diff --git a/NOTICE b/NOTICE index e3b1becbb65b4d8470742746d26fd69293e8c6b1..3a6b9e280c64182ef6b07495f537df0766053ec3 100644 --- a/NOTICE +++ b/NOTICE @@ -363,6 +363,7 @@ The following software have components provided under the terms of this license: - Asynchronous Http Client (from https://repo1.maven.org/maven2/org/asynchttpclient/async-http-client) - Asynchronous Http Client Netty Utils (from https://repo1.maven.org/maven2/org/asynchttpclient/async-http-client-netty-utils) - AutoValue Annotations (from https://github.com/google/auto/tree/master/value, https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations) +- AutoValue Processor (from https://github.com/google/auto/tree/master/value) - BSON (from http://bsonspec.org, https://bsonspec.org) - BSON Record Codec (from <https://www.mongodb.com/>, https://www.mongodb.com/) - Bean Validation API (from http://beanvalidation.org) @@ -373,7 +374,7 @@ The following software have components provided under the terms of this license: - Byte Buddy Java agent (from https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy-agent) - ClassMate (from http://github.com/cowtowncoder/java-classmate) - Cloud Key Management Service (KMS) API (from https://repo1.maven.org/maven2/com/google/apis/google-api-services-cloudkms) -- Cloud Storage JSON API (from https://repo1.maven.org/maven2/com/google/apis/google-api-services-storage) +- Cloud Storage JSON API v1-rev20230301-2.0.0 (from https://repo1.maven.org/maven2/com/google/apis/google-api-services-storage) - CloudWatch Metrics for AWS Java SDK (from https://aws.amazon.com/sdkforjava) - Cobertura (from http://cobertura.sourceforge.net) - Cobertura Limited Runtime (from http://cobertura.sourceforge.net) @@ -393,12 +394,13 @@ The following software have components provided under the terms of this license: - Doxia Sitetools :: Site Renderer (from http://maven.apache.org/doxia/doxia-sitetools/doxia-site-renderer/, https://repo1.maven.org/maven2/org/apache/maven/doxia/doxia-site-renderer) - Elastic JNA Distribution (from https://github.com/java-native-access/jna) - FindBugs-jsr305 (from http://findbugs.sourceforge.net/) +- GAX (Google Api eXtensions) for Java (HTTP JSON) (from <https://repo1.maven.org/maven2/com/google/api/gax-httpjson>, https://repo1.maven.org/maven2/com/google/api/gax-httpjson) - GSON extensions to the Google HTTP Client Library for Java. (from https://repo1.maven.org/maven2/com/google/http-client/google-http-client-gson) - Google APIs Client Library for Java (from https://repo1.maven.org/maven2/com/google/api-client/google-api-client) - Google App Engine extensions to the Google HTTP Client Library for Java. (from https://repo1.maven.org/maven2/com/google/http-client/google-http-client-appengine) -- Google Cloud Core (from https://github.com/googleapis/google-cloud-java, https://github.com/googleapis/google-cloud-java/tree/master/google-cloud-clients/google-cloud-core, https://github.com/googleapis/java-core) -- Google Cloud Core HTTP (from https://github.com/GoogleCloudPlatform/google-cloud-java/tree/master/google-cloud-core-http, https://github.com/googleapis/google-cloud-java/tree/master/google-cloud-clients/google-cloud-core-http, https://github.com/googleapis/java-core) -- Google Cloud Core gRPC (from https://github.com/googleapis/google-cloud-java/tree/master/google-cloud-clients/google-cloud-core-grpc, https://github.com/googleapis/java-core) +- Google Cloud Core (from https://github.com/googleapis/google-cloud-java/tree/master/google-cloud-clients/google-cloud-core, https://github.com/googleapis/java-core, https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core) +- Google Cloud Core HTTP (from https://github.com/GoogleCloudPlatform/google-cloud-java/tree/master/google-cloud-core-http, https://github.com/googleapis/google-cloud-java/tree/master/google-cloud-clients/google-cloud-core-http, https://github.com/googleapis/java-core, https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core-http) +- Google Cloud Core gRPC (from https://github.com/googleapis/google-cloud-java/tree/master/google-cloud-clients/google-cloud-core-grpc, https://github.com/googleapis/java-core, https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core-grpc) - Google Cloud Datastore (from https://github.com/googleapis/google-cloud-java/tree/master/google-cloud-clients/google-cloud-datastore, https://github.com/googleapis/java-datastore) - Google Cloud IAM Service Account Credentials (from https://github.com/googleapis/google-cloud-java, https://github.com/googleapis/java-iamcredentials) - Google Cloud Logging (from https://github.com/googleapis/google-cloud-java/tree/master/google-cloud-clients/google-cloud-logging, https://github.com/googleapis/java-logging) @@ -523,6 +525,7 @@ The following software have components provided under the terms of this license: - Netty/Resolver/DNS (from https://repo1.maven.org/maven2/io/netty/netty-resolver-dns) - Netty/Resolver/DNS/Classes/MacOS (from https://repo1.maven.org/maven2/io/netty/netty-resolver-dns-classes-macos) - Netty/TomcatNative [BoringSSL - Static] (from https://github.com/netty/netty-tcnative/netty-tcnative-boringssl-static/) +- Netty/TomcatNative [OpenSSL - Classes] (from https://repo1.maven.org/maven2/io/netty/netty-tcnative-classes) - Netty/Transport (from https://repo1.maven.org/maven2/io/netty/netty-transport) - Netty/Transport/Classes/Epoll (from https://repo1.maven.org/maven2/io/netty/netty-transport-classes-epoll) - Netty/Transport/Classes/KQueue (from https://repo1.maven.org/maven2/io/netty/netty-transport-classes-kqueue) @@ -538,7 +541,7 @@ The following software have components provided under the terms of this license: - OkHttp Logging Interceptor (from https://github.com/square/okhttp, https://repo1.maven.org/maven2/com/squareup/okhttp3/logging-interceptor, https://square.github.io/okhttp/) - OkHttp URLConnection (from https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp-urlconnection, https://square.github.io/okhttp/) - Okio (from https://github.com/square/okio/, https://repo1.maven.org/maven2/com/squareup/okio/okio) -- OpenCensus (from https://github.com/census-instrumentation/opencensus-java) +- OpenCensus (from https://github.com/census-instrumentation/opencensus-java, https://github.com/census-instrumentation/opencensus-proto) - PWDB :: Database (from https://repo1.maven.org/maven2/org/linguafranca/pwdb/database) - Plexus Common Utilities (from http://plexus.codehaus.org/plexus-utils, https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils) - Plexus I18N Component (from https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-i18n) @@ -627,16 +630,20 @@ The following software have components provided under the terms of this license: - elasticsearch-secure-sm (from https://github.com/elastic/elasticsearch, https://github.com/elastic/elasticsearch.git) - elasticsearch-x-content (from https://github.com/elastic/elasticsearch, https://github.com/elastic/elasticsearch.git) - error-prone annotations (from https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations) +- grpc-google-cloud-datastore-admin-v1 (from https://github.com/googleapis/java-datastore/grpc-google-cloud-datastore-admin-v1) - io.grpc:grpc-alts (from https://github.com/grpc/grpc-java) - io.grpc:grpc-api (from https://github.com/grpc/grpc-java) - io.grpc:grpc-auth (from https://github.com/grpc/grpc-java) - io.grpc:grpc-context (from https://github.com/grpc/grpc-java) - io.grpc:grpc-core (from https://github.com/grpc/grpc-java) +- io.grpc:grpc-googleapis (from https://github.com/grpc/grpc-java) - io.grpc:grpc-grpclb (from https://github.com/grpc/grpc-java) - io.grpc:grpc-netty-shaded (from https://github.com/grpc/grpc-java) - io.grpc:grpc-protobuf (from https://github.com/grpc/grpc-java) - io.grpc:grpc-protobuf-lite (from https://github.com/grpc/grpc-java) +- io.grpc:grpc-services (from https://github.com/grpc/grpc-java) - io.grpc:grpc-stub (from https://github.com/grpc/grpc-java) +- io.grpc:grpc-xds (from https://github.com/grpc/grpc-java) - ion-java (from https://github.com/amzn/ion-java/, https://github.com/amznlabs/ion-java/) - jackson-databind (from http://github.com/FasterXML/jackson, http://wiki.fasterxml.com/JacksonHome, https://github.com/FasterXML/jackson) - jakarta.inject (from https://repo1.maven.org/maven2/org/glassfish/hk2/external/jakarta.inject) @@ -663,6 +670,7 @@ The following software have components provided under the terms of this license: - org.xmlunit:xmlunit-core (from http://www.xmlunit.org/, https://www.xmlunit.org/) - parent-join (from https://github.com/elastic/elasticsearch, https://github.com/elastic/elasticsearch.git) - perfmark:perfmark-api (from https://github.com/perfmark/perfmark) +- proto-google-cloud-datastore-admin-v1 (from https://github.com/googleapis/java-datastore/proto-google-cloud-datastore-admin-v1) - proto-google-cloud-datastore-v1 (from https://github.com/googleapis/googleapis, https://github.com/googleapis/java-datastore/proto-google-cloud-datastore-v1) - proto-google-cloud-iamcredentials-v1 (from https://github.com/googleapis/google-cloud-java, https://github.com/googleapis/java-iamcredentials/proto-google-cloud-iamcredentials-v1, https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-iamcredentials-v1) - proto-google-cloud-logging-v2 (from https://github.com/googleapis/java-logging/proto-google-cloud-logging-v2, https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-cloud-logging-v2) @@ -702,7 +710,6 @@ The following software have components provided under the terms of this license: - Apache Lucene (module: spatial-extras) (from https://lucene.apache.org/, https://repo1.maven.org/maven2/org/apache/lucene/lucene-spatial-extras) - Apache Lucene (module: suggest) (from https://lucene.apache.org/, https://repo1.maven.org/maven2/org/apache/lucene/lucene-suggest) - GAX (Google Api eXtensions) for Java (Core) (from https://github.com/googleapis, https://github.com/googleapis/gax-java, https://repo1.maven.org/maven2/com/google/api/gax) -- GAX (Google Api eXtensions) for Java (HTTP JSON) (from <https://repo1.maven.org/maven2/com/google/api/gax-httpjson>, https://repo1.maven.org/maven2/com/google/api/gax-httpjson) - GAX (Google Api eXtensions) for Java (gRPC) (from <https://repo1.maven.org/maven2/com/google/api/gax-grpc>, https://repo1.maven.org/maven2/com/google/api/gax-grpc) - Hamcrest (from http://hamcrest.org/JavaHamcrest/) - Hamcrest Core (from http://hamcrest.org/, http://hamcrest.org/JavaHamcrest/, https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core) @@ -753,7 +760,6 @@ The following software have components provided under the terms of this license: - Hamcrest (from http://hamcrest.org/JavaHamcrest/) - Hamcrest Core (from http://hamcrest.org/, http://hamcrest.org/JavaHamcrest/, https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core) - JSch (from http://www.jcraft.com/jsch/) -- Jackson module: Afterburner (from http://wiki.fasterxml.com/JacksonHome, https://github.com/FasterXML/jackson-modules-base) - Jakarta Activation API (from https://github.com/eclipse-ee4j/jaf, https://github.com/jakartaee/jaf-api, https://repo1.maven.org/maven2/jakarta/activation/jakarta.activation-api) - Jakarta Annotations API (from https://projects.eclipse.org/projects/ee4j.ca) - Jakarta RESTful WS API (from https://github.com/eclipse-ee4j/jaxrs-api) @@ -779,6 +785,7 @@ The following software have components provided under the terms of this license: - PostgreSQL JDBC Driver - Protocol Buffer Java API (from http://code.google.com/p/protobuf, https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java) - Protocol Buffers [Util] (from https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util) +- RE2/J (from http://github.com/google/re2j) - Redisson (from http://redisson.org) - ServiceLocator Default Implementation (from https://repo1.maven.org/maven2/org/glassfish/hk2/hk2-locator) - Spring Core (from http://www.springframework.org, https://github.com/spring-projects/spring-framework, https://repo1.maven.org/maven2/org/springframework/spring-core) @@ -795,6 +802,13 @@ The following software have components provided under the terms of this license: - jts-core (from https://repo1.maven.org/maven2/org/locationtech/jts/jts-core) - jts-io-common (from https://repo1.maven.org/maven2/org/locationtech/jts/io/jts-io-common) +======================================================================== +BSL-1.0 +======================================================================== +The following software have components provided under the terms of this license: + +- Jackson-core (from http://wiki.fasterxml.com/JacksonHome, https://github.com/FasterXML/jackson-core) + ======================================================================== Beerware ======================================================================== @@ -1006,7 +1020,6 @@ GPL-2.0-with-classpath-exception ======================================================================== The following software have components provided under the terms of this license: -- Checker Qual (from https://checkerframework.org) - Class Model for Hk2 (from https://repo1.maven.org/maven2/org/glassfish/hk2/class-model) - HK2 Implementation Utilities (from https://repo1.maven.org/maven2/org/glassfish/hk2/hk2-utils) - HK2 core module (from https://repo1.maven.org/maven2/org/glassfish/hk2/hk2-core) @@ -1093,8 +1106,6 @@ LGPL-2.1-only The following software have components provided under the terms of this license: - Cobertura (from http://cobertura.sourceforge.net) -- Java Native Access (from https://github.com/java-native-access/jna, https://github.com/twall/jna) -- Java Native Access Platform (from https://github.com/java-native-access/jna) - Logback Classic Module (from http://logback.qos.ch, https://repo1.maven.org/maven2/ch/qos/logback/logback-classic) - Logback Contrib :: JSON :: Classic (from https://repo1.maven.org/maven2/ch/qos/logback/contrib/logback-json-classic) - Logback Contrib :: JSON :: Core (from https://repo1.maven.org/maven2/ch/qos/logback/contrib/logback-json-core) @@ -1144,6 +1155,7 @@ The following software have components provided under the terms of this license: - JSch (from http://www.jcraft.com/jsch/) - JTidy (from http://jtidy.sourceforge.net) - JUL to SLF4J bridge (from http://www.slf4j.org) +- Jackson-core (from http://wiki.fasterxml.com/JacksonHome, https://github.com/FasterXML/jackson-core) - Jakarta XML Binding API (from https://repo1.maven.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api, https://repo1.maven.org/maven2/org/jboss/spec/javax/xml/bind/jboss-jaxb-api_2.3_spec) - Java Client Runtime for AutoRest (from https://github.com/Azure/autorest-clientruntime-for-java) - Java JWT (from http://www.jwt.io, https://github.com/auth0/java-jwt) @@ -1302,6 +1314,13 @@ The following software have components provided under the terms of this license: - Netty/Codec (from https://repo1.maven.org/maven2/io/netty/netty-codec) +======================================================================== +mit-old-style-no-advert +======================================================================== +The following software have components provided under the terms of this license: + +- Brave (from https://repo1.maven.org/maven2/io/zipkin/brave/brave) + ======================================================================== proprietary-license ======================================================================== @@ -1314,6 +1333,7 @@ public-domain ======================================================================== The following software have components provided under the terms of this license: +- Apache Groovy (from http://groovy-lang.org, http://groovy.codehaus.org/, https://groovy-lang.org) - HdrHistogram (from http://hdrhistogram.github.io/HdrHistogram/) - JBoss Logging 3 (from http://www.jboss.org) - JSON in Java (from https://github.com/douglascrockford/JSON-java) diff --git a/README.md b/README.md index 0b2fc26ecb867f1ebb0c569a5f4f4c948b3a7471..51aa2465b3294c3a40c34d25ccf93ae614f92228 100644 --- a/README.md +++ b/README.md @@ -14,3 +14,10 @@ All documentation for the Google Cloud implementation of `os-indexer` lives [her ## AWS Implementation All documentation for the AWS implementation of `os-indexer` lives [here](./provider/indexer-aws/README.md) + +## Open API 3.0 - Swagger +- Swagger UI : https://host/context-path/swagger (will redirect to https://host/context-path/swagger-ui/index.html) +- api-docs (JSON) : https://host/context-path/api-docs +- api-docs (YAML) : https://host/context-path/api-docs.yaml + +All the Swagger and OpenAPI related common properties are managed here [swagger.properties](./indexer-core/src/main/resources/swagger.properties) diff --git a/devops/aws/chart/Chart.yaml b/devops/aws/chart/Chart.yaml index 2afc719c5cbe3a2ee8118ac57d60a09b73b51be9..26a517fbf20e5b43df5efa0db457cd6b3c196df3 100644 --- a/devops/aws/chart/Chart.yaml +++ b/devops/aws/chart/Chart.yaml @@ -1,12 +1,11 @@ apiVersion: v2 name: "os-indexer" version: __CHART_VERSION__ -kubeVersion: ">= 1.21.x-x-x < 1.24.x-x-x" description: Indexer Helm Chart for Kubernetes type: application appVersion: __VERSION__ dependencies: - name: osdu-aws-lib - version: 0.2.0 - repository: __HELM_REPO__/osdu-aws-lib/ + version: ~0 + repository: __HELM_REPO__ deprecated: false diff --git a/devops/aws/chart/values.yaml b/devops/aws/chart/values.yaml index 1712d51d2117277efc176e126580d962658e5d77..b2f670ff10b949de94bcc3c1654e2b5c960ff9c1 100644 --- a/devops/aws/chart/values.yaml +++ b/devops/aws/chart/values.yaml @@ -64,15 +64,17 @@ environmentVariables: value: "true" - name: PARAMETER_MOUNT_PATH value: "/mnt/params" + - name: TMP_VOLUME_PATH + value: "/tmp" # Resource Config replicaCount: 1 resources: limits: - memory: 900M + memory: 1200M requests: cpu: 500m - memory: 900M + memory: 1200M autoscaling: enabled: true minReplicas: 1 @@ -85,7 +87,7 @@ serviceAccountRole: arn:aws:iam::{{ .Values.global.accountID }}:role/osdu-{{ .Va securityContext: runAsUser: 10001 runAsNonRoot: true - readOnlyRootFilesystem: false + readOnlyRootFilesystem: true allowPrivilegeEscalation: false capabilities: drop: diff --git a/devops/gc/deploy/README.md b/devops/gc/deploy/README.md index 3d49b2f9d9b72cb4bbb27d22c2ee6c321651a3d0..e2d9e0b9c1f8642f077e1d5139375a44d28ee686 100644 --- a/devops/gc/deploy/README.md +++ b/devops/gc/deploy/README.md @@ -1,5 +1,3 @@ -<!--- Deploy --> - # Deploy helm chart ## Introduction @@ -27,12 +25,18 @@ Packages are only needed for installation from a local computer. Before installing deploy Helm chart you need to install [configmap Helm chart](../configmap). First you need to set variables in **values.yaml** file using any code editor. Some of the values are prefilled, but you need to specify some values as well. You can find more information about them below. +### Global variables + +| Name | Description | Type | Default |Required | +|------|-------------|------|---------|---------| +**global.domain** | your domain for the external endpoint, ex `example.com` | string | - | yes +**global.onPremEnabled** | whether on-prem is enabled | boolean | false | yes + ### Configmap variables | Name | Description | Type | Default |Required | |------|-------------|------|---------|---------| **data.entitlementsHost** | entitlements host | string | "http://entitlements" | yes -**data.indexerQueueHost** | indexer-queue host | string | "http://indexer-queue" | yes **data.logLevel** | logging level | string | INFO | yes **data.partitionHost** | partition host | string | "http://partition" | yes **data.schemaHost** | schema host | string | "http://schema" | yes @@ -46,8 +50,8 @@ First you need to set variables in **values.yaml** file using any code editor. S | Name | Description | Type | Default |Required | |------|-------------|------|---------|---------| -**data.requestsCpu** | amount of requested CPU | string | 0.1 | yes -**data.requestsMemory** | amount of requested memory| string | 640M | yes +**data.requestsCpu** | amount of requested CPU | string | 35m | yes +**data.requestsMemory** | amount of requested memory| string | 640Mi | yes **data.limitsCpu** | CPU limit | string | 1 | yes **data.limitsMemory** | memory limit | string | 1G | yes **data.image** | service image | string | - | yes @@ -64,18 +68,16 @@ First you need to set variables in **values.yaml** file using any code editor. S **conf.elasticSecretName** | secret for elastic | string | `indexer-elastic-secret` | yes **conf.keycloakSecretName** | secret for keycloak | string | `indexer-keycloak-secret` | yes **conf.rabbitmqSecretName** | secret for rabbitmq | string | `rabbitmq-secret` | yes -**conf.onPremEnabled** | whether on-prem is enabled | boolean | false | yes -**conf.domain** | your domain | string | - | yes **conf.indexerRedisSecretName** | indexer Redis secret that contains redis password with REDIS_PASSWORD key | string | `indexer-redis-secret` | yes ### ISTIO variables | Name | Description | Type | Default |Required | |------|-------------|------|---------|---------| -**istio.proxyCPU** | CPU request for Envoy sidecars | string | 50m | yes -**istio.proxyCPULimit** | CPU limit for Envoy sidecars | string | 500m | yes -**istio.proxyMemory** | memory request for Envoy sidecars | string | 64Mi | yes -**istio.proxyMemoryLimit** | memory limit for Envoy sidecars | string | 512Mi | yes +**istio.proxyCPU** | CPU request for Envoy sidecars | string | 10m | yes +**istio.proxyCPULimit** | CPU limit for Envoy sidecars | string | 200m | yes +**istio.proxyMemory** | memory request for Envoy sidecars | string | 100Mi | yes +**istio.proxyMemoryLimit** | memory limit for Envoy sidecars | string | 256Mi | yes ### Install the helm chart diff --git a/devops/gc/deploy/templates/configmap.yaml b/devops/gc/deploy/templates/configmap.yaml index 3ca6fe5812d03b62c52b480ac8df345f8f57a187..73c17cfc8ff461e868f3f30a6164414d65a20dd0 100644 --- a/devops/gc/deploy/templates/configmap.yaml +++ b/devops/gc/deploy/templates/configmap.yaml @@ -7,7 +7,6 @@ metadata: namespace: {{ .Release.Namespace | quote }} data: ENTITLEMENTS_HOST: {{ .Values.data.entitlementsHost | quote }} - INDEXER_QUEUE_BASE_HOST: {{ .Values.data.indexerQueueHost | quote }} LOG_LEVEL: {{ .Values.data.logLevel | quote }} PARTITION_HOST: {{ .Values.data.partitionHost | quote }} {{- if .Values.data.redisIndexerHost }} diff --git a/devops/gc/deploy/templates/deploy-redis.yaml b/devops/gc/deploy/templates/deploy-redis.yaml index 0e7dd33349e512ec204668d0d1d452905521cbb6..740335a6b86f7fa8fa75e52647532d01816bb3be 100644 --- a/devops/gc/deploy/templates/deploy-redis.yaml +++ b/devops/gc/deploy/templates/deploy-redis.yaml @@ -14,7 +14,8 @@ spec: labels: app: {{ printf "redis-%s" .Values.conf.appName | quote }} annotations: - sidecar.istio.io/proxyCPU: 30m + sidecar.istio.io/proxyCPU: 50m + sidecar.istio.io/proxyMemory: 100Mi spec: containers: - args: @@ -31,5 +32,6 @@ spec: protocol: TCP resources: requests: - memory: 100Mi + cpu: 10m + memory: 50Mi {{ end }} diff --git a/devops/gc/deploy/templates/deployment.yaml b/devops/gc/deploy/templates/deployment.yaml index cfd362ebc14567bc617e7ed710cba93156b1f5a3..e42da5931b5959ba4850e0ecdb5d0e82b54aa7c2 100644 --- a/devops/gc/deploy/templates/deployment.yaml +++ b/devops/gc/deploy/templates/deployment.yaml @@ -41,7 +41,7 @@ spec: name: {{ .Values.conf.configmap | quote }} - secretRef: name: {{ .Values.conf.elasticSecretName | quote }} - {{- if .Values.conf.onPremEnabled }} + {{- if .Values.global.onPremEnabled }} - secretRef: name: {{ .Values.conf.keycloakSecretName | quote }} - secretRef: diff --git a/devops/gc/deploy/templates/service-account.yaml b/devops/gc/deploy/templates/service-account.yaml index f0771985cd5da9db77781dc3ab635e52378b3fb6..eec72f12889eec74d3de43ae6527a860bcd876ea 100644 --- a/devops/gc/deploy/templates/service-account.yaml +++ b/devops/gc/deploy/templates/service-account.yaml @@ -1,4 +1,4 @@ -{{- if .Values.conf.onPremEnabled }} +{{- if .Values.global.onPremEnabled }} apiVersion: v1 kind: ServiceAccount metadata: diff --git a/devops/gc/deploy/templates/service.yaml b/devops/gc/deploy/templates/service.yaml index 45bd505383e8204e40ebf5188814bc4a707b6c34..f985dd5f7a65eff8c6c0475c13d0298b9770ec00 100644 --- a/devops/gc/deploy/templates/service.yaml +++ b/devops/gc/deploy/templates/service.yaml @@ -1,7 +1,7 @@ apiVersion: v1 kind: Service metadata: - {{- if not .Values.conf.onPremEnabled }} + {{- if not .Values.global.onPremEnabled }} annotations: cloud.google.com/neg: '{"ingress": true}' {{- end }} diff --git a/devops/gc/deploy/templates/virtual-service.yaml b/devops/gc/deploy/templates/virtual-service.yaml index ed9507c9788b4fb94ba2c75e2faae7a6ba49ada8..8903b299b9577d298288734003857dcfe5877709 100644 --- a/devops/gc/deploy/templates/virtual-service.yaml +++ b/devops/gc/deploy/templates/virtual-service.yaml @@ -5,10 +5,10 @@ metadata: namespace: {{ .Release.Namespace | quote }} spec: hosts: - {{- if and .Values.conf.domain .Values.conf.onPremEnabled }} - - {{ printf "osdu.%s" .Values.conf.domain | quote }} - {{- else if .Values.conf.domain }} - - {{ .Values.conf.domain | quote }} + {{- if and .Values.global.domain .Values.global.onPremEnabled }} + - {{ printf "osdu.%s" .Values.global.domain | quote }} + {{- else if .Values.global.domain }} + - {{ .Values.global.domain | quote }} {{- else }} - "*" {{- end }} diff --git a/devops/gc/deploy/values.yaml b/devops/gc/deploy/values.yaml index a825cc7f303c17a0a17184a8f9c0b56dfb114d6e..b657f2f62e2402cf28e70ccbec7d519bf682f6b4 100644 --- a/devops/gc/deploy/values.yaml +++ b/devops/gc/deploy/values.yaml @@ -2,10 +2,13 @@ # This is a YAML-formatted file. # Declare variables to be passed into your templates. +global: + domain: "" + onPremEnabled: false + data: # Configmap entitlementsHost: "http://entitlements" - indexerQueueHost: "http://indexer-queue" logLevel: "ERROR" partitionHost: "http://partition" schemaHost: "http://schema" @@ -13,8 +16,8 @@ data: springProfilesActive: "gcp" storageHost: "http://storage" # Deployment - requestsCpu: "75m" - requestsMemory: "640M" + requestsCpu: "35m" + requestsMemory: "640Mi" limitsCpu: "1" limitsMemory: "1G" image: "" @@ -31,12 +34,10 @@ conf: elasticSecretName: "indexer-elastic-secret" keycloakSecretName: "indexer-keycloak-secret" rabbitmqSecretName: "rabbitmq-secret" - onPremEnabled: false - domain: "" indexerRedisSecretName: "indexer-redis-secret" istio: - proxyCPU: "25m" + proxyCPU: "10m" proxyCPULimit: "200m" - proxyMemory: "64Mi" + proxyMemory: "100Mi" proxyMemoryLimit: "256Mi" diff --git a/docs/tutorial/PreviewFeatures.md b/docs/tutorial/PreviewFeatures.md index eaa06b7194ba3d5cb70bf8f01b8b0ae49995dfd3..307360f59ddab73756195822f622d7ae9948142f 100644 --- a/docs/tutorial/PreviewFeatures.md +++ b/docs/tutorial/PreviewFeatures.md @@ -8,17 +8,18 @@ by implementing Ramer–Douglas–Peucker algorithm: - Polygon - MultiPolygon -In order to reduce the risk when extended evaluation of the solution is still on going, a feature flag that is managed by -the Partition Service is applied to the solution. -Here is an example to enable this feature by setting the property "indexer-decimation-enabled" in a given data partition: + +The feature is enabled by default for all data partitions. If client does not want the geo-shape to be decimated in their +data partitions, they can disable geo-shape decimation through the Partition Service. +Here is an example to disable this feature by setting the property "indexer-decimation-enabled" in a given data partition: ``` { "indexer-decimation-enabled": { "sensitive": false, - "value": "true" + "value": "false" } } ``` -If the property "indexer-decimation-enabled" is not created or the property value is set to "false" (String type) in the -given data partition, the geo-shape decimation will be ignored. +If the property "indexer-decimation-enabled" is not created or the property value is set to "true" (String type) in the +given data partition, the geo-shape decimation will be enabled. diff --git a/indexer-core/pom.xml b/indexer-core/pom.xml index 8879d001c71555a9a46718fc90c5047eed3d473f..3fd6fa05d20e9098b1dc904022513d8cb93ab994 100644 --- a/indexer-core/pom.xml +++ b/indexer-core/pom.xml @@ -4,24 +4,22 @@ <parent> <groupId>org.opengroup.osdu.indexer</groupId> <artifactId>indexer-service</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <artifactId>indexer-core</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <name>indexer-core</name> <description>Indexer Service Core</description> <packaging>jar</packaging> <properties> <commons-beanutils.version>1.9.4</commons-beanutils.version> - <spring-security-web.version>5.4.9</spring-security-web.version> <gson.version>2.9.1</gson.version> <netty.version>4.1.70.Final</netty.version> - <jackson-databind.version>2.13.4.2</jackson-databind.version> - <jackson.version>2.13.4</jackson.version> <spring-webmvc.version>5.3.22</spring-webmvc.version> + <os-core-common.version>0.19.0</os-core-common.version> </properties> <dependencyManagement> @@ -33,6 +31,13 @@ <type>pom</type> <scope>import</scope> </dependency> + <dependency> + <groupId>org.opengroup.osdu</groupId> + <artifactId>os-core-common</artifactId> + <version>${os-core-common.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> </dependencies> </dependencyManagement> @@ -88,7 +93,6 @@ <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> - <version>${spring-security-web.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> @@ -103,7 +107,6 @@ <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> - <version>9.0.67</version> </dependency> <dependency> @@ -164,18 +167,14 @@ </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-core</artifactId> - <version>${jackson.version}</version> - </dependency> + <artifactId>jackson-core</artifactId></dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> - <version>${jackson-databind.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> - <version>${jackson.version}</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> @@ -247,7 +246,6 @@ <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> - <version>9.0.68</version> </dependency> </dependencies> diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/IndexerApplication.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/IndexerApplication.java index 416bf89dd51c5e78838ea5f6fcc86166c429d4a5..56be9f76d16aba9019957c6073c6bec470ae6420 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/IndexerApplication.java +++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/IndexerApplication.java @@ -7,10 +7,12 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; @Configuration @ComponentScan({"org.opengroup.osdu.core.common","org.opengroup.osdu.indexer", "org.opengroup.osdu.is"}) @SpringBootApplication(exclude = {ElasticSearchRestHealthContributorAutoConfiguration.class, SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class}) +@PropertySource("classpath:swagger.properties") public class IndexerApplication { public static void main( String[] args ) { diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/CleanupIndiciesApi.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/CleanupIndiciesApi.java index a1f427d8e0396531d964437cadcf48654afe2c5b..9160b175a36154e5e8b32b7ed58fbce931e8892f 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/CleanupIndiciesApi.java +++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/CleanupIndiciesApi.java @@ -17,16 +17,16 @@ package org.opengroup.osdu.indexer.api; import com.google.common.reflect.TypeToken; import com.google.gson.Gson; import com.google.gson.JsonParseException; -import java.lang.reflect.Type; -import java.util.List; -import java.util.stream.Collectors; -import javax.inject.Inject; -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.java.Log; +import org.opengroup.osdu.core.common.model.http.AppError; import org.opengroup.osdu.core.common.model.http.AppException; import org.opengroup.osdu.core.common.model.http.DpsHeaders; import org.opengroup.osdu.core.common.model.indexer.RecordInfo; @@ -49,11 +49,21 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.annotation.RequestScope; + +import javax.inject.Inject; +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.lang.reflect.Type; +import java.util.List; +import java.util.stream.Collectors; + import static java.util.Collections.singletonList; @Log @RestController @RequestScope +@Tag(name = "cleanup-indicies-api", description = "Cleanup Indicies API") public class CleanupIndiciesApi { @Autowired @@ -108,9 +118,22 @@ public class CleanupIndiciesApi { } } + @Operation(summary = "${cleanupIndiciesApi.deleteIndex.summary}", description = "${cleanupIndiciesApi.deleteIndex.description}", + security = {@SecurityRequirement(name = "Authorization")}, tags = { "cleanup-indicies-api" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "403", description = "User not authorized to perform the action", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "404", description = "Not Found", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "502", description = "Bad Gateway", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "503", description = "Service Unavailable", content = {@Content(schema = @Schema(implementation = AppError.class))}) + }) @DeleteMapping(value = "/index", produces = MediaType.APPLICATION_JSON_VALUE) @PreAuthorize("@authorizationFilter.hasPermission('" + ENTITLEMENT_GROUP + "')") - public ResponseEntity deleteIndex(@RequestParam("kind") @NotBlank @ValidKind String kind) { + public ResponseEntity deleteIndex(@Parameter(description = "Kind", example = "tenant1:public:well:1.0.2") + @RequestParam("kind") @NotBlank @ValidKind String kind) { String index = elasticIndexNameResolver.getIndexNameFromKind(kind); try { boolean responseStatus = indicesService.deleteIndex(index); diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/HealthCheckApi.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/HealthCheckApi.java index d19ac9d042d9727b901d0148b34ea4a0dc3289e4..5bb8e0ed8d7709c0a145ee71dd1870653f73b284 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/HealthCheckApi.java +++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/HealthCheckApi.java @@ -14,6 +14,12 @@ package org.opengroup.osdu.indexer.api; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.java.Log; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -28,18 +34,29 @@ import javax.annotation.security.PermitAll; @RestController @RequestMapping("/") @RequestScope +@Tag(name = "health-check-api", description = "Health Check API") public class HealthCheckApi { + @Operation(summary = "${healthCheckApi.livenessCheck.summary}", + description = "${healthCheckApi.livenessCheck.description}", tags = { "health-check-api" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK", content = { @Content(schema = @Schema(implementation = String.class)) }) + }) @PermitAll @GetMapping("/liveness_check") public ResponseEntity<String> livenessCheck(){ return new ResponseEntity<String>("Indexer service is alive", HttpStatus.OK); } + @Operation(summary = "${healthCheckApi.readinessCheck.summary}", + description = "${healthCheckApi.readinessCheck.description}", tags = { "health-check-api" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK", content = { @Content(schema = @Schema(implementation = String.class)) }) + }) @PermitAll @GetMapping("/readiness_check") public ResponseEntity<String> readinessCheck() { return new ResponseEntity<String>("Indexer service is ready", HttpStatus.OK); } -} \ No newline at end of file +} diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/InfoApi.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/InfoApi.java index c9e7b6b15b62775df9cca6ecbdb26cbf63f8a58a..dc33b57dd92114ec84842e31038a4a1d1251f264 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/InfoApi.java +++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/InfoApi.java @@ -18,6 +18,13 @@ package org.opengroup.osdu.indexer.api; import java.io.IOException; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; import org.opengroup.osdu.core.common.info.VersionInfoBuilder; import org.opengroup.osdu.core.common.model.info.VersionInfo; import org.springframework.beans.factory.annotation.Autowired; @@ -28,13 +35,18 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping +@Tag(name = "info", description = "Version info endpoint") public class InfoApi { @Autowired private VersionInfoBuilder versionInfoBuilder; + @Operation(summary = "${infoApi.info.summary}", description = "${infoApi.info.description}", tags = { "info" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Version info.", content = { @Content(schema = @Schema(implementation = VersionInfo.class)) }) + }) @GetMapping(value = "/info", produces = MediaType.APPLICATION_JSON_VALUE) public VersionInfo info() throws IOException { return versionInfoBuilder.buildVersionInfo(); } -} \ No newline at end of file +} diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/PartitionSetupApi.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/PartitionSetupApi.java index 26435bfa27a8f90ff6d66d4721088b916a216f4c..56566ed015536ad821fe7328215f8e3f7ed98b24 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/PartitionSetupApi.java +++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/PartitionSetupApi.java @@ -14,6 +14,14 @@ package org.opengroup.osdu.indexer.api; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.opengroup.osdu.core.common.model.http.AppError; import org.opengroup.osdu.indexer.logging.AuditLogger; import org.opengroup.osdu.indexer.service.IClusterConfigurationService; import org.springframework.beans.factory.annotation.Autowired; @@ -33,6 +41,7 @@ import static org.opengroup.osdu.core.common.model.http.DpsHeaders.DATA_PARTITIO @RestController @RequestMapping("/partitions") @RequestScope +@Tag(name = "partition-setup-api", description = "Partition Setup API") public class PartitionSetupApi { private static final String OPS = "users.datalake.ops"; @@ -42,6 +51,18 @@ public class PartitionSetupApi { @Autowired private AuditLogger auditLogger; + @Operation(summary = "${partitionSetupApi.provisionPartition.summary}", description = "${partitionSetupApi.provisionPartition.description}", + security = {@SecurityRequirement(name = "Authorization")}, tags = { "partition-setup-api" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "403", description = "User not authorized to perform the action", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "404", description = "Not Found", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "502", description = "Bad Gateway", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "503", description = "Service Unavailable", content = {@Content(schema = @Schema(implementation = AppError.class))}) + }) @PreAuthorize("@authorizationFilter.hasPermission('" + OPS + "')") @PutMapping(path = "/provision", consumes = "application/json") public ResponseEntity<?> provisionPartition(@RequestHeader(DATA_PARTITION_ID) String dataPartitionId) throws IOException { diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/ReindexApi.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/ReindexApi.java index a4f38e31d144498d1b4bdb010df91d8a3cf22f77..8d719c247bb1a6aa8fcc8f24877703a31aa743b8 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/ReindexApi.java +++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/api/ReindexApi.java @@ -14,21 +14,33 @@ package org.opengroup.osdu.indexer.api; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.opengroup.osdu.core.common.model.http.AppError; +import org.opengroup.osdu.core.common.model.indexer.RecordReindexRequest; import org.opengroup.osdu.core.common.model.search.SearchServiceRole; import org.opengroup.osdu.indexer.logging.AuditLogger; -import org.opengroup.osdu.core.common.model.indexer.RecordReindexRequest; import org.opengroup.osdu.indexer.service.IndexSchemaService; import org.opengroup.osdu.indexer.service.ReindexService; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; - -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.annotation.RequestScope; import javax.inject.Inject; import javax.validation.Valid; import javax.validation.constraints.NotNull; - import java.io.IOException; import static java.util.Collections.singletonList; @@ -36,6 +48,7 @@ import static java.util.Collections.singletonList; @RestController @RequestMapping("/reindex") @RequestScope +@Tag(name = "reindex-api", description = "Reindex API") public class ReindexApi { @Inject @@ -45,19 +58,44 @@ public class ReindexApi { @Inject private AuditLogger auditLogger; + @Operation(summary = "${reindexApi.reindex.summary}", description = "${reindexApi.reindex.description}", + security = {@SecurityRequirement(name = "Authorization")}, tags = { "reindex-api" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "403", description = "User not authorized to perform the action", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "404", description = "Not Found", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "502", description = "Bad Gateway", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "503", description = "Service Unavailable", content = {@Content(schema = @Schema(implementation = AppError.class))}) + }) @PreAuthorize("@authorizationFilter.hasPermission('" + SearchServiceRole.ADMIN + "')") @PostMapping - public ResponseEntity<?> reindex( - @NotNull @Valid @RequestBody RecordReindexRequest recordReindexRequest, + public ResponseEntity<?> reindex(@NotNull @Valid @RequestBody RecordReindexRequest recordReindexRequest, + @Parameter(description = "Force Clean") @RequestParam(value = "force_clean", defaultValue = "false") boolean forceClean) throws IOException { this.reIndexService.reindexRecords(recordReindexRequest, this.indexSchemaService.isStorageSchemaSyncRequired(recordReindexRequest.getKind(), forceClean)); this.auditLogger.getReindex(singletonList(recordReindexRequest.getKind())); return new ResponseEntity<>(org.springframework.http.HttpStatus.OK); } + @Operation(summary = "${reindexApi.fullReindex.summary}", description = "${reindexApi.fullReindex.description}", + security = {@SecurityRequirement(name = "Authorization")}, tags = { "reindex-api" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "403", description = "User not authorized to perform the action", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "404", description = "Not Found", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "502", description = "Bad Gateway", content = {@Content(schema = @Schema(implementation = AppError.class))}), + @ApiResponse(responseCode = "503", description = "Service Unavailable", content = {@Content(schema = @Schema(implementation = AppError.class))}) + }) @PreAuthorize("@authorizationFilter.hasPermission('" + SearchServiceRole.ADMIN + "')") @PatchMapping - public ResponseEntity<String> fullReindex(@RequestParam(value = "force_clean", defaultValue = "false") boolean forceClean) throws IOException { + public ResponseEntity<String> fullReindex( @Parameter(description = "Force Clean") + @RequestParam(value = "force_clean", defaultValue = "false") boolean forceClean) throws IOException { this.reIndexService.fullReindex(forceClean); return new ResponseEntity<>(org.springframework.http.HttpStatus.OK); } diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/AttributeParsingServiceImpl.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/AttributeParsingServiceImpl.java index 017a126087bdbd308bd2772c75fb4e3e2fc1562b..42d8a8a4645aad05f9ea3a8457fa0d9ba53ee6b9 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/AttributeParsingServiceImpl.java +++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/AttributeParsingServiceImpl.java @@ -18,14 +18,6 @@ import com.google.common.base.Strings; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; -import java.lang.reflect.Array; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.function.BiFunction; -import javax.inject.Inject; import org.apache.http.HttpStatus; import org.opengroup.osdu.core.common.model.indexer.ElasticType; import org.opengroup.osdu.core.common.model.indexer.IndexingStatus; @@ -37,6 +29,16 @@ import org.opengroup.osdu.indexer.util.parser.NumberParser; import org.springframework.stereotype.Service; import org.springframework.web.context.annotation.RequestScope; +import javax.inject.Inject; +import java.lang.reflect.Array; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.BiFunction; + @Service @RequestScope public class AttributeParsingServiceImpl implements IAttributeParsingService { @@ -54,6 +56,8 @@ public class AttributeParsingServiceImpl implements IAttributeParsingService { @Inject private JobStatus jobStatus; + private Gson gson = new Gson(); + @Override public void tryParseValueArray(Class<?> attributeClass, String recordId, String attributeName, Object attributeVal, Map<String, Object> dataMap) { BiFunction<String, Object, ?> parser; @@ -158,7 +162,7 @@ public class AttributeParsingServiceImpl implements IAttributeParsingService { try { Type type = new TypeToken<Map<String, Double>>() {}.getType(); - Map<String, Double> positionMap = new Gson().fromJson(attributeVal.toString(), type); + Map<String, Double> positionMap = this.gson.fromJson(attributeVal.toString(), type); if (positionMap == null || positionMap.isEmpty()) return; @@ -177,8 +181,20 @@ public class AttributeParsingServiceImpl implements IAttributeParsingService { public void tryParseGeojson(String recordId, String attributeName, Object attributeVal, Map<String, Object> dataMap) { try { - Type type = new TypeToken<Map<String, Object>>() {}.getType(); - Map<String, Object> geoJsonMap = new Gson().fromJson(attributeVal.toString(), type); + Map<String, Object> geoJsonMap = new HashMap<>(); + if (attributeVal instanceof Map) { + try { + geoJsonMap = (Map<String, Object>) attributeVal; + } catch (ClassCastException e) { + String parsingError = String.format("geo-json shape parsing error: %s attribute: %s", e.getMessage(), attributeName); + jobStatus.addOrUpdateRecordStatus(recordId, IndexingStatus.WARN, HttpStatus.SC_BAD_REQUEST, parsingError, String.format("record-id: %s | %s", recordId, parsingError)); + } + } + + if (geoJsonMap.isEmpty()) { + Type type = new TypeToken<Map<String, Object>>() {}.getType(); + geoJsonMap = this.gson.fromJson(this.gson.toJson(attributeVal, type), type); + } if (geoJsonMap == null || geoJsonMap.isEmpty()) return; @@ -191,19 +207,19 @@ public class AttributeParsingServiceImpl implements IAttributeParsingService { } } - @Override - public void tryParseNested(String recordId, String name, Object value, Map<String, Object> dataMap) { - dataMap.put(name,value); - } + @Override + public void tryParseNested(String recordId, String name, Object value, Map<String, Object> dataMap) { + dataMap.put(name, value); + } - @Override - public void tryParseObject(String recordId, String name, Object value, Map<String, Object> dataMap) { - dataMap.put(name,value); - } + @Override + public void tryParseObject(String recordId, String name, Object value, Map<String, Object> dataMap) { + dataMap.put(name, value); + } @Override public void tryParseFlattened(String recordId, String name, Object value, Map<String, Object> dataMap) { - dataMap.put(name,value); + dataMap.put(name, value); } diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/IMappingService.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/IMappingService.java index f0009bd048fe18312c9cddefbb3b258fd591756f..00cad2baeaf19615ae764f68d1fa7b83cf803e06 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/IMappingService.java +++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/IMappingService.java @@ -19,7 +19,6 @@ import org.opengroup.osdu.core.common.model.indexer.IndexSchema; import java.io.IOException; import java.util.Map; -import java.util.Set; public interface IMappingService { @@ -31,7 +30,5 @@ public interface IMappingService { Map<String, Object> getIndexMappingFromRecordSchema(IndexSchema schema); - void updateIndexMappingForIndicesOfSameType(Set<String> indices, String fieldName) throws Exception; - void syncIndexMappingIfRequired(RestHighLevelClient restClient, IndexSchema schema) throws Exception; } \ No newline at end of file diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/IndexCopyServiceImpl.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/IndexCopyServiceImpl.java deleted file mode 100644 index 23027e20654fcaae75e8aafd58cf51972565c4e7..0000000000000000000000000000000000000000 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/IndexCopyServiceImpl.java +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright 2017-2019, Schlumberger -// -// 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. - -package org.opengroup.osdu.indexer.service; - -import com.google.common.collect.Lists; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import org.apache.http.HttpEntity; -import org.apache.http.HttpStatus; -import org.apache.http.entity.ContentType; -import org.apache.http.nio.entity.NStringEntity; -import org.apache.http.util.EntityUtils; -import org.elasticsearch.client.Request; -import org.elasticsearch.client.Response; -import org.elasticsearch.client.RestHighLevelClient; -import org.opengroup.osdu.core.common.model.search.ClusterSettings; -import org.opengroup.osdu.core.common.model.http.DpsHeaders; -import org.opengroup.osdu.core.common.model.tenant.TenantInfo; -import org.opengroup.osdu.core.common.model.http.AppException; -import org.opengroup.osdu.core.common.search.ElasticIndexNameResolver; -import org.opengroup.osdu.core.common.search.Preconditions; -import org.opengroup.osdu.indexer.logging.AuditLogger; -import org.opengroup.osdu.core.common.model.indexer.IElasticSettingService; -import org.opengroup.osdu.indexer.util.ElasticClientHandler; -import org.springframework.stereotype.Service; - -import javax.inject.Inject; -import java.io.IOException; -import java.lang.reflect.Type; -import java.util.HashMap; -import java.util.Map; - -@Service -public class IndexCopyServiceImpl implements IndexCopyService { - - @Inject - private ElasticClientHandler elasticClientHandler; - @Inject - private ElasticIndexNameResolver elasticIndexNameResolver; - @Inject - private IndicesService indicesService; - @Inject - private IElasticSettingService elasticSettingService; - @Inject - private IMappingService mappingService; - @Inject - private DpsHeaders headersInfo; - @Inject - private AuditLogger auditLogger; - - @Override - public String fetchTaskStatus(String taskId) { - try (RestHighLevelClient restClient = this.elasticClientHandler.createRestClient()) { - Request request = new Request("GET", String.format("/_tasks/%s", taskId)); - Response response = restClient.getLowLevelClient().performRequest(request); - this.auditLogger.getTaskStatus(Lists.newArrayList(taskId)); - return EntityUtils.toString(response.getEntity()); - } catch (IOException e) { - throw new AppException(HttpStatus.SC_INTERNAL_SERVER_ERROR, "Unknown error", e.getMessage(), e); - } - } - - /** - * This method is used to copy one index from common cluster to tenant cluster. - * - * @param kind request sent to ask the copying operation, includes kind and tenant - * @throws IOException if upstream server cannot process the request - */ - @Override - public String copyIndex(String kind) throws IOException { - Preconditions.checkNotNull(kind, "kind can't be null"); - - String originalAccountId = this.headersInfo.getPartitionId(); - String toBeCopiedIndex = this.elasticIndexNameResolver.getIndexNameFromKind(kind); - - String typeOfToBeCopiedIndex = kind.split(":")[2]; - if (typeOfToBeCopiedIndex == null) { - throw new AppException(HttpStatus.SC_NOT_FOUND, "Fail to find the type of the index", "Fail to find the type of the given index in common cluster."); - } - - Map<String, Object> mappingsMap = this.getIndexMappingsFromCommonCluster(toBeCopiedIndex, typeOfToBeCopiedIndex); - String[] commonCluster = this.getCommonClusterInformation(); - - this.createIndexInTenantCluster(originalAccountId, toBeCopiedIndex, typeOfToBeCopiedIndex, mappingsMap); - String taskStatus = this.reindexInTenantCluster(originalAccountId, toBeCopiedIndex, commonCluster); - this.auditLogger.copyIndex(Lists.newArrayList(String.format("Kind:%s", kind), String.format("Task status: %s", taskStatus))); - return taskStatus; - } - - /** - * This method is used to format the body of remote reindex request. - * - * @param host host of the remote cluster - * @param username username of the remote cluster - * @param password password of the remote cluster - * @param index the index to be copied - * @return request body in json string format - */ - private String formatReindexRequestBody(String host, String username, String password, String index) { - Map<String, String> remoteMap = new HashMap<>(); - remoteMap.put("host", host); - remoteMap.put("username", username); - remoteMap.put("password", password); - - Map<String, Object> sourceMap = new HashMap<>(); - sourceMap.put("index", index); - sourceMap.put("remote", remoteMap); - sourceMap.put("size", 10000); - - Map<String, String> destMap = new HashMap<>(); - destMap.put("index", index); - - Map<String, Object> map = new HashMap<>(); - map.put("source", sourceMap); - map.put("dest", destMap); - - Gson gson = new Gson(); - return gson.toJson(map); - } - - /** - * This method is used to extract cluster information from cluster settings. - * - * @param setting setting of the cluster, including host, port, username and password - * @return the host which combined the hostname, scheme and port together, username, and password - */ - private String[] extractInfoFromClusterSetting(ClusterSettings setting) { - - String[] clusterInfo = new String[3]; - - StringBuilder host = new StringBuilder("https://"); - host.append(setting.getHost()) - .append(":") - .append(setting.getPort()); - clusterInfo[0] = host.toString(); - - String userAndPwd = setting.getUserNameAndPassword(); - int indexOfColon = userAndPwd.indexOf(':'); - clusterInfo[1] = userAndPwd.substring(0, indexOfColon); - clusterInfo[2] = userAndPwd.substring(indexOfColon + 1); - - return clusterInfo; - } - - /** - * This method is used to cast mapping to fit the parameter requirement. - * - * @param mapping input map in json string format - * @return output map in Map<String, Object> format - */ - private Map<String, Object> castMappingsMap(String mapping, String indexType, String index) { - Type type = new TypeToken<Map<String, Map<String, Map<String, Map<String, Object>>>>>() {}.getType(); - Map<String, Map<String, Map<String, Map<String, Object>>>> indexMap = new Gson().fromJson(mapping, type); - Map<String, Map<String, Map<String, Object>>> mappingMap = indexMap.get(index); - Map<String, Map<String, Object>> mappingWithoutMappings = mappingMap.get("mappings"); - - return mappingWithoutMappings.get(indexType); - } - - public Map<String, Object> getIndexMappingsFromCommonCluster(String toBeCopiedIndex, String typeOfToBeCopiedIndex) throws IOException { - this.headersInfo.getHeaders().put(DpsHeaders.ACCOUNT_ID, TenantInfo.COMMON); - this.headersInfo.getHeaders().put(DpsHeaders.DATA_PARTITION_ID, TenantInfo.COMMON); - try (RestHighLevelClient commonClient = this.elasticClientHandler.createRestClient()) { - String indexMapping = this.mappingService.getIndexMapping(commonClient, toBeCopiedIndex); - return castMappingsMap(indexMapping, typeOfToBeCopiedIndex, toBeCopiedIndex); - } catch (Exception e) { - throw new IOException("Fail to get mapping for the given index from common cluster."); - } - } - - public String[] getCommonClusterInformation() throws IOException { - this.headersInfo.getHeaders().put(DpsHeaders.ACCOUNT_ID, TenantInfo.COMMON); - this.headersInfo.getHeaders().put(DpsHeaders.DATA_PARTITION_ID, TenantInfo.COMMON); - String[] commonCluster = extractInfoFromClusterSetting(this.elasticSettingService.getElasticClusterInformation()); - if (commonCluster.length != 3) { - throw new IOException("fail to get the information of common cluster."); - } - return commonCluster; - } - - public void createIndexInTenantCluster(String originalAccountId, String toBeCopiedIndex, String typeOfToBeCopiedIndex, Map<String, Object> mappingsMap) throws IOException { - this.headersInfo.getHeaders().put(DpsHeaders.ACCOUNT_ID, originalAccountId); - this.headersInfo.getHeaders().put(DpsHeaders.DATA_PARTITION_ID, originalAccountId); - try (RestHighLevelClient tenantClient = this.elasticClientHandler.createRestClient()) { - if (!this.indicesService.createIndex(tenantClient, toBeCopiedIndex, null, typeOfToBeCopiedIndex, mappingsMap)) { - throw new AppException(HttpStatus.SC_NOT_FOUND, "Fail to create new index", "Fail to create new corresponding new index in tenant cluster."); - } - } - } - - public String reindexInTenantCluster(String originalAccountId, String toBeCopiedIndex, String[] commonCluster) throws IOException { - this.headersInfo.getHeaders().put(DpsHeaders.ACCOUNT_ID, originalAccountId); - this.headersInfo.getHeaders().put(DpsHeaders.DATA_PARTITION_ID, originalAccountId); - try (RestHighLevelClient tenantClient = this.elasticClientHandler.createRestClient()) { - String json = formatReindexRequestBody(commonCluster[0], commonCluster[1], commonCluster[2], toBeCopiedIndex); - HttpEntity requestBody = new NStringEntity(json, ContentType.APPLICATION_JSON); - Request request = new Request("POST", "/_reindex?wait_for_completion=false"); - request.setEntity(requestBody); - Response response = tenantClient.getLowLevelClient().performRequest(request); - return EntityUtils.toString(response.getEntity()); - } - } -} diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/IndexerMappingServiceImpl.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/IndexerMappingServiceImpl.java index c77f4af7802cf34a347a306cda283d5e97eba15f..a18cbd3fb4db5f5384e1ffb3585d08b436eb0f8e 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/IndexerMappingServiceImpl.java +++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/IndexerMappingServiceImpl.java @@ -17,20 +17,15 @@ package org.opengroup.osdu.indexer.service; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.lambdaworks.redis.RedisException; -import org.apache.http.HttpStatus; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.action.support.master.AcknowledgedResponse; import org.elasticsearch.client.Request; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.Response; import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.client.indices.GetFieldMappingsRequest; -import org.elasticsearch.client.indices.GetFieldMappingsResponse; import org.elasticsearch.client.indices.PutMappingRequest; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.xcontent.XContentType; -import org.elasticsearch.index.reindex.BulkByScrollResponse; -import org.elasticsearch.index.reindex.UpdateByQueryRequest; import org.opengroup.osdu.core.common.Constants; import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; import org.opengroup.osdu.core.common.model.http.AppException; @@ -40,7 +35,6 @@ import org.opengroup.osdu.core.common.search.ElasticIndexNameResolver; import org.opengroup.osdu.core.common.search.Preconditions; import org.opengroup.osdu.indexer.cache.PartitionSafeIndexCache; import org.opengroup.osdu.indexer.model.Kind; -import org.opengroup.osdu.indexer.util.ElasticClientHandler; import org.opengroup.osdu.indexer.util.TypeMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -48,7 +42,10 @@ import org.springframework.stereotype.Service; import javax.inject.Inject; import java.io.IOException; import java.lang.reflect.Type; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; @Service public class IndexerMappingServiceImpl extends MappingServiceImpl implements IMappingService { @@ -57,15 +54,12 @@ public class IndexerMappingServiceImpl extends MappingServiceImpl implements IMa @Inject private JaxRsDpsLog log; - @Inject - private ElasticClientHandler elasticClientHandler; @Autowired private PartitionSafeIndexCache indexCache; @Autowired private ElasticIndexNameResolver elasticIndexNameResolver; - /** * Create a new type in Elasticsearch * @@ -164,15 +158,6 @@ public class IndexerMappingServiceImpl extends MappingServiceImpl implements IMa return dataMapping; } - @Override - public void updateIndexMappingForIndicesOfSameType(Set<String> indices, String fieldName) throws Exception { - try (RestHighLevelClient restClient = this.elasticClientHandler.createRestClient()) { - if(!updateMappingToEnableKeywordIndexingForField(restClient,indices,fieldName)){ - throw new AppException(HttpStatus.SC_INTERNAL_SERVER_ERROR, "Elastic error", "Error updating index mapping.", String.format("Failed to get confirmation from elastic server mapping update for indices: %s", indices)); - } - } - } - @Override public void syncIndexMappingIfRequired(RestHighLevelClient restClient, IndexSchema schema) throws Exception { String index = this.elasticIndexNameResolver.getIndexNameFromKind(schema.getKind()); @@ -187,7 +172,8 @@ public class IndexerMappingServiceImpl extends MappingServiceImpl implements IMa } String jsonResponse = this.getIndexMapping(restClient, index); - Type type = new TypeToken<Map<String, Object>>() {}.getType(); + Type type = new TypeToken<Map<String, Object>>() { + }.getType(); Map<String, Object> mappings = new Gson().fromJson(jsonResponse, type); if (mappings == null || mappings.isEmpty()) return; @@ -228,108 +214,6 @@ public class IndexerMappingServiceImpl extends MappingServiceImpl implements IMa this.indexCache.put(cacheKey, true); } - private boolean updateMappingToEnableKeywordIndexingForField(RestHighLevelClient client, Set<String> indicesSet, String fieldName) throws IOException { - String[] indices = indicesSet.toArray(new String[indicesSet.size()]); - Map<String, Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>>> indexMappingMap = getIndexFieldMap(new String[]{"data."+fieldName}, client, indices); - boolean failure = false; - for (String index : indicesSet) { - if (indexMappingMap.get(index)!=null && updateMappingForAllIndicesOfSameTypeToEnableKeywordIndexingForField(client, index, indexMappingMap.get(index), fieldName)) { - log.info(String.format("Updated field: %s | index: %s", fieldName, index)); - } else { - failure=true; - log.warning(String.format("Failed to update field: %s | index %s", fieldName, index)); - } - } - return !failure; - } - - private Map<String, Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>>> getIndexFieldMap(String[] fieldNames, RestHighLevelClient client, String[] indices) throws IOException { - Map<String, Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>>> indexMappingMap = new HashMap<>(); - GetFieldMappingsRequest request = new GetFieldMappingsRequest(); - request.indices(indices); - request.fields(fieldNames); - try { - GetFieldMappingsResponse response = client.indices().getFieldMapping(request, RequestOptions.DEFAULT); - if (response != null && !response.mappings().isEmpty()) { - final Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>> mappings = response.mappings(); - for (String index : indices) { - if (mappings != null && !mappings.isEmpty()) { - indexMappingMap.put(index, mappings); - } - } - } - - return indexMappingMap; - } catch (ElasticsearchException e) { - log.error(String.format("Failed to get indices: %s. | Error: %s", Arrays.toString(indices), e)); - throw new AppException(HttpStatus.SC_INTERNAL_SERVER_ERROR, "Elastic error", "Error getting indices.", String.format("Failed to get indices error: %s", Arrays.toString(indices))); - } - } - - private boolean updateMappingForAllIndicesOfSameTypeToEnableKeywordIndexingForField( - RestHighLevelClient client, String index, Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>> indexMapping, String fieldName) throws IOException { - - PutMappingRequest request = new PutMappingRequest(index); - String type = indexMapping.keySet().iterator().next(); - if(type.isEmpty()) { - log.error(String.format("Could not find type of the mappings for index: %s.", index)); - return false; - } - - request.setTimeout(REQUEST_TIMEOUT); - Map<String, GetFieldMappingsResponse.FieldMappingMetadata> metaData = indexMapping.get(type); - if(metaData==null || metaData.get("data." + fieldName)==null) { - log.error(String.format("Could not find field: %s in the mapping of index: %s.", fieldName, index)); - return false; - } - - GetFieldMappingsResponse.FieldMappingMetadata fieldMetaData = metaData.get("data." + fieldName); - Map<String, Object> source = fieldMetaData.sourceAsMap(); - if(!source.containsKey(fieldName)){ - log.error(String.format("Could not find field: %s in the mapping of index: %s.", fieldName, index)); - return false; - } - - //Index the field with additional keyword type - Map<String, Object> keywordMap = new HashMap<>(); - keywordMap.put(Constants.TYPE, "keyword"); - Map<String, Object> fieldIndexTypeMap = new HashMap<>(); - fieldIndexTypeMap.put("keyword", keywordMap); - Map<String, Object> dataFieldMap = (Map<String, Object>) source.get(fieldName); - dataFieldMap.put("fields", fieldIndexTypeMap); - Map<String, Object> dataProperties = new HashMap<>(); - dataProperties.put(fieldName, dataFieldMap); - Map<String, Object> mapping = new HashMap<>(); - mapping.put(Constants.PROPERTIES, dataProperties); - Map<String, Object> data = new HashMap<>(); - data.put(Constants.DATA,mapping); - Map<String, Object> properties = new HashMap<>(); - properties.put(Constants.PROPERTIES, data); - - request.source(new Gson().toJson(properties), XContentType.JSON); - - try { - AcknowledgedResponse response = client.indices().putMapping(request, RequestOptions.DEFAULT); - boolean isIndicesUpdated = updateIndices(client, index); - return response.isAcknowledged() && isIndicesUpdated; - - } catch (Exception e) { - log.error(String.format("Could not update mapping of index: %s. | Error: %s", index, e)); - return false; - } - } - - private boolean updateIndices(RestHighLevelClient client, String index) throws IOException { - UpdateByQueryRequest request = new UpdateByQueryRequest(index); - request.setConflicts("proceed"); - BulkByScrollResponse response = client.updateByQuery(request, RequestOptions.DEFAULT); - if(!response.getBulkFailures().isEmpty()) { - log.error(String.format("Could not update index: %s.",index)); - return false; - } - return true; - } - /** * Create a new type in Elasticsearch * diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/IndexerServiceImpl.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/IndexerServiceImpl.java index 31e253eaeda6d9933856bd62a9077d39029da59c..8e2895fc2b0807e9ad6fedcc2a09f7b060ab27af 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/IndexerServiceImpl.java +++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/IndexerServiceImpl.java @@ -125,7 +125,7 @@ public class IndexerServiceImpl implements IndexerService { // get upsert records Map<String, Map<String, OperationType>> upsertRecordMap = RecordInfo.getUpsertRecordIds(recordInfos); if (upsertRecordMap != null && !upsertRecordMap.isEmpty()) { - List<String> upsertFailureRecordIds = processUpsertRecords(upsertRecordMap); + List<String> upsertFailureRecordIds = processUpsertRecords(upsertRecordMap, recordInfos); retryRecordIds.addAll(upsertFailureRecordIds); } @@ -191,7 +191,7 @@ public class IndexerServiceImpl implements IndexerService { } } - private List<String> processUpsertRecords(Map<String, Map<String, OperationType>> upsertRecordMap) throws Exception { + private List<String> processUpsertRecords(Map<String, Map<String, OperationType>> upsertRecordMap, List<RecordInfo> recordChangedInfos) throws Exception { // get schema for kind Map<String, IndexSchema> schemas = this.getSchema(upsertRecordMap); @@ -203,7 +203,7 @@ public class IndexerServiceImpl implements IndexerService { if (recordIds.isEmpty()) return new LinkedList<>(); // get records via storage api - Records storageRecords = this.storageService.getStorageRecords(recordIds); + Records storageRecords = this.storageService.getStorageRecords(recordIds, recordChangedInfos); List<String> failedOrRetryRecordIds = new LinkedList<>(storageRecords.getMissingRetryRecords()); // map storage records to indexer payload @@ -399,17 +399,10 @@ public class IndexerServiceImpl implements IndexerService { jaxRsDpsLog.warning(String.format("data not found for record: %s", record)); } - OperationType operation = record.getOperationType(); Map<String, Object> sourceMap = getSourceMap(record); String index = this.elasticIndexNameResolver.getIndexNameFromKind(record.getKind()); - - if (operation == OperationType.create) { - IndexRequest indexRequest = new IndexRequest(index).id(record.getId()).source(this.gson.toJson(sourceMap), XContentType.JSON); - bulkRequest.add(indexRequest); - } else if (operation == OperationType.update) { - UpdateRequest updateRequest = new UpdateRequest(index, "_doc", record.getId()).doc(this.gson.toJson(sourceMap), XContentType.JSON).docAsUpsert(true); - bulkRequest.add(updateRequest); - } + IndexRequest indexRequest = new IndexRequest(index).id(record.getId()).source(this.gson.toJson(sourceMap), XContentType.JSON); + bulkRequest.add(indexRequest); } return processBulkRequest(restClient, bulkRequest); diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/StorageIndexerPayloadMapper.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/StorageIndexerPayloadMapper.java index 0469ded33dfff0b0a99912594dcb84ada57767e3..91d120a692b15f4fec2fa0d7de8ba4f4ac64ee1c 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/StorageIndexerPayloadMapper.java +++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/StorageIndexerPayloadMapper.java @@ -211,32 +211,34 @@ public class StorageIndexerPayloadMapper { } private void mapVirtualPropertiesPayload(IndexSchema storageSchema, String recordId, Map<String, Object> dataCollectorMap) { - if (dataCollectorMap.isEmpty() || this.virtualPropertiesSchemaCache.get(storageSchema.getKind()) == null) { + if (dataCollectorMap.isEmpty()) { return; } - VirtualProperties virtualProperties = (VirtualProperties) this.virtualPropertiesSchemaCache.get(storageSchema.getKind()); String originalGeoShapeProperty = null; - for (Map.Entry<String, VirtualProperty> entry : virtualProperties.getProperties().entrySet()) { - if (entry.getValue().getPriorities() == null || entry.getValue().getPriorities().size() == 0) { - continue; - } - Priority priority = chooseOriginalProperty(entry.getKey(), entry.getValue().getPriorities(), dataCollectorMap); - String virtualPropertyPath = VirtualPropertyUtil.removeDataPrefix(entry.getKey()); - String originalPropertyPath = VirtualPropertyUtil.removeDataPrefix(priority.getPath()); + if(this.virtualPropertiesSchemaCache.get(storageSchema.getKind()) != null) { + VirtualProperties virtualProperties = (VirtualProperties) this.virtualPropertiesSchemaCache.get(storageSchema.getKind()); + for (Map.Entry<String, VirtualProperty> entry : virtualProperties.getProperties().entrySet()) { + if (entry.getValue().getPriorities() == null || entry.getValue().getPriorities().size() == 0) { + continue; + } + Priority priority = chooseOriginalProperty(entry.getKey(), entry.getValue().getPriorities(), dataCollectorMap); + String virtualPropertyPath = VirtualPropertyUtil.removeDataPrefix(entry.getKey()); + String originalPropertyPath = VirtualPropertyUtil.removeDataPrefix(priority.getPath()); - // Populate the virtual property values from the chosen original property - List<String> originalPropertyNames = dataCollectorMap.keySet().stream() - .filter(originalPropertyName -> VirtualPropertyUtil.isPropertyPathMatched(originalPropertyName, originalPropertyPath)) - .collect(Collectors.toList()); - originalPropertyNames.forEach(originalPropertyName -> { - String virtualPropertyName = virtualPropertyPath + originalPropertyName.substring(originalPropertyPath.length()); - dataCollectorMap.put(virtualPropertyName, dataCollectorMap.get(originalPropertyName)); - }); - - if(virtualPropertyPath.equals(VirtualPropertyUtil.VIRTUAL_DEFAULT_LOCATION) && - dataCollectorMap.containsKey(VirtualPropertyUtil.VIRTUAL_DEFAULT_LOCATION_WGS84_PATH)) { - originalGeoShapeProperty = originalPropertyPath + VirtualPropertyUtil.FIELD_WGS84_COORDINATES; + // Populate the virtual property values from the chosen original property + List<String> originalPropertyNames = dataCollectorMap.keySet().stream() + .filter(originalPropertyName -> VirtualPropertyUtil.isPropertyPathMatched(originalPropertyName, originalPropertyPath)) + .collect(Collectors.toList()); + originalPropertyNames.forEach(originalPropertyName -> { + String virtualPropertyName = virtualPropertyPath + originalPropertyName.substring(originalPropertyPath.length()); + dataCollectorMap.put(virtualPropertyName, dataCollectorMap.get(originalPropertyName)); + }); + + if(virtualPropertyPath.equals(VirtualPropertyUtil.VIRTUAL_DEFAULT_LOCATION) && + dataCollectorMap.containsKey(VirtualPropertyUtil.VIRTUAL_DEFAULT_LOCATION_WGS84_PATH)) { + originalGeoShapeProperty = originalPropertyPath + VirtualPropertyUtil.FIELD_WGS84_COORDINATES; + } } } diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/StorageService.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/StorageService.java index bfbb5c6d5a0faf2cf1b62ec031697141f0f649ef..54a19e807079d6076b855e89ea2707f88308e038 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/StorageService.java +++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/StorageService.java @@ -15,6 +15,7 @@ package org.opengroup.osdu.indexer.service; import org.opengroup.osdu.core.common.model.http.AppException; +import org.opengroup.osdu.core.common.model.indexer.RecordInfo; import org.opengroup.osdu.core.common.model.indexer.RecordQueryResponse; import org.opengroup.osdu.core.common.model.indexer.RecordReindexRequest; import org.opengroup.osdu.core.common.model.indexer.Records; @@ -25,7 +26,7 @@ import java.util.List; public interface StorageService { - Records getStorageRecords(List<String> ids) throws AppException, URISyntaxException; + Records getStorageRecords(List<String> ids, List<RecordInfo> recordChangedInfos) throws AppException, URISyntaxException; RecordQueryResponse getRecordsByKind(RecordReindexRequest request) throws URISyntaxException; diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/StorageServiceImpl.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/StorageServiceImpl.java index ff381db42c4d0854f8e36eba2d05a9733f0535ec..1b20cfb14cd9128dcb1595d9a608d6c4ed1da4b1 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/StorageServiceImpl.java +++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/StorageServiceImpl.java @@ -20,23 +20,28 @@ import com.google.api.client.http.HttpMethods; import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.gson.Gson; - import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import org.apache.http.HttpStatus; import org.opengroup.osdu.core.common.http.FetchServiceHttpRequest; -import org.opengroup.osdu.core.common.model.http.DpsHeaders; +import org.opengroup.osdu.core.common.http.IUrlFetchService; +import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; import org.opengroup.osdu.core.common.model.http.AppException; +import org.opengroup.osdu.core.common.model.http.DpsHeaders; import org.opengroup.osdu.core.common.model.http.HttpResponse; import org.opengroup.osdu.core.common.model.http.RequestStatus; -import org.opengroup.osdu.core.common.model.indexer.*; +import org.opengroup.osdu.core.common.model.indexer.IndexingStatus; +import org.opengroup.osdu.core.common.model.indexer.JobStatus; +import org.opengroup.osdu.core.common.model.indexer.OperationType; +import org.opengroup.osdu.core.common.model.indexer.RecordInfo; +import org.opengroup.osdu.core.common.model.indexer.RecordQueryResponse; +import org.opengroup.osdu.core.common.model.indexer.RecordReindexRequest; +import org.opengroup.osdu.core.common.model.indexer.Records; +import org.opengroup.osdu.core.common.model.search.RecordMetaAttribute; import org.opengroup.osdu.core.common.model.storage.ConversionStatus; import org.opengroup.osdu.core.common.model.storage.RecordIds; -import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; -import org.opengroup.osdu.core.common.http.IUrlFetchService; -import org.opengroup.osdu.core.common.model.search.RecordMetaAttribute; import org.opengroup.osdu.core.common.provider.interfaces.IRequestInfo; -import org.apache.http.HttpStatus; import org.opengroup.osdu.indexer.config.IndexerConfigurationProperties; import org.springframework.stereotype.Component; @@ -52,8 +57,8 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import static org.opengroup.osdu.core.common.model.http.DpsHeaders.FRAME_OF_REFERENCE; import static org.opengroup.osdu.core.common.Constants.SLB_FRAME_OF_REFERENCE_VALUE; +import static org.opengroup.osdu.core.common.model.http.DpsHeaders.FRAME_OF_REFERENCE; @Component public class StorageServiceImpl implements StorageService { @@ -74,15 +79,17 @@ public class StorageServiceImpl implements StorageService { private IndexerConfigurationProperties configurationProperties; @Override - public Records getStorageRecords(List<String> ids) throws AppException, URISyntaxException { + public Records getStorageRecords(List<String> ids, List<RecordInfo> recordChangedInfos) throws AppException, URISyntaxException { List<Records.Entity> valid = new ArrayList<>(); List<String> notFound = new ArrayList<>(); List<ConversionStatus> conversionStatuses = new ArrayList<>(); List<String> missingRetryRecordIds = new ArrayList<>(); + Map<String, String> recordChangedMap = recordChangedInfos.stream().collect(Collectors.toMap(RecordInfo::getId, RecordInfo::getKind, (a, b) -> b)); + Map<String, String> validRecordKindPatchMap = getValidRecordKindPatchMap(recordChangedInfos); List<List<String>> batch = Lists.partition(ids, configurationProperties.getStorageRecordsBatchSize()); for (List<String> recordsBatch : batch) { - Records storageOut = this.getRecords(recordsBatch); + Records storageOut = this.getRecords(recordsBatch, recordChangedMap, validRecordKindPatchMap); valid.addAll(storageOut.getRecords()); notFound.addAll(storageOut.getNotFound()); conversionStatuses.addAll(storageOut.getConversionStatuses()); @@ -91,11 +98,10 @@ public class StorageServiceImpl implements StorageService { return Records.builder().records(valid).notFound(notFound).conversionStatuses(conversionStatuses).missingRetryRecords(missingRetryRecordIds).build(); } - protected Records getRecords(List<String> ids) throws URISyntaxException { + protected Records getRecords(List<String> ids, Map<String, String> recordChangedMap, Map<String, String> validRecordKindPatchMap) throws URISyntaxException { // e.g. {"records":["test:10"]} String body = this.gson.toJson(RecordIds.builder().records(ids).build()); -// Map<String, String> headers = this.requestInfo.getHeadersMap(); DpsHeaders headers = this.requestInfo.getHeaders(); headers.put(FRAME_OF_REFERENCE, SLB_FRAME_OF_REFERENCE_VALUE); FetchServiceHttpRequest request = FetchServiceHttpRequest @@ -105,10 +111,10 @@ public class StorageServiceImpl implements StorageService { .headers(headers) .body(body).build(); HttpResponse response = this.urlFetchService.sendRequest(request); - return this.validateStorageResponse(response, ids); + return this.validateStorageResponse(response, ids, recordChangedMap, validRecordKindPatchMap); } - private Records validateStorageResponse(HttpResponse response, List<String> ids) { + private Records validateStorageResponse(HttpResponse response, List<String> ids, Map<String, String> recordChangedMap, Map<String, String> validRecordKindPatchMap) { String bulkStorageData = response.getBody(); // retry entire payload -- storage service returned empty response @@ -116,6 +122,10 @@ public class StorageServiceImpl implements StorageService { throw new AppException(HttpStatus.SC_NOT_FOUND, "Invalid request", "Storage service returned empty response"); } + if (response.getResponseCode() == 500) { + throw new AppException(RequestStatus.NO_RETRY, "Server error", String.format("Storage service error: %s", response.getBody())); + } + Records records = null; try { records = this.objectMapper.readValue(bulkStorageData, Records.class); @@ -125,6 +135,7 @@ public class StorageServiceImpl implements StorageService { // no retry possible, update record status as failed -- storage service cannot locate records if (!records.getNotFound().isEmpty()) { + jaxRsDpsLog.error(records.getNotFound().size() + " records were not found. Full list: " + records.getNotFound()); this.jobStatus.addOrUpdateRecordStatus(records.getNotFound(), IndexingStatus.FAIL, RequestStatus.INVALID_RECORD, "Storage service records not found", String.format("Storage service records not found: %s", String.join(",", records.getNotFound()))); } @@ -140,8 +151,13 @@ public class StorageServiceImpl implements StorageService { throw new AppException(HttpStatus.SC_NOT_FOUND, "Invalid request", "Storage service error"); } + // validate kind to avoid data duplication + List<String> staleRecords = getStaleRecordsUpdate(recordChangedMap, validRecordKindPatchMap, validRecords); + List<Records.Entity> indexableRecords = validateKind(validRecords, staleRecords); + records.setRecords(indexableRecords); + Map<String, List<String>> conversionStatus = getConversionErrors(records.getConversionStatuses()); - for (Records.Entity storageRecord : validRecords) { + for (Records.Entity storageRecord : indexableRecords) { String recordId = storageRecord.getId(); if (conversionStatus.get(recordId) == null) { continue; @@ -152,8 +168,8 @@ public class StorageServiceImpl implements StorageService { } // retry missing records -- storage did not return response for all RecordChangeMessage record-ids - if (records.getTotalRecordCount() != ids.size()) { - List<String> missingRecords = this.getMissingRecords(records, ids); + if ((records.getRecords().size() + records.getNotFound().size() + staleRecords.size()) != ids.size()) { + List<String> missingRecords = this.getMissingRecords(records, ids, staleRecords); records.setMissingRetryRecords(missingRecords); this.jobStatus.addOrUpdateRecordStatus(missingRecords, IndexingStatus.FAIL, HttpStatus.SC_NOT_FOUND, "Partial response received from Storage service - missing records", String.format("Partial response received from Storage service: %s", String.join(",", missingRecords))); } @@ -161,12 +177,13 @@ public class StorageServiceImpl implements StorageService { return records; } - private List<String> getMissingRecords(Records records, List<String> ids) { + private List<String> getMissingRecords(Records records, List<String> ids, List<String> staleRecords) { List<String> validRecordIds = records.getRecords().stream().map(Records.Entity::getId).collect(Collectors.toList()); List<String> invalidRecordsIds = records.getNotFound(); List<String> requestedIds = new ArrayList<>(ids); requestedIds.removeAll(validRecordIds); requestedIds.removeAll(invalidRecordsIds); + requestedIds.removeAll(staleRecords); return requestedIds; } @@ -183,6 +200,54 @@ public class StorageServiceImpl implements StorageService { return errorsByRecordId; } + private List<Records.Entity> validateKind(List<Records.Entity> validRecords, List<String> staleRecords) { + List<Records.Entity> indexableRecords = new ArrayList<>(); + if (!staleRecords.isEmpty()) { + for (Records.Entity record : validRecords) { + if (staleRecords.contains(record.getId())) { + continue; + } + indexableRecords.add(record); + } + jaxRsDpsLog.warning(String.format("stale records found with older kind, skipping indexing | record ids: %s", String.join(" | ", staleRecords))); + } else { + indexableRecords.addAll(validRecords); + } + return indexableRecords; + } + + private List<String> getStaleRecordsUpdate(Map<String, String> recordChangedMap, Map<String, String> validRecordKindPatchMap, List<Records.Entity> validRecords) { + List<String> staleRecords = new ArrayList<>(); + for (Records.Entity storageRecord : validRecords) { + String kindOnStorage = storageRecord.getKind(); + String kindOnMessage = recordChangedMap.get(storageRecord.getId()); + if (validRecordKindPatchMap.containsKey(storageRecord.getId())) { + continue; + } + if (!kindOnStorage.equals(kindOnMessage)) { + staleRecords.add(storageRecord.getId()); + } + } + return staleRecords; + } + + /* + * Gets valid kind patch map, previousVersionKind is included on the record update message in such cases + * */ + private Map<String, String> getValidRecordKindPatchMap(List<RecordInfo> recordChangedInfos) { + Map<String, String> out = new HashMap<>(); + for (RecordInfo msg : recordChangedInfos) { + OperationType op = OperationType.valueOf(msg.getOp()); + if (op != OperationType.update) { + continue; + } + if (!Strings.isNullOrEmpty(msg.getPreviousVersionKind())) { + out.put(msg.getId(), msg.getPreviousVersionKind()); + } + } + return out; + } + @Override public RecordQueryResponse getRecordsByKind(RecordReindexRequest reindexRequest) throws URISyntaxException { Map<String, String> queryParams = new HashMap<>(); @@ -192,8 +257,8 @@ public class StorageServiceImpl implements StorageService { queryParams.put("cursor", reindexRequest.getCursor()); } - if(requestInfo == null) - throw new AppException(HttpStatus.SC_NO_CONTENT, "Invalid header", "header can't be null"); + if (requestInfo == null) + throw new AppException(HttpStatus.SC_NO_CONTENT, "Invalid header", "header can't be null"); FetchServiceHttpRequest request = FetchServiceHttpRequest.builder() .httpMethod(HttpMethods.GET) @@ -229,6 +294,6 @@ public class StorageServiceImpl implements StorageService { HttpResponse response = this.urlFetchService.sendRequest(request); JsonObject asJsonObject = new JsonParser().parse(response.getBody()).getAsJsonObject(); JsonElement results = asJsonObject.get("results"); - return response.getResponseCode() != HttpStatus.SC_OK ? null : this.gson.fromJson(results,List.class); + return response.getResponseCode() != HttpStatus.SC_OK ? null : this.gson.fromJson(results, List.class); } } diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/swagger/HomeController.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/swagger/HomeController.java deleted file mode 100644 index b3ab482f149f66ca89fa993ad858d4c364ce508e..0000000000000000000000000000000000000000 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/swagger/HomeController.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.opengroup.osdu.indexer.swagger; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; - -@Controller -public class HomeController { - @RequestMapping(value = "/swagger") - public String swagger() { - return "redirect:swagger-ui.html"; - } -} diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/swagger/SwaggerConfiguration.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/swagger/SwaggerConfiguration.java index f40606837a5b52a489ba3de99cdcf8ba07f348bd..957ccd927789ccd3a2168d9275a1c9305e22beb1 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/swagger/SwaggerConfiguration.java +++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/swagger/SwaggerConfiguration.java @@ -1,53 +1,57 @@ package org.opengroup.osdu.indexer.swagger; -import io.swagger.v3.oas.models.servers.Server; -import org.springframework.context.annotation.Configuration; -import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.enums.SecuritySchemeType; +import io.swagger.v3.oas.annotations.info.Contact; +import io.swagger.v3.oas.annotations.info.Info; +import io.swagger.v3.oas.annotations.info.License; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.security.SecurityScheme; +import io.swagger.v3.oas.annotations.servers.Server; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.models.media.StringSchema; import io.swagger.v3.oas.models.parameters.Parameter; -import io.swagger.v3.oas.models.security.SecurityRequirement; -import io.swagger.v3.oas.models.security.SecurityScheme; import org.opengroup.osdu.core.common.model.http.DpsHeaders; import org.springdoc.core.customizers.OperationCustomizer; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; -import javax.servlet.ServletContext; -import java.util.Collections; - +@OpenAPIDefinition( + info = @Info( + title = "${api.title}", + description = "${api.description}", + version = "${api.version}", + contact = @Contact(name = "${api.contact.name}", email = "${api.contact.email}"), + license = @License(name = "${api.license.name}", url = "${api.license.url}")), + servers = @Server(url = "${api.server.url}"), + security = @SecurityRequirement(name = "Authorization"), + tags = { + @Tag(name = "cleanup-indicies-api", description = "Cleanup Indicies API"), + @Tag(name = "partition-setup-api", description = "Partition Setup API"), + @Tag(name = "reindex-api", description = "Reindex API"), + @Tag(name = "health-check-api", description = "Health Check API"), + @Tag(name = "info", description = "Version info endpoint") + } +) +@SecurityScheme(name = "Authorization", scheme = "bearer", bearerFormat = "Authorization", type = SecuritySchemeType.HTTP) @Configuration public class SwaggerConfiguration { @Bean - public OpenAPI openApi(ServletContext servletContext) { - Server server = new Server().url(servletContext.getContextPath()); - return new OpenAPI() - .servers(Collections.singletonList(server)) - .info(new Info() - .description("Indexer service that provides a set of APIs " + - "to index storage records against Elasticsearch") - .title("Indexer Service") - .version("1.0")) - .components(new Components() - .addSecuritySchemes("Authorization", - new SecurityScheme() - .type(SecurityScheme.Type.HTTP) - .scheme("bearer") - .bearerFormat("Authorization") - .in(SecurityScheme.In.HEADER) - .name("Authorization"))) - .addSecurityItem( - new SecurityRequirement() - .addList("Authorization")); + public OperationCustomizer operationCustomizer() { + return (operation, handlerMethod) -> { + Parameter dataPartitionId = new Parameter() + .name(DpsHeaders.DATA_PARTITION_ID) + .description("Data Partition Id") + .in("header") + .required(true) + .schema(new StringSchema()); + // PartitionSetupApi - provisionPartition endpoint has 'data-partition-id' header defined at method level. + if(!operation.getOperationId().equals("provisionPartition")) + return operation.addParametersItem(dataPartitionId); + else + return operation; + }; } - @Bean - public OperationCustomizer customize() { - return (operation, handlerMethod) -> operation.addParametersItem( - new Parameter() - .in("header") - .required(true) - .description("Tenant Id") - .name(DpsHeaders.DATA_PARTITION_ID)); - } } diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/util/geo/decimator/GeoShapeDecimationSetting.java b/indexer-core/src/main/java/org/opengroup/osdu/indexer/util/geo/decimator/GeoShapeDecimationSetting.java index 492f2d7479f3c2a02d883681fab6216045211b0e..a062c1ac6e645e3e5bdcec4d9c066e0d0230d199 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/util/geo/decimator/GeoShapeDecimationSetting.java +++ b/indexer-core/src/main/java/org/opengroup/osdu/indexer/util/geo/decimator/GeoShapeDecimationSetting.java @@ -51,14 +51,13 @@ public class GeoShapeDecimationSetting { if (cache != null && cache.containsKey(cacheKey)) return cache.get(cacheKey); - boolean decimationEnabled = false; + boolean decimationEnabled = true; try { PartitionInfo partitionInfo = getPartitionInfo(dataPartitionId); decimationEnabled = getDecimationSetting(partitionInfo); } catch (Exception e) { - this.logger.error(String.format("PartitionService: Error getting %s for dataPartition with Id: %s", PROPERTY_NAME, dataPartitionId), e); + this.logger.error(String.format("PartitionService: Error getting %s for dataPartition with Id: %s. Turn on the feature flag by default.", PROPERTY_NAME, dataPartitionId), e); } - this.cache.put(cacheKey, decimationEnabled); return decimationEnabled; } @@ -78,12 +77,12 @@ public class GeoShapeDecimationSetting { private boolean getDecimationSetting(PartitionInfo partitionInfo) { if(partitionInfo == null || partitionInfo.getProperties() == null) - return false; + return true; if(partitionInfo.getProperties().containsKey(PROPERTY_NAME)) { Property property = partitionInfo.getProperties().get(PROPERTY_NAME); return Boolean.parseBoolean((String)property.getValue()); } - return false; + return true; } } diff --git a/indexer-core/src/main/resources/swagger.properties b/indexer-core/src/main/resources/swagger.properties new file mode 100644 index 0000000000000000000000000000000000000000..12506ebeb2e9aa1af8fdb396baaa543879cbcba0 --- /dev/null +++ b/indexer-core/src/main/resources/swagger.properties @@ -0,0 +1,45 @@ +#Manage common SpringDoc and OpenAPI related properties + +#SpringDoc related properties +springdoc.swagger-ui.tagsSorter=alpha +springdoc.swagger-ui.operationsSorter=alpha +springdoc.swagger-ui.doc-expansion=none +springdoc.swagger-ui.path=/swagger +springdoc.swagger-ui.displayOperationId=true +springdoc.api-docs.path=/api-docs + +#OpenAPI 3.0 - Indexer Service properties +api.title=Indexer Service +api.description=Indexer service creates an index, which is a methodical arrangement of records designed to enable users to locate information quickly. +api.version=2.0 +api.contact.name=OSDU Data Platform Team +api.contact.email=dps@OSDU.org +api.license.name=Apache 2.0 +api.license.url=https://www.apache.org/licenses/LICENSE-2.0.html +api.server.url=${server.servlet.contextPath} + + +#CleanupIndiciesApi related properties +cleanupIndiciesApi.deleteIndex.summary=Delete Index for the given kind +cleanupIndiciesApi.deleteIndex.description=Delete Index for the given kind. Required roles: `users.datalake.ops` + +#PartitionSetupApi related properties +partitionSetupApi.provisionPartition.summary=Provision partition +partitionSetupApi.provisionPartition.description=Provision partition. Required roles: `users.datalake.ops` + +#Reindex API related properties +reindexApi.reindex.summary=Re-index given 'kind' +reindexApi.reindex.description=This API allows users to re-index a 'kind' without re-ingesting the records via storage API. \ +Required roles: `service.search.admin` +reindexApi.fullReindex.summary=Full Re-index by data partition +reindexApi.fullReindex.description=This API allows users to re-index an entire partition without re-ingesting the records via storage API.\ +Required roles: `service.search.admin` + +#Info & Health API related properties +infoApi.info.summary=Version info +infoApi.info.description=For deployment available public `/info` endpoint, which provides build and git related information. +healthCheckApi.livenessCheck.summary=Liveness Check endpoint +healthCheckApi.livenessCheck.description=For deployment available public `/liveness_check` endpoint. +healthCheckApi.readinessCheck.summary=Readiness Check endpoint +healthCheckApi.readinessCheck.description=For deployment available public `/readiness_check` endpoint. + diff --git a/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/AttributeParsingServiceImplTest.java b/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/AttributeParsingServiceImplTest.java index 1372a8c45330ee2d8ecb600f664502776d456e6b..94d06cf2e81414807f5b7ddc55c3747dec708a70 100644 --- a/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/AttributeParsingServiceImplTest.java +++ b/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/AttributeParsingServiceImplTest.java @@ -31,11 +31,15 @@ import org.opengroup.osdu.indexer.util.parser.NumberParser; import org.springframework.test.context.junit4.SpringRunner; import java.lang.reflect.Type; +import java.util.Date; import java.util.HashMap; import java.util.Map; -import java.util.Date; -import static org.junit.Assert.*; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Mockito.when; @@ -315,8 +319,21 @@ public class AttributeParsingServiceImplTest { @Test public void should_returnGeoShape_given_validTreeMap_tryGetGeoShapeTest() { final String shapeJson = "{\"type\":\"Polygon\",\"coordinates\":[[[100,0],[101,0],[101,1],[100,1],[100,0]]]}"; - Map<String, Object> storageData = new HashMap<>(); - storageData.put("location", parseJson(shapeJson)); + Map<String, Object> storageData = parseJson(shapeJson); + + when(this.geoShapeParser.parseGeoJson(storageData)).thenReturn(new HashMap<>()); + + Map<String, Object> dataMap = new HashMap<>(); + + this.sut.tryParseGeojson("", "location", storageData, dataMap); + + assertFalse(dataMap.isEmpty()); + } + + @Test + public void should_returnGeoShape_given_validTreeMap_tryGetGeoShapeWithPropertiesTest() { + final String shapeJson = "{\"features\":[{\"geometry\":{\"type\":\"Point\",\"coordinates\":[-105.01621,39.57422]},\"properties\":{\"id\":\"opendes:work-product-component--GenericRepresentation:0be3c0de-7844-4bcb-a17d-83de84cd2eca\",\"uri\":\"wdms:opendes:1188d27c-9132-41ec-b281-502a6245d00c:f597df66-4197-4347-99c2-acb58ce27ef3:0be3c0de-7844-4bcb-a17d-83de84cd2eca\"},\"type\":\"Feature\"}],\"type\":\"FeatureCollection\"}"; + Map<String, Object> storageData = parseJson(shapeJson); when(this.geoShapeParser.parseGeoJson(storageData)).thenReturn(new HashMap<>()); @@ -330,8 +347,7 @@ public class AttributeParsingServiceImplTest { @Test public void should_throwException_given_geoShapeParingFailed() { final String shapeJson = "{\"type\":\"Polygon\",\"coordinates\":[[[100,NaN],[101,0],[101,1],[100,1],[100,0]]]}"; - Map<String, Object> storageData = new HashMap<>(); - storageData.put("location", parseJson(shapeJson)); + Map<String, Object> storageData = parseJson(shapeJson); when(this.geoShapeParser.parseGeoJson(any())).thenThrow(new IllegalArgumentException("geo coordinates must be numbers")); @@ -374,4 +390,4 @@ public class AttributeParsingServiceImplTest { */ void accept(T t, U u, V v, W w, X x); } -} \ No newline at end of file +} diff --git a/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/IndexerServiceImplTest.java b/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/IndexerServiceImplTest.java index 285b384a017b4eefd044dc3e58e1434b1ad0543c..194fdab46f77aa9ca67834f640a3ba13337e25c7 100644 --- a/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/IndexerServiceImplTest.java +++ b/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/IndexerServiceImplTest.java @@ -142,7 +142,7 @@ public class IndexerServiceImplTest { validRecords.add(Records.Entity.builder().id(recordId2).kind(kind2).data(storageData).build()); List<ConversionStatus> conversionStatus = new LinkedList<>(); Records storageRecords = Records.builder().records(validRecords).conversionStatuses(conversionStatus).build(); - when(this.storageService.getStorageRecords(any())).thenReturn(storageRecords); + when(this.storageService.getStorageRecords(any(), any())).thenReturn(storageRecords); // setup elastic, index and mapped document when(this.indicesService.createIndex(any(), any(), any(), any(), any())).thenReturn(true); diff --git a/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/StorageIndexerPayloadMapperTest.java b/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/StorageIndexerPayloadMapperTest.java index 8a6c64d60ab28274c29935cfcebf23de59c05288..a8ede574da14ec07ad905907c98d5854e132a6e0 100644 --- a/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/StorageIndexerPayloadMapperTest.java +++ b/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/StorageIndexerPayloadMapperTest.java @@ -12,11 +12,11 @@ import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; import org.opengroup.osdu.core.common.model.http.DpsHeaders; import org.opengroup.osdu.core.common.model.indexer.IndexSchema; import org.opengroup.osdu.core.common.model.indexer.JobStatus; -import org.opengroup.osdu.core.common.partition.*; import org.opengroup.osdu.indexer.schema.converter.config.SchemaConverterPropertiesConfig; import org.opengroup.osdu.indexer.schema.converter.exeption.SchemaProcessingException; import org.opengroup.osdu.indexer.schema.converter.interfaces.IVirtualPropertiesSchemaCache; import org.opengroup.osdu.indexer.schema.converter.tags.SchemaRoot; +import org.opengroup.osdu.indexer.schema.converter.tags.VirtualProperties; import org.opengroup.osdu.indexer.service.mock.PartitionFactoryMock; import org.opengroup.osdu.indexer.service.mock.PartitionProviderMock; import org.opengroup.osdu.indexer.service.mock.ServiceAccountJwtClientMock; @@ -31,6 +31,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import org.springframework.test.context.junit4.SpringRunner; +import javax.inject.Inject; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; @@ -76,6 +77,9 @@ public class StorageIndexerPayloadMapperTest { @Autowired private IVirtualPropertiesSchemaCache virtualPropertiesSchemaCache; + @Inject + private GeoShapeDecimationSetting decimationSetting; + @BeforeClass public static void setUp() { HashMap<String, Object> dataMap = new HashMap<>(); @@ -201,6 +205,59 @@ public class StorageIndexerPayloadMapperTest { assertNull(dataCollectorMap.get("VirtualProperties.DefaultName")); } + @Test + public void geoshape_decimation_is_enabled_by_default() { + assertTrue(decimationSetting.isDecimationEnabled()); + } + + @Test + public void geoshape_decimation_is_executed_with_virtual_spatial_location() { + final String kind = "osdu:wks:master-data--SeismicAcquisitionSurvey:1.0.0"; + final String record_id = "opendes:master-data--SeismicAcquisitionSurvey:WD86-BO_WD86-PR1228-FS-11"; + VirtualProperties virtualProperties = loadObject("/converter/index-virtual-properties/virtual-properties.json", VirtualProperties.class);; + virtualPropertiesSchemaCache.put(kind, virtualProperties); + + IndexSchema indexSchema = loadObject("/converter/index-virtual-properties/survey_storage_schema.json", IndexSchema.class); + Map<String, Object> storageRecordData = new HashMap<>(); + storageRecordData = loadObject("/converter/index-virtual-properties/survey_storage_data.json", storageRecordData.getClass()); + + Map<String, Object> dataCollectorMap = payloadMapper.mapDataPayload(indexSchema, storageRecordData, record_id); + assertTrue(dataCollectorMap.containsKey("VirtualProperties.DefaultLocation.Wgs84Coordinates")); + assertTrue(dataCollectorMap.containsKey("SpatialLocation.Wgs84Coordinates")); + + List<Object> defaultLocationCoordinates =getCoordinates("VirtualProperties.DefaultLocation.Wgs84Coordinates", dataCollectorMap); + List<Object> spatialLocationCoordinates =getCoordinates("SpatialLocation.Wgs84Coordinates", dataCollectorMap); + + assertEquals(11, defaultLocationCoordinates.size()); + assertEquals(11, spatialLocationCoordinates.size()); + } + + @Test + public void geoshape_decimation_is_executed_without_virtual_spatial_location() { + virtualPropertiesSchemaCache.clearAll(); + final String record_id = "opendes:master-data--SeismicAcquisitionSurvey:WD86-BO_WD86-PR1228-FS-11"; + + IndexSchema indexSchema = loadObject("/converter/index-virtual-properties/survey_storage_schema.json", IndexSchema.class); + Map<String, Object> storageRecordData = new HashMap<>(); + storageRecordData = loadObject("/converter/index-virtual-properties/survey_storage_data.json", storageRecordData.getClass()); + + Map<String, Object> dataCollectorMap = payloadMapper.mapDataPayload(indexSchema, storageRecordData, record_id); + assertFalse(dataCollectorMap.containsKey("VirtualProperties.DefaultLocation.Wgs84Coordinates")); + assertTrue(dataCollectorMap.containsKey("SpatialLocation.Wgs84Coordinates")); + + List<Object> spatialLocationCoordinates =getCoordinates("SpatialLocation.Wgs84Coordinates", dataCollectorMap); + + assertEquals(11, spatialLocationCoordinates.size()); + } + + private List<Object> getCoordinates(String key, Map<String, Object> dataCollectorMap) { + Map<String, Object> spatialLocation =(Map<String, Object>)dataCollectorMap.get(key); + List<Object> geometries =(List<Object>)spatialLocation.get("geometries"); + Map<String, Object> firstGeometry = (Map<String, Object>)geometries.get(0); + List<Object> coordinates = (List<Object>)firstGeometry.get("coordinates"); + return coordinates; + } + private <T> T loadObject(String file, Class<T> valueType) { String jsonString = readResourceFile(file); return this.gson.fromJson(jsonString, valueType); diff --git a/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/StorageServiceImplTest.java b/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/StorageServiceImplTest.java index 42791ea57c2541a2073ee87df7033bb6da3758f1..e64574d7a6452f704361f80ea66884232b506c0a 100644 --- a/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/StorageServiceImplTest.java +++ b/indexer-core/src/test/java/org/opengroup/osdu/indexer/service/StorageServiceImplTest.java @@ -1,54 +1,313 @@ +// Copyright 2017-2023, Schlumberger +// +// 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. + package org.opengroup.osdu.indexer.service; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; -import org.mockito.junit.MockitoJUnitRunner; import org.opengroup.osdu.core.common.http.IUrlFetchService; +import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; +import org.opengroup.osdu.core.common.model.http.AppException; import org.opengroup.osdu.core.common.model.http.DpsHeaders; import org.opengroup.osdu.core.common.model.http.HttpResponse; +import org.opengroup.osdu.core.common.model.indexer.IndexingStatus; +import org.opengroup.osdu.core.common.model.indexer.JobStatus; +import org.opengroup.osdu.core.common.model.indexer.OperationType; +import org.opengroup.osdu.core.common.model.indexer.RecordInfo; +import org.opengroup.osdu.core.common.model.indexer.RecordQueryResponse; +import org.opengroup.osdu.core.common.model.indexer.RecordReindexRequest; import org.opengroup.osdu.core.common.model.indexer.Records; import org.opengroup.osdu.core.common.provider.interfaces.IRequestInfo; import org.opengroup.osdu.indexer.config.IndexerConfigurationProperties; +import org.springframework.http.HttpStatus; +import org.springframework.test.context.junit4.SpringRunner; +import java.lang.reflect.Type; import java.net.URISyntaxException; +import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import static java.util.Collections.singletonList; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -@RunWith(MockitoJUnitRunner.class) +@RunWith(SpringRunner.class) public class StorageServiceImplTest { - - @Spy - private ObjectMapper objectMapper = new ObjectMapper(); @Mock private IUrlFetchService urlFetchService; @Mock + private JobStatus jobStatus; + @Mock + private JaxRsDpsLog log; + @Mock private IRequestInfo requestInfo; @Mock private IndexerConfigurationProperties configurationProperties; + @Spy + private ObjectMapper objectMapper = new ObjectMapper(); @InjectMocks private StorageServiceImpl sut; + private List<String> ids; + private static final String RECORD_ID1 = "tenant1:doc:1dbf528e0e0549cab7a08f29fbfc8465"; + private static final String RECORDS_ID2 = "tenant1:doc:15e790a69beb4d789b1f979e2af2e813"; + + @Before + public void setup() { + + String recordChangedMessages = "[{\"id\":\"tenant1:doc:1dbf528e0e0549cab7a08f29fbfc8465\",\"kind\":\"tenant1:testindexer1528919679710:well:1.0.0\",\"op\":\"purge\"}," + + "{\"id\":\"tenant1:doc:15e790a69beb4d789b1f979e2af2e813\",\"kind\":\"tenant1:testindexer1528919679710:well:1.0.0\",\"op\":\"create\"}]"; + + when(this.requestInfo.getHeadersMap()).thenReturn(new HashMap<>()); + when(this.requestInfo.getHeaders()).thenReturn(new DpsHeaders()); + + Type listType = new TypeToken<List<RecordInfo>>() { + }.getType(); + + List<RecordInfo> msgs = (new Gson()).fromJson(recordChangedMessages, listType); + jobStatus.initialize(msgs); + ids = Arrays.asList(RECORD_ID1, RECORDS_ID2); + + when(configurationProperties.getStorageRecordsBatchSize()).thenReturn(20); + } + @Test public void should_parse_long_integer_values_as_integer_types() throws URISyntaxException { when(this.requestInfo.getHeaders()).thenReturn(new DpsHeaders()); - String body = "{\"records\":[{\"id\":\"id1\",\"version\":0,\"data\":{\"long_int\":1000000000000000000000000,\"int\":123}}],\"notFound\":[],\"conversionStatuses\":[],\"missingRetryRecords\":[]}"; + String body = "{\"records\":[{\"id\":\"id1\",\"kind\":\"tenant:test:test:1.0.0\",\"version\":0,\"data\":{\"long_int\":1000000000000000000000000,\"int\":123}}],\"notFound\":[],\"conversionStatuses\":[],\"missingRetryRecords\":[]}"; + Map<String, String> recordChangedMap = new HashMap<>(); + Map<String, String> validRecordKindPatchMap = new HashMap<>(); + recordChangedMap.put("id1", "tenant:test:test:1.0.0"); HttpResponse httpResponse = mock(HttpResponse.class); when(httpResponse.getBody()).thenReturn(body); when(this.urlFetchService.sendRequest(any())).thenReturn(httpResponse); - Records rec = sut.getRecords(Collections.singletonList("id1")); + Records rec = sut.getRecords(Collections.singletonList("id1"), recordChangedMap, validRecordKindPatchMap); assertEquals(1, rec.getRecords().size()); assertEquals("1000000000000000000000000", rec.getRecords().get(0).getData().get("long_int").toString()); assertEquals("123", rec.getRecords().get(0).getData().get("int").toString()); } + + @Test + public void should_return404_givenNullData_getValidStorageRecordsTest() throws URISyntaxException { + + HttpResponse httpResponse = mock(HttpResponse.class); + when(httpResponse.getBody()).thenReturn(null); + + when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); + + should_return404_getValidStorageRecordsTest(); + } + + @Test + public void should_return404_givenEmptyData_getValidStorageRecordsTest() throws URISyntaxException { + + String emptyDataFromStorage = "{\"records\":[],\"notFound\":[]}"; + + HttpResponse httpResponse = mock(HttpResponse.class); + when(httpResponse.getBody()).thenReturn(emptyDataFromStorage); + + when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); + + should_return404_getValidStorageRecordsTest(); + } + + @Test + public void should_returnOneValidRecords_givenValidData_getValidStorageRecordsTest() throws URISyntaxException { + + String validDataFromStorage = "{\"records\":[{\"id\":\"testid\", \"version\":1, \"kind\":\"tenant:test:test:1.0.0\"}],\"notFound\":[\"invalid1\"], \"conversionStatuses\": []}"; + List<RecordInfo> recordChangeInfos = Arrays.asList(RecordInfo.builder().id("testid").kind("tenant:test:test:1.0.0").op(OperationType.create.getValue()).build()); + + HttpResponse httpResponse = mock(HttpResponse.class); + when(httpResponse.getBody()).thenReturn(validDataFromStorage); + + when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); + Records storageRecords = this.sut.getStorageRecords(ids, recordChangeInfos); + + assertEquals(1, storageRecords.getRecords().size()); + } + + @Test + public void should_returnOneValidRecords_givenRecord_withValidKindUpdate_getStorageRecordsTest() throws URISyntaxException { + + String validDataFromStorage = "{\"records\":[{\"id\":\"testid\", \"version\":1, \"kind\":\"tenant:test:test:1.2.0\"}],\"notFound\":[], \"conversionStatuses\": []}"; + List<RecordInfo> recordChangeInfos = Arrays.asList(RecordInfo.builder().id("testid").kind("tenant:test:test:1.2.0").op(OperationType.update.getValue()).previousVersionKind("tenant:test:test:1.1.0").build()); + + HttpResponse httpResponse = mock(HttpResponse.class); + when(httpResponse.getBody()).thenReturn(validDataFromStorage); + + when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); + Records storageRecords = this.sut.getStorageRecords(ids, recordChangeInfos); + + assertEquals(1, storageRecords.getRecords().size()); + } + + @Test + public void should_returnZeroRecords_givenStaleMessage_getStorageRecordsTest() throws URISyntaxException { + + String validDataFromStorage = "{\"records\":[{\"id\":\"testid\", \"version\":1, \"kind\":\"tenant:test:test:1.2.0\"}],\"notFound\":[], \"conversionStatuses\": []}"; + List<RecordInfo> recordChangeInfos = Arrays.asList(RecordInfo.builder().id("testid").kind("tenant:test:test:1.1.0").op(OperationType.update.getValue()).build()); + + HttpResponse httpResponse = mock(HttpResponse.class); + when(httpResponse.getBody()).thenReturn(validDataFromStorage); + + when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); + Records storageRecords = this.sut.getStorageRecords(ids, recordChangeInfos); + + assertEquals(0, storageRecords.getRecords().size()); + verify(this.log).warning("stale records found with older kind, skipping indexing | record ids: testid"); + } + + @Test + public void should_logMissingRecord_given_storageMissedRecords() throws URISyntaxException { + + String validDataFromStorage = "{\"records\":[{\"id\":\"tenant1:doc:1dbf528e0e0549cab7a08f29fbfc8465\", \"version\":1, \"kind\":\"tenant:test:test:1.0.0\"}],\"notFound\":[]}"; + List<RecordInfo> recordChangeInfos = Arrays.asList(RecordInfo.builder().id("tenant1:doc:1dbf528e0e0549cab7a08f29fbfc8465").kind("tenant:test:test:1.0.0").op(OperationType.update.getValue()).build()); + + HttpResponse httpResponse = mock(HttpResponse.class); + when(httpResponse.getBody()).thenReturn(validDataFromStorage); + + when(this.urlFetchService.sendRequest(any())).thenReturn(httpResponse); + Records storageRecords = this.sut.getStorageRecords(ids, recordChangeInfos); + + assertEquals(1, storageRecords.getRecords().size()); + verify(this.jobStatus).addOrUpdateRecordStatus(singletonList(RECORDS_ID2), IndexingStatus.FAIL, HttpStatus.NOT_FOUND.value(), "Partial response received from Storage service - missing records", "Partial response received from Storage service: tenant1:doc:15e790a69beb4d789b1f979e2af2e813"); + } + + @Test + public void should_returnValidJobStatus_givenFailedUnitsConversion_processRecordChangedMessageTest() throws URISyntaxException { + String validDataFromStorage = "{\"records\":[{\"id\":\"tenant1:doc:15e790a69beb4d789b1f979e2af2e813\", \"version\":1, \"kind\":\"tenant:test:test:1.0.0\"}],\"notFound\":[],\"conversionStatuses\":[{\"id\":\"tenant1:doc:15e790a69beb4d789b1f979e2af2e813\",\"status\":\"ERROR\",\"errors\":[\"crs conversion failed\"]}]}"; + List<RecordInfo> recordChangeInfos = Arrays.asList(RecordInfo.builder().id("tenant1:doc:15e790a69beb4d789b1f979e2af2e813").kind("tenant:test:test:1.0.0").op(OperationType.update.getValue()).build()); + + HttpResponse httpResponse = mock(HttpResponse.class); + when(httpResponse.getBody()).thenReturn(validDataFromStorage); + + when(this.urlFetchService.sendRequest(any())).thenReturn(httpResponse); + Records storageRecords = this.sut.getStorageRecords(singletonList(RECORDS_ID2), recordChangeInfos); + + assertEquals(1, storageRecords.getRecords().size()); + verify(this.jobStatus).addOrUpdateRecordStatus(RECORDS_ID2, IndexingStatus.WARN, HttpStatus.BAD_REQUEST.value(), "crs conversion failed", String.format("record-id: %s | %s", "tenant1:doc:15e790a69beb4d789b1f979e2af2e813", "crs conversion failed")); + } + + @Test + public void should_returnValidResponse_givenValidRecordQueryRequest_getRecordListByKind() throws Exception { + + RecordReindexRequest recordReindexRequest = RecordReindexRequest.builder().kind("tenant:test:test:1.0.0").cursor("100").build(); + + HttpResponse httpResponse = new HttpResponse(); + httpResponse.setBody(new Gson().toJson(recordReindexRequest, RecordReindexRequest.class)); + + when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); + + RecordQueryResponse recordQueryResponse = this.sut.getRecordsByKind(recordReindexRequest); + + assertEquals("100", recordQueryResponse.getCursor()); + assertNull(recordQueryResponse.getResults()); + } + + @Test + public void should_returnValidResponse_givenValidKind_getSchemaByKind() throws Exception { + + String validSchemaFromStorage = "{" + + " \"kind\": \"tenant:test:test:1.0.0\"," + + " \"schema\": [" + + " {" + + " \"path\": \"msg\"," + + " \"kind\": \"string\"" + + " }," + + " {" + + " \"path\": \"references.entity\"," + + " \"kind\": \"string\"" + + " }" + + " ]," + + " \"ext\": null" + + "}"; + String kind = "tenant:test:test:1.0.0"; + + HttpResponse httpResponse = new HttpResponse(); + httpResponse.setResponseCode(HttpStatus.OK.value()); + httpResponse.setBody(validSchemaFromStorage); + + when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); + + String recordSchemaResponse = this.sut.getStorageSchema(kind); + + assertNotNull(recordSchemaResponse); + } + + @Test + public void should_returnNullResponse_givenAbsentKind_getSchemaByKind() throws Exception { + + String kind = "tenant:test:test:1.0.0"; + + HttpResponse httpResponse = new HttpResponse(); + httpResponse.setResponseCode(HttpStatus.NOT_FOUND.value()); + + when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); + + String recordSchemaResponse = this.sut.getStorageSchema(kind); + + assertNull(recordSchemaResponse); + } + + @Test + public void should_returnOneValidRecords_givenValidData_getValidStorageRecordsWithInvalidConversionTest() throws URISyntaxException { + + String validDataFromStorage = "{\"records\":[{\"id\":\"testid\", \"version\":1, \"kind\":\"tenant:test:test:1.0.0\"}],\"notFound\":[\"invalid1\"],\"conversionStatuses\": [{\"id\":\"testid\",\"status\":\"ERROR\",\"errors\":[\"conversion error occurred\"] } ]}"; + List<RecordInfo> recordChangeInfos = Arrays.asList(RecordInfo.builder().id("testid").kind("tenant:test:test:1.0.0").op(OperationType.update.getValue()).build()); + + HttpResponse httpResponse = mock(HttpResponse.class); + when(httpResponse.getBody()).thenReturn(validDataFromStorage); + + when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); + Records storageRecords = this.sut.getStorageRecords(ids, recordChangeInfos); + + assertEquals(1, storageRecords.getRecords().size()); + + assertEquals(1, storageRecords.getConversionStatuses().get(0).getErrors().size()); + + assertEquals("conversion error occurred", storageRecords.getConversionStatuses().get(0).getErrors().get(0)); + } + + private void should_return404_getValidStorageRecordsTest() { + List<RecordInfo> recordChangeInfos = Arrays.asList(RecordInfo.builder().id("testid").kind("tenant:test:test:1.0.0").op(OperationType.update.getValue()).build()); + try { + this.sut.getStorageRecords(ids, recordChangeInfos); + fail("Should throw exception"); + } catch (AppException e) { + assertEquals(HttpStatus.NOT_FOUND.value(), e.getError().getCode()); + } catch (Exception e) { + fail("Should not throw this exception" + e.getMessage()); + } + } } \ No newline at end of file diff --git a/indexer-core/src/test/java/org/opengroup/osdu/indexer/util/geo/decimator/GeoShapeDecimationSettingTest.java b/indexer-core/src/test/java/org/opengroup/osdu/indexer/util/geo/decimator/GeoShapeDecimationSettingTest.java index 2b4ed8351c66c303b242403c063bcb5d510a0662..82fc83db7ccd0a520eabb90ea3a0f414ca0338c2 100644 --- a/indexer-core/src/test/java/org/opengroup/osdu/indexer/util/geo/decimator/GeoShapeDecimationSettingTest.java +++ b/indexer-core/src/test/java/org/opengroup/osdu/indexer/util/geo/decimator/GeoShapeDecimationSettingTest.java @@ -91,18 +91,20 @@ public class GeoShapeDecimationSettingTest { } @Test - public void isDecimationEnabled_return_false_when_property_does_not_exist() throws PartitionException { + public void isDecimationEnabled_return_true_when_property_does_not_exist() throws PartitionException { + // The feature flag is enabled by default PartitionInfo partitionInfo = new PartitionInfo(); when(this.partitionProvider.get(anyString())).thenReturn(partitionInfo); boolean enabled = sut.isDecimationEnabled(); - Assert.assertFalse(enabled); + Assert.assertTrue(enabled); } @Test - public void isDecimationEnabled_return_false_when_partitionProvider_throws_exception() throws PartitionException { + public void isDecimationEnabled_return_true_when_partitionProvider_throws_exception() throws PartitionException { + // The feature flag is enabled by default when(this.partitionProvider.get(anyString())).thenThrow(PartitionException.class); boolean enabled = sut.isDecimationEnabled(); - Assert.assertFalse(enabled); + Assert.assertTrue(enabled); } } diff --git a/indexer-core/src/test/java/org/opengroup/osdu/indexer/util/parser/GeoShapeParserTest.java b/indexer-core/src/test/java/org/opengroup/osdu/indexer/util/parser/GeoShapeParserTest.java index fdec7478428205923da22ffc9d7d53040845830f..3107c5277f67b7c7140da1e8c21173de6423da4c 100644 --- a/indexer-core/src/test/java/org/opengroup/osdu/indexer/util/parser/GeoShapeParserTest.java +++ b/indexer-core/src/test/java/org/opengroup/osdu/indexer/util/parser/GeoShapeParserTest.java @@ -89,6 +89,13 @@ public class GeoShapeParserTest { this.validateInput(this.sut::parseGeoJson, shapeJson, expectedParsedShape, Strings.EMPTY); } + @Test + public void should_parseValidWithPropertyPoint() { + String shapeJson = getGeoShapeFromFile("input/valid_point_with_property.json"); + String expectedParsedShape = getGeoShapeFromFile("expected/valid_point.json"); + this.validateInput(this.sut::parseGeoJson, shapeJson, expectedParsedShape, Strings.EMPTY); + } + @Test public void should_parseValidMultiPoint() { String shapeJson = getGeoShapeFromFile("input/valid_multi_point.json"); diff --git a/indexer-core/src/test/resources/converter/index-virtual-properties/survey_storage_data.json b/indexer-core/src/test/resources/converter/index-virtual-properties/survey_storage_data.json new file mode 100644 index 0000000000000000000000000000000000000000..3c67a707a99e9fb59a30d492569aa337fa3541bc --- /dev/null +++ b/indexer-core/src/test/resources/converter/index-virtual-properties/survey_storage_data.json @@ -0,0 +1,31 @@ +{ + "ProjectName": "NT94", + "SeismicGeometryTypeID": "opendes:reference-data--SeismicGeometryType:2D:", + "SpatialLocation": { + "AsIngestedCoordinates": { + "features": [{ + "geometry": { + "coordinates": [[[1437505, 5253656], [1437506, 5253673], [1437507, 5253689], [1437509, 5253705], [1437510, 5253722], [1437511, 5253738], [1437512, 5253754], [1437513, 5253770], [1437514, 5253786], [1437515, 5253802], [1437516, 5253818], [1437517, 5253835], [1437518, 5253851], [1437519, 5253867], [1437520, 5253883], [1437521, 5253900], [1437523, 5253918], [1437524, 5253935], [1437525, 5253952], [1437527, 5253970], [1437528, 5253987], [1437529, 5254005], [1437530, 5254022], [1437532, 5254039], [1437533, 5254057], [1437534, 5254074], [1437536, 5254091], [1437537, 5254108], [1437538, 5254126], [1437539, 5254143], [1437540, 5254160], [1437542, 5254177], [1437543, 5254195], [1437544, 5254212], [1437545, 5254229], [1437547, 5254247], [1437549, 5254265], [1437551, 5254283], [1437554, 5254301], [1437556, 5254319], [1437558, 5254337], [1437560, 5254355], [1437562, 5254373], [1437564, 5254391], [1437566, 5254409], [1437568, 5254426], [1437570, 5254444], [1437573, 5254461], [1437575, 5254479], [1437578, 5254497], [1437580, 5254514], [1437582, 5254532], [1437585, 5254549], [1437587, 5254567], [1437589, 5254585], [1437591, 5254602], [1437592, 5254620], [1437594, 5254638], [1437595, 5254655], [1437597, 5254673], [1437598, 5254691], [1437600, 5254709], [1437601, 5254726], [1437603, 5254744], [1437604, 5254762], [1437606, 5254779], [1437607, 5254797], [1437609, 5254814], [1437610, 5254832], [1437612, 5254850], [1437613, 5254867], [1437615, 5254885], [1437616, 5254902], [1437618, 5254920], [1437619, 5254938], [1437621, 5254955], [1437623, 5254973], [1437624, 5254990], [1437626, 5255008], [1437628, 5255026], [1437629, 5255043], [1437631, 5255061], [1437632, 5255078], [1437634, 5255096], [1437636, 5255114], [1437637, 5255131], [1437639, 5255149], [1437641, 5255167], [1437643, 5255184], [1437644, 5255202], [1437646, 5255220], [1437648, 5255238], [1437649, 5255255], [1437651, 5255273], [1437653, 5255291], [1437654, 5255307], [1437655, 5255324], [1437656, 5255341], [1437657, 5255357], [1437657, 5255374], [1437658, 5255391], [1437659, 5255407], [1437660, 5255424], [1437661, 5255441], [1437662, 5255458], [1437663, 5255474], [1437664, 5255490], [1437665, 5255507], [1437666, 5255523], [1437667, 5255539], [1437668, 5255556], [1437669, 5255572], [1437670, 5255588], [1437671, 5255605], [1437672, 5255621], [1437674, 5255639], [1437676, 5255656], [1437678, 5255674], [1437681, 5255692], [1437683, 5255709], [1437685, 5255727], [1437687, 5255744], [1437689, 5255762], [1437691, 5255780], [1437693, 5255797], [1437695, 5255815], [1437696, 5255832], [1437698, 5255850], [1437699, 5255868], [1437701, 5255885], [1437703, 5255903], [1437704, 5255920], [1437706, 5255938], [1437707, 5255955], [1437709, 5255973], [1437710, 5255991], [1437711, 5256008], [1437712, 5256026], [1437714, 5256044], [1437715, 5256062], [1437716, 5256079], [1437717, 5256097], [1437718, 5256115], [1437720, 5256132], [1437721, 5256150], [1437722, 5256168], [1437723, 5256185], [1437725, 5256203], [1437726, 5256220], [1437727, 5256238], [1437728, 5256256], [1437729, 5256273], [1437731, 5256291], [1437732, 5256308], [1437733, 5256326], [1437734, 5256344], [1437734, 5256363], [1437734, 5256382], [1437735, 5256400], [1437735, 5256419], [1437735, 5256437], [1437736, 5256456], [1437736, 5256474], [1437736, 5256493], [1437737, 5256511], [1437737, 5256530], [1437737, 5256548], [1437737, 5256567], [1437737, 5256585], [1437737, 5256604], [1437737, 5256622], [1437737, 5256641], [1437737, 5256659], [1437737, 5256678], [1437737, 5256696], [1437737, 5256711], [1437737, 5256727], [1437738, 5256742], [1437738, 5256758], [1437739, 5256773], [1437739, 5256789], [1437739, 5256804], [1437740, 5256820], [1437740, 5256835], [1437740, 5256851], [1437741, 5256866], [1437741, 5256882], [1437742, 5256898], [1437742, 5256914], [1437743, 5256929], [1437744, 5256945], [1437744, 5256961], [1437745, 5256977], [1437745, 5256993], [1437746, 5257008], [1437747, 5257026], [1437748, 5257043], [1437749, 5257060], [1437751, 5257078], [1437752, 5257095], [1437753, 5257113], [1437754, 5257130], [1437755, 5257147], [1437757, 5257165], [1437758, 5257182], [1437759, 5257199], [1437760, 5257217], [1437762, 5257234], [1437763, 5257251], [1437764, 5257268], [1437765, 5257286], [1437767, 5257303], [1437768, 5257320], [1437769, 5257337], [1437770, 5257355], [1437771, 5257373], [1437772, 5257391], [1437772, 5257409], [1437773, 5257427], [1437773, 5257445], [1437774, 5257463], [1437775, 5257481], [1437775, 5257499], [1437776, 5257517], [1437777, 5257535], [1437778, 5257553], [1437779, 5257571], [1437780, 5257589], [1437781, 5257607], [1437781, 5257625], [1437782, 5257643], [1437783, 5257662], [1437784, 5257680], [1437785, 5257698], [1437786, 5257716], [1437788, 5257733], [1437789, 5257750], [1437790, 5257767], [1437792, 5257784], [1437793, 5257801], [1437794, 5257818], [1437795, 5257835], [1437797, 5257852], [1437798, 5257869], [1437799, 5257886], [1437801, 5257903], [1437803, 5257920], [1437805, 5257936], [1437806, 5257953], [1437808, 5257970], [1437810, 5257987], [1437812, 5258003], [1437813, 5258020], [1437815, 5258037], [1437817, 5258053], [1437818, 5258071], [1437819, 5258088], [1437820, 5258105], [1437821, 5258123], [1437822, 5258140], [1437823, 5258158], [1437824, 5258175], [1437825, 5258192], [1437826, 5258210], [1437827, 5258227], [1437828, 5258245], [1437829, 5258262], [1437830, 5258280], [1437831, 5258297], [1437831, 5258315], [1437832, 5258333], [1437833, 5258350], [1437834, 5258368], [1437835, 5258385], [1437836, 5258403], [1437836, 5258420], [1437836, 5258437], [1437836, 5258454], [1437836, 5258471], [1437836, 5258488], [1437836, 5258505], [1437836, 5258522], [1437836, 5258539], [1437836, 5258556], [1437836, 5258573], [1437837, 5258590], [1437837, 5258607], [1437837, 5258624], [1437837, 5258641], [1437837, 5258658], [1437837, 5258675], [1437837, 5258692], [1437837, 5258709], [1437837, 5258726], [1437837, 5258743], [1437835, 5258760], [1437833, 5258777], [1437831, 5258794], [1437829, 5258812], [1437827, 5258829], [1437825, 5258846], [1437823, 5258863], [1437821, 5258880], [1437819, 5258897], [1437817, 5258915], [1437815, 5258932], [1437813, 5258948], [1437811, 5258965], [1437809, 5258982], [1437807, 5258999], [1437805, 5259016], [1437803, 5259033], [1437801, 5259050], [1437799, 5259067], [1437797, 5259084], [1437798, 5259101], [1437799, 5259119], [1437800, 5259136], [1437802, 5259153], [1437803, 5259170], [1437804, 5259188], [1437805, 5259205], [1437806, 5259222], [1437808, 5259239], [1437809, 5259257], [1437810, 5259274], [1437812, 5259291], [1437813, 5259309], [1437815, 5259326], [1437816, 5259343], [1437818, 5259361], [1437819, 5259378], [1437821, 5259396], [1437822, 5259413], [1437824, 5259430], [1437821, 5259448], [1437819, 5259465], [1437817, 5259482], [1437815, 5259499], [1437812, 5259516], [1437810, 5259533], [1437808, 5259551], [1437805, 5259568], [1437803, 5259585], [1437801, 5259602], [1437798, 5259619], [1437796, 5259636], [1437793, 5259653], [1437791, 5259670], [1437789, 5259687], [1437786, 5259704], [1437784, 5259721], [1437781, 5259738], [1437779, 5259754]], [[1441649, 5255483], [1441648, 5255500], [1441648, 5255517], [1441647, 5255535], [1441647, 5255552], [1441647, 5255569], [1441646, 5255587], [1441646, 5255604], [1441645, 5255621], [1441645, 5255639], [1441645, 5255656], [1441644, 5255673], [1441644, 5255690], [1441643, 5255707], [1441643, 5255725], [1441643, 5255742], [1441642, 5255759], [1441642, 5255776], [1441641, 5255794], [1441641, 5255810], [1441641, 5255827], [1441640, 5255844], [1441640, 5255861], [1441640, 5255878], [1441639, 5255895], [1441639, 5255912], [1441638, 5255929], [1441638, 5255946], [1441638, 5255963], [1441637, 5255980], [1441636, 5255997], [1441636, 5256014], [1441635, 5256031], [1441634, 5256048], [1441634, 5256065], [1441633, 5256082], [1441633, 5256098], [1441632, 5256115], [1441631, 5256132], [1441631, 5256150], [1441631, 5256168], [1441631, 5256186], [1441632, 5256204], [1441632, 5256222], [1441632, 5256240], [1441632, 5256258], [1441632, 5256276], [1441632, 5256294], [1441632, 5256312], [1441632, 5256330], [1441631, 5256348], [1441631, 5256366], [1441631, 5256384], [1441630, 5256402], [1441630, 5256419], [1441630, 5256437], [1441629, 5256455], [1441629, 5256473], [1441629, 5256491], [1441628, 5256509], [1441628, 5256527], [1441627, 5256545], [1441627, 5256562], [1441627, 5256580], [1441626, 5256598], [1441626, 5256616], [1441625, 5256634], [1441625, 5256652], [1441625, 5256670], [1441624, 5256687], [1441624, 5256705], [1441623, 5256723], [1441623, 5256740], [1441623, 5256758], [1441622, 5256776], [1441622, 5256793], [1441621, 5256811], [1441621, 5256829], [1441621, 5256846], [1441621, 5256864], [1441621, 5256882], [1441622, 5256900], [1441622, 5256917], [1441622, 5256935], [1441623, 5256953], [1441623, 5256971], [1441623, 5256989], [1441623, 5257006], [1441624, 5257024], [1441624, 5257042], [1441624, 5257060], [1441624, 5257077], [1441624, 5257095], [1441624, 5257113], [1441624, 5257130], [1441624, 5257148], [1441625, 5257166], [1441625, 5257183], [1441625, 5257201], [1441626, 5257218], [1441627, 5257235], [1441627, 5257252], [1441628, 5257269], [1441629, 5257285], [1441630, 5257302], [1441631, 5257319], [1441632, 5257336], [1441633, 5257353], [1441634, 5257370], [1441635, 5257387], [1441636, 5257404], [1441636, 5257421], [1441637, 5257438], [1441638, 5257455], [1441639, 5257472], [1441640, 5257489], [1441641, 5257506], [1441641, 5257523], [1441642, 5257540], [1441642, 5257558], [1441642, 5257576], [1441642, 5257594], [1441642, 5257612], [1441642, 5257630], [1441642, 5257648], [1441642, 5257665], [1441642, 5257683], [1441642, 5257701], [1441642, 5257719], [1441642, 5257737], [1441642, 5257756], [1441642, 5257774], [1441643, 5257792], [1441643, 5257810], [1441643, 5257828], [1441643, 5257847], [1441643, 5257865], [1441643, 5257883], [1441643, 5257901], [1441644, 5257919], [1441646, 5257936], [1441647, 5257953], [1441648, 5257971], [1441650, 5257988], [1441651, 5258005], [1441652, 5258023], [1441654, 5258040], [1441655, 5258058], [1441656, 5258075], [1441657, 5258092], [1441658, 5258109], [1441659, 5258126], [1441660, 5258143], [1441661, 5258160], [1441662, 5258177], [1441663, 5258194], [1441664, 5258211], [1441665, 5258228], [1441666, 5258245], [1441666, 5258262], [1441667, 5258278], [1441667, 5258294], [1441668, 5258311], [1441668, 5258327], [1441668, 5258343], [1441669, 5258360], [1441669, 5258376], [1441669, 5258392], [1441670, 5258409], [1441670, 5258425], [1441670, 5258442], [1441671, 5258459], [1441671, 5258475], [1441671, 5258492], [1441671, 5258509], [1441672, 5258525], [1441672, 5258542], [1441672, 5258559], [1441672, 5258575], [1441673, 5258593], [1441673, 5258611], [1441673, 5258629], [1441674, 5258647], [1441674, 5258665], [1441674, 5258683], [1441675, 5258701], [1441675, 5258718], [1441675, 5258736], [1441676, 5258754], [1441676, 5258772], [1441676, 5258790], [1441676, 5258808], [1441676, 5258826], [1441677, 5258844], [1441677, 5258862], [1441677, 5258880], [1441677, 5258897], [1441677, 5258915], [1441677, 5258933], [1441678, 5258950], [1441678, 5258967], [1441679, 5258983], [1441679, 5259000], [1441680, 5259017], [1441680, 5259033], [1441681, 5259050], [1441681, 5259067], [1441682, 5259083], [1441682, 5259100], [1441683, 5259117], [1441684, 5259134], [1441684, 5259151], [1441685, 5259168], [1441685, 5259185], [1441686, 5259202], [1441687, 5259219], [1441687, 5259236], [1441688, 5259253], [1441688, 5259270], [1441689, 5259287], [1441689, 5259304], [1441689, 5259321], [1441689, 5259338], [1441690, 5259355], [1441690, 5259372], [1441690, 5259389], [1441690, 5259406], [1441691, 5259423], [1441691, 5259440], [1441691, 5259457], [1441692, 5259475], [1441692, 5259492], [1441692, 5259509], [1441693, 5259526], [1441693, 5259544], [1441693, 5259561], [1441694, 5259578], [1441694, 5259595], [1441694, 5259613], [1441696, 5259630], [1441697, 5259647], [1441698, 5259665], [1441699, 5259682], [1441700, 5259699], [1441701, 5259717], [1441702, 5259734], [1441703, 5259751], [1441704, 5259769], [1441705, 5259786], [1441707, 5259803], [1441708, 5259821], [1441710, 5259838], [1441711, 5259855], [1441713, 5259872], [1441714, 5259890], [1441716, 5259907], [1441717, 5259924], [1441719, 5259941], [1441720, 5259959], [1441721, 5259976], [1441722, 5259993], [1441723, 5260011], [1441724, 5260028], [1441725, 5260045], [1441726, 5260063], [1441727, 5260080], [1441728, 5260097], [1441729, 5260115], [1441730, 5260132], [1441731, 5260150], [1441732, 5260167], [1441732, 5260185], [1441733, 5260202], [1441734, 5260220], [1441734, 5260238], [1441735, 5260255], [1441736, 5260273], [1441737, 5260290], [1441737, 5260308], [1441738, 5260325], [1441738, 5260343], [1441739, 5260360], [1441739, 5260377], [1441740, 5260395], [1441740, 5260412], [1441740, 5260429], [1441741, 5260447], [1441741, 5260464], [1441742, 5260481], [1441742, 5260499], [1441742, 5260516], [1441742, 5260533], [1441742, 5260550], [1441743, 5260567], [1441743, 5260585], [1441743, 5260602], [1441743, 5260619], [1441743, 5260636], [1441743, 5260654], [1441744, 5260671], [1441745, 5260688], [1441746, 5260705], [1441747, 5260722], [1441748, 5260739], [1441749, 5260756], [1441750, 5260773], [1441751, 5260790], [1441752, 5260807], [1441753, 5260824], [1441753, 5260841], [1441754, 5260858], [1441755, 5260875], [1441756, 5260892], [1441756, 5260909], [1441757, 5260926], [1441758, 5260943], [1441759, 5260960], [1441759, 5260977], [1441760, 5260994], [1441760, 5261011], [1441760, 5261028], [1441760, 5261045], [1441761, 5261062], [1441761, 5261078], [1441761, 5261095], [1441761, 5261112], [1441761, 5261129], [1441761, 5261146], [1441761, 5261163], [1441761, 5261180], [1441761, 5261197], [1441761, 5261214], [1441760, 5261231], [1441760, 5261248], [1441760, 5261265], [1441760, 5261282], [1441759, 5261299], [1441759, 5261316], [1441759, 5261333], [1441760, 5261350], [1441760, 5261367], [1441761, 5261384], [1441761, 5261401], [1441762, 5261418], [1441762, 5261435], [1441763, 5261452], [1441764, 5261469], [1441764, 5261486], [1441765, 5261503], [1441765, 5261520], [1441766, 5261538], [1441766, 5261555], [1441767, 5261572], [1441767, 5261590], [1441768, 5261607], [1441768, 5261624], [1441769, 5261642], [1441769, 5261659], [1441770, 5261676], [1441770, 5261694], [1441771, 5261711], [1441771, 5261728], [1441772, 5261745], [1441772, 5261763], [1441772, 5261780], [1441773, 5261797], [1441773, 5261814], [1441774, 5261832], [1441774, 5261849], [1441775, 5261866], [1441775, 5261883], [1441776, 5261901], [1441776, 5261918], [1441777, 5261935], [1441778, 5261953], [1441778, 5261970], [1441779, 5261988], [1441779, 5262005], [1441780, 5262022], [1441781, 5262039], [1441781, 5262057], [1441782, 5262074], [1441783, 5262091], [1441784, 5262108], [1441784, 5262126], [1441785, 5262143], [1441786, 5262160], [1441787, 5262177], [1441787, 5262195], [1441788, 5262212], [1441788, 5262230], [1441789, 5262248], [1441789, 5262265], [1441790, 5262283], [1441790, 5262301], [1441791, 5262318], [1441791, 5262336], [1441792, 5262354], [1441792, 5262371], [1441793, 5262389], [1441793, 5262407], [1441793, 5262425], [1441793, 5262443], [1441793, 5262461], [1441793, 5262479], [1441794, 5262497], [1441794, 5262515], [1441794, 5262532], [1441794, 5262550], [1441794, 5262568], [1441795, 5262585], [1441795, 5262603], [1441796, 5262621], [1441796, 5262638], [1441797, 5262656], [1441797, 5262673], [1441797, 5262691], [1441798, 5262708], [1441798, 5262726], [1441803, 5262742], [1441808, 5262758], [1441812, 5262774], [1441817, 5262790], [1441822, 5262806], [1441826, 5262823]], [[1447499, 5260244], [1447484, 5260255], [1447469, 5260267], [1447455, 5260278], [1447440, 5260289], [1447425, 5260301], [1447410, 5260312], [1447396, 5260324], [1447381, 5260336], [1447367, 5260347], [1447352, 5260359], [1447337, 5260371], [1447323, 5260382], [1447308, 5260394], [1447294, 5260406], [1447279, 5260418], [1447265, 5260429], [1447251, 5260442], [1447237, 5260455], [1447224, 5260467], [1447210, 5260480], [1447196, 5260493], [1447183, 5260505], [1447169, 5260518], [1447156, 5260531], [1447142, 5260543], [1447128, 5260556], [1447115, 5260569], [1447101, 5260582], [1447088, 5260594], [1447074, 5260607], [1447061, 5260620], [1447047, 5260632], [1447034, 5260645], [1447020, 5260658], [1447007, 5260671], [1446993, 5260683], [1446981, 5260697], [1446968, 5260710], [1446956, 5260724], [1446944, 5260738], [1446931, 5260751], [1446919, 5260765], [1446907, 5260778], [1446894, 5260792], [1446882, 5260806], [1446870, 5260819], [1446857, 5260833], [1446845, 5260846], [1446832, 5260859], [1446820, 5260872], [1446808, 5260886], [1446795, 5260899], [1446783, 5260912], [1446770, 5260926], [1446758, 5260939], [1446746, 5260952], [1446733, 5260964], [1446720, 5260977], [1446707, 5260989], [1446695, 5261002], [1446682, 5261014], [1446669, 5261026], [1446657, 5261039], [1446644, 5261051], [1446631, 5261064], [1446618, 5261076], [1446605, 5261089], [1446592, 5261101], [1446579, 5261114], [1446566, 5261126], [1446553, 5261139], [1446540, 5261152], [1446527, 5261164], [1446514, 5261177], [1446501, 5261189], [1446488, 5261202], [1446471, 5261209], [1446453, 5261217], [1446436, 5261224], [1446419, 5261231], [1446401, 5261239], [1446384, 5261246], [1446367, 5261254], [1446349, 5261261], [1446332, 5261268], [1446315, 5261276], [1446297, 5261283], [1446279, 5261290], [1446261, 5261298], [1446243, 5261305], [1446225, 5261312], [1446207, 5261319], [1446189, 5261327], [1446171, 5261334], [1446153, 5261341], [1446135, 5261349], [1446119, 5261356], [1446102, 5261364], [1446086, 5261372], [1446069, 5261380], [1446053, 5261387], [1446036, 5261395], [1446020, 5261403], [1446003, 5261410], [1445986, 5261418], [1445970, 5261426], [1445954, 5261434], [1445937, 5261441], [1445921, 5261449], [1445905, 5261456], [1445888, 5261464], [1445872, 5261472], [1445856, 5261479], [1445840, 5261487], [1445823, 5261495], [1445807, 5261502], [1445791, 5261510], [1445774, 5261518], [1445758, 5261525], [1445742, 5261533], [1445725, 5261540], [1445709, 5261548], [1445692, 5261556], [1445676, 5261563], [1445660, 5261571], [1445643, 5261579], [1445627, 5261586], [1445610, 5261594], [1445594, 5261601], [1445577, 5261609], [1445561, 5261617], [1445544, 5261624], [1445527, 5261632], [1445511, 5261640], [1445494, 5261647], [1445478, 5261655], [1445462, 5261663], [1445446, 5261672], [1445430, 5261680], [1445415, 5261688], [1445399, 5261696], [1445383, 5261705], [1445367, 5261713], [1445351, 5261721], [1445335, 5261730], [1445320, 5261738], [1445303, 5261746], [1445287, 5261755], [1445271, 5261763], [1445255, 5261771], [1445239, 5261780], [1445223, 5261788], [1445207, 5261796], [1445190, 5261804], [1445174, 5261813], [1445158, 5261821], [1445141, 5261828], [1445123, 5261834], [1445106, 5261841], [1445089, 5261848], [1445071, 5261855], [1445054, 5261861], [1445036, 5261868], [1445019, 5261875], [1445001, 5261882], [1444984, 5261888], [1444967, 5261895], [1444949, 5261902], [1444932, 5261909], [1444915, 5261916], [1444898, 5261923], [1444880, 5261930], [1444863, 5261937], [1444846, 5261944], [1444829, 5261951], [1444811, 5261958], [1444795, 5261966], [1444778, 5261974], [1444762, 5261982], [1444745, 5261990], [1444728, 5261998], [1444712, 5262005], [1444695, 5262013], [1444678, 5262021], [1444662, 5262029], [1444645, 5262037], [1444628, 5262045], [1444611, 5262053], [1444594, 5262060], [1444577, 5262068], [1444560, 5262075], [1444543, 5262083], [1444526, 5262091], [1444510, 5262098], [1444493, 5262106], [1444476, 5262114], [1444459, 5262122], [1444442, 5262130], [1444424, 5262138], [1444407, 5262147], [1444390, 5262155], [1444373, 5262163], [1444356, 5262172], [1444339, 5262180], [1444322, 5262188], [1444305, 5262196], [1444288, 5262204], [1444271, 5262212], [1444254, 5262220], [1444237, 5262228], [1444220, 5262236], [1444202, 5262244], [1444185, 5262252], [1444168, 5262260], [1444151, 5262268], [1444134, 5262276], [1444118, 5262284], [1444102, 5262291], [1444085, 5262299], [1444069, 5262307], [1444053, 5262315], [1444037, 5262322], [1444021, 5262330], [1444005, 5262338], [1443989, 5262346], [1443973, 5262353], [1443956, 5262361], [1443940, 5262368], [1443924, 5262375], [1443907, 5262382], [1443891, 5262390], [1443875, 5262397], [1443859, 5262404], [1443842, 5262412], [1443826, 5262419], [1443810, 5262426], [1443793, 5262433], [1443777, 5262440], [1443761, 5262447], [1443745, 5262455], [1443728, 5262462], [1443712, 5262469], [1443696, 5262476], [1443679, 5262483], [1443663, 5262490], [1443647, 5262497], [1443630, 5262504], [1443614, 5262511], [1443597, 5262518], [1443581, 5262525], [1443565, 5262532], [1443548, 5262539], [1443532, 5262546], [1443515, 5262553], [1443499, 5262560], [1443482, 5262567], [1443466, 5262574], [1443449, 5262581], [1443432, 5262589], [1443416, 5262596], [1443399, 5262604], [1443383, 5262611], [1443366, 5262618], [1443349, 5262626], [1443333, 5262633], [1443316, 5262641], [1443299, 5262648], [1443282, 5262656], [1443266, 5262663], [1443249, 5262671], [1443232, 5262679], [1443215, 5262686], [1443199, 5262694], [1443182, 5262702], [1443165, 5262709], [1443148, 5262717], [1443131, 5262724], [1443114, 5262732], [1443097, 5262740], [1443080, 5262747], [1443063, 5262755], [1443046, 5262762], [1443029, 5262770], [1443012, 5262778], [1442995, 5262785], [1442978, 5262793], [1442961, 5262801], [1442944, 5262808], [1442927, 5262816], [1442910, 5262824], [1442893, 5262832], [1442877, 5262839], [1442860, 5262847], [1442843, 5262855], [1442826, 5262862], [1442809, 5262870], [1442794, 5262881], [1442779, 5262891], [1442764, 5262902], [1442749, 5262913], [1442735, 5262923], [1442720, 5262934], [1442705, 5262945], [1442690, 5262955], [1442675, 5262966], [1442660, 5262977], [1442645, 5262987], [1442630, 5262998], [1442616, 5263008], [1442601, 5263019], [1442586, 5263029]], [[1431201, 5252840], [1431218, 5252846], [1431235, 5252853], [1431252, 5252859], [1431269, 5252865], [1431286, 5252871], [1431303, 5252878], [1431320, 5252884], [1431336, 5252890], [1431353, 5252896], [1431369, 5252902], [1431385, 5252908], [1431402, 5252914], [1431418, 5252920], [1431435, 5252925], [1431451, 5252931], [1431468, 5252937], [1431485, 5252943], [1431502, 5252949], [1431519, 5252955], [1431537, 5252961], [1431554, 5252967], [1431571, 5252973], [1431589, 5252979], [1431606, 5252985], [1431623, 5252991], [1431640, 5252997], [1431657, 5253003], [1431674, 5253009], [1431691, 5253014], [1431708, 5253020], [1431725, 5253026], [1431742, 5253032], [1431759, 5253037], [1431776, 5253043], [1431793, 5253049], [1431810, 5253055], [1431826, 5253061], [1431843, 5253067], [1431859, 5253073], [1431876, 5253078], [1431892, 5253084], [1431908, 5253090], [1431925, 5253096], [1431941, 5253102], [1431958, 5253108], [1431974, 5253114], [1431990, 5253120], [1432007, 5253126], [1432023, 5253132], [1432039, 5253138], [1432055, 5253144], [1432072, 5253150], [1432088, 5253156], [1432104, 5253162], [1432120, 5253168], [1432136, 5253174], [1432153, 5253179], [1432170, 5253185], [1432186, 5253191], [1432203, 5253196], [1432220, 5253202], [1432237, 5253208], [1432253, 5253213], [1432270, 5253219], [1432287, 5253224], [1432303, 5253230], [1432320, 5253236], [1432337, 5253241], [1432353, 5253247], [1432370, 5253253], [1432386, 5253258], [1432403, 5253264], [1432420, 5253269], [1432436, 5253275], [1432453, 5253281], [1432470, 5253286], [1432486, 5253291], [1432503, 5253296], [1432519, 5253301], [1432536, 5253305], [1432552, 5253310], [1432569, 5253315], [1432585, 5253319], [1432601, 5253324], [1432618, 5253329], [1432634, 5253334], [1432651, 5253338], [1432667, 5253342], [1432684, 5253347], [1432700, 5253351], [1432716, 5253356], [1432733, 5253360], [1432749, 5253364], [1432766, 5253369], [1432782, 5253373], [1432799, 5253378], [1432816, 5253382], [1432833, 5253387], [1432850, 5253392], [1432867, 5253397], [1432884, 5253401], [1432901, 5253406], [1432918, 5253411], [1432936, 5253416], [1432953, 5253420], [1432970, 5253425], [1432987, 5253430], [1433004, 5253435], [1433021, 5253439], [1433039, 5253444], [1433056, 5253449], [1433073, 5253454], [1433090, 5253458], [1433108, 5253463], [1433125, 5253468], [1433142, 5253473], [1433158, 5253477], [1433175, 5253481], [1433191, 5253486], [1433207, 5253490], [1433223, 5253495], [1433240, 5253499], [1433256, 5253503], [1433272, 5253508], [1433288, 5253512], [1433305, 5253517], [1433321, 5253521], [1433337, 5253525], [1433353, 5253530], [1433369, 5253534], [1433386, 5253539], [1433402, 5253543], [1433418, 5253547], [1433434, 5253552], [1433451, 5253556], [1433467, 5253561], [1433484, 5253566], [1433500, 5253572], [1433517, 5253578], [1433534, 5253584], [1433551, 5253590], [1433568, 5253596], [1433584, 5253602], [1433601, 5253608], [1433618, 5253614], [1433635, 5253620], [1433652, 5253626], [1433669, 5253631], [1433687, 5253637], [1433704, 5253643], [1433721, 5253648], [1433738, 5253654], [1433756, 5253660], [1433773, 5253665], [1433790, 5253671], [1433807, 5253677], [1433824, 5253682], [1433840, 5253687], [1433856, 5253692], [1433872, 5253697], [1433888, 5253702], [1433904, 5253707], [1433920, 5253712], [1433936, 5253717], [1433952, 5253722], [1433968, 5253727], [1433985, 5253732], [1434002, 5253737], [1434018, 5253741], [1434035, 5253746], [1434052, 5253751], [1434069, 5253756], [1434085, 5253760], [1434102, 5253765], [1434119, 5253770], [1434135, 5253774], [1434153, 5253780], [1434170, 5253786], [1434188, 5253791], [1434205, 5253797], [1434222, 5253803], [1434240, 5253808], [1434257, 5253814], [1434274, 5253820], [1434292, 5253825], [1434309, 5253831], [1434327, 5253836], [1434344, 5253842], [1434362, 5253848], [1434379, 5253853], [1434397, 5253859], [1434414, 5253865], [1434432, 5253870], [1434449, 5253876], [1434467, 5253882], [1434484, 5253887], [1434500, 5253893], [1434516, 5253899], [1434532, 5253904], [1434548, 5253910], [1434564, 5253916], [1434580, 5253922], [1434595, 5253927], [1434611, 5253933], [1434627, 5253939], [1434643, 5253944], [1434659, 5253950], [1434675, 5253955], [1434691, 5253960], [1434707, 5253966], [1434723, 5253971], [1434739, 5253976], [1434754, 5253981], [1434770, 5253987], [1434786, 5253992], [1434802, 5253997], [1434818, 5254003], [1434835, 5254009], [1434851, 5254015], [1434867, 5254021], [1434883, 5254027], [1434899, 5254033], [1434916, 5254039], [1434932, 5254045], [1434948, 5254051], [1434964, 5254057], [1434980, 5254062], [1434997, 5254068], [1435013, 5254073], [1435029, 5254079], [1435045, 5254085], [1435062, 5254090], [1435078, 5254096], [1435094, 5254102], [1435110, 5254107], [1435126, 5254113], [1435142, 5254118], [1435158, 5254124], [1435174, 5254130], [1435190, 5254135], [1435205, 5254141], [1435221, 5254146], [1435237, 5254152], [1435253, 5254158], [1435269, 5254163], [1435285, 5254169], [1435301, 5254175], [1435317, 5254181], [1435333, 5254187], [1435349, 5254192], [1435365, 5254198], [1435381, 5254204], [1435397, 5254210], [1435414, 5254216], [1435430, 5254222], [1435446, 5254228], [1435462, 5254234], [1435479, 5254240], [1435495, 5254246], [1435512, 5254252], [1435528, 5254258], [1435545, 5254264], [1435562, 5254270], [1435578, 5254276], [1435595, 5254282], [1435611, 5254288], [1435628, 5254293], [1435644, 5254299], [1435661, 5254305], [1435677, 5254311], [1435693, 5254316], [1435710, 5254322], [1435726, 5254328], [1435743, 5254333], [1435759, 5254339], [1435776, 5254345], [1435793, 5254351], [1435810, 5254357], [1435827, 5254364], [1435845, 5254370], [1435862, 5254376], [1435879, 5254382], [1435896, 5254388], [1435913, 5254394], [1435930, 5254401], [1435948, 5254407], [1435964, 5254413], [1435981, 5254419], [1435998, 5254425], [1436015, 5254431], [1436032, 5254437], [1436049, 5254443], [1436066, 5254449], [1436083, 5254454], [1436099, 5254460], [1436116, 5254466], [1436133, 5254472], [1436150, 5254478], [1436167, 5254484], [1436184, 5254490], [1436201, 5254496], [1436218, 5254502], [1436235, 5254508], [1436252, 5254514], [1436269, 5254520], [1436286, 5254526], [1436302, 5254532], [1436319, 5254537], [1436335, 5254543], [1436352, 5254549], [1436368, 5254555], [1436385, 5254560], [1436402, 5254566], [1436418, 5254572], [1436435, 5254577], [1436451, 5254583], [1436467, 5254588], [1436483, 5254593], [1436498, 5254598], [1436514, 5254603], [1436530, 5254608], [1436546, 5254613], [1436561, 5254618], [1436577, 5254623], [1436593, 5254628], [1436609, 5254633], [1436624, 5254638], [1436640, 5254643], [1436656, 5254649], [1436672, 5254654], [1436688, 5254659], [1436704, 5254665], [1436719, 5254670], [1436735, 5254676], [1436751, 5254681], [1436767, 5254686], [1436784, 5254692], [1436801, 5254698], [1436818, 5254704], [1436835, 5254710], [1436852, 5254716], [1436870, 5254722], [1436887, 5254728], [1436904, 5254734], [1436921, 5254740], [1436938, 5254746], [1436955, 5254752], [1436973, 5254758], [1436990, 5254764], [1437007, 5254770], [1437025, 5254776], [1437042, 5254782], [1437059, 5254788], [1437077, 5254794], [1437094, 5254800], [1437112, 5254806], [1437128, 5254811], [1437144, 5254817], [1437160, 5254822], [1437177, 5254828], [1437193, 5254834], [1437209, 5254839], [1437226, 5254845], [1437242, 5254850], [1437258, 5254856], [1437275, 5254862], [1437291, 5254867], [1437307, 5254872], [1437323, 5254877], [1437339, 5254883], [1437356, 5254888], [1437372, 5254893], [1437388, 5254899], [1437404, 5254904], [1437421, 5254909], [1437437, 5254914], [1437453, 5254920], [1437469, 5254925], [1437486, 5254931], [1437502, 5254936], [1437518, 5254941], [1437535, 5254947], [1437551, 5254952], [1437567, 5254958], [1437584, 5254963], [1437600, 5254968], [1437616, 5254974], [1437633, 5254979], [1437649, 5254985], [1437665, 5254991], [1437682, 5254996], [1437698, 5255002], [1437715, 5255008], [1437731, 5255013], [1437747, 5255019], [1437764, 5255024], [1437781, 5255030], [1437797, 5255036], [1437814, 5255041], [1437831, 5255047], [1437848, 5255052], [1437865, 5255058], [1437881, 5255064], [1437898, 5255069], [1437915, 5255075], [1437932, 5255081], [1437949, 5255086], [1437966, 5255091], [1437983, 5255097], [1437999, 5255102], [1438016, 5255107], [1438033, 5255113]], [[1434108, 5255930], [1434125, 5255935], [1434142, 5255941], [1434159, 5255947], [1434176, 5255953], [1434193, 5255959], [1434210, 5255965], [1434227, 5255971], [1434243, 5255977], [1434260, 5255983], [1434277, 5255989], [1434294, 5255995], [1434310, 5256001], [1434327, 5256007], [1434344, 5256013], [1434360, 5256019], [1434377, 5256025], [1434394, 5256031], [1434411, 5256037], [1434428, 5256043], [1434445, 5256048], [1434462, 5256054], [1434479, 5256060], [1434496, 5256065], [1434513, 5256071], [1434530, 5256077], [1434547, 5256083], [1434564, 5256088], [1434581, 5256094], [1434598, 5256100], [1434615, 5256105], [1434632, 5256111], [1434649, 5256117], [1434666, 5256122], [1434683, 5256128], [1434700, 5256134], [1434717, 5256139], [1434733, 5256145], [1434750, 5256151], [1434767, 5256156], [1434783, 5256161], [1434800, 5256166], [1434816, 5256172], [1434833, 5256177], [1434849, 5256182], [1434866, 5256187], [1434882, 5256193], [1434899, 5256198], [1434915, 5256203], [1434931, 5256209], [1434948, 5256214], [1434964, 5256219], [1434980, 5256225], [1434996, 5256230], [1435013, 5256236], [1435029, 5256241], [1435045, 5256246], [1435061, 5256252], [1435078, 5256257], [1435095, 5256262], [1435112, 5256267], [1435130, 5256272], [1435147, 5256277], [1435165, 5256282], [1435182, 5256287], [1435200, 5256292], [1435217, 5256297], [1435235, 5256302], [1435252, 5256307], [1435269, 5256312], [1435286, 5256318], [1435304, 5256323], [1435321, 5256329], [1435338, 5256334], [1435355, 5256339], [1435372, 5256345], [1435389, 5256350], [1435406, 5256356], [1435423, 5256361], [1435440, 5256366], [1435457, 5256372], [1435474, 5256377], [1435490, 5256382], [1435507, 5256388], [1435524, 5256393], [1435541, 5256398], [1435557, 5256403], [1435574, 5256409], [1435591, 5256414], [1435607, 5256419], [1435624, 5256425], [1435640, 5256430], [1435657, 5256436], [1435673, 5256441], [1435690, 5256446], [1435706, 5256452], [1435722, 5256457], [1435739, 5256463], [1435755, 5256468], [1435772, 5256473], [1435788, 5256478], [1435804, 5256483], [1435820, 5256488], [1435837, 5256493], [1435853, 5256498], [1435869, 5256502], [1435885, 5256507], [1435902, 5256512], [1435918, 5256517], [1435934, 5256522], [1435950, 5256527], [1435966, 5256532], [1435982, 5256537], [1435998, 5256543], [1436014, 5256548], [1436030, 5256553], [1436046, 5256558], [1436062, 5256563], [1436078, 5256568], [1436095, 5256574], [1436112, 5256580], [1436129, 5256587], [1436147, 5256593], [1436164, 5256599], [1436181, 5256606], [1436198, 5256612], [1436215, 5256618], [1436232, 5256624], [1436250, 5256631], [1436266, 5256637], [1436283, 5256643], [1436300, 5256650], [1436317, 5256656], [1436334, 5256662], [1436350, 5256669], [1436367, 5256675], [1436384, 5256681], [1436401, 5256687], [1436417, 5256694], [1436434, 5256699], [1436451, 5256704], [1436468, 5256710], [1436484, 5256715], [1436501, 5256720], [1436518, 5256725], [1436534, 5256731], [1436551, 5256736], [1436568, 5256741], [1436585, 5256747], [1436601, 5256752], [1436618, 5256757], [1436635, 5256763], [1436651, 5256768], [1436668, 5256773], [1436684, 5256779], [1436701, 5256784], [1436718, 5256790], [1436734, 5256795], [1436751, 5256800], [1436767, 5256806], [1436784, 5256811], [1436800, 5256816], [1436816, 5256822], [1436832, 5256827], [1436848, 5256832], [1436865, 5256837], [1436881, 5256843], [1436897, 5256848], [1436913, 5256853], [1436929, 5256858], [1436946, 5256864], [1436962, 5256869], [1436978, 5256874], [1436994, 5256880], [1437010, 5256885], [1437026, 5256890], [1437042, 5256895], [1437058, 5256901], [1437074, 5256906], [1437091, 5256912], [1437107, 5256917], [1437124, 5256923], [1437140, 5256929], [1437157, 5256934], [1437173, 5256940], [1437190, 5256946], [1437207, 5256952], [1437223, 5256957], [1437240, 5256963], [1437257, 5256969], [1437274, 5256974], [1437291, 5256980], [1437308, 5256986], [1437326, 5256991], [1437343, 5256997], [1437360, 5257003], [1437377, 5257008], [1437394, 5257014], [1437412, 5257019], [1437429, 5257025], [1437446, 5257030], [1437464, 5257035], [1437481, 5257041], [1437499, 5257046], [1437516, 5257051], [1437533, 5257057], [1437551, 5257062], [1437568, 5257067], [1437585, 5257072], [1437603, 5257078], [1437620, 5257083], [1437637, 5257089], [1437654, 5257094], [1437671, 5257099], [1437688, 5257105], [1437705, 5257110], [1437723, 5257116], [1437740, 5257121], [1437757, 5257126], [1437773, 5257133], [1437790, 5257139], [1437806, 5257145], [1437823, 5257152], [1437839, 5257158], [1437856, 5257164], [1437872, 5257170], [1437888, 5257177], [1437905, 5257183], [1437921, 5257189], [1437938, 5257195], [1437954, 5257201], [1437971, 5257207], [1437987, 5257213], [1438004, 5257219], [1438020, 5257225], [1438037, 5257231], [1438053, 5257237], [1438070, 5257243], [1438086, 5257249], [1438102, 5257253], [1438119, 5257258], [1438135, 5257262], [1438152, 5257267], [1438168, 5257272], [1438184, 5257276], [1438201, 5257281], [1438217, 5257285], [1438234, 5257290], [1438250, 5257295], [1438267, 5257299], [1438283, 5257303], [1438299, 5257308], [1438316, 5257312], [1438332, 5257317], [1438349, 5257321], [1438365, 5257325], [1438382, 5257330], [1438398, 5257334], [1438414, 5257339], [1438430, 5257345], [1438446, 5257352], [1438462, 5257359], [1438477, 5257366], [1438493, 5257373], [1438509, 5257380], [1438525, 5257387], [1438541, 5257394], [1438556, 5257401], [1438572, 5257408], [1438588, 5257415], [1438604, 5257422], [1438619, 5257429], [1438635, 5257436], [1438651, 5257444], [1438666, 5257451], [1438682, 5257458], [1438698, 5257465], [1438714, 5257472], [1438729, 5257479], [1438745, 5257486], [1438760, 5257494], [1438775, 5257501], [1438790, 5257508], [1438806, 5257515], [1438821, 5257522], [1438836, 5257529], [1438852, 5257536], [1438867, 5257544], [1438882, 5257551], [1438897, 5257558], [1438912, 5257565], [1438927, 5257572], [1438942, 5257579], [1438957, 5257586], [1438972, 5257593], [1438987, 5257601], [1439003, 5257608], [1439018, 5257615], [1439033, 5257622], [1439049, 5257628], [1439066, 5257634], [1439082, 5257641], [1439098, 5257647], [1439115, 5257653], [1439131, 5257660], [1439148, 5257666], [1439164, 5257672], [1439181, 5257678], [1439197, 5257685], [1439214, 5257691], [1439230, 5257697], [1439247, 5257704], [1439264, 5257710], [1439280, 5257716], [1439297, 5257722], [1439314, 5257729], [1439330, 5257735], [1439347, 5257741], [1439364, 5257747], [1439380, 5257753], [1439397, 5257759], [1439413, 5257764], [1439430, 5257770], [1439446, 5257775], [1439463, 5257781], [1439479, 5257787], [1439496, 5257792], [1439512, 5257798], [1439529, 5257804], [1439546, 5257809], [1439562, 5257815], [1439579, 5257821], [1439596, 5257827], [1439613, 5257833], [1439629, 5257839], [1439646, 5257845], [1439663, 5257851], [1439679, 5257857], [1439696, 5257863], [1439713, 5257869], [1439729, 5257876], [1439746, 5257882], [1439762, 5257888], [1439778, 5257894], [1439795, 5257901], [1439811, 5257907], [1439828, 5257913], [1439844, 5257919], [1439861, 5257926], [1439877, 5257932], [1439893, 5257938], [1439909, 5257944], [1439926, 5257950], [1439942, 5257956], [1439958, 5257963], [1439974, 5257969], [1439991, 5257975], [1440007, 5257981], [1440023, 5257987], [1440039, 5257992], [1440056, 5257997], [1440072, 5258002], [1440089, 5258007], [1440105, 5258012], [1440122, 5258018], [1440138, 5258023], [1440155, 5258028], [1440171, 5258033], [1440188, 5258038], [1440205, 5258042], [1440221, 5258047], [1440238, 5258052], [1440255, 5258057], [1440272, 5258061], [1440288, 5258066], [1440305, 5258071], [1440322, 5258076], [1440339, 5258080], [1440355, 5258085], [1440372, 5258091], [1440388, 5258097], [1440405, 5258104], [1440421, 5258110], [1440438, 5258116], [1440454, 5258123], [1440471, 5258129], [1440488, 5258135], [1440504, 5258141], [1440521, 5258148], [1440538, 5258154], [1440555, 5258160], [1440572, 5258165], [1440589, 5258171], [1440606, 5258177], [1440623, 5258183], [1440640, 5258189], [1440657, 5258195], [1440674, 5258201], [1440691, 5258207], [1440708, 5258212], [1440725, 5258217], [1440742, 5258221], [1440758, 5258226], [1440775, 5258231], [1440792, 5258235], [1440809, 5258240], [1440826, 5258245], [1440842, 5258250], [1440859, 5258254], [1440876, 5258259], [1440893, 5258264], [1440910, 5258269], [1440927, 5258273], [1440944, 5258278], [1440961, 5258283], [1440978, 5258287], [1440995, 5258292], [1441012, 5258297], [1441029, 5258302], [1441045, 5258306], [1441061, 5258310], [1441077, 5258314], [1441092, 5258318], [1441108, 5258322], [1441124, 5258326], [1441140, 5258330], [1441155, 5258334], [1441171, 5258338], [1441187, 5258342], [1441203, 5258346], [1441219, 5258350], [1441234, 5258354], [1441250, 5258358], [1441266, 5258362], [1441282, 5258366], [1441297, 5258370], [1441313, 5258374], [1441329, 5258378], [1441345, 5258382], [1441362, 5258388], [1441380, 5258393], [1441397, 5258398], [1441415, 5258404], [1441433, 5258409], [1441450, 5258415], [1441468, 5258420], [1441485, 5258425], [1441503, 5258431], [1441520, 5258436], [1441538, 5258441], [1441556, 5258446], [1441573, 5258451], [1441591, 5258456], [1441608, 5258461], [1441626, 5258466], [1441644, 5258471], [1441661, 5258476], [1441679, 5258481], [1441697, 5258486], [1441713, 5258492], [1441729, 5258497], [1441746, 5258503], [1441762, 5258509], [1441778, 5258514], [1441795, 5258520], [1441811, 5258526], [1441827, 5258532], [1441843, 5258537], [1441860, 5258543], [1441876, 5258549], [1441892, 5258555], [1441908, 5258561], [1441924, 5258567], [1441940, 5258573], [1441957, 5258579], [1441973, 5258584], [1441989, 5258590], [1442005, 5258596], [1442021, 5258602], [1442038, 5258607], [1442054, 5258612], [1442071, 5258617], [1442087, 5258622], [1442104, 5258627], [1442120, 5258632], [1442137, 5258637], [1442153, 5258642], [1442170, 5258647], [1442186, 5258652], [1442203, 5258657], [1442219, 5258662], [1442236, 5258667], [1442252, 5258672], [1442269, 5258677], [1442285, 5258682], [1442302, 5258687], [1442318, 5258692], [1442335, 5258697], [1442351, 5258702], [1442367, 5258708], [1442383, 5258713], [1442399, 5258719], [1442415, 5258724], [1442431, 5258730], [1442447, 5258736], [1442463, 5258741], [1442479, 5258747], [1442495, 5258752], [1442511, 5258758], [1442527, 5258764], [1442543, 5258770], [1442559, 5258776], [1442575, 5258782], [1442592, 5258787], [1442608, 5258793], [1442624, 5258799], [1442640, 5258805], [1442656, 5258811], [1442672, 5258817], [1442688, 5258822], [1442704, 5258827], [1442719, 5258832], [1442735, 5258837], [1442751, 5258842], [1442766, 5258847], [1442782, 5258852], [1442798, 5258857], [1442813, 5258862], [1442829, 5258867], [1442845, 5258872], [1442860, 5258877], [1442876, 5258882], [1442891, 5258887], [1442907, 5258892], [1442923, 5258897], [1442938, 5258903], [1442954, 5258908], [1442969, 5258913], [1442985, 5258918], [1443003, 5258924], [1443021, 5258930], [1443039, 5258936], [1443057, 5258942], [1443074, 5258948], [1443092, 5258955], [1443110, 5258961], [1443128, 5258967], [1443146, 5258973], [1443164, 5258979], [1443182, 5258986], [1443200, 5258992], [1443217, 5258998], [1443235, 5259005], [1443253, 5259011], [1443271, 5259017], [1443289, 5259023], [1443307, 5259030], [1443325, 5259036], [1443343, 5259042], [1443360, 5259048], [1443376, 5259054], [1443392, 5259059], [1443409, 5259065], [1443425, 5259070], [1443442, 5259076], [1443458, 5259082], [1443475, 5259087], [1443491, 5259093], [1443508, 5259098], [1443524, 5259104], [1443540, 5259109], [1443557, 5259114], [1443573, 5259120], [1443589, 5259125], [1443605, 5259131], [1443622, 5259136], [1443638, 5259141], [1443654, 5259147], [1443670, 5259152], [1443688, 5259158], [1443705, 5259164], [1443723, 5259170], [1443740, 5259176], [1443758, 5259182], [1443775, 5259188], [1443793, 5259194], [1443811, 5259200], [1443828, 5259206], [1443846, 5259212], [1443864, 5259216]], [[1456738, 5278862], [1456731, 5278847], [1456724, 5278832], [1456718, 5278817], [1456711, 5278801], [1456704, 5278786], [1456697, 5278771], [1456691, 5278756], [1456684, 5278740], [1456677, 5278725], [1456670, 5278710], [1456663, 5278693], [1456656, 5278677], [1456649, 5278660], [1456642, 5278644], [1456635, 5278627], [1456628, 5278610], [1456621, 5278594], [1456613, 5278577], [1456606, 5278561], [1456599, 5278544], [1456592, 5278528], [1456585, 5278511], [1456578, 5278495], [1456570, 5278478], [1456563, 5278462], [1456556, 5278445], [1456549, 5278429], [1456542, 5278412], [1456534, 5278396], [1456527, 5278379], [1456521, 5278363], [1456515, 5278347], [1456509, 5278331], [1456503, 5278314], [1456497, 5278298], [1456491, 5278282], [1456485, 5278266], [1456479, 5278249], [1456473, 5278233], [1456467, 5278217], [1456460, 5278201], [1456454, 5278185], [1456448, 5278169], [1456441, 5278152], [1456435, 5278136], [1456429, 5278120], [1456422, 5278104], [1456416, 5278088], [1456410, 5278072], [1456403, 5278056], [1456397, 5278040], [1456390, 5278024], [1456383, 5278009], [1456376, 5277993], [1456369, 5277978], [1456362, 5277962], [1456355, 5277947], [1456348, 5277931], [1456341, 5277915], [1456334, 5277900], [1456328, 5277885], [1456321, 5277869], [1456314, 5277854], [1456307, 5277839], [1456300, 5277824], [1456293, 5277808], [1456286, 5277793], [1456279, 5277778], [1456272, 5277763], [1456265, 5277747], [1456257, 5277731], [1456250, 5277716], [1456242, 5277700], [1456235, 5277684], [1456228, 5277668], [1456220, 5277652], [1456213, 5277637], [1456206, 5277621], [1456198, 5277605], [1456191, 5277589], [1456183, 5277573], [1456176, 5277557], [1456168, 5277541], [1456161, 5277525], [1456153, 5277509], [1456146, 5277494], [1456139, 5277478], [1456131, 5277462], [1456124, 5277446], [1456116, 5277430], [1456108, 5277414], [1456100, 5277398], [1456092, 5277382], [1456084, 5277366], [1456076, 5277350], [1456068, 5277334], [1456060, 5277318], [1456053, 5277302], [1456045, 5277286], [1456037, 5277270], [1456029, 5277254], [1456022, 5277238], [1456014, 5277222], [1456006, 5277206], [1455999, 5277190], [1455991, 5277173], [1455984, 5277157], [1455976, 5277141], [1455969, 5277125], [1455961, 5277109], [1455952, 5277094], [1455943, 5277079], [1455934, 5277064], [1455925, 5277049], [1455916, 5277033], [1455907, 5277018], [1455898, 5277003], [1455889, 5276988], [1455880, 5276973], [1455871, 5276958], [1455862, 5276943], [1455853, 5276929], [1455844, 5276914], [1455834, 5276900], [1455825, 5276885], [1455816, 5276870], [1455807, 5276856], [1455798, 5276841], [1455789, 5276826], [1455780, 5276812], [1455772, 5276795], [1455765, 5276779], [1455757, 5276762], [1455749, 5276746], [1455742, 5276729], [1455734, 5276713], [1455727, 5276696], [1455719, 5276680], [1455712, 5276663], [1455704, 5276647], [1455697, 5276630], [1455690, 5276614], [1455682, 5276597], [1455675, 5276581], [1455667, 5276564], [1455660, 5276547], [1455653, 5276531], [1455645, 5276514], [1455638, 5276498], [1455631, 5276481], [1455622, 5276466], [1455612, 5276450], [1455603, 5276435], [1455594, 5276420], [1455585, 5276404], [1455576, 5276389], [1455567, 5276374], [1455558, 5276359], [1455549, 5276343], [1455540, 5276328], [1455531, 5276313], [1455522, 5276298], [1455513, 5276283], [1455504, 5276268], [1455495, 5276253], [1455486, 5276238], [1455477, 5276223], [1455468, 5276208], [1455459, 5276193], [1455450, 5276178], [1455443, 5276163], [1455436, 5276148], [1455429, 5276134], [1455422, 5276119], [1455415, 5276104], [1455408, 5276089], [1455401, 5276074], [1455393, 5276059], [1455386, 5276044], [1455379, 5276029], [1455372, 5276014], [1455366, 5275998], [1455359, 5275983], [1455352, 5275968], [1455345, 5275952], [1455338, 5275937], [1455331, 5275922], [1455324, 5275906], [1455317, 5275891], [1455310, 5275875], [1455302, 5275860], [1455294, 5275844], [1455286, 5275829], [1455278, 5275813], [1455270, 5275798], [1455262, 5275782], [1455254, 5275767], [1455246, 5275751], [1455238, 5275736], [1455230, 5275720], [1455222, 5275705], [1455214, 5275689], [1455206, 5275673], [1455198, 5275657], [1455189, 5275641], [1455181, 5275625], [1455173, 5275609], [1455165, 5275593], [1455157, 5275577], [1455149, 5275561], [1455141, 5275545], [1455133, 5275528], [1455125, 5275512], [1455117, 5275496], [1455109, 5275480], [1455101, 5275463], [1455093, 5275447], [1455085, 5275431], [1455077, 5275415], [1455069, 5275398], [1455061, 5275382], [1455053, 5275365], [1455045, 5275349], [1455037, 5275332], [1455029, 5275316], [1455020, 5275299], [1455012, 5275283], [1455004, 5275266], [1454996, 5275250], [1454988, 5275233], [1454980, 5275218], [1454972, 5275203], [1454964, 5275187], [1454955, 5275172], [1454947, 5275157], [1454939, 5275142], [1454930, 5275126], [1454922, 5275111], [1454914, 5275096], [1454906, 5275080], [1454897, 5275065], [1454889, 5275050], [1454881, 5275035], [1454873, 5275019], [1454864, 5275004], [1454856, 5274989], [1454848, 5274973], [1454840, 5274958], [1454832, 5274943], [1454823, 5274928], [1454815, 5274913], [1454807, 5274898], [1454799, 5274883], [1454791, 5274868], [1454783, 5274853], [1454775, 5274838], [1454767, 5274823], [1454759, 5274808], [1454751, 5274793], [1454743, 5274778], [1454735, 5274763], [1454727, 5274748], [1454719, 5274732], [1454711, 5274717], [1454703, 5274702], [1454695, 5274686], [1454687, 5274671], [1454679, 5274656], [1454671, 5274641], [1454663, 5274625], [1454655, 5274609], [1454646, 5274593], [1454638, 5274577], [1454629, 5274562], [1454621, 5274546], [1454612, 5274530], [1454604, 5274514], [1454595, 5274498], [1454587, 5274482], [1454578, 5274466], [1454570, 5274450], [1454561, 5274435], [1454553, 5274419], [1454545, 5274403], [1454536, 5274388], [1454528, 5274372], [1454520, 5274356], [1454511, 5274341], [1454503, 5274325], [1454495, 5274310], [1454487, 5274294], [1454480, 5274278], [1454472, 5274263], [1454465, 5274247], [1454458, 5274232], [1454450, 5274216], [1454443, 5274200], [1454436, 5274185], [1454428, 5274169], [1454421, 5274154], [1454413, 5274138], [1454406, 5274123], [1454398, 5274108], [1454391, 5274093], [1454383, 5274077], [1454376, 5274062], [1454368, 5274047], [1454361, 5274032], [1454354, 5274016], [1454346, 5274001], [1454337, 5273985], [1454329, 5273970], [1454320, 5273954], [1454311, 5273939], [1454303, 5273923], [1454294, 5273907], [1454285, 5273892], [1454277, 5273876], [1454268, 5273860], [1454259, 5273845], [1454250, 5273829], [1454241, 5273813], [1454232, 5273797], [1454223, 5273781], [1454214, 5273765], [1454205, 5273749], [1454196, 5273733], [1454187, 5273717], [1454178, 5273701], [1454169, 5273685], [1454162, 5273670], [1454154, 5273654], [1454147, 5273638], [1454139, 5273623], [1454132, 5273607], [1454124, 5273591], [1454117, 5273576], [1454109, 5273560], [1454102, 5273545], [1454094, 5273529], [1454087, 5273514], [1454080, 5273498], [1454072, 5273483], [1454065, 5273467], [1454058, 5273452], [1454050, 5273436], [1454043, 5273421], [1454035, 5273405], [1454028, 5273390], [1454021, 5273374], [1454013, 5273359], [1454005, 5273343], [1453997, 5273328], [1453989, 5273313], [1453981, 5273297], [1453973, 5273282], [1453966, 5273266], [1453958, 5273251], [1453950, 5273236], [1453942, 5273220], [1453934, 5273205], [1453927, 5273190], [1453919, 5273175], [1453911, 5273159], [1453904, 5273144], [1453896, 5273129], [1453889, 5273113], [1453881, 5273098], [1453873, 5273083], [1453866, 5273068], [1453857, 5273051], [1453848, 5273035], [1453839, 5273018], [1453830, 5273002], [1453821, 5272985], [1453813, 5272969], [1453804, 5272952], [1453795, 5272935], [1453786, 5272919], [1453777, 5272902], [1453769, 5272886], [1453760, 5272870], [1453752, 5272854], [1453743, 5272838], [1453735, 5272822], [1453726, 5272805], [1453718, 5272789], [1453709, 5272773], [1453701, 5272757], [1453692, 5272741], [1453685, 5272725], [1453678, 5272710], [1453671, 5272695], [1453663, 5272680], [1453656, 5272664], [1453649, 5272649], [1453642, 5272634], [1453635, 5272619], [1453627, 5272603], [1453620, 5272588], [1453613, 5272573], [1453606, 5272557], [1453599, 5272542], [1453593, 5272527], [1453586, 5272511], [1453579, 5272496], [1453572, 5272481], [1453565, 5272465], [1453558, 5272450], [1453551, 5272434], [1453542, 5272418], [1453533, 5272402], [1453524, 5272386], [1453515, 5272370], [1453506, 5272353], [1453497, 5272337], [1453488, 5272321], [1453479, 5272305], [1453469, 5272289], [1453460, 5272272], [1453452, 5272257], [1453443, 5272241], [1453435, 5272225], [1453426, 5272209], [1453418, 5272193], [1453409, 5272177], [1453401, 5272161], [1453392, 5272145], [1453384, 5272129], [1453375, 5272113], [1453367, 5272096], [1453358, 5272080], [1453349, 5272063], [1453341, 5272047], [1453332, 5272030], [1453323, 5272014], [1453315, 5271997], [1453306, 5271981], [1453297, 5271964], [1453289, 5271948], [1453280, 5271932], [1453271, 5271915], [1453262, 5271899], [1453254, 5271883], [1453245, 5271867], [1453236, 5271851], [1453227, 5271834], [1453219, 5271818], [1453210, 5271802], [1453201, 5271786], [1453194, 5271771], [1453186, 5271755], [1453179, 5271740], [1453171, 5271725], [1453164, 5271710], [1453156, 5271694], [1453149, 5271679], [1453141, 5271664], [1453134, 5271649], [1453126, 5271633], [1453119, 5271618], [1453111, 5271602], [1453104, 5271586], [1453096, 5271571], [1453088, 5271555], [1453081, 5271540], [1453073, 5271524], [1453065, 5271508], [1453058, 5271493], [1453050, 5271477], [1453042, 5271462], [1453033, 5271446], [1453024, 5271430], [1453016, 5271415], [1453007, 5271399], [1452999, 5271383], [1452990, 5271368], [1452981, 5271352], [1452973, 5271337], [1452964, 5271321], [1452956, 5271305], [1452947, 5271290], [1452939, 5271274], [1452930, 5271258], [1452922, 5271243], [1452913, 5271227], [1452905, 5271212], [1452896, 5271196], [1452888, 5271180], [1452879, 5271165], [1452871, 5271149], [1452863, 5271133], [1452855, 5271118], [1452847, 5271102], [1452839, 5271087], [1452831, 5271071], [1452823, 5271055], [1452815, 5271040], [1452807, 5271024], [1452799, 5271009], [1452791, 5270993], [1452782, 5270977], [1452774, 5270962], [1452766, 5270946], [1452758, 5270931], [1452750, 5270915], [1452741, 5270899], [1452733, 5270884], [1452725, 5270868], [1452717, 5270852], [1452708, 5270838], [1452700, 5270823], [1452691, 5270809], [1452683, 5270794], [1452674, 5270779], [1452666, 5270765], [1452657, 5270750], [1452649, 5270735], [1452640, 5270721], [1452632, 5270706], [1452623, 5270691], [1452615, 5270677], [1452606, 5270662], [1452598, 5270647], [1452589, 5270633], [1452581, 5270618], [1452572, 5270603], [1452564, 5270588], [1452555, 5270574], [1452547, 5270559], [1452538, 5270543], [1452529, 5270527], [1452520, 5270511], [1452511, 5270495], [1452502, 5270480], [1452492, 5270464], [1452483, 5270448], [1452474, 5270432], [1452465, 5270416], [1452456, 5270400], [1452447, 5270384], [1452437, 5270368], [1452428, 5270351], [1452419, 5270335], [1452409, 5270319], [1452400, 5270302], [1452390, 5270286], [1452381, 5270270], [1452372, 5270253], [1452362, 5270237], [1452354, 5270221], [1452346, 5270205], [1452337, 5270190], [1452329, 5270174], [1452321, 5270158], [1452313, 5270142], [1452304, 5270126], [1452296, 5270110], [1452288, 5270095], [1452279, 5270079], [1452271, 5270062], [1452263, 5270046], [1452254, 5270030], [1452246, 5270014], [1452237, 5269997], [1452229, 5269981], [1452221, 5269965], [1452212, 5269948], [1452204, 5269932], [1452195, 5269916], [1452188, 5269900], [1452180, 5269885], [1452172, 5269869], [1452164, 5269853], [1452156, 5269838], [1452149, 5269822], [1452141, 5269807], [1452133, 5269791], [1452125, 5269775], [1452117, 5269760], [1452110, 5269744], [1452102, 5269729], [1452094, 5269714], [1452086, 5269699], [1452078, 5269683], [1452070, 5269668], [1452062, 5269653], [1452054, 5269638], [1452046, 5269622], [1452038, 5269607], [1452029, 5269591], [1452021, 5269574], [1452012, 5269558], [1452004, 5269542], [1451995, 5269525], [1451987, 5269509], [1451978, 5269493], [1451969, 5269477], [1451961, 5269460], [1451952, 5269444], [1451944, 5269428], [1451935, 5269412], [1451927, 5269396], [1451919, 5269381], [1451910, 5269365], [1451902, 5269349], [1451893, 5269333], [1451885, 5269317], [1451876, 5269301], [1451868, 5269286], [1451859, 5269269], [1451851, 5269253], [1451842, 5269236], [1451834, 5269219], [1451825, 5269203], [1451816, 5269186], [1451808, 5269170], [1451799, 5269153], [1451791, 5269137], [1451782, 5269120], [1451774, 5269104], [1451765, 5269087], [1451756, 5269071], [1451748, 5269054], [1451739, 5269037], [1451730, 5269021], [1451722, 5269004], [1451713, 5268987], [1451704, 5268971], [1451696, 5268954], [1451688, 5268940], [1451680, 5268926], [1451672, 5268911], [1451664, 5268897], [1451656, 5268883], [1451648, 5268868], [1451640, 5268854], [1451633, 5268840], [1451625, 5268826], [1451617, 5268811], [1451609, 5268797], [1451601, 5268782], [1451593, 5268767], [1451585, 5268752], [1451577, 5268738], [1451569, 5268723], [1451560, 5268708], [1451552, 5268693], [1451544, 5268679], [1451536, 5268664], [1451528, 5268649], [1451519, 5268634], [1451510, 5268619], [1451501, 5268604], [1451492, 5268589], [1451483, 5268574], [1451474, 5268559], [1451466, 5268544], [1451457, 5268529], [1451448, 5268514], [1451439, 5268499], [1451430, 5268484], [1451422, 5268468], [1451413, 5268453], [1451404, 5268438], [1451395, 5268423], [1451386, 5268407], [1451378, 5268392], [1451369, 5268377], [1451360, 5268361], [1451350, 5268348], [1451340, 5268335], [1451330, 5268322], [1451320, 5268309], [1451310, 5268295], [1451300, 5268282], [1451290, 5268269], [1451281, 5268256], [1451271, 5268242], [1451261, 5268229], [1451251, 5268216], [1451241, 5268203], [1451232, 5268190], [1451222, 5268176], [1451212, 5268163], [1451202, 5268150], [1451193, 5268137], [1451183, 5268124], [1451173, 5268110], [1451164, 5268097], [1451153, 5268083], [1451142, 5268069], [1451132, 5268055], [1451121, 5268041], [1451111, 5268027], [1451100, 5268012], [1451089, 5267998], [1451079, 5267984], [1451068, 5267970], [1451058, 5267956], [1451047, 5267942], [1451036, 5267928], [1451026, 5267915], [1451015, 5267901], [1451004, 5267887], [1450994, 5267873], [1450983, 5267860], [1450972, 5267846], [1450961, 5267832], [1450951, 5267818], [1450941, 5267804], [1450931, 5267789], [1450921, 5267775], [1450910, 5267760], [1450900, 5267746], [1450890, 5267732], [1450880, 5267717], [1450870, 5267703], [1450860, 5267688], [1450850, 5267674], [1450840, 5267659], [1450831, 5267644], [1450821, 5267630], [1450811, 5267615], [1450802, 5267601], [1450792, 5267586], [1450782, 5267571], [1450773, 5267557], [1450763, 5267542], [1450753, 5267527], [1450744, 5267514], [1450735, 5267500], [1450726, 5267487], [1450717, 5267473], [1450708, 5267460], [1450698, 5267446], [1450689, 5267433], [1450680, 5267419], [1450671, 5267406], [1450662, 5267392], [1450653, 5267379], [1450644, 5267365], [1450635, 5267352], [1450627, 5267338], [1450618, 5267325], [1450609, 5267312], [1450600, 5267298], [1450591, 5267285], [1450583, 5267271], [1450574, 5267258], [1450564, 5267243], [1450555, 5267227], [1450545, 5267212], [1450535, 5267197], [1450526, 5267181], [1450516, 5267166], [1450506, 5267151], [1450497, 5267135], [1450487, 5267120], [1450477, 5267105], [1450468, 5267089], [1450458, 5267074], [1450448, 5267059], [1450439, 5267043], [1450429, 5267028], [1450419, 5267013], [1450410, 5266997], [1450400, 5266982], [1450390, 5266967], [1450381, 5266951], [1450371, 5266937], [1450361, 5266923], [1450351, 5266908], [1450341, 5266894], [1450331, 5266879], [1450321, 5266865], [1450311, 5266850], [1450301, 5266836], [1450291, 5266822], [1450281, 5266807], [1450272, 5266793], [1450262, 5266778], [1450252, 5266764], [1450242, 5266749], [1450232, 5266735], [1450222, 5266721], [1450212, 5266706], [1450202, 5266692], [1450192, 5266677], [1450182, 5266663], [1450173, 5266649], [1450164, 5266635], [1450155, 5266622], [1450146, 5266608], [1450137, 5266594], [1450128, 5266580], [1450119, 5266567], [1450111, 5266553], [1450102, 5266539], [1450093, 5266525], [1450084, 5266512], [1450074, 5266498], [1450065, 5266484], [1450056, 5266470], [1450047, 5266457], [1450038, 5266443], [1450029, 5266429], [1450020, 5266415], [1450011, 5266402], [1450001, 5266388], [1449992, 5266374], [1449982, 5266360], [1449972, 5266345], [1449962, 5266331], [1449953, 5266317], [1449943, 5266303], [1449933, 5266289], [1449923, 5266275], [1449914, 5266261], [1449904, 5266247], [1449894, 5266233], [1449885, 5266219], [1449875, 5266204], [1449866, 5266190], [1449857, 5266176], [1449847, 5266162], [1449838, 5266148], [1449828, 5266134], [1449819, 5266120], [1449809, 5266106], [1449801, 5266093], [1449792, 5266079], [1449783, 5266066], [1449774, 5266053], [1449765, 5266040], [1449756, 5266027], [1449747, 5266013], [1449738, 5266000], [1449729, 5265987], [1449720, 5265974], [1449711, 5265961], [1449702, 5265947], [1449693, 5265934], [1449684, 5265921], [1449675, 5265908], [1449666, 5265895], [1449657, 5265881], [1449648, 5265868], [1449639, 5265855], [1449630, 5265842], [1449619, 5265826], [1449608, 5265811], [1449596, 5265795], [1449585, 5265779], [1449574, 5265763], [1449562, 5265748], [1449551, 5265732], [1449540, 5265716], [1449528, 5265701], [1449517, 5265685], [1449506, 5265669], [1449494, 5265654], [1449483, 5265638], [1449471, 5265623], [1449460, 5265607], [1449448, 5265592], [1449437, 5265576], [1449426, 5265560], [1449414, 5265545], [1449403, 5265529], [1449394, 5265515], [1449385, 5265500], [1449376, 5265486], [1449368, 5265472], [1449359, 5265457], [1449350, 5265443], [1449341, 5265428], [1449332, 5265414], [1449324, 5265400], [1449315, 5265385], [1449306, 5265371], [1449297, 5265356], [1449288, 5265342], [1449279, 5265327], [1449270, 5265313], [1449261, 5265299], [1449252, 5265284], [1449243, 5265270], [1449234, 5265255], [1449225, 5265241], [1449216, 5265227], [1449206, 5265212], [1449197, 5265198], [1449188, 5265183], [1449179, 5265169], [1449170, 5265154], [1449160, 5265140], [1449151, 5265126], [1449142, 5265111], [1449133, 5265097], [1449124, 5265082], [1449114, 5265067], [1449105, 5265053], [1449096, 5265038], [1449086, 5265023], [1449077, 5265009], [1449067, 5264994], [1449058, 5264980], [1449049, 5264965], [1449039, 5264950], [1449030, 5264937], [1449021, 5264923], [1449012, 5264910], [1449003, 5264896], [1448993, 5264883], [1448984, 5264869], [1448975, 5264855], [1448966, 5264842], [1448957, 5264828], [1448947, 5264815], [1448938, 5264801], [1448929, 5264787], [1448920, 5264774], [1448911, 5264760], [1448902, 5264746], [1448893, 5264732], [1448884, 5264719], [1448875, 5264705], [1448866, 5264691], [1448857, 5264677], [1448847, 5264662], [1448837, 5264647], [1448827, 5264631], [1448817, 5264616], [1448807, 5264601], [1448797, 5264585], [1448787, 5264570], [1448777, 5264555], [1448767, 5264539], [1448756, 5264524], [1448746, 5264509], [1448736, 5264493], [1448726, 5264478], [1448716, 5264463], [1448706, 5264447], [1448696, 5264432], [1448686, 5264417], [1448675, 5264401], [1448665, 5264386], [1448655, 5264371], [1448646, 5264357], [1448636, 5264344], [1448627, 5264330], [1448617, 5264317], [1448608, 5264303], [1448598, 5264289], [1448589, 5264276], [1448579, 5264262], [1448570, 5264249], [1448561, 5264235], [1448551, 5264222], [1448542, 5264208], [1448532, 5264194], [1448523, 5264180], [1448513, 5264167], [1448504, 5264153], [1448494, 5264139], [1448485, 5264125], [1448476, 5264112], [1448466, 5264098], [1448456, 5264083], [1448446, 5264068], [1448436, 5264054], [1448426, 5264039], [1448415, 5264024], [1448405, 5264010], [1448395, 5263995], [1448385, 5263980], [1448375, 5263966], [1448365, 5263951], [1448355, 5263936], [1448344, 5263922], [1448334, 5263907], [1448324, 5263892], [1448314, 5263877], [1448304, 5263862], [1448294, 5263848], [1448283, 5263833], [1448273, 5263818], [1448263, 5263803], [1448254, 5263789], [1448245, 5263774], [1448236, 5263760], [1448226, 5263746], [1448217, 5263731], [1448208, 5263717], [1448199, 5263702], [1448190, 5263688], [1448181, 5263673], [1448171, 5263659], [1448162, 5263644], [1448152, 5263630], [1448143, 5263615], [1448133, 5263600], [1448123, 5263586], [1448114, 5263571], [1448104, 5263556], [1448095, 5263542], [1448085, 5263527], [1448076, 5263513], [1448065, 5263497], [1448054, 5263481], [1448044, 5263465], [1448033, 5263450], [1448023, 5263434], [1448012, 5263418], [1448002, 5263403], [1447991, 5263387], [1447981, 5263371], [1447970, 5263356], [1447960, 5263340], [1447949, 5263324], [1447939, 5263309], [1447928, 5263293], [1447918, 5263277], [1447907, 5263262], [1447897, 5263246], [1447886, 5263230], [1447876, 5263215], [1447866, 5263199], [1447855, 5263185], [1447845, 5263170], [1447835, 5263156], [1447825, 5263141], [1447814, 5263127], [1447804, 5263112], [1447794, 5263098], [1447783, 5263083], [1447773, 5263069], [1447763, 5263055], [1447753, 5263040], [1447743, 5263025], [1447733, 5263010], [1447723, 5262995], [1447713, 5262981], [1447704, 5262966], [1447694, 5262951], [1447684, 5262936], [1447674, 5262922], [1447664, 5262907], [1447654, 5262892], [1447644, 5262876], [1447634, 5262861], [1447624, 5262846], [1447615, 5262831], [1447605, 5262815], [1447595, 5262800], [1447585, 5262785], [1447575, 5262770], [1447565, 5262755], [1447555, 5262740], [1447545, 5262724], [1447535, 5262709], [1447525, 5262694], [1447516, 5262679], [1447506, 5262664], [1447496, 5262649], [1447486, 5262634], [1447476, 5262619], [1447466, 5262604], [1447457, 5262589], [1447448, 5262575], [1447439, 5262561], [1447429, 5262547], [1447420, 5262533], [1447411, 5262519], [1447402, 5262505], [1447393, 5262491], [1447383, 5262477], [1447374, 5262463], [1447365, 5262449], [1447356, 5262434], [1447346, 5262420], [1447337, 5262406], [1447328, 5262392], [1447319, 5262378], [1447309, 5262364], [1447300, 5262350], [1447291, 5262336], [1447282, 5262322], [1447272, 5262306], [1447262, 5262291], [1447252, 5262276], [1447242, 5262260], [1447232, 5262245], [1447223, 5262230], [1447213, 5262214], [1447203, 5262199], [1447193, 5262184], [1447183, 5262168], [1447173, 5262153], [1447163, 5262138], [1447153, 5262122], [1447143, 5262107], [1447133, 5262092], [1447123, 5262076], [1447113, 5262061], [1447102, 5262046], [1447092, 5262030], [1447082, 5262015], [1447072, 5262000], [1447062, 5261986], [1447052, 5261971], [1447043, 5261956], [1447033, 5261941], [1447023, 5261926], [1447013, 5261912], [1447003, 5261897], [1446993, 5261882], [1446983, 5261867], [1446973, 5261853]], [[1459596, 5277302], [1459590, 5277287], [1459583, 5277272], [1459577, 5277257], [1459571, 5277242], [1459564, 5277227], [1459558, 5277212], [1459552, 5277197], [1459545, 5277182], [1459539, 5277167], [1459533, 5277152], [1459527, 5277136], [1459521, 5277121], [1459515, 5277106], [1459508, 5277090], [1459502, 5277075], [1459496, 5277060], [1459490, 5277044], [1459484, 5277029], [1459476, 5277013], [1459468, 5276997], [1459461, 5276981], [1459453, 5276966], [1459445, 5276950], [1459437, 5276934], [1459430, 5276918], [1459422, 5276902], [1459414, 5276887], [1459407, 5276871], [1459399, 5276855], [1459391, 5276839], [1459383, 5276823], [1459375, 5276807], [1459367, 5276791], [1459359, 5276775], [1459351, 5276759], [1459343, 5276743], [1459335, 5276727], [1459327, 5276711], [1459321, 5276695], [1459315, 5276679], [1459309, 5276663], [1459303, 5276647], [1459297, 5276631], [1459291, 5276615], [1459285, 5276598], [1459278, 5276582], [1459272, 5276566], [1459266, 5276550], [1459260, 5276534], [1459254, 5276517], [1459248, 5276500], [1459241, 5276484], [1459235, 5276467], [1459229, 5276451], [1459223, 5276434], [1459217, 5276418], [1459210, 5276401], [1459204, 5276384], [1459198, 5276369], [1459192, 5276354], [1459186, 5276339], [1459180, 5276324], [1459174, 5276308], [1459168, 5276293], [1459161, 5276278], [1459155, 5276263], [1459149, 5276247], [1459143, 5276232], [1459137, 5276217], [1459131, 5276201], [1459126, 5276185], [1459120, 5276170], [1459114, 5276154], [1459108, 5276139], [1459102, 5276123], [1459096, 5276108], [1459091, 5276092], [1459085, 5276077], [1459078, 5276060], [1459071, 5276044], [1459064, 5276028], [1459057, 5276012], [1459050, 5275996], [1459043, 5275980], [1459035, 5275964], [1459028, 5275947], [1459021, 5275931], [1459014, 5275915], [1459007, 5275899], [1459000, 5275883], [1458993, 5275867], [1458986, 5275851], [1458979, 5275836], [1458972, 5275820], [1458966, 5275804], [1458959, 5275788], [1458952, 5275772], [1458945, 5275756], [1458936, 5275740], [1458928, 5275724], [1458920, 5275708], [1458911, 5275693], [1458903, 5275677], [1458895, 5275661], [1458887, 5275645], [1458878, 5275629], [1458870, 5275613], [1458862, 5275598], [1458853, 5275582], [1458845, 5275566], [1458837, 5275550], [1458829, 5275534], [1458820, 5275518], [1458812, 5275502], [1458804, 5275486], [1458795, 5275470], [1458787, 5275454], [1458779, 5275438], [1458772, 5275421], [1458765, 5275405], [1458758, 5275388], [1458751, 5275371], [1458744, 5275354], [1458737, 5275337], [1458730, 5275321], [1458723, 5275304], [1458716, 5275287], [1458709, 5275270], [1458702, 5275253], [1458695, 5275236], [1458688, 5275219], [1458680, 5275202], [1458673, 5275184], [1458666, 5275167], [1458658, 5275150], [1458651, 5275133], [1458644, 5275116], [1458637, 5275099], [1458630, 5275083], [1458624, 5275066], [1458618, 5275050], [1458612, 5275034], [1458606, 5275018], [1458600, 5275002], [1458594, 5274986], [1458587, 5274970], [1458581, 5274954], [1458575, 5274937], [1458569, 5274922], [1458562, 5274906], [1458555, 5274890], [1458549, 5274874], [1458542, 5274858], [1458536, 5274842], [1458529, 5274826], [1458523, 5274810], [1458516, 5274794], [1458509, 5274778], [1458504, 5274761], [1458499, 5274744], [1458494, 5274727], [1458489, 5274710], [1458484, 5274693], [1458479, 5274676], [1458473, 5274659], [1458468, 5274642], [1458463, 5274624], [1458458, 5274607], [1458453, 5274591], [1458448, 5274574], [1458443, 5274557], [1458438, 5274540], [1458433, 5274523], [1458428, 5274507], [1458423, 5274490], [1458417, 5274473], [1458412, 5274456], [1458407, 5274440], [1458400, 5274423], [1458393, 5274407], [1458385, 5274391], [1458378, 5274375], [1458370, 5274359], [1458363, 5274343], [1458356, 5274327], [1458348, 5274310], [1458341, 5274294], [1458334, 5274278], [1458326, 5274262], [1458319, 5274246], [1458311, 5274230], [1458304, 5274214], [1458296, 5274197], [1458289, 5274181], [1458281, 5274165], [1458274, 5274149], [1458266, 5274133], [1458259, 5274117], [1458251, 5274100], [1458243, 5274084], [1458235, 5274068], [1458227, 5274052], [1458219, 5274035], [1458211, 5274019], [1458203, 5274003], [1458195, 5273986], [1458187, 5273970], [1458180, 5273954], [1458172, 5273938], [1458164, 5273921], [1458157, 5273905], [1458149, 5273889], [1458142, 5273873], [1458134, 5273856], [1458127, 5273840], [1458119, 5273824], [1458112, 5273808], [1458104, 5273791], [1458098, 5273776], [1458093, 5273760], [1458087, 5273744], [1458081, 5273728], [1458075, 5273712], [1458069, 5273697], [1458063, 5273681], [1458058, 5273665], [1458052, 5273649], [1458046, 5273633], [1458040, 5273618], [1458034, 5273602], [1458029, 5273586], [1458023, 5273570], [1458017, 5273554], [1458011, 5273538], [1458006, 5273522], [1458000, 5273506], [1457994, 5273490], [1457988, 5273474], [1457981, 5273457], [1457974, 5273440], [1457967, 5273423], [1457960, 5273406], [1457953, 5273389], [1457945, 5273372], [1457938, 5273354], [1457931, 5273337], [1457924, 5273320], [1457917, 5273303], [1457909, 5273286], [1457902, 5273270], [1457895, 5273253], [1457888, 5273236], [1457880, 5273220], [1457873, 5273203], [1457866, 5273186], [1457858, 5273169], [1457851, 5273153], [1457844, 5273136], [1457837, 5273119], [1457829, 5273102], [1457822, 5273085], [1457815, 5273067], [1457808, 5273050], [1457801, 5273033], [1457793, 5273016], [1457786, 5272999], [1457779, 5272982], [1457772, 5272965], [1457765, 5272948], [1457757, 5272931], [1457750, 5272914], [1457743, 5272897], [1457736, 5272881], [1457728, 5272864], [1457721, 5272847], [1457714, 5272830], [1457706, 5272813], [1457699, 5272796], [1457692, 5272781], [1457685, 5272765], [1457677, 5272750], [1457670, 5272734], [1457663, 5272718], [1457655, 5272703], [1457648, 5272687], [1457641, 5272672], [1457633, 5272656], [1457626, 5272640], [1457619, 5272625], [1457612, 5272610], [1457605, 5272595], [1457598, 5272579], [1457590, 5272564], [1457583, 5272549], [1457576, 5272534], [1457569, 5272518], [1457562, 5272503], [1457555, 5272488], [1457546, 5272472], [1457538, 5272455], [1457530, 5272439], [1457522, 5272423], [1457513, 5272407], [1457505, 5272390], [1457497, 5272374], [1457489, 5272358], [1457480, 5272341], [1457472, 5272325], [1457464, 5272309], [1457456, 5272293], [1457448, 5272277], [1457440, 5272261], [1457431, 5272244], [1457423, 5272228], [1457415, 5272212], [1457407, 5272196], [1457399, 5272180], [1457391, 5272164], [1457383, 5272149], [1457375, 5272134], [1457367, 5272119], [1457359, 5272104], [1457351, 5272089], [1457344, 5272074], [1457336, 5272059], [1457328, 5272044], [1457320, 5272029], [1457312, 5272014], [1457304, 5271999], [1457296, 5271984], [1457288, 5271969], [1457280, 5271954], [1457273, 5271939], [1457265, 5271924], [1457257, 5271909], [1457249, 5271894], [1457241, 5271879], [1457233, 5271864], [1457224, 5271848], [1457216, 5271832], [1457207, 5271816], [1457198, 5271800], [1457189, 5271784], [1457181, 5271769], [1457172, 5271753], [1457163, 5271737], [1457154, 5271721], [1457146, 5271705], [1457137, 5271690], [1457128, 5271674], [1457120, 5271658], [1457111, 5271643], [1457103, 5271627], [1457094, 5271611], [1457086, 5271596], [1457077, 5271580], [1457069, 5271565], [1457060, 5271549], [1457052, 5271533], [1457043, 5271517], [1457034, 5271501], [1457026, 5271485], [1457017, 5271469], [1457009, 5271453], [1457000, 5271437], [1456991, 5271421], [1456983, 5271405], [1456974, 5271389], [1456965, 5271374], [1456957, 5271358], [1456948, 5271343], [1456939, 5271327], [1456930, 5271311], [1456922, 5271296], [1456913, 5271280], [1456904, 5271264], [1456895, 5271249], [1456886, 5271233], [1456878, 5271218], [1456870, 5271203], [1456862, 5271187], [1456853, 5271172], [1456845, 5271157], [1456837, 5271142], [1456828, 5271126], [1456820, 5271111], [1456812, 5271096], [1456804, 5271080], [1456795, 5271065], [1456787, 5271050], [1456778, 5271035], [1456770, 5271019], [1456762, 5271004], [1456753, 5270989], [1456745, 5270973], [1456737, 5270958], [1456728, 5270943], [1456720, 5270928], [1456710, 5270912], [1456701, 5270897], [1456692, 5270882], [1456682, 5270866], [1456673, 5270851], [1456663, 5270836], [1456654, 5270820], [1456644, 5270805], [1456635, 5270790], [1456626, 5270774], [1456616, 5270759], [1456607, 5270744], [1456597, 5270729], [1456587, 5270713], [1456578, 5270698], [1456568, 5270683], [1456559, 5270667], [1456549, 5270652], [1456540, 5270637], [1456530, 5270621], [1456520, 5270607], [1456510, 5270592], [1456500, 5270577], [1456490, 5270562], [1456480, 5270548], [1456470, 5270533], [1456460, 5270518], [1456450, 5270503], [1456439, 5270489], [1456429, 5270474], [1456419, 5270459], [1456409, 5270445], [1456400, 5270430], [1456390, 5270415], [1456380, 5270401], [1456370, 5270386], [1456360, 5270371], [1456350, 5270357], [1456340, 5270342], [1456330, 5270327], [1456321, 5270315], [1456312, 5270303], [1456303, 5270291], [1456294, 5270279], [1456285, 5270267], [1456275, 5270256], [1456266, 5270244], [1456257, 5270232], [1456248, 5270220], [1456239, 5270208], [1456230, 5270195], [1456221, 5270183], [1456212, 5270171], [1456203, 5270159], [1456194, 5270147], [1456185, 5270135], [1456176, 5270122], [1456167, 5270110], [1456158, 5270098], [1456149, 5270086], [1456139, 5270070], [1456129, 5270054], [1456118, 5270038], [1456108, 5270022], [1456098, 5270006], [1456088, 5269990], [1456077, 5269974], [1456067, 5269958], [1456057, 5269942], [1456047, 5269926], [1456037, 5269910], [1456026, 5269894]], [[1460841, 5275876], [1460824, 5275882], [1460807, 5275887], [1460790, 5275892], [1460773, 5275897], [1460756, 5275903], [1460740, 5275908], [1460723, 5275913], [1460706, 5275918], [1460689, 5275923], [1460672, 5275928], [1460655, 5275933], [1460638, 5275938], [1460621, 5275943], [1460604, 5275948], [1460587, 5275953], [1460570, 5275958], [1460553, 5275963], [1460536, 5275968], [1460519, 5275974], [1460503, 5275980], [1460486, 5275985], [1460470, 5275991], [1460453, 5275997], [1460437, 5276003], [1460420, 5276009], [1460404, 5276014], [1460387, 5276020], [1460371, 5276026], [1460354, 5276031], [1460338, 5276037], [1460321, 5276043], [1460305, 5276048], [1460288, 5276054], [1460272, 5276059], [1460255, 5276065], [1460239, 5276070], [1460222, 5276076], [1460206, 5276081], [1460191, 5276091], [1460176, 5276101], [1460162, 5276111], [1460147, 5276121], [1460132, 5276131], [1460117, 5276141], [1460103, 5276151], [1460088, 5276161], [1460073, 5276171], [1460059, 5276181], [1460044, 5276190], [1460029, 5276200], [1460014, 5276209], [1459999, 5276219], [1459985, 5276228], [1459970, 5276238], [1459955, 5276247], [1459940, 5276256], [1459925, 5276266], [1459911, 5276275], [1459895, 5276285], [1459880, 5276294], [1459865, 5276304], [1459850, 5276313], [1459835, 5276322], [1459819, 5276332], [1459804, 5276341], [1459789, 5276350], [1459774, 5276360], [1459759, 5276369], [1459743, 5276379], [1459728, 5276388], [1459713, 5276398], [1459698, 5276407], [1459682, 5276417], [1459667, 5276427], [1459652, 5276436], [1459636, 5276446], [1459621, 5276455], [1459606, 5276465], [1459591, 5276473], [1459576, 5276482], [1459562, 5276491], [1459547, 5276499], [1459532, 5276508], [1459517, 5276516], [1459502, 5276525], [1459488, 5276533], [1459473, 5276542], [1459458, 5276551], [1459443, 5276560], [1459429, 5276569], [1459414, 5276577], [1459399, 5276586], [1459385, 5276595], [1459370, 5276604], [1459355, 5276613], [1459341, 5276622], [1459326, 5276631], [1459311, 5276640], [1459295, 5276646], [1459279, 5276651], [1459262, 5276657], [1459246, 5276662], [1459229, 5276668], [1459213, 5276673], [1459197, 5276679], [1459180, 5276684], [1459164, 5276690], [1459148, 5276695], [1459131, 5276701], [1459115, 5276706], [1459098, 5276711], [1459082, 5276716], [1459065, 5276722], [1459049, 5276727], [1459032, 5276732], [1459016, 5276737], [1458999, 5276742], [1458983, 5276748], [1458965, 5276753], [1458948, 5276758], [1458931, 5276763], [1458914, 5276769], [1458896, 5276774], [1458879, 5276779], [1458862, 5276784], [1458845, 5276789], [1458827, 5276795], [1458810, 5276800], [1458793, 5276805], [1458777, 5276810], [1458760, 5276815], [1458743, 5276821], [1458726, 5276826], [1458710, 5276831], [1458693, 5276836], [1458676, 5276841], [1458659, 5276847], [1458643, 5276852], [1458625, 5276857], [1458607, 5276863], [1458590, 5276868], [1458572, 5276874], [1458554, 5276880], [1458537, 5276885], [1458519, 5276891], [1458501, 5276896], [1458484, 5276902], [1458466, 5276907], [1458448, 5276913], [1458431, 5276919], [1458413, 5276924], [1458395, 5276930], [1458378, 5276936], [1458360, 5276942], [1458342, 5276947], [1458325, 5276953], [1458307, 5276959], [1458289, 5276965], [1458273, 5276969], [1458257, 5276974], [1458240, 5276979], [1458224, 5276983], [1458207, 5276988], [1458191, 5276993], [1458174, 5276997], [1458158, 5277002], [1458142, 5277007], [1458125, 5277011], [1458109, 5277016], [1458092, 5277021], [1458076, 5277026], [1458059, 5277031], [1458043, 5277036], [1458026, 5277041], [1458010, 5277045], [1457993, 5277050], [1457977, 5277055], [1457960, 5277060], [1457943, 5277067], [1457926, 5277073], [1457909, 5277079], [1457892, 5277086], [1457875, 5277092], [1457858, 5277099], [1457841, 5277105], [1457824, 5277112], [1457807, 5277118], [1457790, 5277124], [1457773, 5277131], [1457756, 5277137], [1457739, 5277144], [1457722, 5277150], [1457705, 5277157], [1457688, 5277163], [1457671, 5277169], [1457654, 5277176], [1457637, 5277182], [1457620, 5277189], [1457603, 5277194], [1457586, 5277198], [1457569, 5277203], [1457551, 5277208], [1457534, 5277213], [1457517, 5277218], [1457500, 5277223], [1457482, 5277228], [1457465, 5277232], [1457448, 5277237], [1457431, 5277242], [1457413, 5277247], [1457396, 5277251], [1457379, 5277256], [1457361, 5277261], [1457344, 5277265], [1457327, 5277270], [1457309, 5277274], [1457292, 5277279], [1457275, 5277284], [1457258, 5277290], [1457241, 5277296], [1457224, 5277302], [1457208, 5277308], [1457191, 5277314], [1457174, 5277320], [1457157, 5277326], [1457141, 5277333], [1457124, 5277339], [1457107, 5277345], [1457091, 5277351], [1457074, 5277356], [1457057, 5277362], [1457041, 5277368], [1457024, 5277374], [1457008, 5277380], [1456991, 5277386], [1456975, 5277392], [1456958, 5277398], [1456942, 5277404], [1456925, 5277409], [1456908, 5277415], [1456891, 5277420], [1456874, 5277426], [1456857, 5277431], [1456840, 5277437], [1456823, 5277442], [1456806, 5277448], [1456789, 5277453], [1456772, 5277459], [1456755, 5277464], [1456738, 5277470], [1456721, 5277475], [1456704, 5277481], [1456687, 5277486], [1456670, 5277491], [1456653, 5277497], [1456636, 5277502], [1456619, 5277508], [1456602, 5277513], [1456586, 5277519], [1456570, 5277525], [1456554, 5277531], [1456538, 5277537], [1456521, 5277543], [1456505, 5277548], [1456489, 5277554], [1456473, 5277560], [1456457, 5277566], [1456441, 5277572], [1456425, 5277578], [1456409, 5277584], [1456393, 5277589], [1456377, 5277595], [1456361, 5277601], [1456345, 5277607], [1456329, 5277612], [1456313, 5277618], [1456297, 5277624], [1456281, 5277630], [1456265, 5277635], [1456248, 5277640], [1456232, 5277645], [1456216, 5277650], [1456199, 5277655], [1456183, 5277660], [1456167, 5277665], [1456150, 5277670], [1456134, 5277675], [1456118, 5277680], [1456102, 5277685], [1456086, 5277690], [1456070, 5277695], [1456053, 5277701], [1456037, 5277706], [1456021, 5277711], [1456005, 5277716], [1455989, 5277722], [1455973, 5277727], [1455957, 5277732], [1455940, 5277737], [1455923, 5277743], [1455906, 5277748], [1455889, 5277754], [1455871, 5277759], [1455854, 5277765], [1455837, 5277770], [1455820, 5277775], [1455803, 5277781], [1455786, 5277786], [1455768, 5277792], [1455751, 5277797], [1455734, 5277803], [1455717, 5277808], [1455699, 5277814], [1455682, 5277819], [1455665, 5277825], [1455648, 5277830], [1455630, 5277836], [1455613, 5277842], [1455597, 5277847], [1455581, 5277852], [1455565, 5277857], [1455549, 5277862], [1455533, 5277868], [1455517, 5277873], [1455501, 5277878], [1455486, 5277883], [1455470, 5277889], [1455454, 5277894], [1455437, 5277899], [1455421, 5277904], [1455405, 5277909], [1455389, 5277914], [1455373, 5277919], [1455357, 5277924], [1455340, 5277929], [1455324, 5277934], [1455308, 5277939], [1455292, 5277944], [1455274, 5277949], [1455256, 5277954], [1455239, 5277960], [1455221, 5277965], [1455203, 5277971], [1455185, 5277976], [1455168, 5277982], [1455150, 5277987], [1455132, 5277992], [1455114, 5277998], [1455097, 5278003], [1455079, 5278009], [1455061, 5278014], [1455043, 5278020], [1455025, 5278025], [1455007, 5278031], [1454989, 5278036], [1454972, 5278042], [1454954, 5278047], [1454936, 5278053], [1454920, 5278059], [1454903, 5278065], [1454887, 5278071], [1454871, 5278076], [1454855, 5278082], [1454838, 5278088], [1454822, 5278094], [1454806, 5278100], [1454789, 5278106], [1454773, 5278112], [1454757, 5278117], [1454741, 5278123], [1454725, 5278128], [1454709, 5278133], [1454693, 5278139], [1454677, 5278144], [1454661, 5278150], [1454645, 5278155], [1454629, 5278161], [1454613, 5278166], [1454597, 5278171], [1454580, 5278175], [1454564, 5278180], [1454548, 5278185], [1454531, 5278189], [1454515, 5278194], [1454499, 5278199], [1454482, 5278203], [1454466, 5278208], [1454450, 5278213], [1454433, 5278217], [1454417, 5278221], [1454401, 5278225], [1454385, 5278230], [1454368, 5278234], [1454352, 5278238], [1454336, 5278242], [1454320, 5278246], [1454303, 5278251], [1454287, 5278255], [1454269, 5278260], [1454251, 5278265], [1454233, 5278270], [1454215, 5278276], [1454197, 5278281], [1454180, 5278286], [1454162, 5278291], [1454144, 5278296]], [[1461535, 5278867], [1461519, 5278874], [1461503, 5278880], [1461487, 5278886], [1461471, 5278892], [1461455, 5278899], [1461439, 5278905], [1461423, 5278911], [1461407, 5278917], [1461391, 5278923], [1461374, 5278930], [1461358, 5278936], [1461342, 5278942], [1461326, 5278948], [1461310, 5278954], [1461293, 5278960], [1461277, 5278966], [1461261, 5278972], [1461245, 5278979], [1461228, 5278984], [1461211, 5278990], [1461195, 5278995], [1461178, 5279001], [1461161, 5279006], [1461144, 5279012], [1461128, 5279017], [1461111, 5279023], [1461094, 5279029], [1461077, 5279034], [1461061, 5279040], [1461044, 5279045], [1461028, 5279051], [1461012, 5279056], [1460995, 5279062], [1460979, 5279067], [1460962, 5279073], [1460946, 5279079], [1460929, 5279084], [1460913, 5279090], [1460897, 5279096], [1460882, 5279102], [1460866, 5279108], [1460851, 5279114], [1460835, 5279120], [1460820, 5279126], [1460804, 5279133], [1460789, 5279139], [1460773, 5279145], [1460757, 5279151], [1460742, 5279157], [1460726, 5279163], [1460711, 5279168], [1460695, 5279174], [1460679, 5279180], [1460664, 5279186], [1460648, 5279192], [1460632, 5279197], [1460617, 5279203], [1460601, 5279209], [1460585, 5279214], [1460569, 5279219], [1460552, 5279224], [1460536, 5279229], [1460520, 5279234], [1460504, 5279239], [1460487, 5279244], [1460471, 5279249], [1460455, 5279254], [1460439, 5279259], [1460422, 5279264], [1460406, 5279268], [1460389, 5279273], [1460373, 5279277], [1460356, 5279282], [1460340, 5279286], [1460324, 5279291], [1460307, 5279295], [1460291, 5279300], [1460274, 5279305], [1460258, 5279310], [1460241, 5279316], [1460225, 5279321], [1460208, 5279327], [1460191, 5279332], [1460175, 5279338], [1460158, 5279343], [1460142, 5279349], [1460125, 5279355], [1460108, 5279360], [1460092, 5279366], [1460075, 5279371], [1460058, 5279377], [1460041, 5279382], [1460025, 5279388], [1460008, 5279393], [1459991, 5279399], [1459974, 5279404], [1459958, 5279410], [1459941, 5279416], [1459925, 5279422], [1459909, 5279428], [1459892, 5279434], [1459876, 5279440], [1459860, 5279446], [1459844, 5279452], [1459828, 5279458], [1459812, 5279465], [1459796, 5279471], [1459780, 5279477], [1459764, 5279483], [1459748, 5279489], [1459733, 5279494], [1459717, 5279500], [1459701, 5279506], [1459686, 5279512], [1459670, 5279518], [1459655, 5279524], [1459639, 5279530], [1459623, 5279536], [1459608, 5279541], [1459593, 5279547], [1459577, 5279552], [1459562, 5279558], [1459547, 5279563], [1459532, 5279569], [1459516, 5279574], [1459501, 5279580], [1459486, 5279585], [1459470, 5279590], [1459455, 5279596], [1459440, 5279602], [1459424, 5279608], [1459409, 5279614], [1459394, 5279620], [1459378, 5279626], [1459363, 5279632], [1459347, 5279638], [1459332, 5279644], [1459317, 5279650], [1459300, 5279656], [1459283, 5279662], [1459266, 5279668], [1459249, 5279674], [1459232, 5279680], [1459215, 5279686], [1459198, 5279692], [1459181, 5279698], [1459164, 5279705], [1459147, 5279711], [1459130, 5279717], [1459113, 5279723], [1459096, 5279729], [1459079, 5279735], [1459062, 5279742], [1459045, 5279748], [1459028, 5279754], [1459011, 5279760], [1458994, 5279766], [1458977, 5279773], [1458961, 5279778], [1458946, 5279784], [1458930, 5279789], [1458914, 5279794], [1458898, 5279800], [1458883, 5279805], [1458867, 5279811], [1458851, 5279816], [1458836, 5279822], [1458820, 5279827], [1458804, 5279832], [1458788, 5279838], [1458771, 5279843], [1458755, 5279848], [1458739, 5279853], [1458723, 5279859], [1458707, 5279864], [1458690, 5279869], [1458674, 5279874], [1458658, 5279879], [1458642, 5279887], [1458625, 5279894], [1458609, 5279901], [1458593, 5279908], [1458576, 5279915], [1458560, 5279922], [1458544, 5279929], [1458528, 5279936], [1458511, 5279943], [1458495, 5279951], [1458478, 5279958], [1458462, 5279965], [1458446, 5279972], [1458429, 5279979], [1458413, 5279986], [1458396, 5279993], [1458380, 5280000], [1458363, 5280007], [1458347, 5280015], [1458330, 5280022], [1458314, 5280026], [1458297, 5280030], [1458281, 5280034], [1458264, 5280038], [1458248, 5280042], [1458231, 5280046], [1458215, 5280050], [1458198, 5280054], [1458182, 5280058], [1458165, 5280062], [1458149, 5280066], [1458132, 5280070], [1458115, 5280074], [1458098, 5280078], [1458082, 5280083], [1458065, 5280087], [1458048, 5280091], [1458031, 5280095], [1458015, 5280100], [1457998, 5280104], [1457981, 5280110], [1457964, 5280116], [1457948, 5280121], [1457931, 5280127], [1457914, 5280133], [1457897, 5280139], [1457880, 5280145], [1457864, 5280151], [1457847, 5280157], [1457830, 5280163], [1457813, 5280169], [1457796, 5280175], [1457779, 5280181], [1457762, 5280187], [1457745, 5280193], [1457728, 5280199], [1457712, 5280205], [1457695, 5280211], [1457678, 5280217], [1457661, 5280223], [1457644, 5280230], [1457628, 5280236], [1457612, 5280243], [1457595, 5280249], [1457579, 5280256], [1457562, 5280262], [1457546, 5280269], [1457530, 5280275], [1457513, 5280281], [1457497, 5280288], [1457481, 5280294], [1457465, 5280300], [1457449, 5280306], [1457433, 5280312], [1457417, 5280318], [1457401, 5280325], [1457385, 5280331], [1457369, 5280337], [1457353, 5280343], [1457336, 5280349], [1457320, 5280356], [1457303, 5280362], [1457287, 5280369], [1457270, 5280375], [1457254, 5280382], [1457237, 5280388], [1457221, 5280395], [1457204, 5280401], [1457188, 5280408], [1457171, 5280415], [1457155, 5280421], [1457140, 5280427], [1457124, 5280434], [1457108, 5280440]], [[1440797, 5262409], [1440816, 5262414], [1440834, 5262419], [1440852, 5262424], [1440870, 5262428], [1440888, 5262433], [1440906, 5262438], [1440924, 5262443], [1440943, 5262447], [1440961, 5262452], [1440978, 5262456], [1440996, 5262461], [1441014, 5262465], [1441032, 5262469], [1441050, 5262474], [1441068, 5262478], [1441086, 5262483], [1441104, 5262487], [1441122, 5262492], [1441139, 5262495], [1441156, 5262499], [1441173, 5262503], [1441190, 5262507], [1441207, 5262511], [1441224, 5262515], [1441241, 5262518], [1441259, 5262522], [1441276, 5262526], [1441293, 5262530], [1441310, 5262533], [1441328, 5262537], [1441345, 5262540], [1441362, 5262544], [1441380, 5262547], [1441397, 5262550], [1441415, 5262554], [1441432, 5262557], [1441450, 5262560], [1441467, 5262564], [1441484, 5262568], [1441502, 5262573], [1441519, 5262577], [1441536, 5262581], [1441553, 5262586], [1441571, 5262590], [1441588, 5262595], [1441605, 5262599], [1441622, 5262603], [1441640, 5262608], [1441657, 5262612], [1441674, 5262616], [1441691, 5262620], [1441708, 5262625], [1441725, 5262629], [1441742, 5262633], [1441759, 5262637], [1441776, 5262641], [1441793, 5262645], [1441811, 5262650], [1441827, 5262653], [1441843, 5262657], [1441859, 5262661], [1441876, 5262664], [1441892, 5262668], [1441908, 5262672], [1441925, 5262675], [1441941, 5262679], [1441957, 5262683], [1441973, 5262687], [1441990, 5262690], [1442007, 5262694], [1442023, 5262698], [1442040, 5262702], [1442056, 5262706], [1442073, 5262710], [1442089, 5262713], [1442106, 5262717], [1442122, 5262721], [1442139, 5262725], [1442156, 5262730], [1442174, 5262734], [1442191, 5262739], [1442208, 5262744], [1442226, 5262749], [1442243, 5262753], [1442261, 5262758], [1442278, 5262763], [1442295, 5262767], [1442313, 5262772], [1442330, 5262777], [1442348, 5262782], [1442366, 5262786], [1442383, 5262791], [1442401, 5262796], [1442418, 5262801], [1442436, 5262805], [1442453, 5262810], [1442471, 5262815], [1442489, 5262819], [1442505, 5262823], [1442522, 5262827], [1442538, 5262831], [1442555, 5262834], [1442571, 5262838], [1442588, 5262842], [1442604, 5262845], [1442621, 5262849], [1442637, 5262853], [1442654, 5262857], [1442671, 5262860], [1442687, 5262864], [1442704, 5262868], [1442721, 5262872], [1442737, 5262876], [1442754, 5262880], [1442771, 5262883], [1442787, 5262887], [1442804, 5262891], [1442821, 5262895], [1442839, 5262899], [1442856, 5262904], [1442874, 5262908], [1442892, 5262912], [1442909, 5262917], [1442927, 5262921], [1442944, 5262926], [1442962, 5262930], [1442980, 5262934], [1442997, 5262939], [1443015, 5262943], [1443033, 5262948], [1443051, 5262952], [1443069, 5262956], [1443087, 5262961], [1443104, 5262965], [1443122, 5262970], [1443140, 5262974], [1443158, 5262979], [1443176, 5262983], [1443192, 5262987], [1443208, 5262992], [1443224, 5262996], [1443240, 5263000], [1443256, 5263005], [1443272, 5263009], [1443288, 5263014], [1443304, 5263018], [1443320, 5263022], [1443336, 5263027], [1443353, 5263031], [1443369, 5263035], [1443386, 5263040], [1443402, 5263044], [1443419, 5263048], [1443435, 5263053], [1443452, 5263057], [1443468, 5263062], [1443485, 5263066], [1443501, 5263070], [1443519, 5263073], [1443537, 5263075], [1443554, 5263077], [1443572, 5263080], [1443590, 5263082], [1443607, 5263084], [1443625, 5263086], [1443643, 5263089], [1443661, 5263091], [1443678, 5263093], [1443696, 5263096], [1443715, 5263098], [1443733, 5263101], [1443751, 5263103], [1443769, 5263106], [1443787, 5263108], [1443806, 5263111], [1443824, 5263113], [1443842, 5263116], [1443860, 5263118], [1443877, 5263122], [1443893, 5263126], [1443910, 5263130], [1443926, 5263134], [1443943, 5263138], [1443959, 5263141], [1443975, 5263145], [1443992, 5263149], [1444008, 5263153], [1444025, 5263157], [1444041, 5263160], [1444058, 5263164], [1444075, 5263168], [1444092, 5263172], [1444108, 5263176], [1444125, 5263180], [1444142, 5263183], [1444158, 5263187], [1444175, 5263191], [1444192, 5263195], [1444209, 5263199], [1444226, 5263203], [1444243, 5263207], [1444260, 5263211], [1444277, 5263215], [1444294, 5263219], [1444311, 5263223], [1444328, 5263227], [1444345, 5263231], [1444362, 5263235], [1444379, 5263239], [1444397, 5263242], [1444414, 5263246], [1444432, 5263249], [1444449, 5263253], [1444467, 5263256], [1444484, 5263260], [1444501, 5263263], [1444519, 5263267], [1444536, 5263270], [1444554, 5263271], [1444571, 5263272], [1444588, 5263273], [1444606, 5263274], [1444623, 5263275], [1444640, 5263276], [1444658, 5263277], [1444675, 5263278], [1444692, 5263279], [1444710, 5263280], [1444727, 5263281], [1444744, 5263282], [1444762, 5263283], [1444779, 5263284], [1444796, 5263285], [1444814, 5263286], [1444831, 5263287], [1444848, 5263288], [1444866, 5263289], [1444883, 5263290], [1444901, 5263290], [1444919, 5263291], [1444936, 5263291], [1444954, 5263291], [1444972, 5263291], [1444990, 5263291], [1445008, 5263291], [1445026, 5263291], [1445043, 5263291], [1445061, 5263291], [1445079, 5263291], [1445097, 5263291], [1445115, 5263291], [1445133, 5263291], [1445151, 5263291], [1445169, 5263291], [1445187, 5263292], [1445205, 5263292], [1445223, 5263292], [1445241, 5263292], [1445259, 5263293], [1445276, 5263294], [1445294, 5263295], [1445311, 5263296], [1445328, 5263297], [1445346, 5263298], [1445363, 5263299], [1445381, 5263300], [1445398, 5263301], [1445416, 5263302], [1445433, 5263303], [1445451, 5263304], [1445469, 5263305], [1445487, 5263306], [1445504, 5263307], [1445522, 5263308], [1445540, 5263309], [1445557, 5263310], [1445575, 5263311], [1445593, 5263312], [1445611, 5263312], [1445629, 5263313], [1445648, 5263313], [1445666, 5263313], [1445684, 5263314], [1445702, 5263314], [1445721, 5263315], [1445739, 5263315], [1445757, 5263316], [1445775, 5263316], [1445794, 5263317], [1445812, 5263317], [1445830, 5263318], [1445848, 5263319], [1445866, 5263320], [1445884, 5263320], [1445902, 5263321], [1445920, 5263322], [1445938, 5263323], [1445956, 5263323], [1445974, 5263324], [1445992, 5263325], [1446009, 5263326], [1446027, 5263327], [1446045, 5263328], [1446063, 5263329], [1446080, 5263330], [1446098, 5263331], [1446116, 5263332], [1446134, 5263333], [1446151, 5263334], [1446168, 5263334], [1446186, 5263335], [1446203, 5263336], [1446221, 5263336], [1446238, 5263337], [1446256, 5263338], [1446273, 5263339], [1446290, 5263339], [1446308, 5263340], [1446326, 5263341], [1446344, 5263343], [1446363, 5263344], [1446381, 5263345], [1446399, 5263347], [1446417, 5263348], [1446435, 5263349], [1446454, 5263350], [1446472, 5263352], [1446490, 5263353], [1446508, 5263354], [1446527, 5263355], [1446545, 5263356], [1446563, 5263357], [1446581, 5263358], [1446600, 5263359], [1446618, 5263360], [1446636, 5263362], [1446654, 5263363], [1446672, 5263364], [1446690, 5263365], [1446708, 5263366], [1446726, 5263367], [1446743, 5263368], [1446761, 5263369], [1446779, 5263370], [1446797, 5263371], [1446814, 5263372], [1446832, 5263373], [1446850, 5263374], [1446867, 5263375], [1446885, 5263376], [1446903, 5263377], [1446920, 5263378], [1446938, 5263379], [1446956, 5263380], [1446973, 5263381], [1446991, 5263382], [1447009, 5263383], [1447026, 5263384], [1447043, 5263385], [1447060, 5263385], [1447077, 5263386], [1447093, 5263387], [1447110, 5263387], [1447127, 5263388], [1447144, 5263389], [1447161, 5263389], [1447177, 5263390], [1447194, 5263391], [1447211, 5263392], [1447228, 5263393], [1447245, 5263394], [1447261, 5263395], [1447278, 5263396], [1447295, 5263397], [1447312, 5263398], [1447329, 5263399], [1447346, 5263400], [1447363, 5263401], [1447381, 5263401], [1447399, 5263400], [1447417, 5263399], [1447436, 5263399], [1447454, 5263398], [1447472, 5263398], [1447490, 5263397], [1447509, 5263396], [1447527, 5263396], [1447545, 5263395], [1447564, 5263395], [1447582, 5263395], [1447600, 5263395], [1447619, 5263395], [1447637, 5263395], [1447655, 5263394], [1447674, 5263394], [1447692, 5263394], [1447710, 5263394], [1447729, 5263394], [1447747, 5263395], [1447766, 5263396], [1447784, 5263397], [1447803, 5263398], [1447821, 5263399], [1447840, 5263400], [1447858, 5263400], [1447877, 5263401], [1447896, 5263402], [1447914, 5263403], [1447933, 5263404], [1447952, 5263406], [1447970, 5263407], [1447989, 5263408], [1448008, 5263409], [1448026, 5263410], [1448045, 5263411], [1448064, 5263412], [1448083, 5263413], [1448101, 5263414], [1448118, 5263415], [1448134, 5263416], [1448150, 5263416], [1448167, 5263417], [1448183, 5263418], [1448200, 5263418], [1448216, 5263419], [1448232, 5263420], [1448249, 5263420], [1448265, 5263421], [1448281, 5263422], [1448298, 5263422], [1448314, 5263423], [1448330, 5263423], [1448347, 5263424], [1448363, 5263425], [1448379, 5263425], [1448396, 5263426], [1448412, 5263426], [1448429, 5263427], [1448447, 5263428], [1448466, 5263430], [1448485, 5263431], [1448504, 5263433], [1448523, 5263434], [1448541, 5263435], [1448560, 5263437], [1448579, 5263438], [1448598, 5263440], [1448617, 5263441], [1448636, 5263442], [1448655, 5263443], [1448674, 5263444], [1448693, 5263445], [1448713, 5263446], [1448732, 5263447], [1448751, 5263448], [1448770, 5263449], [1448789, 5263450], [1448809, 5263451], [1448826, 5263451], [1448844, 5263451], [1448862, 5263451], [1448880, 5263451], [1448897, 5263451], [1448915, 5263451], [1448933, 5263451], [1448951, 5263451], [1448969, 5263451]], [[1462413, 5284268], [1462404, 5284256], [1462395, 5284243], [1462387, 5284231], [1462378, 5284219], [1462370, 5284205], [1462361, 5284192], [1462353, 5284178], [1462344, 5284164], [1462336, 5284150], [1462327, 5284137], [1462319, 5284123], [1462310, 5284109], [1462302, 5284096], [1462293, 5284082], [1462284, 5284068], [1462276, 5284054], [1462267, 5284041], [1462259, 5284027], [1462250, 5284013], [1462241, 5284000], [1462233, 5283986], [1462224, 5283972], [1462216, 5283958], [1462207, 5283945], [1462198, 5283930], [1462188, 5283914], [1462179, 5283899], [1462170, 5283884], [1462160, 5283869], [1462151, 5283854], [1462141, 5283839], [1462132, 5283824], [1462123, 5283809], [1462113, 5283794], [1462104, 5283779], [1462094, 5283764], [1462085, 5283749], [1462075, 5283734], [1462066, 5283719], [1462056, 5283704], [1462047, 5283689], [1462037, 5283674], [1462028, 5283659], [1462018, 5283644], [1462009, 5283631], [1462000, 5283617], [1461991, 5283603], [1461982, 5283589], [1461973, 5283576], [1461964, 5283562], [1461955, 5283548], [1461946, 5283534], [1461937, 5283521], [1461928, 5283507], [1461919, 5283493], [1461910, 5283479], [1461901, 5283465], [1461892, 5283451], [1461883, 5283437], [1461874, 5283423], [1461865, 5283409], [1461856, 5283394], [1461847, 5283380], [1461838, 5283366], [1461828, 5283351], [1461818, 5283336], [1461809, 5283321], [1461799, 5283306], [1461789, 5283291], [1461779, 5283276], [1461770, 5283261], [1461760, 5283247], [1461750, 5283232], [1461741, 5283217], [1461731, 5283201], [1461721, 5283186], [1461711, 5283171], [1461702, 5283156], [1461692, 5283141], [1461682, 5283126], [1461673, 5283111], [1461663, 5283096], [1461653, 5283081], [1461643, 5283066], [1461634, 5283051], [1461624, 5283037], [1461614, 5283023], [1461605, 5283008], [1461595, 5282994], [1461585, 5282979], [1461576, 5282965], [1461566, 5282950], [1461557, 5282936], [1461547, 5282922], [1461538, 5282907], [1461528, 5282893], [1461519, 5282879], [1461510, 5282864], [1461501, 5282850], [1461491, 5282836], [1461482, 5282822], [1461473, 5282807], [1461464, 5282793], [1461455, 5282779], [1461445, 5282763], [1461436, 5282747], [1461426, 5282732], [1461417, 5282716], [1461407, 5282701], [1461398, 5282685], [1461388, 5282669], [1461379, 5282654], [1461369, 5282638], [1461360, 5282622], [1461351, 5282607], [1461341, 5282591], [1461332, 5282576], [1461323, 5282560], [1461314, 5282544], [1461304, 5282529], [1461295, 5282513], [1461286, 5282497], [1461276, 5282482], [1461267, 5282466], [1461257, 5282451], [1461247, 5282435], [1461237, 5282419], [1461227, 5282404], [1461217, 5282388], [1461207, 5282372], [1461197, 5282357], [1461187, 5282341], [1461178, 5282325], [1461168, 5282310], [1461158, 5282294], [1461148, 5282279], [1461138, 5282264], [1461129, 5282249], [1461119, 5282233], [1461109, 5282218], [1461100, 5282203], [1461090, 5282187], [1461080, 5282172], [1461071, 5282157], [1461061, 5282142], [1461052, 5282128], [1461043, 5282114], [1461034, 5282099], [1461025, 5282085], [1461016, 5282070], [1461007, 5282056], [1460997, 5282042], [1460988, 5282027], [1460979, 5282013], [1460970, 5281999], [1460962, 5281985], [1460953, 5281971], [1460944, 5281956], [1460935, 5281942], [1460927, 5281928], [1460918, 5281914], [1460909, 5281900], [1460900, 5281886], [1460892, 5281872], [1460882, 5281857], [1460872, 5281841], [1460862, 5281826], [1460852, 5281811], [1460842, 5281796], [1460832, 5281780], [1460822, 5281765], [1460812, 5281750], [1460802, 5281734], [1460792, 5281719], [1460782, 5281704], [1460772, 5281688], [1460761, 5281673], [1460751, 5281658], [1460741, 5281642], [1460731, 5281627], [1460721, 5281612], [1460711, 5281597], [1460700, 5281581], [1460690, 5281566], [1460681, 5281552], [1460671, 5281538], [1460662, 5281525], [1460652, 5281511], [1460643, 5281497], [1460633, 5281483], [1460624, 5281470], [1460614, 5281456], [1460605, 5281442], [1460595, 5281428], [1460585, 5281415], [1460576, 5281401], [1460566, 5281387], [1460556, 5281373], [1460547, 5281359], [1460537, 5281345], [1460527, 5281331], [1460517, 5281318], [1460508, 5281304], [1460498, 5281290], [1460489, 5281275], [1460481, 5281261], [1460472, 5281246], [1460464, 5281231], [1460455, 5281217], [1460446, 5281202], [1460438, 5281188], [1460429, 5281173], [1460421, 5281158], [1460412, 5281144], [1460403, 5281129], [1460394, 5281114], [1460386, 5281100], [1460377, 5281085], [1460368, 5281070], [1460359, 5281055], [1460350, 5281041], [1460341, 5281026], [1460332, 5281011], [1460323, 5280996], [1460314, 5280981], [1460304, 5280966], [1460294, 5280951], [1460284, 5280936], [1460275, 5280922], [1460265, 5280907], [1460255, 5280892], [1460246, 5280877], [1460236, 5280862], [1460226, 5280847], [1460216, 5280832], [1460207, 5280817], [1460197, 5280802], [1460187, 5280788], [1460178, 5280773], [1460168, 5280758], [1460158, 5280743], [1460148, 5280729], [1460139, 5280714], [1460129, 5280699], [1460120, 5280684], [1460111, 5280669], [1460102, 5280653], [1460093, 5280638], [1460084, 5280623], [1460075, 5280607], [1460066, 5280592], [1460057, 5280577], [1460048, 5280562], [1460039, 5280546], [1460030, 5280531], [1460021, 5280516], [1460012, 5280501], [1460003, 5280486], [1459994, 5280472], [1459985, 5280457], [1459976, 5280442], [1459967, 5280427], [1459958, 5280412], [1459949, 5280397], [1459939, 5280383], [1459930, 5280370], [1459921, 5280356], [1459911, 5280343], [1459902, 5280330], [1459892, 5280316], [1459883, 5280303], [1459874, 5280289], [1459864, 5280276], [1459855, 5280263], [1459846, 5280249], [1459837, 5280236], [1459828, 5280222], [1459818, 5280209], [1459809, 5280195], [1459800, 5280181], [1459791, 5280168], [1459782, 5280154], [1459773, 5280141], [1459764, 5280127], [1459755, 5280113], [1459746, 5280098], [1459737, 5280083], [1459728, 5280068], [1459719, 5280054], [1459710, 5280039], [1459701, 5280024], [1459692, 5280010], [1459683, 5279995], [1459674, 5279980], [1459665, 5279965], [1459656, 5279950], [1459647, 5279935], [1459638, 5279920], [1459628, 5279905], [1459619, 5279890], [1459610, 5279875], [1459601, 5279860], [1459592, 5279845], [1459583, 5279831], [1459574, 5279816], [1459564, 5279802], [1459555, 5279788], [1459546, 5279774], [1459537, 5279760], [1459527, 5279746], [1459518, 5279732], [1459509, 5279718], [1459500, 5279704], [1459491, 5279690], [1459481, 5279676], [1459471, 5279662], [1459461, 5279648], [1459452, 5279633], [1459442, 5279619], [1459432, 5279605], [1459422, 5279591], [1459413, 5279577], [1459403, 5279563], [1459393, 5279549], [1459385, 5279534], [1459377, 5279520], [1459369, 5279505], [1459361, 5279490], [1459353, 5279476], [1459344, 5279461], [1459336, 5279447], [1459328, 5279432], [1459320, 5279417], [1459312, 5279403], [1459304, 5279388], [1459295, 5279373], [1459287, 5279359], [1459279, 5279344], [1459271, 5279329], [1459262, 5279315], [1459254, 5279300], [1459246, 5279285], [1459238, 5279270], [1459229, 5279256], [1459220, 5279241], [1459211, 5279226], [1459202, 5279212], [1459193, 5279197], [1459183, 5279183], [1459174, 5279168], [1459165, 5279153], [1459156, 5279139], [1459146, 5279124], [1459137, 5279109], [1459128, 5279095], [1459118, 5279080], [1459109, 5279065], [1459100, 5279050], [1459090, 5279036], [1459081, 5279021], [1459072, 5279006], [1459062, 5278991], [1459053, 5278977], [1459043, 5278962], [1459033, 5278947], [1459022, 5278932], [1459012, 5278917], [1459001, 5278902], [1458991, 5278887], [1458980, 5278872], [1458970, 5278857], [1458959, 5278842], [1458949, 5278827], [1458938, 5278812], [1458927, 5278797], [1458917, 5278781], [1458906, 5278766], [1458895, 5278751], [1458884, 5278735], [1458874, 5278720], [1458863, 5278705], [1458852, 5278689], [1458841, 5278674], [1458831, 5278659], [1458821, 5278644], [1458811, 5278630], [1458801, 5278615], [1458792, 5278601], [1458782, 5278586], [1458772, 5278572], [1458763, 5278557], [1458753, 5278542], [1458743, 5278528], [1458733, 5278513], [1458724, 5278499], [1458715, 5278485], [1458705, 5278471], [1458696, 5278456], [1458686, 5278442], [1458677, 5278428], [1458667, 5278413], [1458658, 5278399], [1458648, 5278385], [1458639, 5278370], [1458629, 5278356], [1458620, 5278342], [1458610, 5278327], [1458601, 5278313], [1458591, 5278298], [1458582, 5278284], [1458572, 5278270], [1458563, 5278255], [1458554, 5278241], [1458544, 5278226], [1458535, 5278212], [1458525, 5278198], [1458516, 5278184], [1458506, 5278170], [1458497, 5278156], [1458487, 5278142], [1458478, 5278128], [1458468, 5278114], [1458459, 5278100], [1458449, 5278085], [1458441, 5278071], [1458432, 5278057], [1458424, 5278043], [1458415, 5278029], [1458406, 5278015], [1458398, 5278001], [1458389, 5277987], [1458381, 5277973], [1458372, 5277959], [1458364, 5277945], [1458355, 5277930], [1458347, 5277916], [1458338, 5277902], [1458330, 5277887], [1458321, 5277873], [1458313, 5277859], [1458304, 5277844], [1458296, 5277830], [1458287, 5277815], [1458279, 5277801], [1458269, 5277786], [1458260, 5277772], [1458250, 5277757], [1458241, 5277742], [1458232, 5277728], [1458222, 5277713], [1458213, 5277698], [1458203, 5277684], [1458194, 5277669], [1458184, 5277655], [1458175, 5277640], [1458166, 5277624], [1458157, 5277609], [1458147, 5277594], [1458138, 5277579], [1458129, 5277564], [1458120, 5277549], [1458111, 5277534], [1458101, 5277519], [1458092, 5277504], [1458082, 5277489], [1458072, 5277475], [1458062, 5277461], [1458052, 5277446], [1458042, 5277432], [1458032, 5277417], [1458022, 5277403], [1458012, 5277388], [1458003, 5277374], [1457993, 5277360], [1457983, 5277345], [1457973, 5277330], [1457963, 5277316], [1457954, 5277301], [1457944, 5277286], [1457934, 5277272], [1457925, 5277257], [1457915, 5277242], [1457905, 5277228], [1457895, 5277213], [1457886, 5277198], [1457876, 5277183], [1457866, 5277168], [1457856, 5277153], [1457846, 5277138], [1457836, 5277123], [1457826, 5277108], [1457816, 5277093], [1457806, 5277078], [1457796, 5277063], [1457786, 5277048], [1457776, 5277033], [1457766, 5277017], [1457756, 5277002], [1457746, 5276987], [1457736, 5276972], [1457726, 5276956], [1457717, 5276941], [1457707, 5276926], [1457697, 5276910], [1457686, 5276896], [1457676, 5276881], [1457666, 5276866], [1457656, 5276851], [1457645, 5276836], [1457635, 5276822], [1457625, 5276807], [1457614, 5276792], [1457604, 5276777], [1457594, 5276763], [1457584, 5276748], [1457575, 5276734], [1457565, 5276719], [1457556, 5276705], [1457546, 5276690], [1457537, 5276676], [1457527, 5276661]]], + "type": "AnyCrsMultiLineString" + }, + "properties": {}, + "type": "AnyCrsFeature" + } + ], + "persistableReferenceCrs": "{\"authCode\":{\"auth\":\"OSDU\",\"code\":\"2193001\"},\"lateBoundCRS\":{\"authCode\":{\"auth\":\"EPSG\",\"code\":\"2193\"},\"name\":\"NZGD_2000_New_Zealand_Transverse_Mercator\",\"type\":\"LBC\",\"ver\":\"PE_10_9_1\",\"wkt\":\"PROJCS[\\\"NZGD_2000_New_Zealand_Transverse_Mercator\\\",GEOGCS[\\\"GCS_NZGD_2000\\\",DATUM[\\\"D_NZGD_2000\\\",SPHEROID[\\\"GRS_1980\\\",6378137.0,298.257222101]],PRIMEM[\\\"Greenwich\\\",0.0],UNIT[\\\"Degree\\\",0.0174532925199433]],PROJECTION[\\\"Transverse_Mercator\\\"],PARAMETER[\\\"False_Easting\\\",1600000.0],PARAMETER[\\\"False_Northing\\\",10000000.0],PARAMETER[\\\"Central_Meridian\\\",173.0],PARAMETER[\\\"Scale_Factor\\\",0.9996],PARAMETER[\\\"Latitude_Of_Origin\\\",0.0],UNIT[\\\"Meter\\\",1.0],AUTHORITY[\\\"EPSG\\\",2193]]\"},\"name\":\"NZGD2000 * OSG-Nzl / New Zealand Transverse Mercator 2000 [2193,1565]\",\"singleCT\":{\"authCode\":{\"auth\":\"EPSG\",\"code\":\"1565\"},\"name\":\"NZGD_2000_To_WGS_1984_1\",\"type\":\"ST\",\"ver\":\"PE_10_9_1\",\"wkt\":\"GEOGTRAN[\\\"NZGD_2000_To_WGS_1984_1\\\",GEOGCS[\\\"GCS_NZGD_2000\\\",DATUM[\\\"D_NZGD_2000\\\",SPHEROID[\\\"GRS_1980\\\",6378137.0,298.257222101]],PRIMEM[\\\"Greenwich\\\",0.0],UNIT[\\\"Degree\\\",0.0174532925199433]],GEOGCS[\\\"GCS_WGS_1984\\\",DATUM[\\\"D_WGS_1984\\\",SPHEROID[\\\"WGS_1984\\\",6378137.0,298.257223563]],PRIMEM[\\\"Greenwich\\\",0.0],UNIT[\\\"Degree\\\",0.0174532925199433]],METHOD[\\\"Geocentric_Translation\\\"],PARAMETER[\\\"X_Axis_Translation\\\",0.0],PARAMETER[\\\"Y_Axis_Translation\\\",0.0],PARAMETER[\\\"Z_Axis_Translation\\\",0.0],OPERATIONACCURACY[1.0],AUTHORITY[\\\"EPSG\\\",1565]]\"},\"type\":\"EBC\",\"ver\":\"PE_10_9_1\"}", + "type": "AnyCrsFeatureCollection" + }, + "Wgs84Coordinates": { + "type": "FeatureCollection", + "features": [{ + "type": "Feature", + "geometry": { + "type": "MultiLineString", + "coordinates": [[[171.01118477769356, -42.85241132532663], [171.01120192075032, -42.85225853976968], [171.01121877483035, -42.85211475409379], [171.01124786077412, -42.85197118095449], [171.0112650035133, -42.85181839537142], [171.0112818572893, -42.85167460967042], [171.01129871097467, -42.85153082396195], [171.01131556456946, -42.85138703824601], [171.01133241807358, -42.851243252522586], [171.0113492714871, -42.85109946679171], [171.01136612480997, -42.85095568105337], [171.01138326688343, -42.8508028954154], [171.0114001200212, -42.850659109661784], [171.0114169730683, -42.85051532390069], [171.0114338260248, -42.850371538132144], [171.0114509677162, -42.85021875246269], [171.01148062970873, -42.85005717940297], [171.01149777116896, -42.84990439371448], [171.01151491253066, -42.84975160801788], [171.01154457408782, -42.849590034921256], [171.01156171521836, -42.84943724920562], [171.01157914504773, -42.84927546358627], [171.01159628597716, -42.84912267785408], [171.01162565817307, -42.84897010460557], [171.01164308765877, -42.84880831895799], [171.01166022825856, -42.84865553319864], [171.01168960003312, -42.8485029599143], [171.01170674040583, -42.848350174136286], [171.0117241694453, -42.848188388451995], [171.01174130961692, -42.848035602657376], [171.01175844969, -42.84788281685465], [171.01178782078614, -42.84773024351337], [171.01180524937942, -42.847568457792406], [171.0118223891229, -42.84741567196253], [171.01183952876784, -42.84726288612452], [171.0118691880474, -42.84710131283622], [171.01189884715677, -42.846939739532836], [171.011928506096, -42.846778166214314], [171.01197039576837, -42.846616805326356], [171.01200005433563, -42.846455231973785], [171.01202971273275, -42.8462936586061], [171.01205937095972, -42.84613208522329], [171.01208902901655, -42.845970511825385], [171.01211868690325, -42.84580893841233], [171.01214834461976, -42.84564736498417], [171.012177713494, -42.84549479144575], [171.01220737087618, -42.845333217987765], [171.01224897004982, -42.845180856830595], [171.01227862706602, -42.845019283338985], [171.01232051447096, -42.84485792223357], [171.012349882476, -42.844705348614966], [171.01237953895608, -42.84454377507461], [171.01242113710614, -42.844391413815735], [171.01245079322024, -42.84422984024175], [171.01248044916423, -42.844068266652656], [171.01250981633007, -42.84391569295761], [171.012527241597, -42.843753906965155], [171.0125568970682, -42.84359233333494], [171.0125740334961, -42.84343954723263], [171.01260368866465, -42.843277973576406], [171.01262111344545, -42.84311618754405], [171.01265076830543, -42.8429546138614], [171.01266790426723, -42.842801827720706], [171.01269755882458, -42.84264025401206], [171.01271498311928, -42.842478467939834], [171.01274434881014, -42.8423258941177], [171.01276177286385, -42.8421641080257], [171.01279113826206, -42.84201153417832], [171.01280856207478, -42.841849748066565], [171.01283821571835, -42.84168817427946], [171.01285535075215, -42.84153538806239], [171.0128850040931, -42.84137381424929], [171.0129021388959, -42.8412210280132], [171.01293179193425, -42.84105945417409], [171.01294921502003, -42.84089766800268], [171.01297857924183, -42.84074509405389], [171.01300823180753, -42.840583520173645], [171.01302536601582, -42.840430733888645], [171.01305501827892, -42.840269159982405], [171.01308467037197, -42.840107586061066], [171.01310180421683, -42.83995479974616], [171.01313145600727, -42.8397932257988], [171.01314858962118, -42.83964043946489], [171.01317824110905, -42.839478865491536], [171.01320789242686, -42.83931729150305], [171.01322502567731, -42.83916450513925], [171.01325467669258, -42.83900293112476], [171.0132843275378, -42.83884135709516], [171.01331368977426, -42.83868878297226], [171.01333111096744, -42.83852699664587], [171.01336076134004, -42.838365422575166], [171.0133904115426, -42.83820384848934], [171.0134075439337, -42.83805106205484], [171.0134371938337, -42.83788948794301], [171.01346684356366, -42.83772791381609], [171.01348368718854, -42.837584127276145], [171.01350081912184, -42.837431340803946], [171.0135179509567, -42.837278554323646], [171.0135347943022, -42.83713476776067], [171.01353969692954, -42.83698176902582], [171.01355682850308, -42.83682898252392], [171.01357367159747, -42.83668519594027], [171.01359080297817, -42.83653240942246], [171.01360793426042, -42.83637962289652], [171.01362506544424, -42.836226836362485], [171.01364190816489, -42.836083049748], [171.01365875079497, -42.83593926312606], [171.01367588169154, -42.83578647656831], [171.01369272413672, -42.83564268993111], [171.0137095664914, -42.83549890328648], [171.0137266971007, -42.83534611670501], [171.01374353927042, -42.83520233004512], [171.01376038134967, -42.835058543377734], [171.01377751167175, -42.8349057567726], [171.01379435356606, -42.83476197008997], [171.0138240005677, -42.83460039573811], [171.0138533590817, -42.8344478213026], [171.01388300574925, -42.834286246920946], [171.01392488070084, -42.83412488471166], [171.01395423869855, -42.83397231022871], [171.0139838848303, -42.83381073579835], [171.01401324250568, -42.83365816128641], [171.0140428883034, -42.833496586826236], [171.0140725339311, -42.833335012350965], [171.01410189112008, -42.833182437795344], [171.01413153641371, -42.833020863290265], [171.01414866507224, -42.83286807654839], [171.01417831006347, -42.8327065020173], [171.01419572674, -42.832544715320125], [171.01422508317995, -42.83239214069931], [171.01425472769878, -42.83223056612715], [171.0142718557632, -42.832077779336366], [171.0143014999796, -42.831916204738185], [171.01431862781322, -42.83176341792841], [171.01434827172721, -42.83160184330421], [171.01436568754306, -42.83144005653647], [171.01438281504343, -42.831287269699224], [171.0144002306503, -42.83112548291421], [171.01442987398522, -42.83096390824145], [171.01444728934715, -42.83080212143635], [171.01446441641187, -42.83064933456319], [171.0144818315648, -42.83048754774083], [171.01449924661117, -42.830325760909645], [171.01452860105215, -42.830173186118834], [171.01454601585777, -42.83001139926792], [171.01456343055682, -42.8298496124082], [171.01458055698507, -42.82969682548255], [171.01461019902953, -42.8295352507017], [171.014627325227, -42.82938246375705], [171.01464473947635, -42.82922067686032], [171.0146621536191, -42.82905888995479], [171.0146792795134, -42.82890610298512], [171.01470892084646, -42.828744528144796], [171.01472604650994, -42.828591741156124], [171.01474346020302, -42.82842995421358], [171.01476087378956, -42.82826816726224], [171.01476634811684, -42.82809716828315], [171.0147718223963, -42.8279261692984], [171.01478923571838, -42.827764382324936], [171.0147947098711, -42.82759338332782], [171.01479989586642, -42.827431384272685], [171.0148175970336, -42.82726059732946], [171.01482278290888, -42.827098598262616], [171.01482825684175, -42.82692759924208], [171.01484566963907, -42.82676581222477], [171.0148511434452, -42.826594813191875], [171.0148563291122, -42.82643281410285], [171.01486180282527, -42.826261815058864], [171.01486698840404, -42.82609981595934], [171.01487246202402, -42.8259288169043], [171.01487764751462, -42.82576681779427], [171.01488312104155, -42.82559581872814], [171.01488830644396, -42.825433819607596], [171.01489377987778, -42.82526282053039], [171.01489896519206, -42.825100821399374], [171.01490328625448, -42.82496582211961], [171.01490789535495, -42.824821822883955], [171.014924442957, -42.82468703564026], [171.01492905196343, -42.824543036395724], [171.0149455994226, -42.824408249140326], [171.01495020833502, -42.824264249886916], [171.01495452915967, -42.82412925058318], [171.0149713644697, -42.82398546335755], [171.01497568520617, -42.823850464045485], [171.01498029395893, -42.82370646477537], [171.0149968410158, -42.82357167748721], [171.01500144967454, -42.823427678208226], [171.0150182846248, -42.82328389095302], [171.01502289318742, -42.823139891664894], [171.01503943995473, -42.823005104353065], [171.01505627466577, -42.822861317078136], [171.01506088307218, -42.82271731777603], [171.01507771763056, -42.82257353048856], [171.01508232594082, -42.82242953117733], [171.01509887233206, -42.82229474383468], [171.01511628267232, -42.82213295661206], [171.01513340489976, -42.82198016933874], [171.01515052702885, -42.82182738205728], [171.01518016306565, -42.821665806813094], [171.01519728496407, -42.82151301951263], [171.01521469475247, -42.821351232244574], [171.0152318164502, -42.82119844492755], [171.01524893804958, -42.82104565760242], [171.01527857338124, -42.82088408229919], [171.01529569474997, -42.820731294955046], [171.01531281602033, -42.8205785076028], [171.0153302251546, -42.82041672028081], [171.01535957195722, -42.82026414489145], [171.01537669289863, -42.82011135751209], [171.0153938137417, -42.81995857012461], [171.01541122243063, -42.819796782766], [171.01544056868443, -42.819644207330285], [171.01545768919854, -42.81949141991568], [171.01547480961432, -42.819338632492986], [171.015492217858, -42.81917684509773], [171.01550962599515, -42.81901505769366], [171.01552703402587, -42.818853270280805], [171.0155322165256, -42.818691270905674], [171.01554962437504, -42.818529483477704], [171.01555480675717, -42.81836748409116], [171.01557221442536, -42.81820569664811], [171.01558962198712, -42.81804390919624], [171.01559480417689, -42.817881909791986], [171.0156122115574, -42.81772012232502], [171.01562961883138, -42.81755833484929], [171.01564702599893, -42.81739654736472], [171.01566443305998, -42.817234759871354], [171.01568184001454, -42.8170729723692], [171.01569924686265, -42.816911184858256], [171.01570442856112, -42.81674918541107], [171.015721835228, -42.81658739788503], [171.01573952965097, -42.816416610380045], [171.01575693610076, -42.81625482283604], [171.01577434244405, -42.816093035283224], [171.0157917486809, -42.815931247721615], [171.015821091818, -42.81577867203519], [171.01583820997416, -42.81562588442578], [171.015855328032, -42.81547309680826], [171.01588467075447, -42.81532052108645], [171.01590178858575, -42.81516773345026], [171.01591890631872, -42.81501494580596], [171.01593602395343, -42.81486215815354], [171.01596536613303, -42.814709582385824], [171.01598248354117, -42.81455679471475], [171.01599960085102, -42.81440400703556], [171.01602894261603, -42.814251431232464], [171.01605828422296, -42.814098855415054], [171.01608733788456, -42.81395527955932], [171.0161044547154, -42.81380249184073], [171.01613379588366, -42.81364991598462], [171.01616313689388, -42.81349734011427], [171.01619218998005, -42.81335376420706], [171.01620930633186, -42.81320097644904], [171.01623864690347, -42.81304840053996], [171.01626769956647, -42.81290482459518], [171.01628510331406, -42.81274303682939], [171.01630221921286, -42.812590249034045], [171.01631933501338, -42.81243746123061], [171.01633673844995, -42.81227567343912], [171.0163538540499, -42.81212288561912], [171.01637125727774, -42.81196109781039], [171.0163883726771, -42.81180830997384], [171.01640548797826, -42.81165552212914], [171.0164228908951, -42.81149373429472], [171.01644000599566, -42.81134094643348], [171.01645740870376, -42.81117915858182], [171.01647452360382, -42.811026370704035], [171.0164919261032, -42.810864582835116], [171.0165090408027, -42.81071179494075], [171.01651421926522, -42.81054979523815], [171.01653162148122, -42.810388007345715], [171.01654873590783, -42.81023521942876], [171.01656613791513, -42.81007343151909], [171.01658325214123, -42.80992064358558], [171.01660065393983, -42.809758855658636], [171.0166055443224, -42.80960585590563], [171.0166104346668, -42.80945285614804], [171.01661532497297, -42.80929985638592], [171.01662021524098, -42.80914685661923], [171.01662510547075, -42.80899385684799], [171.01662999566233, -42.808840857072184], [171.01663488581568, -42.808687857291844], [171.01663977593088, -42.80853485750693], [171.01664466600783, -42.80838185771747], [171.0166495560466, -42.80822885792346], [171.01666666938925, -42.8080760699166], [171.01667155932154, -42.80792307011233], [171.01667644921562, -42.80777007030354], [171.0166813390715, -42.807617070490174], [171.0166862288892, -42.80746407067227], [171.01669111866866, -42.80731107084979], [171.01669600840995, -42.80715807102276], [171.01670089811304, -42.80700507119119], [171.0167057877779, -42.80685207135505], [171.0167106774046, -42.80669907151436], [171.01669112091082, -42.80654564810696], [171.01667156449975, -42.806392224694285], [171.01665200817132, -42.806238801276365], [171.01663273955464, -42.80607637786186], [171.01661318339285, -42.80592295443325], [171.01659362731374, -42.80576953099941], [171.0165740713173, -42.80561610756027], [171.01655451540353, -42.80546268411591], [171.01653495957243, -42.80530926066626], [171.0165156914607, -42.805146837219205], [171.01649613579622, -42.804993413758915], [171.01647629257516, -42.80484899028575], [171.01645673707472, -42.80469556681507], [171.01643718165695, -42.80454214333911], [171.01641762632184, -42.804388719857876], [171.01639807106937, -42.80423529637142], [171.01637851589962, -42.80408187287968], [171.0163589608125, -42.803928449382674], [171.01633940580803, -42.803775025880405], [171.01631985088622, -42.803621602372885], [171.0163369633445, -42.80346881429005], [171.0163543633461, -42.80330702620491], [171.01637147560388, -42.80315423810549], [171.01640081010456, -42.803001661797985], [171.01641792213593, -42.802848873679935], [171.01643532169268, -42.80268708555816], [171.0164524335236, -42.802534297423534], [171.01646954525629, -42.80238150928081], [171.01649887908047, -42.80222893291646], [171.01651627819243, -42.80206714475806], [171.0165333895965, -42.80191435658823], [171.0165627230006, -42.801761780188116], [171.01658012176998, -42.80159999200154], [171.01660945488214, -42.8014474155762], [171.01662656582943, -42.80129462736873], [171.01665618623147, -42.80113305091933], [171.01667329694834, -42.80098026269287], [171.01670291704855, -42.80081868621752], [171.01672002753506, -42.80066589797206], [171.01674935977726, -42.800513321471485], [171.01671787030153, -42.80035068619657], [171.01669831520445, -42.80019726267006], [171.01667876019002, -42.80004383913826], [171.01665920525826, -42.799890415601226], [171.01662742870886, -42.79973678029731], [171.01660787397273, -42.79958335674827], [171.0165886068878, -42.79942093319239], [171.01655683071084, -42.799267297865384], [171.0165372762543, -42.79911387429894], [171.01651772188035, -42.798960450727236], [171.0164859460728, -42.798806815377226], [171.01646639189448, -42.79865339179351], [171.0164346163434, -42.79849975642725], [171.0164150623607, -42.79834633283153], [171.01639550846062, -42.79819290923056], [171.0163637332789, -42.79803927384127], [171.01634417957442, -42.79788585022828], [171.01631240464914, -42.797732214822766], [171.01629256354735, -42.797587791200634]], [[171.06238963300524, -42.83683760714094], [171.06238218574086, -42.836684396899216], [171.06238696778306, -42.836531393675045], [171.06237980182948, -42.836369183236265], [171.0623845838249, -42.836216180003845], [171.06238936578293, -42.8360631767669], [171.06238219983257, -42.835900966316636], [171.06238698174383, -42.83574796307148], [171.06237953451875, -42.83559475280471], [171.06238459767053, -42.835432749360066], [171.0623893794976, -42.83527974610212], [171.06238193228066, -42.83512653582464], [171.06238671406317, -42.83497353255872], [171.06237926686202, -42.83482032227418], [171.06238432987746, -42.83465831880758], [171.0623891115758, -42.834505315528894], [171.06238166438283, -42.83435210523364], [171.06238644603653, -42.83419910194699], [171.06237928013152, -42.83403689145098], [171.06238378046848, -42.83389288835004], [171.06238856204027, -42.83373988505088], [171.06238111487164, -42.833586674738044], [171.06238589639887, -42.833433671430925], [171.06239067788866, -42.83328066811926], [171.06238323072859, -42.83312745779592], [171.0623880121738, -42.8329744544763], [171.06238056502957, -42.8328212441459], [171.0623853464302, -42.83266824081829], [171.0623901277935, -42.83251523748617], [171.06238268065778, -42.83236202714526], [171.0623752335451, -42.83220881680071], [171.06238001485656, -42.832055813457174], [171.0623725677597, -42.831902603105554], [171.06236512068583, -42.83174939275029], [171.0623699019455, -42.83159638939536], [171.06236245488742, -42.83144317903303], [171.06236695485555, -42.83129917586809], [171.06235950781368, -42.83114596549889], [171.0623520607949, -42.83099275512605], [171.06235712320418, -42.8308307515534], [171.06236218557157, -42.830668747975665], [171.06236724789704, -42.83050674439284], [171.06238453824452, -42.8303449478025], [171.06238960045437, -42.830182944208346], [171.06239466262232, -42.83002094060911], [171.0623997247484, -42.82985893700479], [171.06240478683262, -42.8296969333954], [171.06240984887492, -42.829534929780905], [171.06241491087536, -42.82937292616133], [171.06241997283394, -42.829210922536674], [171.06241280694192, -42.82904871191869], [171.0624178688486, -42.82888670828504], [171.06242293071344, -42.828724704646284], [171.06241576482353, -42.82856249401641], [171.06242054542574, -42.82840949057145], [171.06242560719915, -42.828247486918904], [171.06241844131188, -42.82808527627736], [171.06242350303341, -42.82792327261582], [171.06242856471306, -42.827761268949175], [171.0624213988279, -42.827599058295746], [171.06242646045567, -42.82743705462012], [171.06241929458255, -42.8272748439587], [171.06242407496094, -42.827121840478895], [171.06242913649734, -42.82695983678946], [171.06242197062684, -42.826797626116374], [171.06242703211137, -42.82663562241794], [171.0624198662529, -42.826473411736856], [171.0624249276856, -42.82631140802942], [171.06242998907643, -42.8261494043169], [171.06242254203332, -42.825996193830534], [171.06242760337463, -42.825834190109305], [171.06242043753085, -42.82567197940859], [171.06242521763863, -42.825518975885714], [171.06243027888854, -42.82535697215066], [171.0624231130474, -42.82519476143827], [171.06242789306884, -42.82504175790236], [171.06242072724032, -42.82487954718221], [171.06242578838885, -42.824717543429436], [171.062430568324, -42.824564539880505], [171.0624356293911, -42.824402536117844], [171.06244069041634, -42.82424053235011], [171.06245797822905, -42.82407873554281], [171.06246275797812, -42.82392573197383], [171.06246781884818, -42.82376372818996], [171.06248510641197, -42.82360193136179], [171.0624901671664, -42.82343992756658], [171.06249522787897, -42.823277923766305], [171.0625000074024, -42.82312492017247], [171.0625172946435, -42.82296312331719], [171.0625223552009, -42.82280111950076], [171.06252741571646, -42.82263911567926], [171.06253219505382, -42.82248611206539], [171.06253725548797, -42.822324108234], [171.06254231588025, -42.82216210439751], [171.0625470951012, -42.822009100769506], [171.06255215541208, -42.82184709692316], [171.06256944203963, -42.821685300016085], [171.06257422111403, -42.82153229637283], [171.0625792812698, -42.82137029251036], [171.06259628653387, -42.821217495797484], [171.0626132917005, -42.821064699076565], [171.06261807056316, -42.82091169541272], [171.06263507556494, -42.820758898678136], [171.0626517993687, -42.82061510215181], [171.06266880417957, -42.82046230540149], [171.062685808893, -42.82030950864312], [171.06270281350902, -42.820156711876706], [171.06271981802763, -42.82000391510223], [171.0627368224488, -42.81985111831975], [171.06275382677254, -42.8196983215292], [171.0627708309989, -42.819545524730614], [171.06277560921936, -42.81939252101178], [171.0627926132808, -42.81923972419953], [171.06280961724488, -42.81908692737924], [171.06282662111147, -42.8189341305509], [171.06284362488068, -42.81878133371452], [171.06286062855247, -42.81862853687011], [171.06286540639843, -42.81847553311856], [171.06288240990537, -42.81832273626045], [171.062887468689, -42.81816073227732], [171.06289252743076, -42.8179987282891], [171.06289758613073, -42.817836724295795], [171.0629026447888, -42.817674720297404], [171.06290770340505, -42.81751271629393], [171.06291276197942, -42.81735071228537], [171.0629175394835, -42.81719770849486], [171.0629225979765, -42.817035704476446], [171.0629276564277, -42.8168737004529], [171.06293271483702, -42.81671169642429], [171.0629377732045, -42.81654969239061], [171.06294311254703, -42.81637868812733], [171.0629481708285, -42.81621668408317], [171.06296545432028, -42.81605488691433], [171.0629705124862, -42.815892882858854], [171.0629755706103, -42.8157308787983], [171.06298090969585, -42.81555987450665], [171.06298596773388, -42.81539787043565], [171.06299102573013, -42.815235866359565], [171.0629960836845, -42.8150738622784], [171.06301336662443, -42.814912065062984], [171.06304259346828, -42.81475947493355], [171.0630595951872, -42.81460667792653], [171.06307687778724, -42.81444488068318], [171.06310610421338, -42.814292290518296], [171.0631231056062, -42.81413949348443], [171.0631403878663, -42.81397769621316], [171.06316961387478, -42.81382510601284], [171.06318689589634, -42.813663308722006], [171.0632038968617, -42.81351051165291], [171.06322089772965, -42.813357714575766], [171.06323789850023, -42.813204917490594], [171.06325489917342, -42.81305212039737], [171.06327189974925, -42.81289932329612], [171.0632889002277, -42.81274652618682], [171.06330590060873, -42.81259372906949], [171.06332290089242, -42.812440931944124], [171.0633399010787, -42.812288134810714], [171.06335690116762, -42.812135337669254], [171.06337390115917, -42.81198254051977], [171.0633786766303, -42.81182953654359], [171.06339539555196, -42.811685739614795], [171.0633998900176, -42.81154173586332], [171.0634168896875, -42.811388938687145], [171.0634213840566, -42.81124493492636], [171.06342587839268, -42.81110093116156], [171.06344287783833, -42.81094813396675], [171.06344737207792, -42.81080413019263], [171.06345186628445, -42.81066012641448], [171.06346886550588, -42.810507329201016], [171.06347335961595, -42.81036332541357], [171.06347813457168, -42.81021032138499], [171.0634951335649, -42.810057524152555], [171.06349962754337, -42.809913520351515], [171.06350440235929, -42.80976051630851], [171.06350917713795, -42.80960751226097], [171.06352589497124, -42.80946371524247], [171.06353066964735, -42.809310711185034], [171.06353544428615, -42.809157707123056], [171.06353993802978, -42.80901370329588], [171.0635572172897, -42.80885190577488], [171.06356227263814, -42.80868990145825], [171.06356732794475, -42.808527897136536], [171.0635846069519, -42.80836609959434], [171.06358966214302, -42.80820409526131], [171.0635947172923, -42.808042090923195], [171.0636119960467, -42.80788029335978], [171.0636167702464, -42.80772728925211], [171.0636218252407, -42.80756528489785], [171.0636391037464, -42.80740348731357], [171.0636441586252, -42.807241482948], [171.06364921346224, -42.80707947857733], [171.06365426825744, -42.806917474201576], [171.06365932301082, -42.80675546982075], [171.06367660111644, -42.80659367220276], [171.06368165575435, -42.80643166781059], [171.06368671035045, -42.80626966341335], [171.06369148409726, -42.80611665925575], [171.06369653861208, -42.805954654848634], [171.06370159308506, -42.80579265043641], [171.0637185899222, -42.805639853024424], [171.06372336348537, -42.80548684884704], [171.06374007936492, -42.80534305166757], [171.0637448528256, -42.80519004748028], [171.06376184933728, -42.80503725004127], [171.0637663419087, -42.80489324609085], [171.06378333825958, -42.80474044863851], [171.06378811151316, -42.80458744443115], [171.06380482692472, -42.80444364721309], [171.06380960007579, -42.804290642995845], [171.06382659610125, -42.80413784551649], [171.06384359202937, -42.8039850480291], [171.06384836500843, -42.803832043796035], [171.06386536077184, -42.80367924629498], [171.06387013364625, -42.80352624205176], [171.063887129245, -42.803373444537016], [171.06390412474636, -42.80322064701427], [171.06390889744875, -42.80306764275523], [171.06392589278548, -42.80291484521879], [171.0639306653832, -42.80276184094961], [171.06394766055521, -42.8026090433995], [171.06395243304829, -42.80245603912014], [171.06395720550407, -42.80230303483625], [171.0639619779226, -42.80215003054782], [171.0639789727952, -42.801997232972774], [171.06398374510906, -42.80184422867419], [171.06398851738564, -42.801691224371055], [171.06399328962496, -42.801538220063414], [171.06401028419816, -42.80138542246342], [171.06401505633283, -42.801232418145595], [171.06401982843022, -42.80107941382323], [171.0640371034779, -42.800917615949224], [171.06404187546843, -42.80076461161642], [171.06404664742172, -42.80061160727911], [171.0640636415269, -42.80045880964019], [171.06406869407138, -42.800296805036815], [171.06407346588057, -42.80014380068452], [171.06409045974976, -42.79999100302597], [171.06409523145433, -42.79983799866351], [171.06410028380674, -42.799675994039504], [171.06412949944553, -42.799523403053605], [171.06414649295152, -42.79937060536497], [171.06416376703154, -42.799208807410224], [171.06418076033896, -42.79905600970517], [171.06419775354905, -42.79890321199211], [171.06421502732124, -42.79874141401189], [171.0642320203328, -42.798588616282416], [171.06424901324706, -42.79843581854491], [171.06426628671136, -42.79827402053924], [171.06428327942706, -42.798121222785326], [171.06431249374637, -42.79796863169013], [171.0643297668711, -42.79780683365656], [171.06435898090038, -42.797654242536396], [171.06437597316307, -42.797501444745194], [171.06440518690806, -42.79734885360045], [171.06442245956026, -42.79718705552811], [171.06445167301524, -42.79703446435837], [171.06446866482491, -42.796881666529906], [171.06449787799562, -42.79672907533559], [171.06451515017534, -42.796567277224504], [171.06453214165927, -42.79641447936918], [171.06454913304592, -42.796261681505825], [171.06456640491783, -42.796099883369294], [171.06458339610597, -42.79594708548954], [171.0646003871968, -42.79579428760176], [171.0646176587609, -42.79563248943976], [171.06463464965327, -42.79547969153558], [171.06465164044832, -42.79532689362334], [171.06466891170464, -42.79516509543593], [171.06468590230122, -42.79501229750729], [171.06470317335095, -42.79485049930279], [171.06472016374903, -42.79469770135774], [171.06472521356378, -42.794535696527994], [171.0647422037933, -42.79438289856897], [171.06475947446165, -42.79422110033277], [171.06476452408975, -42.79405909548572], [171.0647815140495, -42.79390629750434], [171.06479878443773, -42.793744499244816], [171.064815774199, -42.793591701247], [171.06482082356914, -42.79342969637671], [171.06483781316186, -42.793276898364915], [171.064842862419, -42.79311489348356], [171.06485985184315, -42.79296209545779], [171.06486462048034, -42.79280909083732], [171.0648818902429, -42.792647292525594], [171.06488665877333, -42.79249428789472], [171.0648914272665, -42.79234128325929], [171.06490869678473, -42.79217948492706], [171.06491346517114, -42.792026480281194], [171.06493045402638, -42.79187368220812], [171.06493550279424, -42.79171167727807], [171.0649402710367, -42.79155867261728], [171.06494503924188, -42.79140566795192], [171.06494980740982, -42.79125266328202], [171.0649667958946, -42.791099865178055], [171.06497184443114, -42.79093786022257], [171.06497661245507, -42.79078485553772], [171.0649813804418, -42.79063185084835], [171.06498614839128, -42.790478846154436], [171.06499119676775, -42.79031684117947], [171.06500818481084, -42.79016404303864], [171.06502517275666, -42.79001124488976], [171.06504216060526, -42.78985844673285], [171.0650591483566, -42.78970564856792], [171.0650761360107, -42.78955285039495], [171.06509312356758, -42.78940005221394], [171.06511011102722, -42.78924725402491], [171.0651270983896, -42.789094455827815], [171.0651440856548, -42.788941657622715], [171.06516107282272, -42.78878885940958], [171.06516584002247, -42.78863585465002], [171.0651828270259, -42.78848305642321], [171.06519981393205, -42.78833025818836], [171.065216800741, -42.78817745994548], [171.06522156770166, -42.78802445516449], [171.06523855434608, -42.78787165690797], [171.06525554089328, -42.78771885864339], [171.06527252734324, -42.78756606037078], [171.06527729406477, -42.787413055568365], [171.06529428035023, -42.78726025728209], [171.06529904696723, -42.78710725246951], [171.06530381354702, -42.78695424765241], [171.06530858008958, -42.78680124283077], [171.0653255660759, -42.78664844451957], [171.0653300521363, -42.7865044399721], [171.06533481853927, -42.786351435136034], [171.06533958490502, -42.78619843029543], [171.06534435123356, -42.786045425450304], [171.06534911752487, -42.785892420600625], [171.06535388377895, -42.78573941574641], [171.0653586499958, -42.785586410887696], [171.06536341617542, -42.78543340602443], [171.06536818231783, -42.78528040115662], [171.06536072924075, -42.78512718978025], [171.06536549533877, -42.784974184904485], [171.06537026139952, -42.78482118002418], [171.0653750274231, -42.784668175139366], [171.06536757434756, -42.784514963749025], [171.06537234032672, -42.78436195885624], [171.06537710626864, -42.78420895395891], [171.06539409114507, -42.7840561555547], [171.0653988569825, -42.78390315064721], [171.06541584169443, -42.783750352229355], [171.06542060742734, -42.783597347311726], [171.06543759197478, -42.78344454888018], [171.06544235760322, -42.783291543952366], [171.0654593419862, -42.78313874550717], [171.06547632627198, -42.78298594705395], [171.06548109172863, -42.78283294211034], [171.06549807584994, -42.78268014364346], [171.0655028412021, -42.78252713868968], [171.06552010546864, -42.78236533991727], [171.06552487071414, -42.78221233495305], [171.06554185450253, -42.782059536458505], [171.0655468999448, -42.78189753119139], [171.06556388356478, -42.78174473268286], [171.0655686485991, -42.78159172769804], [171.06558591234565, -42.78142992888216], [171.0655906772733, -42.78127692388693], [171.0656076605604, -42.78112412535073], [171.06561270566615, -42.780962120050766], [171.06562968878484, -42.78080932150058], [171.06563445350133, -42.78065631648476], [171.0656514364556, -42.7805035179209], [171.06565648133778, -42.780341512599136], [171.06566124591038, -42.780188507568354], [171.06567822862897, -42.78003570898487], [171.06568299309714, -42.77988270394394], [171.065700255909, -42.77972090504978], [171.06570502027049, -42.77956789999841], [171.06572200265626, -42.779415101387286], [171.06572676691326, -42.779262096325745], [171.0657440293799, -42.779100297402735], [171.06574879353028, -42.77894729233078], [171.0657657755832, -42.778794493691976], [171.06578303777403, -42.778632694746], [171.06578780175047, -42.778479689657985], [171.06580506376665, -42.77831789069741], [171.06580982763646, -42.77816488559895], [171.06582680925547, -42.77801208692414], [171.0658437907773, -42.777859288241295], [171.06584883469176, -42.77769728282607], [171.0658658160452, -42.77754448412924], [171.0658827973015, -42.77739168542437], [171.06589977846062, -42.777238886711466], [171.0659048221198, -42.77707688127328], [171.06592180311054, -42.776924082546394], [171.06593878400415, -42.77677128381148], [171.06595576480058, -42.776618485068525], [171.06596080820444, -42.77645647960736], [171.0659777888325, -42.77630368085042], [171.06598283212344, -42.77614167537821], [171.0660000927608, -42.77597987630279], [171.0660048557612, -42.77582687112404], [171.06602211622393, -42.775665072034016], [171.06602715928676, -42.775503066539436], [171.06604413940582, -42.77535026774019], [171.06604918235573, -42.775188262234586], [171.06606644246514, -42.77502646311499], [171.0660712051435, -42.77487345790469], [171.0660884650783, -42.774711658770485], [171.0660935078001, -42.77454965324251], [171.06609855048023, -42.774387647709446], [171.06610359311867, -42.77422564217133], [171.06610863571538, -42.77406363662811], [171.06611367827043, -42.77390163107981], [171.0661309377325, -42.77373983190569], [171.06613598017233, -42.77357782634606], [171.0661407424383, -42.77342482109064], [171.0661457847971, -42.77326281552115], [171.06615082711414, -42.77310080994656], [171.0661678060576, -42.77294801104928], [171.06617284826174, -42.77278600546366], [171.06619010715414, -42.7726242062416], [171.06619486912817, -42.77247120095573], [171.06621212784597, -42.77230940171906], [171.0662168897134, -42.77215639642275], [171.06622193165012, -42.771994390809965], [171.06623891001743, -42.77184159186476], [171.06624395184127, -42.77167958624094], [171.0663095160113, -42.77153661300927], [171.0663750798689, -42.77139363973068], [171.0664284269523, -42.77125046006859], [171.06649399021273, -42.771107486703734], [171.06655955316074, -42.77096451329197], [171.06661317945586, -42.77081233320214]], [[171.13522195186195, -42.79517449616006], [171.1350416010296, -42.79507250271634], [171.1348615211787, -42.79496150836395], [171.13469339315327, -42.79485971351532], [171.13451304411507, -42.794757719267324], [171.13433296613192, -42.79464672411292], [171.1341526183124, -42.79454472931645], [171.13398476309763, -42.79443393283273], [171.13380468700728, -42.79432293687704], [171.13363656246227, -42.79422114053115], [171.13345648761768, -42.79411014404736], [171.13327641342005, -42.79399914729046], [171.13310829062692, -42.793897350196325], [171.13292821767507, -42.793786352911326], [171.13276036671195, -42.793675554698716], [171.13258029503092, -42.79356455688636], [171.13241217456726, -42.79346275880656], [171.13224459615503, -42.7933429592423], [171.1320770183901, -42.79322315944265], [171.13192139170272, -42.793112559462315], [171.1317538151845, -42.792992759208616], [171.13158623931358, -42.79287295871952], [171.13143061438006, -42.79276235809888], [171.13126303975582, -42.79264255715576], [171.1311076868823, -42.79252295549482], [171.13093984259916, -42.792412154716324], [171.13077226986886, -42.79229235308383], [171.13061691881694, -42.79217275078458], [171.1304493473564, -42.79205294869877], [171.13029372650706, -42.79194234659514], [171.13012615629316, -42.79182254405535], [171.1299708076607, -42.79170294091603], [171.12980296763095, -42.79159213853633], [171.12964762019752, -42.79147253497668], [171.1294800525, -42.79135273152964], [171.12932470628695, -42.79123312755028], [171.12915686868433, -42.79112232426077], [171.1290140156545, -42.7909939189862], [171.12885867123507, -42.79087431440149], [171.12871581938768, -42.79074590877212], [171.12857296812817, -42.79061750297305], [171.12841762549584, -42.79049789781651], [171.12827477541876, -42.79036949166262], [171.12813165461446, -42.79025008594597], [171.1279765850843, -42.790121479610704], [171.1278337367775, -42.78999307293237], [171.12769061768307, -42.78987366668957], [171.1275355500003, -42.78974505978418], [171.12739243204743, -42.78962565318551], [171.12723709416028, -42.789506046497976], [171.12709397732934, -42.78938663954289], [171.12695113252397, -42.789258231814635], [171.12679579640243, -42.78913862455475], [171.1266526812617, -42.78901921707302], [171.12649761785022, -42.78889060882514], [171.12635450385102, -42.78877120098758], [171.1262113904005, -42.78865179297924], [171.12605578561588, -42.788541185358596], [171.12590045300726, -42.7884215769367], [171.12574484935396, -42.78831096891076], [171.12560173813247, -42.788191560173765], [171.12544613558768, -42.7880809517587], [171.12529053359776, -42.78797034314072], [171.12514742403206, -42.78785093386067], [171.12499182315065, -42.787740324853594], [171.1248364945918, -42.787620715049485], [171.12468089484167, -42.78751010563714], [171.124525567457, -42.787390495429], [171.12436996883815, -42.787279885611404], [171.12421464262758, -42.78716027499925], [171.12405904514003, -42.787049664776426], [171.1239037201036, -42.78693005376026], [171.12374839566493, -42.78681044254245], [171.12359279988502, -42.786699831712056], [171.12343747662044, -42.78658022009023], [171.12328188197174, -42.78646960885462], [171.12312655988126, -42.78634999682883], [171.1229207269619, -42.78628358666244], [171.12270294675244, -42.78620797515869], [171.12249711477853, -42.78614156424664], [171.1222912832555, -42.786075152972124], [171.12207350457697, -42.7859995402968], [171.1218676739994, -42.78593312827665], [171.1216621160835, -42.785857715313576], [171.12144406672516, -42.785791102047185], [171.12123823754393, -42.78572468891894], [171.12103268111358, -42.78564927485072], [171.120814633197, -42.78558266040988], [171.12059658576044, -42.78551604556188], [171.12037881119664, -42.785440429732205], [171.1201607647511, -42.78537381407089], [171.11994271878558, -42.78530719800244], [171.1197246733001, -42.785240581526864], [171.1195069008111, -42.78516496407366], [171.11928885631664, -42.78509834678479], [171.11907081230225, -42.78503172908879], [171.1188530413771, -42.78495611041825], [171.11865943738326, -42.784889893545056], [171.11845388697665, -42.78481447494826], [171.1182605565616, -42.78473925685034], [171.11805500715704, -42.78466383755419], [171.11786140496233, -42.78459761936178], [171.11765585653072, -42.78452219936535], [171.1174625280276, -42.78444697995189], [171.11725670776323, -42.78438055981622], [171.11705116081376, -42.78430513875905], [171.11685783374585, -42.78422991834856], [171.11666450715464, -42.784154697619584], [171.11645868875246, -42.7840882760807], [171.11626536310362, -42.784013054693546], [171.11607176492916, -42.78394683354255], [171.1158662209114, -42.78387141040728], [171.11567289668164, -42.7837961880435], [171.1154792998425, -42.78372996591313], [171.11528597653887, -42.78365474291156], [171.1150804344799, -42.783579318398466], [171.11488683897608, -42.78351309528878], [171.11469351709155, -42.78343787131061], [171.11448797649845, -42.78336244575853], [171.11429438232997, -42.783296221669545], [171.1141010618645, -42.78322099671478], [171.11389524942732, -42.78315457066835], [171.11370192990418, -42.78307934505549], [171.11349639175, -42.78300391776431], [171.1133027998027, -42.78293769203609], [171.1131094816987, -42.782862465446705], [171.11290394501046, -42.782787037116584], [171.11271035439853, -42.78272081040913], [171.1125048186833, -42.78264538137889], [171.11231122895728, -42.782579154011515], [171.11210569421507, -42.782503724281156], [171.1119123789654, -42.782428495718435], [171.1117065716058, -42.78236206582339], [171.1115010383458, -42.78228663503252], [171.11130772453137, -42.782211405473014], [171.11110191856847, -42.78214497451469], [171.1109086056964, -42.78206974429711], [171.11071529330113, -42.781994513761155], [171.1105222551694, -42.781910282377765], [171.11032894375487, -42.78183505120589], [171.11014785165654, -42.78176002142943], [171.10995454117938, -42.781684789641126], [171.109761505073, -42.78160055700886], [171.10956819557657, -42.78152532458466], [171.10937488655694, -42.781450091842075], [171.1091818519898, -42.7813658582582], [171.10900076269004, -42.78129082671418], [171.10879523638883, -42.78121539118294], [171.10860220336096, -42.78113115664743], [171.1084088967796, -42.78105592231477], [171.108215590675, -42.780980687663735], [171.1080225591864, -42.7808964521767], [171.10782925406258, -42.780821216889805], [171.10763594941554, -42.78074598128458], [171.10743042663907, -42.78067054336265], [171.10723739721163, -42.78058630658633], [171.1070440940383, -42.78051107000657], [171.1068382984796, -42.78044463156011], [171.10662001049164, -42.78038699117893], [171.10641421582028, -42.78032055198533], [171.1062084215999, -42.78025411242946], [171.1059904093295, -42.78018747036123], [171.10578434156972, -42.78013003056642], [171.10556633021406, -42.780063387706285], [171.1053605377975, -42.77999694665712], [171.10514252738753, -42.77993030300609], [171.1049364613112, -42.779872861714], [171.10473067023304, -42.779806419555506], [171.1045126612033, -42.77973977472866], [171.10430687104164, -42.77967333182403], [171.10410108133098, -42.779606888557176], [171.10389529207131, -42.77954044492812], [171.10367728491832, -42.779473798542604], [171.1034714965752, -42.77940735416742], [171.10326570868313, -42.77934090943005], [171.10305992124202, -42.77927446433045], [171.1028419159658, -42.77920781638633], [171.10264862261351, -42.77913257255225], [171.10244311148432, -42.779057125875546], [171.10224981910173, -42.77898188138457], [171.1020443089747, -42.778906434008974], [171.10183879935687, -42.778830986273135], [171.10164523339463, -42.77876474127443], [171.10143972474995, -42.778689292838756], [171.1012342166145, -42.77861384404283], [171.10104092712996, -42.778538597559916], [171.10083541999668, -42.77846314806512], [171.10062991337261, -42.778387698210096], [171.1004244072578, -42.778312247994805], [171.1002186264083, -42.77824579790048], [171.1000131212829, -42.778170346963776], [171.09980734136462, -42.778103896146106], [171.09960183722868, -42.77802844448799], [171.09939633360196, -42.77795299246964], [171.0992027730956, -42.77788674343437], [171.09899727044203, -42.77781129071625], [171.09879176829773, -42.77773583763792], [171.09858626666264, -42.77766038419939], [171.0983807655368, -42.77758493040063], [171.09816304700115, -42.77750927326655], [171.0979578224737, -42.777424818255085], [171.0977523229209, -42.77734936335502], [171.09754682387737, -42.77727390809477], [171.09734160099362, -42.77718945200651], [171.0971361029976, -42.77711399602682], [171.09693060551086, -42.77703853968693], [171.09672510853335, -42.77696308298684], [171.0965196120651, -42.7768876259266], [171.09631411610607, -42.77681216850615], [171.09610862065634, -42.77673671072552], [171.0959031257158, -42.77666125258471], [171.09569763128457, -42.77658579408375], [171.095479919659, -42.77651013196505], [171.09527442626256, -42.77643467272208], [171.09506893337536, -42.77635921311897], [171.09486344099744, -42.776283753155695], [171.0946579491288, -42.776208292832266], [171.09446467539144, -42.776133035514405], [171.09427112604666, -42.77606677833191], [171.09406563564414, -42.77599131697033], [171.0938723633261, -42.77591605867671], [171.0936790914849, -42.77584080006492], [171.09348554392525, -42.77577454158483], [171.09329227301038, -42.775699282335786], [171.09309900257225, -42.775624022768596], [171.09290573261097, -42.77554876288322], [171.0927121868221, -42.77548250312596], [171.09250670032156, -42.77540703903283], [171.0923131554188, -42.775340778616155], [171.09211961093817, -42.77527451787954], [171.09191384945746, -42.775208053189886], [171.09172058228026, -42.775132791351346], [171.0915270391079, -42.77506652963537], [171.0913334963577, -42.77500026759944], [171.09112801319543, -42.77492480108886], [171.0909344713313, -42.774858538393545], [171.0907409298894, -42.774792275378296], [171.09053517155198, -42.77472580826479], [171.09034163096877, -42.774659544589284], [171.09014809080773, -42.774593280593805], [171.08995482776336, -42.7745180158451], [171.08974907121592, -42.774451547349564], [171.08955553236316, -42.77438528237481], [171.08936199393258, -42.77431901708015], [171.0891562387094, -42.774252547541934], [171.08896270113752, -42.774186281587035], [171.08876916398788, -42.77412001531221], [171.08856341008894, -42.774053544731366], [171.08836987379803, -42.773987277796294], [171.08816412078681, -42.77392080651315], [171.08797058535464, -42.77385453891788], [171.0877770503447, -42.773788271002694], [171.0875712986577, -42.77372179867694], [171.0873777645065, -42.77365553010156], [171.08717201370726, -42.77358905707351], [171.08697848041484, -42.77352278783792], [171.08677273050333, -42.773456314107605], [171.08657919806964, -42.773390044211816], [171.08637344904585, -42.77332356977924], [171.08616797770372, -42.773248094569254], [171.08597444659281, -42.773181823673944], [171.085768976224, -42.77310634776455], [171.08557544599924, -42.77304007620999], [171.0853696992603, -42.77297360001288], [171.08516423034501, -42.77289812304313], [171.08497070144307, -42.77283185048905], [171.0847652335011, -42.772756372819906], [171.08455948861047, -42.77268989519862], [171.08435402165807, -42.77261441680848], [171.08416049454286, -42.772548142915596], [171.08395502856376, -42.772472663826115], [171.08374956309396, -42.77239718437663], [171.083543820532, -42.772330704970216], [171.08335057283247, -42.77225542933638], [171.0831451088453, -42.77217994882757], [171.08293936768052, -42.772113468358974], [171.08273390468295, -42.77203798712922], [171.08252816444963, -42.77197150593776], [171.0823227024417, -42.77189602398705], [171.08211724094306, -42.77182054167637], [171.08191150212147, -42.77175405940108], [171.08170604161248, -42.77167857636949], [171.08150030372238, -42.77161209337135], [171.081294844203, -42.77153660961885], [171.08108938519294, -42.77146112550636], [171.08088364871463, -42.77139464142447], [171.08067819069421, -42.77131915659111], [171.08047273318311, -42.77124367139777], [171.08026699811657, -42.77117718623211], [171.08006154159511, -42.77110170031792], [171.079856085583, -42.771026214043786], [171.0796506300802, -42.770950727409684], [171.07945711338917, -42.770884445746105], [171.0792516588597, -42.770808958412786], [171.0790462048396, -42.77073347071953], [171.07884047306246, -42.77066698304723], [171.078635020032, -42.770591494633145], [171.0784548352806, -42.77048941482768], [171.07827437277984, -42.77039633512682], [171.07809418919604, -42.770294254773084], [171.07791400620854, -42.7701921741456], [171.0777457617131, -42.77009929874659], [171.07756557987184, -42.76999721758969], [171.0773853986269, -42.76989513615904], [171.07720493948352, -42.769802054828304], [171.07702475940616, -42.76969997284942], [171.0768445799251, -42.76959789059681], [171.07666412247022, -42.769504808441745], [171.0764839441567, -42.769402725640916], [171.07631570397047, -42.76930984821176], [171.0761355268031, -42.76920776488156], [171.0759550715631, -42.76911468164576]], [[170.93383176425152, -42.858389005892164], [170.93404151996086, -42.858338763287406], [170.93425157546127, -42.85827952083988], [170.93446133048565, -42.858229277449645], [170.93467108518294, -42.8581790336673], [170.93488083955327, -42.85812878949289], [170.93509089359054, -42.858069545470606], [170.93530064727582, -42.85801930051073], [170.93549816806927, -42.85796883449917], [170.93570792110881, -42.857918588777736], [170.9359054412732, -42.85786812204855], [170.93610296112735, -42.85781765497122], [170.93631271320237, -42.85776740811875], [170.93651023242745, -42.8577169403238], [170.93671968410354, -42.85767569217544], [170.9369172027288, -42.857625223664066], [170.93712695354324, -42.8575749752898], [170.93733670403063, -42.85752472652347], [170.93754645419097, -42.85747447736505], [170.93775620402425, -42.8574242278146], [170.9379781859969, -42.85737419826553], [170.93818793516775, -42.85732394790833], [170.93839768401156, -42.85727369715903], [170.93861966496993, -42.85722366634203], [170.93882941315127, -42.85717341478602], [170.93903916100555, -42.85712316283794], [170.93924890853273, -42.85707291049782], [170.93945865573286, -42.85702265776564], [170.9396684026059, -42.85697240464142], [170.9398778498651, -42.856931150609846], [170.94008759611492, -42.85688089670279], [170.94029734203767, -42.85683064240367], [170.9405070876333, -42.85678038771253], [170.9407165337389, -42.8567391321191], [170.94092627871134, -42.85668887664515], [170.94113602335668, -42.85663862077916], [170.9413457676749, -42.85658836452112], [170.94154327933708, -42.85653788786318], [170.94175302300937, -42.85648763084371], [170.9419505340424, -42.85643715346824], [170.942159978119, -42.856395895185784], [170.94235748855206, -42.856345417094], [170.94255499867472, -42.856294938654116], [170.94276474076736, -42.85624467974361], [170.94296225026082, -42.85619420058622], [170.94317199170746, -42.85614394091429], [170.94336950057175, -42.8560934610394], [170.94356700912564, -42.85604298081642], [170.94377674960748, -42.85599272001368], [170.94397425753218, -42.85594223907321], [170.94417176514645, -42.85589175778465], [170.94436927245036, -42.855841276148006], [170.94457901164856, -42.85579101384508], [170.9447765183232, -42.85574053149094], [170.94497402468747, -42.85569004878875], [170.9451715307413, -42.85563956573846], [170.94536903648478, -42.855589082340096], [170.9455784756359, -42.85554781768673], [170.94578821293535, -42.855497553123534], [170.94598571775992, -42.85544706863954], [170.94619515605984, -42.85540580283779], [170.9464048924171, -42.8553555371225], [170.94661462844715, -42.855305271015226], [170.94681183377142, -42.85526378460275], [170.9470215691864, -42.85521351773538], [170.94723100607357, -42.85517225000506], [170.94742850877054, -42.85512176298165], [170.94763824324323, -42.855071494962225], [170.94784767927914, -42.855030226083564], [170.9480451810571, -42.85497973797456], [170.9482549145875, -42.854929468803086], [170.9484521177158, -42.85488797951306], [170.94866185063105, -42.85483770958152], [170.9488712852606, -42.85479643879688], [170.9490687855194, -42.854745948886126], [170.94927851749233, -42.854695677802574], [170.94948795127053, -42.85465440586964], [170.94968515277182, -42.85461291441707], [170.94989458602575, -42.85457164172778], [170.950091787016, -42.854530149562656], [170.95030092199778, -42.85449787566441], [170.95049812250605, -42.85445638278787], [170.9507075547422, -42.85441510858713], [170.95090445708036, -42.85438261454901], [170.95110165685438, -42.85434112061542], [170.9513110883382, -42.854299845292694], [170.95150828760114, -42.85425835064657], [170.9517174210213, -42.854226074123275], [170.9519143222918, -42.854193578322736], [170.95212375278862, -42.85415230148985], [170.9523206536368, -42.85411980498033], [170.95251785171249, -42.85407830856697], [170.952726984066, -42.854046030173876], [170.9529238842977, -42.854013532612086], [170.9531333135794, -42.8539722539034], [170.95333021338874, -42.85393975563266], [170.9535396421769, -42.85389847616891], [170.95374877345895, -42.85386619588353], [170.95395820174704, -42.85382491564219], [170.95416762976967, -42.85378363501142], [170.95437705752678, -42.85374235399126], [170.954586187901, -42.853710072154406], [170.954795615158, -42.85366879035664], [170.9550050421495, -42.85362750816946], [170.95522670072668, -42.85358644412817], [170.95543583018818, -42.85355416071741], [170.9556452564075, -42.853512877340705], [170.95585468236132, -42.853471593574604], [170.95606410804962, -42.8534303094191], [170.95627323660318, -42.8533980244569], [170.95649489360684, -42.8533569579227], [170.9567043185229, -42.8533156725777], [170.95691374317343, -42.85327438684329], [170.9571228708142, -42.85324210030725], [170.95734452675578, -42.85320103210275], [170.95755395063404, -42.85315974517888], [170.95776337424675, -42.8531184578656], [170.95796026920127, -42.853085951515766], [170.95816939572995, -42.853053663041386], [170.95836658685238, -42.853012156388765], [170.9585634811901, -42.852979648986754], [170.95876067183696, -42.85293814164406], [170.95896979750253, -42.85290585168699], [170.95916669122346, -42.85287334323281], [170.9593638811648, -42.85283183483442], [170.95956077446814, -42.85279932569254], [170.95977019565623, -42.852758034650655], [170.95996708853707, -42.8527255247999], [170.96016398122353, -42.85269301460588], [170.96036116998374, -42.852651504461754], [170.9605580622526, -42.85261899358004], [170.96076748223155, -42.852577700685174], [170.96096437407783, -42.8525451890946], [170.9611612657298, -42.852512677160746], [170.96135845330883, -42.85247116527095], [170.96156757621617, -42.85243887050266], [170.96176476331283, -42.85239735790159], [170.96197418181694, -42.852356062764414], [170.96217166440388, -42.85230554983346], [170.9623813783232, -42.8522552543201], [170.96259109191507, -42.852204958414916], [170.96280080517954, -42.85215466211787], [170.9630105181166, -42.852104365429014], [170.96320799911658, -42.852053850673165], [170.96341771140712, -42.8520035532232], [170.96362742337024, -42.8519532553814], [170.96383713500595, -42.85190295714781], [170.9640468463142, -42.85185265852233], [170.96425626160132, -42.85181135913503], [170.96447820384716, -42.85176127726674], [170.96468791419574, -42.85171097744443], [170.96489732861772, -42.85166967686411], [170.9651070383424, -42.85161937625942], [170.96532897926969, -42.85156929271081], [170.96553839282646, -42.85152799093748], [170.96574810159143, -42.85147768913597], [170.96595781002895, -42.85142738694267], [170.96616722272708, -42.851386083998854], [170.9663644036659, -42.85134456333068], [170.96656158435226, -42.851303042316935], [170.96675876478625, -42.851261520957664], [170.9669559449678, -42.851219999252805], [170.96715312489692, -42.85117847720243], [170.9673503045736, -42.851136954806506], [170.9675474839979, -42.85109543206502], [170.96774466316975, -42.851053908978], [170.96794184208917, -42.851012385545445], [170.96815125218959, -42.850971078911314], [170.9683606620243, -42.85092977188787], [170.9685575451132, -42.85089724703168], [170.9687669544539, -42.85085593925339], [170.96897636352895, -42.85081463108582], [170.96918577233822, -42.85077332252892], [170.9693826545477, -42.850740796232934], [170.96959206286297, -42.85069948692122], [170.9698014709125, -42.850658177220204], [170.9699983524709, -42.85062564984992], [170.9702202862144, -42.850575556650305], [170.97042998825103, -42.85052524611492], [170.97065162656313, -42.85048415173042], [170.97086132796733, -42.85043384039013], [170.971071029044, -42.85038352865812], [170.97129266646755, -42.85034243301168], [170.97150236691178, -42.850292120474755], [170.97171206702845, -42.85024180754608], [170.97193370356345, -42.85020071063774], [170.97214340304765, -42.850150396904176], [170.97236503899896, -42.850109299147086], [170.97257473785072, -42.85005898460866], [170.97279666765368, -42.8500088863223], [170.9730060714376, -42.849967570659494], [170.97322800059328, -42.84991747152183], [170.97343769814907, -42.849867155372436], [170.97365933231669, -42.849826055067766], [170.97386902923995, -42.84977573811352], [170.9740909570683, -42.84972563727197], [170.97430035911458, -42.84968431920101], [170.97449782385993, -42.84963378459089], [170.97469528829455, -42.84958324963294], [170.9748924582923, -42.84954171402005], [170.97508992213457, -42.849491178367614], [170.97528738566606, -42.849440642367334], [170.9754848488868, -42.84939010601925], [170.97566978661695, -42.84934835268793], [170.97586724925378, -42.84929781566666], [170.97606471157985, -42.849247278297575], [170.97626187967128, -42.8492057402817], [170.976459341405, -42.84915520221812], [170.9766565089623, -42.84911366351013], [170.97685367626707, -42.84907212445664], [170.97705113712675, -42.849021585352], [170.97724830389734, -42.8489800456064], [170.97744547041538, -42.84893850551534], [170.9776304055848, -42.84889674895712], [170.97782786529737, -42.848846208486044], [170.97802503103537, -42.848804667378644], [170.97822219652082, -42.848763125925785], [170.97841965535935, -42.84871258441365], [170.97862934494424, -42.84866225856905], [170.97882680315269, -42.84861171634002], [170.9790242610503, -42.848561173763194], [170.97922171863712, -42.84851063083857], [170.9794191759131, -42.848460087566146], [170.9796288638932, -42.84840975985351], [170.97982632053908, -42.84835921586421], [170.9800237768741, -42.848308671527114], [170.98022123289832, -42.84825812684224], [170.98041839530143, -42.848216581535276], [170.98062808170758, -42.848166251955845], [170.9808252435697, -42.848124705935604], [170.9810226984005, -42.848074159840664], [170.98122015292043, -42.84802361339793], [170.98142954491084, -42.84798228205253], [170.9816269988298, -42.84793173489412], [170.9818244524379, -42.847881187387955], [170.9820216126615, -42.847839639269175], [170.9822190656771, -42.84778909106863], [170.98241622536636, -42.847747542257835], [170.98261367778946, -42.84769699336293], [170.98281112990168, -42.84764644412026], [170.983008288775, -42.84760489427084], [170.98319350942157, -42.84755412881179], [170.98339066776728, -42.847512578291585], [170.9835881187029, -42.847462027681516], [170.98378556932767, -42.84741147672369], [170.9839827268574, -42.84736992516491], [170.98418017688957, -42.84731937351275], [170.9843776266109, -42.84726882151283], [170.98457507602131, -42.847218269165175], [170.98477252512092, -42.84716771646976], [170.98496968127117, -42.847126163179254], [170.98516712977815, -42.84707560978953], [170.98536457797425, -42.84702505605205], [170.98556202585945, -42.846974501966855], [170.98577170420185, -42.84692416277931], [170.9859691514568, -42.84687360797733], [170.9861665984008, -42.84682305282762], [170.98636404503398, -42.846772497330164], [170.9865737220905, -42.84672215664392], [170.98677116809333, -42.84667160042971], [170.98698084450268, -42.846621258982815], [170.98717828987523, -42.846570702051864], [170.98738796563748, -42.846520359844334], [170.98759764107194, -42.8464700172452], [170.98779508549478, -42.84641945922848], [170.98800476028208, -42.84636911586872], [170.98820220407458, -42.84631855713528], [170.98841158608465, -42.84627721278792], [170.988609029276, -42.846226653338924], [170.98881870279988, -42.84617630845916], [170.9890161453609, -42.84612574829344], [170.98921329559923, -42.846084187557786], [170.98942296818745, -42.846033841549655], [170.98962040983636, -42.84598328032071], [170.98982978985657, -42.845941933333386], [170.9900272309043, -42.8458913713889], [170.990236902229, -42.84584102386083], [170.99044657322594, -42.84579067594117], [170.99065624389507, -42.845740327629926], [170.99086620600423, -42.8456809791396], [170.99108810653968, -42.845630844716304], [170.9912977761861, -42.845580495206484], [170.99150744550468, -42.84553014530508], [170.9917171144955, -42.84547979501208], [170.99192678315842, -42.84542944432754], [170.99213674307381, -42.84537009345641], [170.99235864155128, -42.84531995652287], [170.99255607869875, -42.84526939012695], [170.9927657460195, -42.845219037874884], [170.99297541301237, -42.84516868523126], [170.99318507967743, -42.84511833219606], [170.99339474601467, -42.845067978769286], [170.99360441202407, -42.84501762495098], [170.99381407770562, -42.8449672707411], [170.99402345175767, -42.84492591594581], [170.99422088638698, -42.844875346620654], [170.9944305511243, -42.844824991259955], [170.99464021553376, -42.844774635507704], [170.99484987961537, -42.8447242793639], [170.99505954336914, -42.844673922828555], [170.99526920679503, -42.84462356590167], [170.99547886989305, -42.844573208583235], [170.9956885326632, -42.84452285087327], [170.9958981951055, -42.84447249277175], [170.9961078572199, -42.844422134278716], [170.99631751900645, -42.84437177539414], [170.99652718046514, -42.84432141611802], [170.99672461126895, -42.84427084238684], [170.9969339812081, -42.84422948217354], [170.99713141141052, -42.84417890772695], [170.99734107160532, -42.84412854693115], [170.99753850117722, -42.84407797176799], [170.99774786997259, -42.84403661003981], [170.997957529223, -42.84398624809327], [170.99815495787396, -42.84393567184579], [170.99836432581586, -42.843894308970505], [170.99856175386543, -42.84384373200765], [170.99875889100105, -42.84380215453116], [170.99895602788388, -42.843760576709336], [170.9991409342777, -42.843718784738975], [170.99933807066157, -42.84367720624777], [170.9995352067926, -42.84363562741127], [170.99973234267074, -42.84359404822945], [170.999917248087, -42.843552254982676], [171.0001143834662, -42.84351067513149], [171.00031151859255, -42.843469094934996], [171.00050865346603, -42.8434275143932], [171.00069355790464, -42.84338571987003], [171.0008906922791, -42.84334413865887], [171.00108811666053, -42.84329355725484], [171.00128525050027, -42.843251975351954], [171.00148238408713, -42.84321039310375], [171.00167980759363, -42.843159810659266], [171.00186471050776, -42.84311801420942], [171.0020621334298, -42.84306743109217], [171.0022592659538, -42.84302584748178], [171.00245639822495, -42.84298426352607], [171.00266605037956, -42.842933892793276], [171.00287570220618, -42.842883521669], [171.00308535370485, -42.842833150153254], [171.00329500487555, -42.842782778246054], [171.00350465571827, -42.84273240594735], [171.00372653629876, -42.84268224656785], [171.00393618647715, -42.84263187346363], [171.00414583632755, -42.84258149996796], [171.00435548584997, -42.84253112608084], [171.0045651350444, -42.842480751802256], [171.00477478391082, -42.842430377132224], [171.00499666246492, -42.842380215244496], [171.00520631066698, -42.84232983976896], [171.00541595854105, -42.842279463901974], [171.00563783607777, -42.84222930074823], [171.00584748328743, -42.842178924075746], [171.0060571301691, -42.842128547011825], [171.00627900668843, -42.842078382592064], [171.0064886529057, -42.842028004722664], [171.00671052874395, -42.84197783945096], [171.00690765495494, -42.84193624769124], [171.00710507028512, -42.841885655703464], [171.0073021959612, -42.84184406325208], [171.00751184061693, -42.84179368347317], [171.00770925503434, -42.84174309042262], [171.00790637988675, -42.841701496911995], [171.00811602360608, -42.84165111600521], [171.0083131479168, -42.84160952178174], [171.00851056113942, -42.84155892732205], [171.0087202039223, -42.841508545287404], [171.00891732740934, -42.84146695000472], [171.0091144506434, -42.84142535437682], [171.00931157362447, -42.84138375840367], [171.00950898537027, -42.84133316218848], [171.0097183376525, -42.84129177818887], [171.00991545983888, -42.841250181157655], [171.01011287070094, -42.841199583880915], [171.01030999235235, -42.84115798615812], [171.01051934355826, -42.84111660066898], [171.0107164646969, -42.84107500223453], [171.01091387439325, -42.841024403549866], [171.01111099499693, -42.840982804423824], [171.01132063387715, -42.84093241753785], [171.01151775393907, -42.84089081769903], [171.01171487374796, -42.84084921751498], [171.01192451172255, -42.840798829502454], [171.01212163098967, -42.84075722860564], [171.01231903860725, -42.840706627450416], [171.01252838707273, -42.840665238224545], [171.012725505545, -42.84062363626972], [171.01292291227878, -42.84057303405302], [171.01313225992754, -42.84053164370414], [171.01332966605958, -42.84048104077232], [171.01352707188036, -42.840430437492984], [171.01373641868162, -42.840389046019894], [171.01393382390057, -42.840338442025434], [171.01414345847937, -42.840288049872], [171.01434057476206, -42.84024644508624], [171.014537979068, -42.84019584002917], [171.01474732446474, -42.840154446675356], [171.0149569578096, -42.84010405300409], [171.015154361194, -42.840053446863145], [171.01536370573652, -42.840012052362646], [171.0155733381363, -42.83996165754113], [171.01578268211523, -42.83992026226157], [171.01599231388965, -42.83986986665855], [171.01618971574206, -42.839819258697396], [171.0163990588667, -42.83977786227118], [171.016608689696, -42.83972746551794], [171.0168183201971, -42.83967706837334], [171.0170276624609, -42.83963567077797], [171.01723700445822, -42.83959427279369], [171.01744663403673, -42.83954387447751], [171.01764374592827, -42.83950226390395], [171.0178530871021, -42.83946086477425], [171.01806271576632, -42.839410465309115]], [[170.97030358560565, -42.83121648362208], [170.97051292690517, -42.83117517111629], [170.97072256248123, -42.83112485852275], [170.9709321977301, -42.83107454553771], [170.97114183265174, -42.83102423216116], [170.9713514672462, -42.83097391839309], [170.97156110151343, -42.830923604233526], [170.97177073545348, -42.830873289682444], [170.97196814157746, -42.83082275808635], [170.9721777748714, -42.830772442774865], [170.97238740783808, -42.83072212707188], [170.97259704047758, -42.83067181097739], [170.9727944453345, -42.83062127792695], [170.97300407732786, -42.83057096107206], [170.97321370899397, -42.83052064382568], [170.97341111290265, -42.830470109689806], [170.97362074392265, -42.830419791683056], [170.97383037461543, -42.83036947328481], [170.97404000498094, -42.83031915449507], [170.9742496350192, -42.83026883531386], [170.97445897073968, -42.83022751546212], [170.9746686001544, -42.830177195499175], [170.97487822924182, -42.830126875144806], [170.97508756410411, -42.83008555412358], [170.97529719256798, -42.83003523298749], [170.9755068207046, -42.82998491145992], [170.97571644851394, -42.82993458954089], [170.97592578222168, -42.82989326696002], [170.97613540940742, -42.82984294425931], [170.97634503626585, -42.82979262116714], [170.97655436911538, -42.82975129741683], [170.9767639953502, -42.829700973542984], [170.9769736212577, -42.82965064927767], [170.97718295324898, -42.82960932435796], [170.97739257853289, -42.829558999311], [170.97760220348948, -42.82950867387257], [170.97781153462242, -42.829467347783485], [170.97800893169799, -42.82941680556062], [170.97821855571198, -42.8293664789717], [170.97842788599317, -42.829325151735745], [170.97862498877302, -42.829283608174364], [170.9788343185296, -42.829242280183], [170.97903171411477, -42.82919173616196], [170.97924104331594, -42.82915040741396], [170.97943814504407, -42.82910886242806], [170.9796474737206, -42.82906753292467], [170.97984486813425, -42.82901698747433], [170.98005419625537, -42.828975657214315], [170.98025129693173, -42.828934110803914], [170.98044869046365, -42.828883564291985], [170.98065801777022, -42.82884223290889], [170.98085511765385, -42.828800685440484], [170.98105251030404, -42.82875013786694], [170.9812496096539, -42.82870858970693], [170.98145922884595, -42.82865825707209], [170.98165632765537, -42.82861670819927], [170.98185342621247, -42.82857515898125], [170.98205081738897, -42.82852460965221], [170.9822601425176, -42.82848327528901], [170.98246946738055, -42.82844194053687], [170.9826787919779, -42.828400605395764], [170.98290034339527, -42.82835948534325], [170.9831096674547, -42.82831814940177], [170.98333121832118, -42.828277028502534], [170.98354054184276, -42.828235691760675], [170.98376209215834, -42.82819457001473], [170.98397141514198, -42.828153232472495], [170.98419296490664, -42.82811210987984], [170.98440228735237, -42.828070771537234], [170.9846116095324, -42.82802943280571], [170.98482122391113, -42.82797909390325], [170.98504277254779, -42.82793796963972], [170.98525238629426, -42.827887629933166], [170.98546170734343, -42.82784628962099], [170.98567102812692, -42.82780494891991], [170.985880640953, -42.8277546080417], [170.98608996117432, -42.82771326656157], [170.9862995733765, -42.82766292490184], [170.9865088930356, -42.82762158264269], [170.98671821242897, -42.827580239994596], [170.98692782371074, -42.82752989716325], [170.9871371425419, -42.82748855373615], [170.98733423416797, -42.82744699492103], [170.9875438445377, -42.82739665094066], [170.98775316254748, -42.82735530636814], [170.98796248029151, -42.82731396140674], [170.9881595708587, -42.82727240114618], [170.98836918001973, -42.82722205562666], [170.98857849694235, -42.82718070951988], [170.98877558670975, -42.82713914818023], [170.98898519495864, -42.82708880151174], [170.98918228418538, -42.82704723945942], [170.98939189181863, -42.82699689203204], [170.9895889805047, -42.82695532926703], [170.989798295791, -42.82691398089203], [170.98999567566773, -42.826863417603136], [170.99019276356066, -42.826821853780295], [170.9904023696744, -42.826771504467715], [170.99059945702666, -42.82672993993221], [170.9908087709423, -42.82668858967793], [170.99100585778288, -42.82664702443091], [170.991202944371, -42.826605458838785], [170.99140003070661, -42.8265638929015], [170.99160934357886, -42.82652254115929], [170.99180642940277, -42.8264809745105], [170.99200322356748, -42.82644840734072], [170.99220030891544, -42.826406840002825], [170.99240962077505, -42.82636548677392], [170.99260670561122, -42.82632391872454], [170.99280379019496, -42.82628235033004], [170.99300087452616, -42.826240781590386], [170.99319795860484, -42.82619921250563], [170.99339504243102, -42.826157643075724], [170.99359241717747, -42.82610707346726], [170.9937895004696, -42.82606550334597], [170.99398658350918, -42.826023932879544], [170.99418366629627, -42.82598236206798], [170.99438074883082, -42.82594079091131], [170.99457783111282, -42.82589921940953], [170.99478743082108, -42.82584886192044], [170.99499703020177, -42.82579850404006], [170.99520692018984, -42.825739145925496], [170.99542874553802, -42.82568900139035], [170.99563834389684, -42.82563864231229], [170.9958482327683, -42.82557928299625], [170.99605783044112, -42.825528923134385], [170.99626742778636, -42.82547856288124], [170.99647702480405, -42.8254282022368], [170.99669913881053, -42.82536905534158], [170.99689650854225, -42.82531847992125], [170.99710610454633, -42.82526811810175], [170.9973159908464, -42.82520875603564], [170.99752558616441, -42.82515839343237], [170.99773518115487, -42.825108030437846], [170.99793283980233, -42.82504845333518], [170.99814243411507, -42.824998089579445], [170.99835202810024, -42.824947725432466], [170.9985616217578, -42.824897360894234], [170.99875927898572, -42.82483778233206], [170.99896858158604, -42.824796416897755], [170.99917788392045, -42.824755051074646], [170.99938747630694, -42.82470468499521], [170.99958455159629, -42.824663104713366], [170.99979385310883, -42.82462173774515], [171.00000315435545, -42.824580370388134], [171.0002005190718, -42.824529789156344], [171.0004098197624, -42.824488421043036], [171.00061912018705, -42.824447052540926], [171.00082871045157, -42.82439668377407], [171.00102578388106, -42.82435510096837], [171.00123508348375, -42.82431373132119], [171.0014446728356, -42.824263361405684], [171.00164174546475, -42.824221777521196], [171.00185104424546, -42.824180406728956], [171.0020484062888, -42.82412982225007], [171.0022577045134, -42.82408845070156], [171.00246729233655, -42.82403807887876], [171.00266436362435, -42.82399649320305], [171.00287366102694, -42.8239551205095], [171.0030710215783, -42.82390453423345], [171.00328031842477, -42.823863160783645], [171.00347738865958, -42.82382157368416], [171.0036747483283, -42.823770986347064], [171.0038718180288, -42.82372939855633], [171.00406888747665, -42.82368781042055], [171.00427818298888, -42.82364643511572], [171.00447554149335, -42.82359584637142], [171.00467261014748, -42.823554257178166], [171.00486967854894, -42.823512667639854], [171.00506674669774, -42.82347107775649], [171.00527633032635, -42.823420700694804], [171.00547339793408, -42.823379110099026], [171.00567046528914, -42.82333751915821], [171.0058678217551, -42.823286927967004], [171.0060648885758, -42.82324533633497], [171.0062619551438, -42.823203744357905], [171.00645902145908, -42.82316215203579], [171.00665637676917, -42.82311155945874], [171.0068534425501, -42.823069966445445], [171.00706302348186, -42.82301958605104], [171.00726008872167, -42.82297799232534], [171.00746966903728, -42.822927611172396], [171.00766702283445, -42.82287701681844], [171.00787631343545, -42.82283563482279], [171.00807366663153, -42.82278503975408], [171.00828324568394, -42.82273465708282], [171.00849282440865, -42.82268427402039], [171.00868988770756, -42.82264267778901], [171.00889946581606, -42.82259229396804], [171.00910904359685, -42.82254190975591], [171.00931833219485, -42.82250052507812], [171.00952790935108, -42.8224501400849], [171.00973748617955, -42.82239975470052], [171.00995900002337, -42.82235858141846], [171.01016857621886, -42.82230819523044], [171.01037815208662, -42.82225780865124], [171.01058743895857, -42.82221642161378], [171.01079701420173, -42.822166034253506], [171.01101852657808, -42.822124858887705], [171.01122810118824, -42.822074470723805], [171.0114373869277, -42.82203308210656], [171.011658898447, -42.82199190548201], [171.01186847212728, -42.821941516124554], [171.01208998306214, -42.82190033865249], [171.01229926769327, -42.821858948434205], [171.01250884044367, -42.82180855788322], [171.0127303505214, -42.82176737915242], [171.01293963431684, -42.82172598774433], [171.0131489178461, -42.82168459594753], [171.0133707153579, -42.82163441601033], [171.0135799983176, -42.82159302341244], [171.01378956920811, -42.82154263047445], [171.01399885160478, -42.821501237097955], [171.01420813373534, -42.82145984333279], [171.01441770370428, -42.82140944922388], [171.01462698527178, -42.82136805468014], [171.01484878055274, -42.82131787182837], [171.01505806155058, -42.82127647648355], [171.0152673422823, -42.82123508075005], [171.01546497273162, -42.82117547273501], [171.01567454079546, -42.82112507628189], [171.015871882635, -42.82107446751103], [171.01608173791075, -42.82101507033354], [171.01627907909074, -42.820964460845744], [171.0164886458291, -42.820914062872156], [171.0166859863787, -42.82086345266859], [171.0168836143581, -42.82080384214833], [171.0170931800988, -42.82075344304539], [171.01729051967786, -42.82070283177767], [171.01750008477129, -42.82065243191512], [171.0176974237199, -42.820601819931646], [171.01790698816598, -42.8205514193095], [171.01810432648415, -42.820500806610276], [171.01831389028288, -42.820450405228556], [171.01851122797063, -42.8203997918136], [171.01872079112204, -42.82034938967229], [171.0189181281793, -42.820298775541595], [171.01912769068332, -42.820248372640734], [171.01932502711014, -42.820197757794304], [171.01952178852292, -42.82016514257035], [171.01973106280104, -42.82012373852993], [171.01992782378997, -42.820091122598384], [171.020137097573, -42.82004971780439], [171.02033414537044, -42.820008101175745], [171.02053090571167, -42.81997548419281], [171.02074017874006, -42.819934078279104], [171.0209369386574, -42.81990146058862], [171.0211462111907, -42.819860053921374], [171.02134325776822, -42.81981843552799], [171.02155224272238, -42.819786028102484], [171.02174900179196, -42.81975340899681], [171.02194604766208, -42.81971178954975], [171.0221550319807, -42.819679381009216], [171.02235207736732, -42.81963776085228], [171.02256106125046, -42.81960535156054], [171.0227578192772, -42.819572730697075], [171.0229670896011, -42.81953132065077], [171.02316384720393, -42.81949869907973], [171.02336089139953, -42.81945707715923], [171.0235582221009, -42.81940645488585], [171.02375583922068, -42.81934683225615], [171.02395345597103, -42.819287209276936], [171.0241388467583, -42.81922737491151], [171.0243364627801, -42.81916775125462], [171.02453407843248, -42.81910812724823], [171.02473169371544, -42.81904850289234], [171.02492930862894, -42.81898887818694], [171.02511469763093, -42.81892904220071], [171.02531231181587, -42.81886941681767], [171.0255099256314, -42.81880979108513], [171.02570753907747, -42.818750165003095], [171.02589292665328, -42.81869032772426], [171.02609053937078, -42.81863070096458], [171.0262884380731, -42.81856207383133], [171.0264738245544, -42.81850223558697], [171.02667143614457, -42.818442607799014], [171.02686904736532, -42.81838297966161], [171.02706665821663, -42.81832335117471], [171.02725204327172, -42.818263511637795], [171.0274496533944, -42.8182038824733], [171.02763532389625, -42.81813504226806], [171.02782070786722, -42.818075201785675], [171.02800609148946, -42.818015360995226], [171.02820370013595, -42.81795573049569], [171.02838908305026, -42.81789588906899], [171.02857446561583, -42.8178360473342], [171.0287720731745, -42.81777641582893], [171.0289577409908, -42.817707573417984], [171.0291431224722, -42.81764773073778], [171.0293285036049, -42.81758788774948], [171.0295138843888, -42.81752804445308], [171.02969926482396, -42.81746820084861], [171.02988464491037, -42.81740835693604], [171.03007002464804, -42.817348512715384], [171.03025540403692, -42.81728866818665], [171.0304410688157, -42.81721982330109], [171.03063867271382, -42.817160188491044], [171.03082405101853, -42.81710034301694], [171.03100942897447, -42.81704049723477], [171.03120674615954, -42.81698986147232], [171.0314162882299, -42.81693943561484], [171.0316138903494, -42.8168797990813], [171.03181120656348, -42.8168291622551], [171.03202074763558, -42.816778735268684], [171.03221834869478, -42.816719097667864], [171.03242788908838, -42.81666866992092], [171.03262520401177, -42.816618031662614], [171.03283474375763, -42.81656760315637], [171.033032343406, -42.816507964118706], [171.03324188247325, -42.81645753485195], [171.03343919610595, -42.81640689516157], [171.03364901979018, -42.81634746506804], [171.03385855785078, -42.81629703464982], [171.03405587050386, -42.81624639387449], [171.0342654079167, -42.816195962697016], [171.03447523014427, -42.816136531056344], [171.03467254181777, -42.81608588919606], [171.03488207822386, -42.81603545686716], [171.0350916143019, -42.81598502414736], [171.03528892502487, -42.815934381203306], [171.03549846045513, -42.81588394772424], [171.03569548558443, -42.81584230414405], [171.03590502039782, -42.815791869906974], [171.03610204498526, -42.81575022561487], [171.0363115791817, -42.815699790619725], [171.0365088880703, -42.81564914553169], [171.03671813680683, -42.81560770986253], [171.03691544509365, -42.81555706406023], [171.03712497802536, -42.815506627547855], [171.0373342259076, -42.815465190733335], [171.03753153327293, -42.81541454384847], [171.0377410652596, -42.81536410618716], [171.03795059691817, -42.815313668135], [171.03816012824856, -42.81526322969192], [171.03835743434357, -42.81521258135503], [171.03856696502615, -42.81516214215275], [171.03877649538057, -42.8151117025596], [171.03897380052493, -42.815061053139026], [171.03918333023148, -42.81501061278668], [171.0393928596099, -42.81496017204345], [171.0395904481923, -42.81490052143741], [171.03979997689194, -42.8148500799338], [171.03999728042552, -42.81479942871305], [171.04019458364792, -42.81474877714529], [171.04040439564852, -42.81468933440768], [171.0406016982108, -42.81463868212342], [171.040811225264, -42.814588238731986], [171.04100852719532, -42.81453758573239], [171.0412183377491, -42.81447814147056], [171.0414156390203, -42.81442748775451], [171.04161293998024, -42.814376833691426], [171.041810240629, -42.81432617928132], [171.0420197657159, -42.814275733633785], [171.04221706573364, -42.81422507850836], [171.042414649412, -42.81416542291778], [171.04261194877813, -42.81411476709718], [171.04282147254668, -42.814064319952756], [171.0430187712818, -42.81401366341687], [171.04321606970564, -42.81396300653395], [171.04341308399367, -42.81392134942798], [171.04362232271174, -42.813879900914245], [171.04381933648668, -42.81383824309758], [171.04402857467824, -42.81379679382946], [171.04422558794005, -42.81375513530211], [171.04443510927948, -42.81370468514987], [171.0446321219992, -42.81366302591073], [171.044841359107, -42.8136215751327], [171.0450383713136, -42.813579915182906], [171.04524760789485, -42.8135384636505], [171.04545656068538, -42.81350601186526], [171.0456535721479, -42.81346435083999], [171.04586280796676, -42.81342289816603], [171.046072043519, -42.81338144510364], [171.0462809954016, -42.81334899179308], [171.04647800586, -42.81330732932645], [171.04668724064985, -42.81326587512249], [171.04689647517304, -42.81322442053012], [171.0471054261477, -42.81319196569427], [171.04730243560195, -42.8131503017863], [171.0475119525849, -42.81309984590518], [171.04770924469008, -42.813049181137075], [171.047919044187, -42.812989724347325], [171.0481163356319, -42.81293905886291], [171.04832585128779, -42.812888601462504], [171.04852342517438, -42.812828935109806], [171.04873294015127, -42.812778476949184], [171.04894245479983, -42.81272801839777], [171.04913974463344, -42.8126773511136], [171.0493495415849, -42.812617891645345], [171.04955905522618, -42.81256743194294], [171.04976856853918, -42.81251697184977], [171.04997779866554, -42.81247551152727], [171.05018731135286, -42.81242505065374], [171.05039682371188, -42.81237458938944], [171.05060633574263, -42.81232412773437], [171.05081584744505, -42.81227366568852], [171.05102535881917, -42.81222320325191], [171.05123486986503, -42.81217274042455], [171.05144438058255, -42.8121222772064], [171.0516536083603, -42.81208081376856], [171.05186283587136, -42.81203934994233], [171.05207178056563, -42.81200688590114], [171.05226878320482, -42.811965213294194], [171.05247800995318, -42.81192374832654], [171.0526869539751, -42.8118912831474], [171.0528961802208, -42.811849817404216], [171.05310540619982, -42.81180835127265], [171.05330240757448, -42.81176667685865], [171.05351135068804, -42.81173421015441], [171.0537205759043, -42.811692742881455], [171.0539298008538, -42.811651275220136], [171.05413902553667, -42.81160980717047], [171.0543479677369, -42.8115773389187], [171.054557191917, -42.81153587009351], [171.05476641583041, -42.811494400879965], [171.0549753573533, -42.81146193146787], [171.05518458076395, -42.81142046147879], [171.05539380390786, -42.81137899110139], [171.055603026785, -42.81133752033562], [171.0557997431297, -42.81130484175039], [171.05599645927893, -42.811272162822696], [171.05619317523264, -42.81123948355256], [171.05637766674113, -42.8112065963764], [171.0565743823088, -42.811173916442534], [171.05677109768095, -42.81114123616626], [171.05696781285758, -42.81110855554753], [171.0571523036092, -42.81107566710599], [171.0573490183998, -42.81104298582355], [171.05754573299487, -42.811010304198675], [171.0577424473944, -42.810977622231384], [171.0579391615984, -42.81094493992166], [171.05812365140252, -42.810912049893446], [171.05832036522045, -42.810879366920005], [171.05851707884284, -42.810846683604154], [171.05871379226969, -42.81081399994588], [171.05889828131683, -42.81078110865232], [171.0590949943576, -42.81074842433034], [171.0592917072028, -42.81071573966595], [171.05948841985239, -42.81068305465914], [171.05969791933262, -42.81063257608572], [171.05991936123837, -42.810591304523534], [171.06012857871661, -42.810549825366124], [171.06035030140393, -42.81049955273854], [171.0605717424437, -42.810458279895094], [171.06078124034906, -42.81040779930415], [171.06100268080283, -42.81036652561407], [171.06121189686547, -42.81032504444527], [171.0614336179415, -42.810274769683694], [171.06164283343307, -42.81023328771461], [171.0618642727473, -42.810192012332514], [171.0620857117815, -42.81015073651583], [171.0622949264592, -42.81010925333687], [171.06251636493985, -42.81006797667481], [171.0627255790772, -42.81002649269678], [171.06294701700426, -42.80998521518935], [171.0631684546513, -42.80994393724735], [171.06337766797475, -42.80990245205946], [171.06359910506822, -42.80986117327209], [171.0638205418816, -42.80981989405016], [171.06401781116355, -42.809769200669244], [171.06421479936697, -42.80972750718329], [171.06442429206157, -42.80967701980983], [171.06462156042954, -42.80962632536829], [171.0648185478079, -42.809584630825135], [171.06502803956474, -42.809534142326065], [171.06522530701872, -42.809483446823876], [171.06542257416115, -42.80943275097487], [171.06561956043203, -42.80939105502885], [171.065829050931, -42.80934056503606], [171.06602631715938, -42.80928986812645], [171.0662235830763, -42.80923917087001], [171.06642084868162, -42.80918847326675], [171.06661811397547, -42.80913777531667], [171.06681537895776, -42.80908707701978], [171.06702486752775, -42.809036584796004], [171.06722185155454, -42.808994886043166], [171.0674191156227, -42.808944186685714], [171.0676163793794, -42.80889348698144], [171.0678136428245, -42.80884278693036], [171.06802284961051, -42.80880129310839], [171.06821983227618, -42.808759592608176], [171.06842903853502, -42.80871809803222], [171.0686260206869, -42.808676396821674], [171.06883522641849, -42.808634901491736], [171.0690322080566, -42.80859319957089], [171.06924141326093, -42.80855170348694], [171.06943839438523, -42.80851000085581], [171.0696475990623, -42.80846850401788], [171.06984457967278, -42.80842680067643], [171.0700537838226, -42.80838530308454], [171.07025076391926, -42.808343599032796], [171.0704599675418, -42.80830210068693], [171.07065694712463, -42.808260395924904], [171.07086615021987, -42.80821889682507], [171.07106312928886, -42.80817719135276], [171.0712723318568, -42.80813569149897], [171.0714693104119, -42.80809398531639], [171.07167851245254, -42.80805248470864], [171.0718754904938, -42.808010777815795], [171.07207274789212, -42.80796007029212], [171.07226972539735, -42.80791836270908], [171.07246698220158, -42.80786765449299], [171.07266395917074, -42.80782594621977], [171.07286121538084, -42.80777523731127], [171.07305847127935, -42.80772452805601], [171.07325544742991, -42.80768281874697], [171.0734527027343, -42.80763210879931], [171.0736496783488, -42.807590398800116], [171.07384693305903, -42.80753968816004], [171.07404418745762, -42.80748897717323], [171.07424144154461, -42.80743826583966], [171.07443869531997, -42.807387554159334], [171.07463594878368, -42.80733684213225], [171.07484514634464, -42.807295335638834], [171.07504239920564, -42.80724462289813], [171.07523965175497, -42.807193909810685], [171.0754369039927, -42.807143196376494], [171.07563415591878, -42.807092482595564], [171.0758314075332, -42.807041768467876], [171.07602837980835, -42.807000054302215], [171.07622535182992, -42.806958339792054], [171.07641010004843, -42.80691641952873], [171.07660707156958, -42.80687470435073], [171.07680404283715, -42.80683298882822], [171.0769887903222, -42.80679106761484], [171.07718576108937, -42.80674935142453], [171.07738273160288, -42.80670763488971], [171.07756747835444, -42.80666571272626], [171.07776444836756, -42.80662399552364], [171.07796141812705, -42.806582277976524], [171.07814616414507, -42.806540354863024], [171.07834313340413, -42.806498636648115], [171.07852787893546, -42.80645671290788], [171.07872484769408, -42.806414994025175], [171.07892181619908, -42.80637327479797], [171.0791068395717, -42.80632234978164], [171.07930380754726, -42.80628062988556], [171.0794885518311, -42.80623870456755], [171.0796855193062, -42.806196984003684], [171.0799072118339, -42.806146672833606], [171.08012890401614, -42.806096361226594], [171.0803505958529, -42.806046049182704], [171.08057228734418, -42.80599573670188], [171.08078175510042, -42.80594521884588], [171.0810037242047, -42.80588590517834], [171.0812254146352, -42.805835591409405], [171.08144710472024, -42.80578527720357], [171.08166879445977, -42.80573496256084], [171.0818904838538, -42.80568464748121], [171.08211245103473, -42.805625331621656], [171.08233413970513, -42.805575015667], [171.08254360471065, -42.80552449452683], [171.0827655707345, -42.80546517737552], [171.08298725834405, -42.80541486013279], [171.08320894560808, -42.805364542453184], [171.08343063252659, -42.805314224336705], [171.08365259700508, -42.8052549054316], [171.08387428319992, -42.805204586440105], [171.0840959690492, -42.80515426701173], [171.08430543130385, -42.80510374258756], [171.08450266998912, -42.80505301323521], [171.08469963061145, -42.80501128389383], [171.0849090919275, -42.80496075834455], [171.08510605200664, -42.804919028292005], [171.08531551270445, -42.804868501985545], [171.085512749872, -42.80481777085965], [171.08572193231996, -42.804776244158184], [171.0859191688845, -42.80472551231885], [171.08612835077395, -42.80468398486252], [171.08632558673548, -42.804633252309756], [171.08652254490235, -42.80459151977821], [171.08673172597278, -42.80454999120138], [171.08692896104859, -42.80449925758966], [171.08712591841848, -42.804457524002544], [171.0873231528998, -42.804406789698646], [171.08753233285995, -42.80436525963459], [171.08772928943284, -42.804323524991915], [171.08792652302841, -42.8042727896291], [171.08812347906488, -42.8042310542965], [171.08834515825814, -42.80418072649386], [171.08855461401797, -42.804130194152734], [171.08877629252834, -42.804079865500285], [171.08898574762208, -42.804029332355746], [171.08920742544953, -42.80397900285349], [171.08941687987712, -42.80392846890558], [171.08963855702166, -42.80387813855353], [171.0898602338206, -42.8038278077647], [171.09006968724475, -42.803777272600406], [171.09029136336073, -42.80372694096179], [171.09051248533953, -42.803694609666856]], [[171.25285154626894, -42.62937132594535], [171.2527624390332, -42.629505046433145], [171.2526733314086, -42.62963876684174], [171.25259641342785, -42.629772673155216], [171.25250705317345, -42.62991539489359], [171.25241794439376, -42.630049115073824], [171.25232883522526, -42.63018283517483], [171.25225191580446, -42.6303167412193], [171.25216255395162, -42.63045946264757], [171.25207344362798, -42.630593182520215], [171.25198433291547, -42.63072690231366], [171.25189471786547, -42.630878624975516], [171.25180535435865, -42.63102134608237], [171.2517157384321, -42.63117306858121], [171.25162637407703, -42.63131578952638], [171.25153675727384, -42.63146751186219], [171.2514471400252, -42.631619234116144], [171.2513577743907, -42.631761954818415], [171.25125596582356, -42.631913490776434], [171.25116659931356, -42.63205621130699], [171.25107698028256, -42.63220793322482], [171.25098761292423, -42.63235065359367], [171.25089799301657, -42.63250237534845], [171.25080862480996, -42.63264509555557], [171.25070681341498, -42.63279663095286], [171.25061744433276, -42.63293935098826], [171.25052782264262, -42.63309107240689], [171.25043845271207, -42.63323379228058], [171.2503488301452, -42.63338551353613], [171.25024726861594, -42.633528047002166], [171.25015764514328, -42.633679768084605], [171.2500804642954, -42.63382267389076], [171.25000328308502, -42.63396557963512], [171.2499261015122, -42.634108485317654], [171.2498486672779, -42.63426039239701], [171.24977148496774, -42.63440329795531], [171.2496943022951, -42.63454620345177], [171.24961711925997, -42.6346891088864], [171.2495396835137, -42.634841015715466], [171.2494624997412, -42.634983921025864], [171.24938531560628, -42.63512682627444], [171.24929594002472, -42.63526954510794], [171.24921875513738, -42.635412450224145], [171.24914156988748, -42.63555535527851], [171.24905194068242, -42.635707075342935], [171.24897475466776, -42.63584998026434], [171.24889756829057, -42.6359928851239], [171.24880819030096, -42.63613560351347], [171.24873100317134, -42.63627850824066], [171.2486538156792, -42.63642141290602], [171.24856443649256, -42.636564131073946], [171.24848724824795, -42.63670703560692], [171.24839786825416, -42.63684975362373], [171.24830874038827, -42.63698347011304], [171.24821935957416, -42.63712618796938], [171.24813023091616, -42.637259904299505], [171.2480408492818, -42.63740262199537], [171.24795171983163, -42.637536338166335], [171.24786233737694, -42.63767905570171], [171.24777295450502, -42.63782177315653], [171.2476838238596, -42.637955489088384], [171.24760688444852, -42.63808939148509], [171.24751750038044, -42.63823210870954], [171.2474283685793, -42.63836582441286], [171.24733923638905, -42.638499540036925], [171.24725010380976, -42.6386332555817], [171.24716071811508, -42.6387759724858], [171.24707158474357, -42.638909687871376], [171.24698245098296, -42.63904340317769], [171.24689331683325, -42.639177118404696], [171.2468039295119, -42.639319834988456], [171.2467023498877, -42.6394623648477], [171.24661321451705, -42.639596079825644], [171.2465116339924, -42.63973860949311], [171.24642224496154, -42.63988132573515], [171.24633285551334, -42.64002404189664], [171.2462312736278, -42.640166571281], [171.24614213620438, -42.64030028584001], [171.24605274549114, -42.640443001750356], [171.24595116226058, -42.640585530852334], [171.2458617706854, -42.64072824659148], [171.24576018653846, -42.64087077550094], [171.24567079410136, -42.64101349106889], [171.24556920903802, -42.64115601978582], [171.24547981573895, -42.64129873518257], [171.2453782297592, -42.64144126370696], [171.24528908861913, -42.64157497750736], [171.2451996940549, -42.64171769265297], [171.24509810673, -42.64186022089492], [171.24500871130377, -42.64200293586932], [171.24490712306243, -42.64214546391873], [171.2448055343493, -42.64228799186623], [171.2447039451643, -42.64243051971177], [171.2446023555075, -42.64257304745541], [171.24450076537892, -42.642715575097114], [171.24439917477844, -42.64285810263687], [171.24429758370616, -42.64300063007469], [171.24419599216202, -42.64314315741057], [171.2441065927611, -42.6432858715794], [171.24400500030046, -42.643428398722726], [171.24390340736792, -42.64357092576411], [171.24380181396356, -42.643713452703544], [171.24371241281116, -42.643856166519875], [171.24361081849023, -42.643998693266745], [171.2435092236974, -42.64414121991164], [171.24341982123818, -42.64428393346609], [171.24331797219847, -42.64443546132959], [171.24322856886295, -42.64457817471211], [171.24312697222103, -42.64472070097114], [171.2430375680233, -42.64486341418241], [171.24293597046477, -42.64500594024886], [171.2428224328719, -42.64513927772891], [171.2427088947881, -42.6452726150846], [171.2425953562134, -42.64540595231596], [171.2424818171478, -42.64553928942295], [171.24236802411295, -42.6456816278102], [171.24225448404792, -42.645814964667714], [171.24214094349193, -42.64594830140089], [171.24202740244502, -42.646081638009726], [171.24191386090715, -42.64621497449418], [171.24180031887835, -42.64634831085428], [171.2416867763586, -42.64648164709], [171.24157348694902, -42.646605981802104], [171.2414599434649, -42.64673931778986], [171.24133445983023, -42.64686346501429], [171.2412209153564, -42.64699680074153], [171.24110737039163, -42.64713013634439], [171.2409940786263, -42.64725447042741], [171.2408805326971, -42.64738780578229], [171.24076698627692, -42.64752114101279], [171.24065369310873, -42.64764547472573], [171.24055183167573, -42.64779699982214], [171.24046241701376, -42.64793971076247], [171.2403605546178, -42.64809123566412], [171.24025894552304, -42.64823375907199], [171.24016927572043, -42.64838547113936], [171.2400676656929, -42.64852799435384], [171.2399779949835, -42.64867970624785], [171.23987638402315, -42.648822229268966], [171.23978671240698, -42.64897394098958], [171.2396851005138, -42.64911646381729], [171.23959542799085, -42.649268175364526], [171.23950600894602, -42.649410885444915], [171.2394041417351, -42.649562409372706], [171.2393147218136, -42.649705119281094], [171.23921285363963, -42.64985664301409], [171.23912317885697, -42.65000835413254], [171.23903375762708, -42.6501510637876], [171.23893188801492, -42.65030258723372], [171.23884246590833, -42.65044529671675], [171.23875278934096, -42.650597007498476], [171.23863923237553, -42.65073034035878], [171.23851322678033, -42.65087248691694], [171.23839966878987, -42.65100581951511], [171.23828611030828, -42.65113915198887], [171.23817229720265, -42.651281485713696], [171.2380587377213, -42.65141481793786], [171.23794517774883, -42.651548150037605], [171.23783161728522, -42.65168148201295], [171.2377178021272, -42.651823815236284], [171.23760424066384, -42.65195714696202], [171.23749067870932, -42.65209047856334], [171.23737711626364, -42.65222381004021], [171.23726355332687, -42.65235714139268], [171.23714998989894, -42.652490472620705], [171.23703642597985, -42.652623803724325], [171.23692286156964, -42.652757134703485], [171.23680929666824, -42.65289046555823], [171.23669573127572, -42.65302379628854], [171.23658216539198, -42.65315712689441], [171.23646859901712, -42.65329045737583], [171.23637942124023, -42.65342416332012], [171.23629024307382, -42.65355786918502], [171.23620131895657, -42.65368257360838], [171.2361121400252, -42.653816279315116], [171.23602296070433, -42.65394998494247], [171.23593378099397, -42.65408369049041], [171.23584460089407, -42.654217395958966], [171.23574322568302, -42.65435091348542], [171.23565404477856, -42.6544846187852], [171.23556486348457, -42.65461832400559], [171.23547568180103, -42.65475202914656], [171.23539843998665, -42.654894923467], [171.23530925753553, -42.655028628458524], [171.23522007469487, -42.65516233337058], [171.23513063685732, -42.65530503955766], [171.23504145322352, -42.65543874431028], [171.23495226920016, -42.655572448983506], [171.23486283013762, -42.655715154929744], [171.23477364532107, -42.65584885944351], [171.23468420543713, -42.65599156522897], [171.23458282476676, -42.656125081590794], [171.2344811889463, -42.6562675992017], [171.23437980737904, -42.65640111536153], [171.23427817062992, -42.65654363276901], [171.23417678816577, -42.656677148726835], [171.23407515048802, -42.65681966593092], [171.23397376712697, -42.656953181686745], [171.23387212852055, -42.657095698687385], [171.23377074426259, -42.65722921424122], [171.23366910472748, -42.65737173103844], [171.23356771957256, -42.65750524639026], [171.23346607910878, -42.65764776298404], [171.23336443817266, -42.65779027947574], [171.23326279676422, -42.65793279586538], [171.2331489594512, -42.658075124000916], [171.23304731707094, -42.65821764017506], [171.2329456742183, -42.65836015624713], [171.23284403089338, -42.658502672217104], [171.23274238709604, -42.65864518808498], [171.2326407428264, -42.65878770385078], [171.23253909808437, -42.658930219514495], [171.23243719784054, -42.659081736411494], [171.23233555213787, -42.659224251870306], [171.23223390596283, -42.659366767227034], [171.23213225931542, -42.65950928248164], [171.2320303571023, -42.65966079896666], [171.23192870949418, -42.659803314016386], [171.2318270614137, -42.65994582896399], [171.2317254128608, -42.66008834380952], [171.23162350867833, -42.660239859882516], [171.23152185916473, -42.66038237452312], [171.23141995398953, -42.66053389038976], [171.23131830351514, -42.66067640482542], [171.2312163973472, -42.66082792048566], [171.23111474591204, -42.66097043471641], [171.2310006427378, -42.661121761778794], [171.23089899031467, -42.66126427579327], [171.23079708213226, -42.66141579102936], [171.23069542874828, -42.6615583048389], [171.23059351957306, -42.66170981986856], [171.23049212056307, -42.66184333215162], [171.23039072111243, -42.66197684433398], [171.2302890658546, -42.662119357735776], [171.23017546927755, -42.66225268123271], [171.23007406846355, -42.66238619310103], [171.22997266720878, -42.66251970486862], [171.22985881377468, -42.66266202933428], [171.22975741159723, -42.662795540888496], [171.22965600897908, -42.66292905234203], [171.22955435043923, -42.66307156500988], [171.22944075051336, -42.6632048876964], [171.22933934653173, -42.66333839883582], [171.2292379421094, -42.66347190987456], [171.22913628170016, -42.66361442212473], [171.22902267986672, -42.66374774434998], [171.22892127408085, -42.66388125507461], [171.22881961225877, -42.66402376700849], [171.22871820557555, -42.66415727753097], [171.22861679845155, -42.66429078795275], [171.22850319424427, -42.66442410960477], [171.22840178621328, -42.66455761981383], [171.22830037774156, -42.6646911299222], [171.22819896882902, -42.66482463992981], [171.22809755947569, -42.66495814983671], [171.2279961496816, -42.66509165964289], [171.22789473944667, -42.66522516934835], [171.22779332877096, -42.66535867895308], [171.22769191765443, -42.66549218845708], [171.22759050609713, -42.66562569786037], [171.22748909409896, -42.665759207162914], [171.22738768166005, -42.66589271636472], [171.22728626878026, -42.6660262254658], [171.22718459960916, -42.666168735764785], [171.2270831858319, -42.6663022446637], [171.22698177161382, -42.666435753461876], [171.22688010105685, -42.66657826345582], [171.22677868594124, -42.666711772051826], [171.2266772703848, -42.66684528054708], [171.22657585438756, -42.66697878894158], [171.22647418198792, -42.66712129852901], [171.22637250911566, -42.66726380801428], [171.22625863856007, -42.667406128478824], [171.22615696471536, -42.66754863774841], [171.22604334916184, -42.66768195668262], [171.2259416743606, -42.66782446573726], [171.22582780176924, -42.667966785723294], [171.2257261259955, -42.66810929456226], [171.22561225237737, -42.66825161430863], [171.2255105756311, -42.6683941229319], [171.22539670098618, -42.66853644243862], [171.2252950232674, -42.668678950846186], [171.22518140375894, -42.668812268828574], [171.22507972508356, -42.66895477702116], [171.22497804593544, -42.66909728511159], [171.2248644249675, -42.66923060274376], [171.22476274486274, -42.66937311061918], [171.22466106428533, -42.66951561839241], [171.22454744185782, -42.66964893567439], [171.2244457603237, -42.66979144323261], [171.22434433461095, -42.66992494940982], [171.22424265214735, -42.67006745676437], [171.22415316695592, -42.670210153170764], [171.2240517399141, -42.67034365905549], [171.2239622538731, -42.67048635529086], [171.22387302378215, -42.67062005016993], [171.22377133906838, -42.67076255704893], [171.22368185175955, -42.6709052530324], [171.22359262044495, -42.671038947661636], [171.22349093438325, -42.6711814542574], [171.22340170224908, -42.67131514871694], [171.223300015285, -42.67145765512037], [171.22321078233122, -42.671591349410214], [171.2231093509531, -42.6717248543513], [171.22302011719376, -42.671858548472116], [171.22291842844083, -42.67200105449151], [171.22282919386183, -42.67213474844264], [171.2227277607548, -42.6722682530024], [171.22263852537017, -42.67240194678446], [171.2225490330191, -42.672544641752935], [171.22244759862406, -42.67267814603218], [171.22233370893633, -42.672820462119454], [171.22223227361798, -42.67295396618512], [171.22211838292088, -42.67309628203342], [171.22200474835796, -42.67322959649331], [171.22190305497267, -42.67337210149483], [171.22178916273907, -42.67351441697796], [171.2216755266909, -42.67364773107495], [171.22157383184867, -42.67379023574782], [171.2214599380785, -42.673932550865764], [171.221346300545, -42.674065864599825], [171.2212324057383, -42.67420817946613], [171.2211185104045, -42.674350494206244], [171.22100461454352, -42.674492808820105], [171.22089071815537, -42.67463512330781], [171.22077682124012, -42.67477743766927], [171.2206629237977, -42.67491975190455], [171.22054902582812, -42.67506206601358], [171.22043512733137, -42.6752043799964], [171.22032122830745, -42.675346693853015], [171.22020732875637, -42.6754890075834], [171.22011808318985, -42.67562269914562], [171.2200163814601, -42.67576520226386], [171.21992687808864, -42.67590789490416], [171.21982543244133, -42.67604139658213], [171.2197359282199, -42.67618408905129], [171.21963422466885, -42.676326591783926], [171.2195449766286, -42.67646028283619], [171.21944327217486, -42.67660278537638], [171.21935402331468, -42.67673647625889], [171.21925231795822, -42.67687897860661], [171.2191630682781, -42.67701266931933], [171.21907356108838, -42.67715536119419], [171.21897211151884, -42.67728886201754], [171.21888260347913, -42.67743155372125], [171.21879335218466, -42.67756524410439], [171.21869164414716, -42.67770774588604], [171.2186023920327, -42.677841436099406], [171.21850068309237, -42.67798393768858], [171.21841143015794, -42.67811762773214], [171.21832191959547, -42.67826031893241], [171.21822046656038, -42.67839381900259], [171.21811875581443, -42.67853632020679], [171.21801730188113, -42.678669820074575], [171.21791584750662, -42.678803319841506], [171.21781413537354, -42.67894582074032], [171.2177126801008, -42.679079320304844], [171.21762316650182, -42.679222010881226], [171.21752171035624, -42.67935551025463], [171.2174202537694, -42.679489009527174], [171.2173185393464, -42.67963150992805], [171.2172170818613, -42.679765008998174], [171.21712782352816, -42.67989869790402], [171.21702636518603, -42.68003219678371], [171.21692464894593, -42.68017469678894], [171.2168353893769, -42.68030838543538], [171.21673392972068, -42.680441884023054], [171.2166444118447, -42.68058457372472], [171.21654295131555, -42.68071807212123], [171.21644149034512, -42.68085157041687], [171.2163522287341, -42.68098525863472], [171.21623805195156, -42.68113656914865], [171.21612413218847, -42.681278878313975], [171.21600995429793, -42.68143018857298], [171.21589603346234, -42.68157249748497], [171.21578185446367, -42.681723807489035], [171.21568013252417, -42.68186630624544], [171.21556595244627, -42.68201761600725], [171.21545177180545, -42.682168925641186], [171.21533784830677, -42.68231123393201], [171.2152236665578, -42.68246254331099], [171.21512194209598, -42.6826050415083], [171.2150080170244, -42.682747349432084], [171.2149062915891, -42.682889847413406], [171.21479236548976, -42.683032155097216], [171.21469063908097, -42.68317465286255], [171.21457645412974, -42.68332596151634], [171.21447472673145, -42.68346845906496], [171.2143607985588, -42.68361076626805], [171.21425907018698, -42.68375326360069], [171.2141451409865, -42.68389557056378], [171.21405561202383, -42.68403825795897], [171.21396634056248, -42.68417194406761], [171.2138770687108, -42.68430563009663], [171.2137755960093, -42.68443912573751], [171.21368606538735, -42.68458181280085], [171.21359679232492, -42.684715498580346], [171.2135075188721, -42.684849184280175], [171.21341824502895, -42.68498286990041], [171.2133165121843, -42.685125366282115], [171.21322723752073, -42.685259051732416], [171.2131379624668, -42.6853927371031], [171.21304842895785, -42.68553542359307], [171.212959153109, -42.685669108803815], [171.21288207759005, -42.685802984344754], [171.21279254288075, -42.68594567060323], [171.21270326587225, -42.68607935558439], [171.21261398847332, -42.6862130404859], [171.21252445253631, -42.68635572650285], [171.2124351743425, -42.686489411244416], [171.21234563758227, -42.68663209710013], [171.21223169859095, -42.686774401913574], [171.21211775907213, -42.68691670660071], [171.21200381902568, -42.6870590111615], [171.21188987845167, -42.68720131559592], [171.21177567908532, -42.68735262109385], [171.2116617374384, -42.6874949252748], [171.21154779526393, -42.68763722932939], [171.2114338525618, -42.68777953325764], [171.21130770820767, -42.687921646475736], [171.21119350606793, -42.68807295132446], [171.21109202128997, -42.68820644428422], [171.21097807647743, -42.68834874770703], [171.21087633237025, -42.688491241636555], [171.21076238652958, -42.68863354481928], [171.21066064144856, -42.688776038532716], [171.21054669457973, -42.68891834147534], [171.2104449485248, -42.68906083497269], [171.21033100062778, -42.68920313767522], [171.21022925359898, -42.68934563095644], [171.21011530467374, -42.6894879334189], [171.2100132981311, -42.68963942766157], [171.2098993481599, -42.68978172988312], [171.20978513908548, -42.689933033154276], [171.2096833895763, -42.69007552588808], [171.20956917942206, -42.690226828916806], [171.20945522733174, -42.69036913064392], [171.20935321768883, -42.690520624220056], [171.20923926455248, -42.690662925706256], [171.20912505220966, -42.6908142282374], [171.20902329970335, -42.69095672030931], [171.20890934499326, -42.69109902142819], [171.20879513102506, -42.691250323589685], [171.2086811752418, -42.69139262445501], [171.2085794207442, -42.69153511608254], [171.20846546393255, -42.69167741670771], [171.2083515065932, -42.69181971720646], [171.20823728990862, -42.691971018743956], [171.20813553341972, -42.692113509927104], [171.20802157450646, -42.692255810058505], [171.20790761506547, -42.69239811006351], [171.2078183179901, -42.69253179072787], [171.20771655959612, -42.69267428149076], [171.20762726169994, -42.69280796198509], [171.20752576133137, -42.69294145139513], [171.2074364626284, -42.69307513172008], [171.20733470244298, -42.693217622098175], [171.20724540291914, -42.693351302253085], [171.20714390081912, -42.69348479128107], [171.20705460048853, -42.693618471266575], [171.2069528385115, -42.69376096125988], [171.20686353736002, -42.69389464107535], [171.20676177447925, -42.69403713087587], [171.20667221344337, -42.69417981167524], [171.20657070872224, -42.69431330012904], [171.20646894446415, -42.69445578963436], [171.20637964124043, -42.69458946901936], [171.2062778760785, -42.69473195833192], [171.20617611044304, -42.694874447542034], [171.20608680596808, -42.69500812666661], [171.20598503942875, -42.69515061568393], [171.20588353160335, -42.695284103450504], [171.20576956157637, -42.6954264010631], [171.20565559102155, -42.69556869854924], [171.20555408178842, -42.6957021859888], [171.2054401102227, -42.695844483235504], [171.2053383407924, -42.69598697160559], [171.2052246274882, -42.69612026746831], [171.20511065438367, -42.6962625643491], [171.20500914281803, -42.69639605124761], [171.20489516870256, -42.696538347888946], [171.2047933968547, -42.69668083571418], [171.2046796810857, -42.6968141309753], [171.20457790827942, -42.69695661858501], [171.20446393212427, -42.69709891474659], [171.20436241776838, -42.69723240100232], [171.2042484406022, -42.697374696924406], [171.2041469253215, -42.69750818296609], [171.20403294714433, -42.6976504786487], [171.20393117144673, -42.69779296561106], [171.20381745175058, -42.69792625991944], [171.20371567509446, -42.69806874666626], [171.20361389796471, -42.698211233310595], [171.20351237991903, -42.698344718720705], [171.203410601858, -42.698487205160816], [171.20330908291285, -42.69862069036814], [171.20320730392052, -42.69876317660406], [171.2031055244545, -42.6989056627375], [171.20300400415223, -42.69903914764031], [171.2029022237549, -42.699181633569545], [171.20280070255316, -42.699315118269574], [171.20269892122445, -42.699457603994574], [171.20258493606966, -42.699599898062274], [171.20248341348525, -42.69973338244646], [171.20238163072426, -42.69987586785341], [171.20228010724037, -42.70000935203479], [171.20217832354797, -42.70015183723747], [171.202064335897, -42.70029413072493], [171.20196281103037, -42.70042761459045], [171.20186102590566, -42.700570099475065], [171.2017592403072, -42.70071258425719], [171.20164577034305, -42.70083687504012], [171.2015442436677, -42.70097035848944], [171.20143077279468, -42.70109464903734], [171.20132924522602, -42.70122813227397], [171.2012155135273, -42.70136142370247], [171.20111424498205, -42.701485905610724], [171.20100051234095, -42.70161919680271], [171.2008989829698, -42.70175267961323], [171.20078550935233, -42.701876969455185], [171.2006839790878, -42.70201045205299], [171.20057024454428, -42.70214374277113], [171.20046897340347, -42.70226822404495], [171.20035523791753, -42.70240151452654], [171.20025370585037, -42.70253499669821], [171.20014022948837, -42.70265928583416], [171.20003869652783, -42.70279276779309], [171.1999249591394, -42.7029260578008], [171.19982342526956, -42.70305953954631], [171.1997099470719, -42.70318382821131], [171.19960841230866, -42.70331730974406], [171.19949441283325, -42.70345960038173], [171.19938041282964, -42.70360189089286], [171.19926641229793, -42.70374418127747], [171.19915241123803, -42.703886471535526], [171.19903866990546, -42.704019760566325], [171.19891246358577, -42.704161858609595], [171.19879846093204, -42.70430414847615], [171.19868445775015, -42.70444643821618], [171.19857045404007, -42.70458872782964], [171.19845644980182, -42.70473101731656], [171.1983424450354, -42.704873306676944], [171.19821623535697, -42.70501540387101], [171.19810196910592, -42.705166694059926], [171.19798796271, -42.70530898302719], [171.19786175131915, -42.70545107978881], [171.1977474833834, -42.70560236958214], [171.19762127083538, -42.705744466050525], [171.19750726225465, -42.70588675448545], [171.19739299263415, -42.70603804388319], [171.1972667783736, -42.70618013991912], [171.19716497279595, -42.70632262011863], [171.19706316674433, -42.706465100215595], [171.1969494161125, -42.706598386943256], [171.1968476091018, -42.7067408668245], [171.19674580161725, -42.706883346603185], [171.19664399365874, -42.70702582627932], [171.19652998043216, -42.70716811362575], [171.19642817149855, -42.707310593085424], [171.19632662276945, -42.70744407136063], [171.19621260803, -42.70758635835343], [171.1961105369511, -42.70773783857515], [171.19600872609448, -42.70788031761322], [171.1958947098066, -42.70802260425079], [171.1957928979748, -42.708165083072366], [171.19567861987753, -42.70831637054673], [171.19557680705452, -42.70845884915108], [171.19547499375756, -42.708601327652865], [171.19536071406185, -42.708752614769715], [171.19525889977368, -42.70889509305428], [171.19514487986046, -42.709037378854774], [171.19505526977534, -42.709180049315634], [171.19495371495898, -42.70931352622033], [171.1948518987908, -42.7094560040953], [171.19475008214863, -42.70959848186771], [171.1946485259742, -42.70973195846756], [171.19455891371098, -42.70987462848375], [171.19445735666187, -42.71000810489194], [171.19435553818283, -42.71015058226682], [171.19425371922975, -42.71029305953912], [171.19415216082243, -42.71042653564245], [171.19406254638105, -42.71056920521394], [171.19396098709908, -42.71070268112556], [171.19385942737492, -42.710836156936026], [171.1937578672086, -42.71096963264535], [171.1936560455025, -42.71111210931641], [171.193554484436, -42.71124558482272], [171.19345292292735, -42.711379060227884], [171.1933513609765, -42.7115125355319], [171.1932495374221, -42.711655011794754], [171.19314797457105, -42.71178848689574], [171.19303394438077, -42.71193077033727], [171.19293185818177, -42.712082247339445], [171.19281782694392, -42.71222453053959], [171.19271600096462, -42.712367006266696], [171.19260170743416, -42.71251829028165], [171.1924998804634, -42.71266076579146], [171.1923858471482, -42.712803048509585], [171.19227181330453, -42.71294533110107], [171.19216972352635, -42.71309680733269], [171.19205568863507, -42.71323908968276], [171.19195385919593, -42.71338156464467], [171.19183982327476, -42.713523846754136], [171.1917379928601, -42.713666321499424], [171.19163642338546, -42.71379979509355], [171.19152238595083, -42.71394207684916], [171.19142055410248, -42.71408455127598], [171.19130651563796, -42.714226832790956], [171.19120468281406, -42.71436930700118], [171.19109064331957, -42.71451158827549], [171.19098907103552, -42.71464506122502], [171.19087476899563, -42.71479634330273], [171.19077293422055, -42.7149388170797], [171.190658631099, -42.71509009891441], [171.19055653374897, -42.71524157351496], [171.190442491129, -42.715383854065706], [171.19032818636154, -42.715535135529144], [171.19022634908566, -42.71567760875666], [171.19011204323644, -42.71582888997708], [171.19001020496887, -42.7159713629872], [171.18989589803792, -42.716122643964624], [171.1897940587786, -42.71626511675734], [171.18967975076592, -42.71641639749176], [171.18956570392757, -42.71655867706392], [171.18946360142036, -42.716710150558455], [171.18934929176157, -42.71686143092153], [171.18923524332894, -42.71700371012474], [171.18913313926063, -42.717155183284774], [171.18901882795572, -42.71730646327655], [171.1889047779288, -42.717448742110776], [171.18880267229932, -42.7176002149363], [171.18870135178648, -42.71772468457433], [171.18860003086297, -42.717849154112585], [171.18849844762298, -42.717982624577424], [171.18839712586234, -42.71810709391538], [171.188295803691, -42.71823156315352], [171.1881942191557, -42.71836503331617], [171.18809289614723, -42.71848950235401], [171.18800377970757, -42.71861416447043], [171.18790245590142, -42.71873863331992], [171.18780086966981, -42.718872103091144], [171.18769954502648, -42.718996571740334], [171.18759795792596, -42.71913004130981], [171.18749637038306, -42.71926351077809], [171.18739478239772, -42.719396980145135], [171.1872934560642, -42.71952144839299], [171.18719186720998, -42.719654917558294], [171.18707807070982, -42.7197881933424], [171.18697648094528, -42.719921662293935], [171.18687515289778, -42.72004613012919], [171.1867735622643, -42.72017959887897], [171.1866719711884, -42.72031306752752], [171.186558172341, -42.72044634273708], [171.18644437300034, -42.720579617821485], [171.18633057316643, -42.72071289278073], [171.18621677283923, -42.72084616761479], [171.18610297201872, -42.7209794423237], [171.18598917070491, -42.721112716907456], [171.18588757637903, -42.72124618477946], [171.18577377410398, -42.7213794591255], [171.18565997133567, -42.72151273334636], [171.185546168074, -42.72164600744204], [171.18543236431907, -42.72177928141253], [171.18533050527907, -42.72192174973748], [171.18521670054517, -42.722055023469466], [171.18510289531795, -42.72218829707629], [171.18498908959737, -42.72232157055793], [171.18487502091287, -42.722463844915666], [171.1847734219265, -42.72259731168323], [171.18465961473362, -42.72273058480116], [171.18454554452538, -42.7228728587929], [171.1844200535945, -42.72298793608838], [171.18429456219695, -42.72310301323547], [171.18416907033273, -42.723218090234106], [171.1840435780018, -42.72333316708434], [171.18391782258607, -42.72345724478108], [171.18379232930255, -42.72357232133363], [171.18366683555234, -42.723687397737756], [171.18355354930202, -42.72380266766492], [171.18342779194685, -42.72392674477772], [171.18330229679904, -42.72404182074953], [171.18317680118452, -42.72415689657291], [171.18305130510325, -42.72427197224784], [171.18293801663236, -42.724387241513504], [171.18281225685175, -42.72451131789311], [171.18268675937287, -42.72462639313571], [171.18256126142725, -42.72474146822986], [171.18244797118064, -42.72485673696866], [171.18232247232328, -42.72497181177971], [171.18219671011718, -42.725095887426065], [171.18208341853992, -42.72521115577267], [171.18194544710983, -42.72533503728642], [171.1818074751276, -42.72545891862106], [171.1816817108963, -42.725582993654044], [171.1815437378332, -42.72570687464563], [171.18141797256786, -42.72583094936455], [171.18127973540138, -42.72596383099091], [171.18114176068423, -42.72608771145946], [171.18101599383672, -42.72621178569956], [171.18087801803867, -42.72633566582504], [171.18075225015707, -42.72645973975108], [171.18061427327808, -42.72658361953349], [171.18047629584694, -42.72670749913677], [171.1803507895673, -42.726822571613], [171.18021281107633, -42.726946450874095], [171.1800748320332, -42.727070329956035], [171.17994906104514, -42.72719440292683], [171.17981134416831, -42.72730928069736], [171.17967336351316, -42.72743315925796], [171.1795353823058, -42.727557037639436], [171.17940960924528, -42.72768110996901], [171.1792838356794, -42.72780518214846], [171.17915779826072, -42.727938255141865], [171.17903202366483, -42.72806232702023], [171.1788937763809, -42.7281952055281], [171.17876800073148, -42.728319277091536], [171.1786422245767, -42.728443348504825], [171.17851618447045, -42.72857642072788], [171.1783904072856, -42.728700491840065], [171.17826436611048, -42.728833563760325], [171.17813858789555, -42.72895763457143], [171.17801254565157, -42.72909070618892], [171.17789871185474, -42.7292239719485], [171.17777293210847, -42.7293480423214], [171.17764688827666, -42.7294811134982], [171.17753331656388, -42.72960537790419], [171.1774072716884, -42.72973844879215], [171.17728122626875, -42.729871519528274], [171.17716765309865, -42.729995783536424], [171.1770416066353, -42.73012885398367], [171.17691555962773, -42.7302619242791], [171.1768022487109, -42.73037718694094], [171.1766886736427, -42.73050145042825], [171.17657536186175, -42.73061671284493], [171.1764617858944, -42.730740976085514], [171.17634847324933, -42.73085623825695], [171.17622268705827, -42.730980306773155], [171.17610937352723, -42.73109556868689], [171.17599579573795, -42.731219831421434], [171.17588248134277, -42.731335093089946], [171.17576890265428, -42.73145935557777], [171.1756555873949, -42.73157461700106], [171.17554200780722, -42.73169887924213], [171.1754286916837, -42.731814140420184], [171.17532732070308, -42.73193859699238], [171.17521400373715, -42.73205385793769], [171.17510068634786, -42.73216911876075], [171.17498710454456, -42.732293380397884], [171.17487378629104, -42.73240864097571], [171.1747724132076, -42.73253309700527], [171.17465909411166, -42.73264835735034], [171.17453303680807, -42.73278142477552], [171.1744189245731, -42.73292368765955], [171.1742928661867, -42.73305675479406], [171.17416680725597, -42.73318982177672], [171.17405269341478, -42.73333208425629], [171.17392663340124, -42.733465150948284], [171.1738005728434, -42.73359821748842], [171.1736864573959, -42.7337404795635], [171.17356039575515, -42.733873545812955], [171.1734343335701, -42.734006611910544], [171.1733202165163, -42.73414887358111], [171.17319415324835, -42.73428193938804], [171.17306808943604, -42.734415005043054], [171.17295397077586, -42.73455726630911], [171.17282790588067, -42.73469033167344], [171.17270184044108, -42.73482339688589], [171.1725877201745, -42.734965657747416], [171.172461653652, -42.73509872266916], [171.1723355865851, -42.73523178743902], [171.17222146471204, -42.735374047895995], [171.1720956610007, -42.735498111458384], [171.17196985678376, -42.735622174870564], [171.17184378758404, -42.73575523904757], [171.1717179823366, -42.735879302158466], [171.1715919120675, -42.73601236603253], [171.1714661057895, -42.73613642884209], [171.17134003445108, -42.73626949241317], [171.17121422714254, -42.73639355492145], [171.17108841932838, -42.73651761727949], [171.17096234639564, -42.73665068039652], [171.1708487479754, -42.73677493752619], [171.1707226739985, -42.73690800035414], [171.1705968641467, -42.737032062123404], [171.1704707891004, -42.737165124648385], [171.1703449782179, -42.73728918611629], [171.17021916682978, -42.73741324743396], [171.17009309018908, -42.73754630950485], [171.16996727777033, -42.73767037052119], [171.16984120006018, -42.737803432289034], [171.1697153866108, -42.737927493004015], [171.16960178332226, -42.738051748779284], [171.16948817957515, -42.73817600443072], [171.16937484022733, -42.73829125905969], [171.16926123558065, -42.73841551446423], [171.16914763047535, -42.73853976974494], [171.1690340249115, -42.7386640249018], [171.1689206838171, -42.73877927903924], [171.16881928818202, -42.738903729246275], [171.16870568128354, -42.739027984044945], [171.16859207392648, -42.73915223871978], [171.1684787311073, -42.73926749237817], [171.1683529119296, -42.73939155145878], [171.16823930319066, -42.73951580575025], [171.16812569399312, -42.73964005991789], [171.16801234940542, -42.739755313072195], [171.1678987393082, -42.7398795669929], [171.1677851287524, -42.74000382078975], [171.1676715177379, -42.74012807446273], [171.1675581714035, -42.740243327125455], [171.16743234838313, -42.74036738510247], [171.1673187359867, -42.740491638392086], [171.16719291197836, -42.740615696082386], [171.16706682224992, -42.740748754505574], [171.16694099721073, -42.74087281189444], [171.16682738289128, -42.74099706465012], [171.16670155686407, -42.74112112175225], [171.1665757303311, -42.74124517870408], [171.16644990329237, -42.7413692355056], [171.16633628706745, -42.7414934877281], [171.16621045904066, -42.74161754424286], [171.1660846305081, -42.741741600607284], [171.16597101285993, -42.74186585243304], [171.16584491793662, -42.74199890938578], [171.16573129932985, -42.74212316095041], [171.1656176802644, -42.74224741239117], [171.16549184925404, -42.74237146804481], [171.16537822924758, -42.74249571922524], [171.1652523972491, -42.74261977459207], [171.1651387763016, -42.742744025512174], [171.165012943315, -42.74286808059222], [171.16491179857738, -42.74298352611188], [171.16479817627135, -42.743107776661056], [171.16468481908854, -42.743223026219084], [171.16457146148204, -42.74333827565474], [171.1644581034519, -42.74345352496804], [171.16434474499803, -42.74356877415894], [171.1642311204687, -42.743693024091705], [171.16411776115004, -42.7438082730371], [171.16400440140768, -42.743923521860125], [171.16389104124164, -42.74403877056078], [171.16377768065192, -42.74415401913904], [171.1636640538992, -42.744278268455375], [171.16355069244457, -42.7443935167881], [171.16343733056627, -42.74450876499846], [171.16332396826428, -42.74462401308641], [171.16321060553858, -42.74473926105198], [171.16309697656237, -42.74486350975186], [171.16298361297177, -42.7449787574719], [171.16287024895743, -42.74509400506954], [171.16275688451938, -42.745209252544775], [171.16261829786407, -42.74535111049872], [171.16247997649296, -42.74548396741702], [171.1623291764803, -42.74562562899339], [171.16219058790625, -42.7457674863838], [171.1620519986945, -42.745909343591144], [171.16190146267198, -42.74604200370711], [171.1617628721792, -42.74618386053397], [171.16162428104863, -42.74632571717779], [171.16147374309426, -42.746458376685865], [171.16133515068265, -42.74660023294918], [171.1611965576333, -42.74674208902942], [171.16104601774705, -42.746874747929596], [171.16090742341657, -42.74701660362932], [171.1607568822417, -42.747149262119045], [171.16061828663015, -42.74729111743824], [171.16046774416665, -42.7474237755175], [171.16032914727398, -42.74756563045615], [171.16019054974348, -42.74770748521173], [171.16004000534798, -42.747840142683], [171.15990140653633, -42.747981997058034], [171.15978776491085, -42.74810624216944], [171.15967385647303, -42.748239487990936], [171.15956021391216, -42.74836373285367], [171.15945878353781, -42.74848817392271], [171.15934487367824, -42.74862141938188], [171.15923122974672, -42.74874566388451], [171.15911731891643, -42.74887890909343], [171.15900367404953, -42.74900315334738], [171.15890224149084, -42.749127593869325], [171.1587883292387, -42.74926083871588], [171.1586746830011, -42.749385082609734], [171.1585607697782, -42.749518327206005], [171.1584471226052, -42.74964257085115], [171.15833320841153, -42.74977581519716], [171.15821956030308, -42.74990005859358], [171.15810591173567, -42.75002430186602], [171.15799199609475, -42.750157545837006], [171.15787834659187, -42.750281788860725], [171.15776442998012, -42.75041503258141], [171.15765077954177, -42.7505392753564], [171.15753712864446, -42.75066351800739], [171.15741099750073, -42.750796564797206], [171.1572973456443, -42.750920807186915], [171.15718342658897, -42.751054050269595], [171.15706977379705, -42.751178292410536], [171.15695585377085, -42.75131153524293], [171.15682998683727, -42.75143558051498], [171.15671633262724, -42.75155982227057], [171.1566024111282, -42.75169306471525], [171.1564887559826, -42.751817306222094], [171.15637483351264, -42.75195054841643], [171.15624869721907, -42.75208359380071], [171.15613504063765, -42.75220783492144], [171.1560211166771, -42.752341076727234], [171.15589497881862, -42.75247412168384], [171.15578132080142, -42.752598362418425], [171.15565518189774, -42.75273140708552], [171.15554152292128, -42.75285564755873], [171.15542759647374, -42.75298888871301], [171.1553014560051, -42.75312193295237], [171.15518806264197, -42.753237172236], [171.15507440178823, -42.75336141219981], [171.15496100755973, -42.75347665123769], [171.1548473458055, -42.753600890954246], [171.15472173707232, -42.75371593289306], [171.15460807439402, -42.753840172349754], [171.1544944112567, -42.75396441168246], [171.15438101483417, -42.7540796500931], [171.15426735079635, -42.75420388917851], [171.15414173975466, -42.75431893042598], [171.15402807479273, -42.75444316925153], [171.1539144093717, -42.75456740795305], [171.15380101075507, -42.7546826457364], [171.15368734443356, -42.75480688419063], [171.153573677653, -42.754931122520816], [171.1534600104133, -42.755055360726985], [171.15334661004832, -42.75517059801803], [171.15323294190807, -42.7552948359769], [171.15311927330876, -42.75541907381172], [171.15300560425038, -42.75554331152248], [171.15287945331707, -42.75567635284014], [171.1527533018387, -42.7558093940056], [171.15262688237016, -42.75595143580508], [171.15250072978208, -42.75608447666529], [171.15237457664892, -42.75621751737334], [171.15224815546696, -42.756359558712795], [171.15212200122411, -42.75649259911556], [171.1519958464361, -42.75662563936615], [171.15186942354072, -42.756767680245574], [171.15173105339886, -42.75690052300687], [171.15160489693076, -42.75703356278602], [171.1514784722948, -42.7571756031914], [171.15135231471697, -42.757308642665286], [171.15122615659394, -42.75744168198695], [171.15109973024445, -42.757583721932264], [171.15097357101166, -42.75771676094865], [171.1508474112337, -42.7578497998128], [171.15070876871923, -42.75799164200097], [171.1505826078062, -42.75812468054589], [171.150456446348, -42.75825771893858], [171.1503427666703, -42.75838195374721], [171.15021713980218, -42.75849699031045], [171.15010345920012, -42.75862122485912], [171.14997783139916, -42.75873626113756], [171.1498641498727, -42.758860495426276], [171.1497382532474, -42.75898453218665], [171.14962483868808, -42.759099765448646], [171.14949894109304, -42.759223801922666], [171.14938552564618, -42.759339034926285], [171.14927184181178, -42.75946326857094], [171.14914621074703, -42.759578303859115], [171.14903252598816, -42.759702537243776], [171.14890662597074, -42.759826573008304], [171.14879294026983, -42.7599508061322], [171.14866730732004, -42.76006584084995], [171.14855362069466, -42.76019007371383], [171.14842771871827, -42.76031410890472], [171.14831403115082, -42.76043834150783], [171.14820061125303, -42.76055357323042], [171.14807470782398, -42.76067760799818], [171.14794853572084, -42.760810643370114], [171.1478223630725, -42.76094367858978], [171.14769645808556, -42.76106771290413], [171.14757028436617, -42.7612007478201], [171.1474318950163, -42.761333584924905], [171.14730598844795, -42.76145761877195], [171.14717981308698, -42.76159065321799], [171.14705363718073, -42.761723687511775], [171.14692772905448, -42.761847720905365], [171.1468015520771, -42.76198075489543], [171.1466753745545, -42.76211378873323], [171.14653724961366, -42.7622376239157], [171.14641107099465, -42.76237065743583], [171.14628489183033, -42.76250369080364], [171.1461587121207, -42.76263672401917], [171.14603253186576, -42.76276975708242], [171.14590661954836, -42.76289378925232], [171.14576822281597, -42.7630266241692], [171.14564204091928, -42.763159656762454], [171.14551585847724, -42.76329268920341], [171.14540215953278, -42.76341691863887], [171.14528819155052, -42.76355014868705], [171.14517449166974, -42.763674377873464], [171.1450485757767, -42.7637984090135], [171.14493460632045, -42.76393163867351], [171.14482090502042, -42.76405586747413], [171.14470693459245, -42.7641890968835], [171.1445932323561, -42.76431332543504], [171.14447926095642, -42.764446554593775], [171.14435334208392, -42.764570584897015], [171.14423936968714, -42.764703813792444], [171.14411344980576, -42.76482784380749], [171.14399947641184, -42.76496107243961], [171.14387328672382, -42.76509410289365], [171.1437473653077, -42.76521813246899], [171.14363339039647, -42.76535136069942], [171.143507199117, -42.765484390711286], [171.14339349206307, -42.765608617953674], [171.14326729973752, -42.76574164767565], [171.14315359172355, -42.76586587465636], [171.14301491345012, -42.76600770666262], [171.14287623453816, -42.766149538485465], [171.1427497710144, -42.766291568302876], [171.14261135984535, -42.76642439905557], [171.14248489514495, -42.766566428551705], [171.142346213754, -42.76670825967252], [171.142220016911, -42.76684128813047], [171.14208133429125, -42.766983118900704], [171.14195486721792, -42.76712514775336], [171.1418164524639, -42.76725797745878], [171.1416899842139, -42.76740000599014], [171.141551299115, -42.767541836058264], [171.14142509884527, -42.767674863556785], [171.14128641251747, -42.76781669327433], [171.14115994189441, -42.76795872116215], [171.14102152355525, -42.76809154982023], [171.14089505175545, -42.76823357738672], [171.1407563629484, -42.768375406402086], [171.1406301592517, -42.76850843294111], [171.14050368569045, -42.76865046003215], [171.14036553372355, -42.7687742871218], [171.140239328365, -42.76890731318972], [171.1401133918402, -42.76903133840345], [171.13998718541012, -42.769164364167466], [171.13984903125706, -42.76928819058178], [171.13972282373012, -42.76942121602791], [171.13959688511653, -42.76954524062329], [171.1394584598485, -42.76967806722519], [171.1393325201787, -42.76980209150444], [171.1392065800023, -42.76992611563297], [171.13908036978086, -42.770059140305754], [171.13895415901382, -42.7701921648261], [171.1388279477012, -42.77032518919406], [171.138701735843, -42.77045821340962], [171.13857579305574, -42.770582236781244], [171.1384617969922, -42.77071545934462], [171.138335583542, -42.77084848311775], [171.1382093695462, -42.77098150673847], [171.13808342469753, -42.77110552951865], [171.13795720963, -42.77123855283539], [171.13783099401687, -42.77137157599974], [171.1377045081068, -42.771513599697215], [171.13757829138288, -42.771646622555856], [171.13745207411336, -42.77177964526207], [171.13733807339204, -42.771912866591954], [171.13721158522867, -42.77205488968946], [171.13708536632794, -42.7721879119515], [171.13695914688154, -42.7723209340611], [171.1368329268895, -42.77245395601826], [171.1367067063518, -42.77258697782301], [171.13658048526844, -42.77271999947529], [171.13645399369426, -42.772862021652195], [171.13632777150002, -42.77299504299875], [171.13620154876008, -42.77312806419288], [171.1360875428247, -42.77326128414905], [171.13596131901866, -42.77339430505224], [171.13583509466693, -42.77352732580299], [171.1357088697695, -42.773660346401265], [171.13558264432638, -42.7737933668471], [171.13545641833755, -42.77392638714047], [171.13534240930497, -42.77405960627837], [171.13522866991246, -42.77418382462175], [171.13511493006035, -42.77430804284088], [171.13498897217573, -42.77443206190097], [171.1348752313807, -42.774556279858956], [171.13476149012598, -42.77468049769266], [171.1346477484116, -42.774804715402105], [171.13453400623757, -42.77492893298727], [171.134408045913, -42.7750529513491], [171.134294302796, -42.77517716867312], [171.13418055921935, -42.77530138587286], [171.1340665448678, -42.77543460360906], [171.13394058256716, -42.77555862140866], [171.13382683757013, -42.77568283822218], [171.13371309211345, -42.7758070549114], [171.13359934619706, -42.77593127147633], [171.1334733819396, -42.776055288714495], [171.13335963508018, -42.776179505018256], [171.13324588776106, -42.776303721197735], [171.13313213998225, -42.77642793725293], [171.13300563280902, -42.77656995523669], [171.13287939554996, -42.77670297241357], [171.1327531577451, -42.77683598943796], [171.13262664885616, -42.77697800696081], [171.13250040994015, -42.77711102367934], [171.13238638858573, -42.77724423956957], [171.13225987800809, -42.77738625664549], [171.13213363746033, -42.77751927291963], [171.1320073963667, -42.77765228904126], [171.13188088407327, -42.77779430565619], [171.1317546418684, -42.77792732147195], [171.13162839911777, -42.77806033713518], [171.13150188510846, -42.77820235328914], [171.13137564124654, -42.77833536864649], [171.13124939683874, -42.778468383851326], [171.13112288111355, -42.77861039954428], [171.1309966355945, -42.77874341444319], [171.13085817111178, -42.77887622969758], [171.13073165364364, -42.7790182449155], [171.13060540644207, -42.779151259342015], [171.13047915869464, -42.779284273616], [171.13035318129195, -42.77940828710204], [171.13022693247228, -42.77954130107184], [171.13011290167609, -42.77967451446488], [171.12998665178984, -42.779807528143564], [171.1298604013577, -42.77994054166971], [171.12973442136612, -42.78006455441211], [171.12960816986168, -42.780197567634026], [171.1294819178113, -42.78033058070337], [171.129355665215, -42.78046359362019], [171.12922968313734, -42.78058760575668]], [[171.28730575153452, -42.643940038889866], [171.28722888846738, -42.64407396915113], [171.28713983198966, -42.644207716995204], [171.28706296822182, -42.64434164712698], [171.28698610411635, -42.644475577198286], [171.28689704652345, -42.644609324825225], [171.28682018171725, -42.64474325476706], [171.28674331657345, -42.64487718464844], [171.2866542578653, -42.64501093205821], [171.2865773920207, -42.645144861810095], [171.28650052583853, -42.64527879150154], [171.28642341219435, -42.64542172274768], [171.2863465453248, -42.64555565231769], [171.28626967811763, -42.64568958182722], [171.2861803700274, -42.645832330425335], [171.28610350210718, -42.6459662598048], [171.28602663384936, -42.64610018912383], [171.28594951805405, -42.64624311999402], [171.2858726491088, -42.646377049191585], [171.28577114556973, -42.64651961491979], [171.2856696415592, -42.64666218054642], [171.28558033064746, -42.64680492860437], [171.2854790729951, -42.64693849243083], [171.28537756761327, -42.647081057764666], [171.28527606176002, -42.64722362299693], [171.28518674911265, -42.64736637070433], [171.28508524234368, -42.64750893574471], [171.28498398245455, -42.64764249907863], [171.28489466851576, -42.64778524652579], [171.28479316037541, -42.64792781127337], [171.28469165176358, -42.648070375919346], [171.28459014268026, -42.648212940463715], [171.28448863312548, -42.64835550490651], [171.28438712309915, -42.64849806924769], [171.28428561260134, -42.64864063348725], [171.28418410163204, -42.648783197625214], [171.28408259019122, -42.64892576166157], [171.28398107827886, -42.64906832559634], [171.28387956589498, -42.64921088942948], [171.2838024411529, -42.64935381862411], [171.28372531604847, -42.6494967477571], [171.28364819058177, -42.64963967682847], [171.2835710647528, -42.64978260583823], [171.28349393856155, -42.649925534786355], [171.28341681200797, -42.650068463672866], [171.28333943748146, -42.65022039409077], [171.28325011594052, -42.65036314006157], [171.28317298826028, -42.650506068753906], [171.28309586021768, -42.65064899738461], [171.2830187318128, -42.650791925953655], [171.28294135537132, -42.65094385605111], [171.28286397854262, -42.65109578608575], [171.28277465460766, -42.65123853162325], [171.28269727698796, -42.65139046152408], [171.28262014670696, -42.651533389774514], [171.28254276832538, -42.65168531955027], [171.28246563730733, -42.651828247676846], [171.28237606360318, -42.651979994437106], [171.28229868404338, -42.65213192401624], [171.2822217996757, -42.65226585036348], [171.28214491497033, -42.65239977665025], [171.28206802992722, -42.65253370287656], [171.2819911445463, -42.65266762904237], [171.28191401098906, -42.652810556729946], [171.2818371249204, -42.65294448277425], [171.28174804374274, -42.65307822579699], [171.2816711569729, -42.653212151711685], [171.28159402197576, -42.65335507914574], [171.2815171345181, -42.65348900493889], [171.2814402467227, -42.65362293067157], [171.28136311066314, -42.653765857921876], [171.28129816917172, -42.65390896812362], [171.28122128036412, -42.65404289368235], [171.28114414325717, -42.65418582075697], [171.28106725376173, -42.65431974619416], [171.28099011594233, -42.65446267314611], [171.28091322575904, -42.65459659846173], [171.28084828231715, -42.65473970835479], [171.28077139147166, -42.6548736335575], [171.28068180907616, -42.655025378764435], [171.28059247428484, -42.655168122317434], [171.28050313907633, -42.655310865790085], [171.28041380345064, -42.65545360918238], [171.2803244674078, -42.65559635249431], [171.28023513094772, -42.65573909572586], [171.28013359876184, -42.65588165573451], [171.28004401330378, -42.65603340036366], [171.27995467555064, -42.65617614334349], [171.2798653373803, -42.65631888624294], [171.27977599879276, -42.65646162906202], [171.279686659788, -42.65660437180076], [171.279597320366, -42.656747114459115], [171.27950798052677, -42.65688985703708], [171.27941888850543, -42.657023597970905], [171.27932954784586, -42.65716634038879], [171.27925240235086, -42.65730926596887], [171.27916306088414, -42.657452008236014], [171.27907371900017, -42.65759475042278], [171.27898437669893, -42.65773749252915], [171.27887064259826, -42.65787986798871], [171.27876910368963, -42.658022426619155], [171.27866756430922, -42.65816498514793], [171.2785540770554, -42.65829835869824], [171.27845253672004, -42.65844091701304], [171.2783509959129, -42.65858347522615], [171.2782494546339, -42.65872603333757], [171.2781357170036, -42.658868407981785], [171.2780341747538, -42.65901096587853], [171.2779328805, -42.65914452212018], [171.27781914136315, -42.65928689641358], [171.27771759768652, -42.65942945399463], [171.27761605353803, -42.659572011474005], [171.2775145089177, -42.659714568851676], [171.2774007677575, -42.65985694268048], [171.27729922216628, -42.659999499843444], [171.27719767610316, -42.66014205690472], [171.27708393341868, -42.66028443038191], [171.27698238638465, -42.660426987228476], [171.2768808388787, -42.660569543973324], [171.27679123848586, -42.660721285678285], [171.27670188630765, -42.660864025756645], [171.2766122850376, -42.661015767298835], [171.27652268332182, -42.661167508759306], [171.2764330811603, -42.661319250138064], [171.276343478553, -42.6614709914351], [171.27625412423149, -42.66161373110886], [171.27616452074696, -42.66176547224311], [171.2760749168167, -42.66191721329566], [171.27598531244064, -42.66206895426648], [171.27589570761884, -42.66222069515556], [171.27580610235128, -42.662372435962936], [171.27571649663793, -42.66252417668857], [171.27561469387138, -42.662675733685454], [171.27552483839014, -42.66283647577378], [171.27543523129611, -42.662988216243505], [171.27533342705996, -42.663139772952924], [171.27524381904524, -42.66329151324913], [171.27515421058473, -42.66344325346362], [171.2750646016784, -42.663594993596355], [171.27497524126073, -42.6637377321152], [171.274897828317, -42.66388965581398], [171.27482066394506, -42.66403257791887], [171.27474349921044, -42.66417549996207], [171.27466633411316, -42.66431842194354], [171.27458916865322, -42.66446134386334], [171.27451200283056, -42.664604265721394], [171.27442263964056, -42.66474700373666], [171.2743454730651, -42.66488992546256], [171.2742680570792, -42.66504184865354], [171.27419113882604, -42.66517576872928], [171.27410177404815, -42.66531850645284], [171.2740124088528, -42.665461244095944], [171.2739352404089, -42.665604165495864], [171.2738458744059, -42.665746902988126], [171.27376870520914, -42.665889824255906], [171.27367933839847, -42.6660325615973], [171.2736021684488, -42.6661754827329], [171.27351280083045, -42.66631821992345], [171.2734234327946, -42.66646095703351], [171.2733582098699, -42.66661306338861], [171.27329298661613, -42.66676516969703], [171.27322776303325, -42.66691727595875], [171.27316253912127, -42.66706938217379], [171.27309731488018, -42.667221488342136], [171.27303209030998, -42.667373594463825], [171.27295466787228, -42.66752551659181], [171.27288944261454, -42.66767762261263], [171.27282396774723, -42.66783873010225], [171.2727587418205, -42.66799083602915], [171.27269376486657, -42.668133940394924], [171.2726285382923, -42.66828604622899], [171.27256331138895, -42.66843815201636], [171.27249808415644, -42.668590257756996], [171.2724328565948, -42.66874236345099], [171.2723678780595, -42.66888546758659], [171.27230264985025, -42.66903757318772], [171.27222522345286, -42.66918949471177], [171.27215999455603, -42.66934160021204], [171.2720950147301, -42.66948470415618], [171.27200538929551, -42.66963644145422], [171.2719160128434, -42.669779177162376], [171.2718144379741, -42.66992172871342], [171.27172506065943, -42.67006446425064], [171.27162348487303, -42.67020701560941], [171.27153410669578, -42.670349750975696], [171.27144472810096, -42.6704924862615], [171.27134290143383, -42.6706440388416], [171.27125352196228, -42.670786773955825], [171.27116414207305, -42.67092950898958], [171.27106256354654, -42.67107205978217], [171.27097318279473, -42.67121479464495], [171.270871603351, -42.671357345245276], [171.27078222173654, -42.67150007993711], [171.27068039175265, -42.67165163184445], [171.2705910092614, -42.67179436636469], [171.27048942796736, -42.67193691657973], [171.27040004461347, -42.672079650929], [171.2702984624022, -42.67222220095175], [171.2702090781856, -42.67236493513005], [171.27010724534384, -42.67251648645573], [171.27000566172717, -42.67265903618367], [171.26990407763824, -42.672801585809815], [171.2698024930771, -42.672944135334156], [171.2697006582667, -42.673095686249056], [171.2695990727451, -42.67323823556905], [171.26949748675125, -42.67338078478726], [171.26939565046027, -42.67353233539388], [171.26929406350595, -42.673674884407745], [171.2692046748239, -42.67381761768912], [171.26910308695224, -42.673960166510675], [171.26900124872148, -42.67411171671784], [171.26891185871742, -42.674254449737056], [171.26881026944017, -42.67439699826377], [171.26872087857328, -42.67453973111196], [171.26861903843164, -42.67469128093104], [171.26852964668777, -42.67483401360761], [171.26842805555984, -42.67497656174892], [171.2683386629531, -42.67511929425446], [171.26823682090048, -42.67527084368541], [171.26815987648635, -42.67540475902403], [171.2680948807777, -42.675547860276346], [171.26801768565784, -42.67569077698212], [171.26794049017494, -42.6758336936261], [171.2678632943291, -42.675976610208295], [171.26778634819993, -42.67611052525024], [171.26770915164047, -42.676253441709484], [171.2676441539569, -42.676396542651396], [171.2675669566989, -42.67653945899579], [171.26748975907788, -42.676682375278396], [171.26741281123367, -42.67681629002364], [171.26733561289905, -42.676959206183284], [171.26727061357587, -42.677102306867795], [171.26719341454267, -42.677245222912596], [171.26711621514644, -42.6773881388956], [171.26703901538718, -42.677531054816825], [171.26697401474934, -42.67767415529647], [171.2668968142915, -42.677817071102844], [171.2668196134706, -42.67795998684742], [171.26674241228665, -42.67810290253021], [171.26665276088343, -42.67825463496585], [171.2665631090339, -42.67840636731966], [171.26647345673814, -42.67855809959162], [171.26638380399606, -42.67870983178173], [171.26629415080774, -42.67886156389001], [171.26619229743167, -42.67901311120964], [171.26610239297216, -42.67917384460979], [171.26601273840157, -42.6793255764618], [171.26592308338465, -42.67947730823197], [171.26583342792145, -42.67962903992025], [171.26573157212331, -42.67978058676816], [171.26564216616092, -42.679923316820414], [171.2655525093439, -42.68007504825377], [171.2654628520806, -42.680226779605256], [171.2653612448348, -42.68036932461458], [171.26527158666394, -42.680521055792966], [171.2651819280468, -42.68067278688947], [171.26508006889463, -42.680824333072586], [171.26499065988142, -42.68096706253778], [171.2649009999103, -42.68111879337931], [171.2648113394929, -42.68127052413899], [171.26470947842594, -42.68142206994369], [171.26461981708667, -42.68157380052955], [171.26452990470216, -42.681734532487674], [171.26444024245583, -42.681886262909146], [171.26435057976315, -42.682037993248755], [171.26424871627373, -42.68218953858165], [171.26415905265915, -42.68234126874745], [171.26406938859816, -42.68249299883136], [171.26397972409077, -42.6826447288334], [171.26389005913697, -42.68279645875357], [171.263788193241, -42.68294800361537], [171.26369852736528, -42.683099733361715], [171.26360886104308, -42.6832514630262], [171.2635194450339, -42.68339419116211], [171.2634175772228, -42.68354573564544], [171.26332790954652, -42.68369746505488], [171.26323824142378, -42.68384919438242], [171.26313637215705, -42.6840007385785], [171.2630467031123, -42.68415246773221], [171.26295753531787, -42.68428619391887], [171.26286811627125, -42.684428921468204], [171.26276674687807, -42.6845624624048], [171.26267732698219, -42.684705189783614], [171.26258790666827, -42.684847917081875], [171.26248653597176, -42.68498145773809], [171.26239711480858, -42.68512418486585], [171.26230794417796, -42.68525791047507], [171.26220632122744, -42.68540045228885], [171.26211689879688, -42.68554317916551], [171.26202772694305, -42.685676904525664], [171.26193855469936, -42.68581062980653], [171.2618493820658, -42.68594435500808], [171.26175995800546, -42.6860870815644], [171.26165858345578, -42.68622062139207], [171.261569409613, -42.686354346345155], [171.26148023538033, -42.68648807121897], [171.26139080966277, -42.6866307974449], [171.2613016346363, -42.68676452215947], [171.26121245921993, -42.686898246794755], [171.26109862971794, -42.687040602227164], [171.26099674983837, -42.68719214425219], [171.260895120627, -42.6873346847459], [171.2607934909429, -42.68747722513768], [171.2606796593963, -42.68761958010373], [171.26057777751714, -42.68777112170606], [171.26047614637173, -42.687913661780016], [171.2603745147536, -42.68805620175202], [171.2602604298903, -42.68820755767519], [171.26015879728354, -42.68835009743128], [171.26005716420403, -42.68849263708546], [171.2599555306518, -42.68863517663768], [171.2598538966268, -42.68877771608796], [171.25975226212904, -42.68892025543629], [171.25963817412358, -42.68907161066215], [171.25953653863712, -42.68921414979455], [171.2594349026779, -42.689356688824994], [171.2593332662459, -42.689499227753515], [171.25923162934117, -42.68964176658008], [171.25912999196362, -42.689784305304684], [171.25902860557835, -42.6899178425124], [171.258927218752, -42.69005137961958], [171.25882583148464, -42.690184916626215], [171.2587244437762, -42.690318453532285], [171.2586230556267, -42.6904519903378], [171.25853386899246, -42.690585712606776], [171.25843247998628, -42.69071924922245], [171.2583310905391, -42.690852785737576], [171.25822970065076, -42.69098632215213], [171.2581283103214, -42.69111985846615], [171.25802691955093, -42.691253394679585], [171.25792552833937, -42.691386930792476], [171.25782413668674, -42.691520466804796], [171.25772274459302, -42.69165400271656], [171.25763355424394, -42.69178772419182], [171.25753216129345, -42.69192125991373], [171.25743076790192, -42.69205479553506], [171.25732937406923, -42.69218833105581], [171.2572279797954, -42.69232186647599], [171.25712658508053, -42.69245540179561], [171.2570127358062, -42.69259775268404], [171.2569110883722, -42.692740289190915], [171.2567972380705, -42.6928826398401], [171.25668338724154, -42.69302499036338], [171.25656953588535, -42.6931673407607], [171.2564681383426, -42.693300875428314], [171.25635428597667, -42.69344322558717], [171.25624043308346, -42.69358557562006], [171.25612657966295, -42.69372792552705], [171.25602492829822, -42.69387046115075], [171.25591132580143, -42.69400380942491], [171.25579747084387, -42.69414615896744], [171.2556958180218, -42.69428869426324], [171.25558221403912, -42.69442204217518], [171.25548056025988, -42.69456457725635], [171.25536670326503, -42.694706926321125], [171.25526530056447, -42.69484045979783], [171.2551514425598, -42.69498280862408], [171.25505003893554, -42.69511634188761], [171.25493617992103, -42.69525869047535], [171.25483452325417, -42.69540122491195], [171.25472066321208, -42.695543573260366], [171.25460680264266, -42.69568592148285], [171.2545051445024, -42.69582845559074], [171.25439128290535, -42.69597080357389], [171.25428962379186, -42.696113337466464], [171.25417576116723, -42.696255685210296], [171.25406189801524, -42.69639803282816], [171.25396023742823, -42.696540566392024], [171.2538463732486, -42.69668291377059], [171.25373276083215, -42.69681625964446], [171.25363109878754, -42.6969587928803], [171.25351748539467, -42.69709213851711], [171.25340361916795, -42.69723448540591], [171.25328975241385, -42.69737683216872], [171.25318834078666, -42.69751036358823], [171.25307447302254, -42.69765271011248], [171.252960604731, -42.69779505651072], [171.25284698834034, -42.69792840141032], [171.25273311901162, -42.698070747557374], [171.2526317050286, -42.69820427842658], [171.25253029060428, -42.69833780919515], [171.25242862324515, -42.69848034123291], [171.25231500443468, -42.69861368554637], [171.25221358864513, -42.6987472160011], [171.25211217241426, -42.698880746355194], [171.25199829961755, -42.69902309168726], [171.25189688246274, -42.699156621828116], [171.2517954648666, -42.699290151868325], [171.25169379422107, -42.69943268317268], [171.251580172057, -42.699566026676166], [171.25147875309557, -42.69969955640249], [171.25136512997244, -42.699832899669566], [171.25126345742783, -42.6999754305452], [171.25116203710104, -42.70010895995764], [171.25104841253446, -42.70024230287562], [171.25094673857504, -42.70038483343519], [171.25084531688287, -42.70051836253372], [171.25073169087278, -42.70065170510263], [171.25063026827235, -42.70078523398859], [171.25050418458278, -42.70092739122366], [171.2503905570784, -42.70106073341834], [171.25027692908176, -42.701194075488495], [171.25015084374007, -42.70133623229532], [171.25003721471595, -42.701469574103164], [171.24991138114214, -42.701602729266796], [171.24979749820574, -42.70174507216506], [171.24967166355205, -42.70187822703985], [171.2495580324905, -42.70201156832374], [171.24944414797966, -42.70215391083281], [171.2493183117284, -42.702287065281666], [171.24920467914708, -42.702420406178724], [171.24907884183523, -42.70255356033951], [171.2489527509476, -42.702695715695796], [171.24883911682107, -42.70282905619338], [171.24871327788634, -42.70296220991434], [171.24859938966227, -42.70310455149441], [171.24847354964754, -42.70323770492651], [171.24835991348343, -42.70337104490009], [171.2482338192641, -42.7035131993858], [171.2481082307897, -42.703637351037116], [171.24798238862843, -42.7037705038792], [171.24785654592415, -42.703903656570255], [171.24773070267693, -42.70403680911034], [171.24760511212733, -42.70416096016182], [171.2474792678135, -42.70429411240076], [171.24735342295668, -42.70442726448869], [171.24722757755686, -42.70456041642567], [171.24708978028937, -42.704684380046146], [171.24696393379764, -42.70481753166806], [171.24683808676292, -42.704950683138975], [171.24671249256286, -42.70507483312701], [171.24659884920337, -42.705208171183294], [171.24647300058425, -42.70534132221591], [171.24634740485595, -42.705465471767994], [171.24622155517014, -42.7055986224994], [171.24609570494127, -42.70573177307983], [171.2459701076612, -42.70585592218216], [171.24584425636564, -42.705989072461364], [171.24571840452703, -42.70612222258955], [171.24560551772973, -42.70622855558871], [171.24549263054456, -42.70633488846771], [171.24537974297155, -42.706441221226584], [171.2452668550107, -42.70654755386528], [171.24515396666197, -42.70665388638382], [171.24502912652537, -42.7067510304031], [171.2449162373981, -42.706857362669645], [171.2448033478829, -42.70696369481601], [171.24469045797986, -42.70707002684223], [171.24457756768894, -42.70717635874827], [171.24446442328815, -42.70729169185174], [171.24435153220423, -42.70739802351675], [171.2442386407324, -42.70750435506159], [171.2441257488727, -42.70761068648628], [171.24401285662515, -42.70771701779078], [171.24389996398966, -42.707823348975126], [171.24378681714066, -42.70793868135256], [171.24367392371212, -42.70804501229584], [171.24356102989572, -42.70815134311896], [171.2434481356914, -42.70825767382188], [171.24332202017354, -42.708399822400615], [171.24319590407373, -42.70854197082665], [171.24305758199213, -42.708683931825206], [171.24293146470131, -42.70882607993191], [171.2428053468285, -42.708968227885876], [171.24267922837365, -42.70911037568717], [171.24254090382908, -42.70925233600388], [171.2424147841832, -42.709394483485795], [171.2422886639553, -42.70953663081498], [171.2421625431454, -42.70967877799147], [171.24203642175345, -42.70982092501522], [171.2418980941367, -42.709962884483446]], [[171.30213695510164, -42.65700244321193], [171.30193109869538, -42.65694535932802], [171.30172499765942, -42.656897276748886], [171.3015188969519, -42.65684919380392], [171.30131279657286, -42.65680111049318], [171.30110694162687, -42.656744025150516], [171.300913037534, -42.656696122043634], [171.30070693815895, -42.65664803765819], [171.30050083911237, -42.65659995290695], [171.30029474039424, -42.65655186778995], [171.30008864200462, -42.656503782307155], [171.29988254394343, -42.656455696458586], [171.29967644621075, -42.656407610244244], [171.29947034880655, -42.65635952366412], [171.29926425173085, -42.65631143671822], [171.2990581549836, -42.65626334940656], [171.29885205856488, -42.6562152617291], [171.29864596247464, -42.6561671736859], [171.2984398667129, -42.65611908527693], [171.29823401679275, -42.65606199484841], [171.29804036270636, -42.656005085293906], [171.29783426797803, -42.6559569958112], [171.29764061460094, -42.655900085591725], [171.29743476617475, -42.655842993749786], [171.29724111353443, -42.6557860828662], [171.29703526586985, -42.65572899031799], [171.29684136825568, -42.65568108041816], [171.29663552132348, -42.65562398716282], [171.29644187012929, -42.655567074950184], [171.2962357781621, -42.65551898263391], [171.29604212767728, -42.65546206975634], [171.29583628223907, -42.655404975087656], [171.29564238661027, -42.65535706318877], [171.2954365419045, -42.65529996781297], [171.29524264692833, -42.6552520552475], [171.29503680295497, -42.655194959164604], [171.29484290863144, -42.655147045932516], [171.29463706539048, -42.65508994914255], [171.29444317171956, -42.65504203524385], [171.29426270396394, -42.654949294474], [171.29408223674955, -42.65485655342771], [171.2939139652545, -42.654763993778054], [171.29373349910344, -42.6546712521978], [171.29355303349368, -42.654578510341146], [171.29337256842518, -42.65448576820805], [171.2932042989991, -42.65439320754588], [171.2930238349939, -42.65430046487883], [171.29284337152998, -42.6542077219354], [171.29267510365077, -42.65411516051826], [171.29249439492688, -42.654031418671], [171.29231393304232, -42.65393867491652], [171.29213322532516, -42.653854932514356], [171.29195276449792, -42.65376218820637], [171.29178425273994, -42.65367862714535], [171.2916037929508, -42.65358588230278], [171.29142308722967, -42.65350213880972], [171.2912423819992, -42.65341839503884], [171.29106192378342, -42.65332564936573], [171.2908934144212, -42.653242087029376], [171.29070076240126, -42.65314915881337], [171.2905200591843, -42.65306541393276], [171.29033960308314, -42.652972667152696], [171.29015890087297, -42.652888921717214], [171.28997819915347, -42.652805176003916], [171.28978554987464, -42.65271224628914], [171.2896048491794, -42.65262850000207], [171.28942414897486, -42.652544753437205], [171.28924369603968, -42.65245200497725], [171.28906299684186, -42.65236825785756], [171.28887035030414, -42.65227532664406], [171.28868965213059, -42.652191578950585], [171.28850920132925, -42.65209882936494], [171.28832850416242, -42.652015081116666], [171.2881358598322, -42.65192214870047], [171.28795541064866, -42.65182939826622], [171.28777471502215, -42.65174564916713], [171.2875820723659, -42.65165271584435], [171.2874013777636, -42.65156896617154], [171.2872209307139, -42.65147621461163], [171.2870399900311, -42.65140146599267], [171.28685929690087, -42.651317715486606], [171.2866907987038, -42.651234147132726], [171.28650985937588, -42.65115939769664], [171.28632916767492, -42.6510756463756], [171.28614822925226, -42.65100089638186], [171.28596753850735, -42.65091714450465], [171.28579879535025, -42.65084257647679], [171.28561810554385, -42.65075882406233], [171.28543741622815, -42.65067507137016], [171.28525672740315, -42.65059131840026], [171.28508823335915, -42.65050774775063], [171.28490729811162, -42.65043299584433], [171.2847266107158, -42.65034924205951], [171.28455811805037, -42.65026567065057], [171.28437743161845, -42.65018191632925], [171.2841967456772, -42.650098161730256], [171.28402825441387, -42.65001458956266], [171.2838475694365, -42.6499308344272], [171.28366688494978, -42.64984707901402], [171.2834732640566, -42.64979014534028], [171.2832793959106, -42.64974221293837], [171.28307358159776, -42.649685095812124], [171.28287971410455, -42.649637162743865], [171.2826739005243, -42.64958004491085], [171.28248003368392, -42.64953211117629], [171.28228641490696, -42.64947517552917], [171.28208035464868, -42.64942705823562], [171.28188673658133, -42.649370121923894], [171.28169287103597, -42.64932218687721], [171.28148705964114, -42.649265066945574], [171.28129319474863, -42.64921713123258], [171.2810871361601, -42.64916901217828], [171.2808932718929, -42.64912107579815], [171.28068746193415, -42.64906395445215], [171.2804935983198, -42.64901601740574], [171.28028754105387, -42.64896789693361], [171.28009367806484, -42.648919959220095], [171.27988762144557, -42.648871838038616], [171.2796940072061, -42.64881489807996], [171.27947575734834, -42.648766593001916], [171.27926970174443, -42.64871847072468], [171.27906364646924, -42.648670348081886], [171.27885783976575, -42.64861322349917], [171.27863959130755, -42.64856491684975], [171.2784335370585, -42.64851679308947], [171.27822748313812, -42.64846866896364], [171.27802142954644, -42.648420544472245], [171.2778034308497, -42.64836323468074], [171.2775973779555, -42.648315109437426], [171.27739132539, -42.64826698382858], [171.27719746694598, -42.648219041284236], [171.2769914150272, -42.648170914966094], [171.27678561197462, -42.64811378671706], [171.27657956074262, -42.64806565966876], [171.27638570358755, -42.64801771577068], [171.27617965300226, -42.64796958801309], [171.27597360274572, -42.64792145989], [171.2757678015, -42.64786432984044], [171.2755739456339, -42.647816384588666], [171.27535570268918, -42.64776807176847], [171.27513770886637, -42.64771075697973], [171.27493166032284, -42.6476626270091], [171.27471366728108, -42.64760531142554], [171.27449567465158, -42.64754799543356], [171.27428962717437, -42.647499864324686], [171.27407163532598, -42.6474425475379], [171.273853394936, -42.647394231895305], [171.273647597479, -42.64733709809558], [171.27342935780987, -42.647288781656364], [171.27321136753628, -42.64723146325703], [171.27300557123675, -42.64717432832188], [171.2727873326699, -42.647126010676686], [171.27256934358974, -42.64706869107417], [171.27236354844771, -42.647011555003616], [171.2721455601796, -42.64695423460727], [171.27192732309646, -42.64690591534679], [171.27172152911203, -42.64684877814087], [171.27150354203735, -42.646791456541386], [171.27128555537502, -42.64673413453351], [171.2710914573378, -42.646695183348925], [171.2708976089265, -42.646647230299635], [171.270691567388, -42.64659909281149], [171.27049747017182, -42.64656014063327], [171.27029142925093, -42.64651200243504], [171.27009758206322, -42.64646404805104], [171.26989129227252, -42.64642491067896], [171.26969744568285, -42.64637695562717], [171.26950359940062, -42.64632900025215], [171.2692973104612, -42.646289861823746], [171.26910346477706, -42.64624190578095], [171.2688974260564, -42.64619376510975], [171.26870358099782, -42.64614580840006], [171.26849754292414, -42.64609766701973], [171.26830369849117, -42.64604970964313], [171.2680976610644, -42.64600156755366], [171.2679035674578, -42.64596261103678], [171.26769753064872, -42.64591446823727], [171.26750368743942, -42.64586650952602], [171.2672976512773, -42.645818366017416], [171.26709211527313, -42.645752219097275], [171.26688632977095, -42.64569507333745], [171.26668054465608, -42.64563792721397], [171.26647500993042, -42.64557177920647], [171.26626922561934, -42.645514632356615], [171.26606369175568, -42.645448483624506], [171.26585790824842, -42.6453913360483], [171.2656523752468, -42.645325186591585], [171.26544659254333, -42.645268038289004], [171.26524081022717, -42.6452108896228], [171.26503527850412, -42.64514473907877], [171.26482949699178, -42.64508758968624], [171.26462396613076, -42.64502143841764], [171.26441818542224, -42.64496428829876], [171.26421265542325, -42.6448981363056], [171.2640068755186, -42.644840985460384], [171.2638010960013, -42.644783834251584], [171.26359556728087, -42.644717681171166], [171.26338978856742, -42.644660529236035], [171.26318426070907, -42.644594375431076], [171.26297823230254, -42.64454622427498], [171.2627719536986, -42.644507074257966], [171.26256592592057, -42.6444589223702], [171.26234770551807, -42.64441058512095], [171.26214167840863, -42.644362432480634], [171.26193565162805, -42.644314279474955], [171.26172962517646, -42.64426612610388], [171.2615114061434, -42.644217787282976], [171.26130512962544, -42.64417863465733], [171.26109910414203, -42.644130480167455], [171.26089307898758, -42.64408232531219], [171.26067486129298, -42.64403398491869], [171.26046858595322, -42.64399483080518], [171.260262561767, -42.643946674831135], [171.26004434507124, -42.64389833325224], [171.25983807061007, -42.64385917801714], [171.25963204739213, -42.643811020924296], [171.25941358069122, -42.643771679649554], [171.25920755811262, -42.643723521803345], [171.25900153586304, -42.643675363591775], [171.25879576503425, -42.64361820352803], [171.25858999459285, -42.64356104310074], [171.25838422453887, -42.6435038823099], [171.25819064761052, -42.64344690659201], [171.25798487831884, -42.64338974509578], [171.25777910941457, -42.643332583235996], [171.2575733408977, -42.64327542101269], [171.25738001674898, -42.64320944246714], [171.25717424902362, -42.64315227953936], [171.25696848168567, -42.643095116248034], [171.25677490738434, -42.64303813817891], [171.25656888940145, -42.64298997565938], [171.2563631231841, -42.642932811298294], [171.25616954996775, -42.64287583222325], [171.25596378451274, -42.6428186671568], [171.25577021203387, -42.64276168741852], [171.25556444734124, -42.64270452164673], [171.25537087559985, -42.64264754124523], [171.25516511166956, -42.6425903747681], [171.25497154066568, -42.64253339370339], [171.25476552583498, -42.64248522799025], [171.25455976302536, -42.642428060443386], [171.25435374888193, -42.64237989400055], [171.25414798681805, -42.6423227257258], [171.25394197336195, -42.64227455855322], [171.2537362120438, -42.642217389550574], [171.25353019927502, -42.64216922164831], [171.2533244387026, -42.64211205191778], [171.25311842662114, -42.642063883285815], [171.2529126667945, -42.64200671282741], [171.25270665540035, -42.64195854346575], [171.25250089631945, -42.64190137227948], [171.25229488561266, -42.64185320218815], [171.25208912727757, -42.641796030273994], [171.2518831172581, -42.641747859453005], [171.25167710756773, -42.64169968826671], [171.25147135033671, -42.641642515260365], [171.2512653413337, -42.641594343344416], [171.25105958484846, -42.64153716961021], [171.2508535765328, -42.64148899696461], [171.25066001308926, -42.64143200873349], [171.25046645000833, -42.641375020181], [171.25027288728995, -42.64131803130715], [171.2500793249342, -42.641261042111935], [171.24987357069475, -42.641203866282844], [171.2496797566924, -42.6411558778715], [171.24948619540942, -42.64109888769096], [171.24929263448905, -42.64104189718908], [171.2490990739313, -42.640984906365844], [171.24890551373616, -42.64092791522127], [171.24871195390364, -42.64087092375535], [171.24851839443372, -42.640813931968076], [171.2483245827503, -42.640765941300515], [171.2481310239782, -42.640708948869715], [171.24793746556873, -42.64065195611757], [171.2477439075219, -42.64059496304411], [171.24755009715184, -42.64054697108697], [171.24735653980284, -42.64048997736999], [171.24716298281646, -42.640432983331664], [171.2469694261927, -42.64037598897201], [171.24677561713605, -42.640327995725336], [171.24656961634275, -42.64027981549472], [171.2463758079122, -42.64023182158154], [171.24618199978937, -42.64018382734532], [171.24597599996193, -42.64013564606251], [171.24578219246516, -42.640087651159796], [171.24558838527614, -42.64003965593407], [171.24538238641455, -42.63999147359908], [171.24518857985163, -42.639943477706865], [171.24499477359646, -42.63989548149163], [171.244800967649, -42.63984748495338], [171.24460716200932, -42.63979948809212], [171.24441335667737, -42.63975149090787], [171.24420761289696, -42.63969430506742], [171.24401380821865, -42.63964630721756], [171.24382000384807, -42.63959830904468], [171.24362619978527, -42.63955031054881], [171.2434326493003, -42.63949331031048], [171.2432388458805, -42.63944531116946], [171.24304504276847, -42.63939731170544], [171.24283904812592, -42.6393491248638], [171.24263330719606, -42.639291936241], [171.2424273132411, -42.63924374866989], [171.24222157305726, -42.63918655931944], [171.24200338799824, -42.639138183876], [171.24179764857288, -42.63908099377623], [171.2415916560039, -42.6390328047244], [171.24138566376402, -42.6389846153074], [171.24117992544313, -42.638927424115714], [171.2409739338909, -42.638879233969256], [171.24075600459435, -42.63882185477547], [171.2405500137405, -42.6387736638778], [171.24034427692416, -42.6387164712092], [171.24013828675797, -42.638668279582106], [171.23992035901264, -42.63861089882322], [171.23971436954483, -42.638562706444944], [171.23950863423315, -42.638505512299425], [171.23930264545297, -42.63845731919172], [171.23908471925898, -42.63839993686778], [171.2388789850935, -42.638342741609634], [171.23868518897532, -42.63829473488082], [171.23849139316496, -42.63824672782905], [171.23829759766244, -42.63819872045433], [171.2381038024677, -42.63815071275663], [171.23791026163445, -42.63809370334103], [171.23771646708286, -42.638045694998304], [171.23752267283905, -42.63799768633264], [171.23734107043208, -42.63794986498012], [171.2371475309551, -42.63789285429741], [171.23695373765165, -42.63784484468423], [171.23674775316073, -42.6377966470507], [171.23655396048358, -42.63774863677119], [171.23636016811423, -42.63770062616872], [171.23616637605272, -42.63765261524334], [171.23597258429908, -42.637604603995], [171.23577879285324, -42.63755659242374], [171.23557281028397, -42.637508392708135], [171.23537901946446, -42.63746038047056], [171.23518522895282, -42.63741236791005], [171.23499143874898, -42.63736435502662], [171.23477326607593, -42.63731596600991], [171.23455509375376, -42.63726757658327], [171.23434936770826, -42.63721037331952], [171.23413119610802, -42.6371619830971], [171.23391327947968, -42.63710459108757], [171.2336951086123, -42.637056200046295], [171.23348938409674, -42.63699899526252], [171.23327121395133, -42.63695060342544], [171.23305304415683, -42.63690221117846], [171.23283512948728, -42.63684481714925], [171.23262915169855, -42.636796612216905], [171.23241123781116, -42.63673921739382], [171.2321930694715, -42.63669082353225], [171.23197515637892, -42.63663342789231], [171.23175698877216, -42.63658503321194], [171.23153907647435, -42.63652763675514], [171.2313209096005, -42.636479241256], [171.23111518928732, -42.6364220322756], [171.23089702313553, -42.6363736359807], [171.23067911241472, -42.63631623791324], [171.23048558441442, -42.63625921615847], [171.23027986563545, -42.636202005702486], [171.23008633837313, -42.63614498328499], [171.22989255628227, -42.63609696190555], [171.22969902971815, -42.636039938844895], [171.2294933124233, -42.63598272700006], [171.22929978659712, -42.6359257032767], [171.22910626113378, -42.63586867923216], [171.22890054497702, -42.635811466341025], [171.22870702025165, -42.63575444163381], [171.22851324050245, -42.635706417958566], [171.22831971647528, -42.63564939260818], [171.22812593736938, -42.63560136828806], [171.22793215857143, -42.635553343645086], [171.22773863557788, -42.635496317329576], [171.22754485742325, -42.63544829204175], [171.22735133512796, -42.63539126508311], [171.2271575576167, -42.63534323915042], [171.2269640360196, -42.63528621154865], [171.2267702591517, -42.63523818497112], [171.22657648259175, -42.63519015807077], [171.22637025974038, -42.6351509433988], [171.22617648377943, -42.63510291583142], [171.22598270812645, -42.63505488794117], [171.22577648612804, -42.635015672213974], [171.22558271107408, -42.634967643656736], [171.22538893632805, -42.63491961477665], [171.22518271518263, -42.63488039799421], [171.2249889410357, -42.634832368447135], [171.22479516719667, -42.63478433857721], [171.22458894690422, -42.634745120739574], [171.2243949176931, -42.634706091537296], [171.2242008887348, -42.63466706201044], [171.22400711605582, -42.634619030826144], [171.22380089684876, -42.63457981158724], [171.22360686868558, -42.634540781067], [171.22341284077524, -42.63450175022218], [171.22321881311777, -42.63446271905279], [171.22301285113468, -42.63441449708343], [171.22281882401944, -42.634375465245256], [171.2226006719303, -42.6343270533761], [171.2223825201923, -42.63427864109716], [171.22216436880532, -42.63423022840843], [171.22194647408887, -42.6341728139864], [171.22172832343506, -42.63412440047909], [171.221522363801, -42.63407617586767], [171.2213042138385, -42.63402776156381], [171.2210860642271, -42.633979346850175]], [[171.31132929721667, -42.63020342674745], [171.31113595337678, -42.63013753852951], [171.31094236649434, -42.6300806517455], [171.3107487799735, -42.630023764639844], [171.31055519381414, -42.62996687721252], [171.31036185155745, -42.629900987712], [171.31016826614862, -42.629844099642206], [171.3099746811014, -42.629787211250765], [171.30978109641572, -42.62973032253768], [171.30958751209158, -42.62967343350297], [171.30938198144324, -42.629607362459], [171.30918839788197, -42.629550472761416], [171.30899481468228, -42.62949358274219], [171.30880123184414, -42.62943669240134], [171.30860764936762, -42.62937980173886], [171.30840187695054, -42.62932273071134], [171.30820829520945, -42.62926583938519], [171.30801471382992, -42.629208947737446], [171.3078213767127, -42.629143054027125], [171.30761536190295, -42.629094983350726], [171.3074095913802, -42.62903791056966], [171.30721576748513, -42.62899001933299], [171.30700999769348, -42.628932945845335], [171.30680398424323, -42.628884873730556], [171.30659821519512, -42.62882779951459], [171.30640439261342, -42.6287799069252], [171.3061986242964, -42.62872283200266], [171.30599285636572, -42.62866575671638], [171.30578684463214, -42.62861768279873], [171.30559326758066, -42.628560787125174], [171.30538725652153, -42.62851271249924], [171.30519368017812, -42.62845581616127], [171.30499985989553, -42.62840792123071], [171.30479409415818, -42.62835084382473], [171.30460027452702, -42.62830294822806], [171.30439450952082, -42.628245870115535], [171.3042009349553, -42.6281889721272], [171.30399492626609, -42.628140895033724], [171.3038013524087, -42.628083996381], [171.30360777891298, -42.628027097406694], [171.30342639578558, -42.62797037868038], [171.30323282300074, -42.62791347908334], [171.30305144055973, -42.627856759773756], [171.3028578684858, -42.627799859553974], [171.30267648673117, -42.62774313966119], [171.3024831600255, -42.62767723710029], [171.30230177898292, -42.627620516625036], [171.30210820835825, -42.62756361516059], [171.3019146380952, -42.62750671337461], [171.30173325808832, -42.62744999201499], [171.30153968853625, -42.62739308960627], [171.30135806439927, -42.62734536937711], [171.3011644955307, -42.62728846634489], [171.3009709270238, -42.62723156299109], [171.30078954871337, -42.62717484016318], [171.30059598091742, -42.627117936186714], [171.30040216853124, -42.62707003359833], [171.3002207912309, -42.627013309885314], [171.30002722448017, -42.6269564049638], [171.2998334130586, -42.62690850142797], [171.2996396019438, -42.62686059756897], [171.29943360138003, -42.62681251239764], [171.2992397908893, -42.6267646078718], [171.29904598070527, -42.6267167030228], [171.298852170828, -42.62666879785062], [171.29864617154416, -42.62662071128299], [171.298452362291, -42.62657280544401], [171.2982585533445, -42.62652489928185], [171.29806474470482, -42.626476992796526], [171.29785874670097, -42.62642890483263], [171.2976646933449, -42.626389999378425], [171.29745869595715, -42.626341910704646], [171.29726464314078, -42.62630300458108], [171.29705864636907, -42.62625491519743], [171.2968645940924, -42.62621600840451], [171.2966707875492, -42.626168099593194], [171.29646454619987, -42.62612901084875], [171.29627074025328, -42.62608110136982], [171.29606474503117, -42.62603301022281], [171.2958709397087, -42.62598510007711], [171.29566519075667, -42.625928006531865], [171.29547138608586, -42.62588009572026], [171.29526563786516, -42.625823001468646], [171.29505964432042, -42.62577490854012], [171.29486608635662, -42.62571799503315], [171.29466009348658, -42.62566990139657], [171.29446653623108, -42.625612987225395], [171.29426078985955, -42.62555589119749], [171.29405479802153, -42.62550779648842], [171.29386124184842, -42.62545088131118], [171.29365525068513, -42.62540278589405], [171.2934495057888, -42.62534568843181], [171.2932435153109, -42.6252975922849], [171.2930499605668, -42.625240675758896], [171.29284397076364, -42.62519257890399], [171.2926382273425, -42.6251354800074], [171.29243223822476, -42.625087382422706], [171.29223868490976, -42.62503046454801], [171.29203294260654, -42.62497336458156], [171.29183939002732, -42.62491644604353], [171.29164583780985, -42.62485952718403], [171.29144009664122, -42.624802426170326], [171.29124654515954, -42.624745506647514], [171.29105299403955, -42.62468858680328], [171.2908594432813, -42.624631666637576], [171.2906658928848, -42.624574746150415], [171.29047258921057, -42.62450882367466], [171.29027903956492, -42.62445190254544], [171.29008549028097, -42.62439498109475], [171.2898919413588, -42.624338059322625], [171.28969839279839, -42.624281137229076], [171.28951678729163, -42.62423339851386], [171.28932323941495, -42.62417647579699], [171.2891296919, -42.62411955275871], [171.28894833389938, -42.62406281149561], [171.2887547870956, -42.624005887834855], [171.2885734297816, -42.623949145988796], [171.28837988368898, -42.62389222170558], [171.2881863379581, -42.623835297100946], [171.28800473497034, -42.623787556027615], [171.28782337900392, -42.623730813014895], [171.28762958754334, -42.62368288914104], [171.2874482322379, -42.62362614554461], [171.28726663045532, -42.62357840331982], [171.28708527579863, -42.62352165915879], [171.2868914855888, -42.62347373405569], [171.28671013159308, -42.623416989310954], [171.28652853101573, -42.62336924593474], [171.28633474173284, -42.623321319904186], [171.2861533887097, -42.623264574293096], [171.28597203602376, -42.6232078284001], [171.28577849472043, -42.62315089979574], [171.28559714272114, -42.62309415331983], [171.28541579105908, -42.623037406562034], [171.2852222508164, -42.62298047703428], [171.28504089984096, -42.622923729693575], [171.2848473603095, -42.622866799543424], [171.28466601002074, -42.62281005161984], [171.28448466006918, -42.622753303414356], [171.28427893274204, -42.62269618975337], [171.28407320580152, -42.62263907572896], [171.2838674792476, -42.62258196134106], [171.2836617530802, -42.62252484658968], [171.28345602729942, -42.62246773147485], [171.28325030190524, -42.62241061599656], [171.28304457689765, -42.62235350015482], [171.28283885227668, -42.62229638394961], [171.2826333755125, -42.62223026574713], [171.28242765169384, -42.6221731488159], [171.2822219282618, -42.62211603152123], [171.28201620521637, -42.62205891386309], [171.28181048255752, -42.622001795841534], [171.2816047602853, -42.62194467745652], [171.2813992860446, -42.62187855707952], [171.28119356457475, -42.62182143796852], [171.28098784349152, -42.621764318494066], [171.28078212279488, -42.62170719865618], [171.28057640248485, -42.62165007845489], [171.28037093035203, -42.62158395626598], [171.2801771516284, -42.621536019983125], [171.27999580964863, -42.62147926479498], [171.2798020315558, -42.62143132788737], [171.2796082537699, -42.621383390656774], [171.27941472421702, -42.621326451483135], [171.27923313562, -42.62127869672804], [171.27903960675104, -42.6212217569313], [171.27884583023734, -42.62117381843083], [171.27866449057697, -42.62111706117121], [171.27847071469412, -42.62106912204606], [171.2782769391182, -42.6210211825979], [171.27808341196393, -42.620964241212455], [171.27787744856127, -42.62091611785679], [171.27768367394432, -42.620868177420064], [171.27748989963433, -42.620820236660336], [171.27729637385767, -42.620763293966725], [171.2771026001891, -42.6207153525619], [171.2768966384142, -42.62066722746823], [171.2767028653702, -42.62061928539697], [171.27650909263315, -42.62057134300275], [171.27631606529908, -42.620496395465565], [171.2761106016815, -42.62043026576753], [171.27591732685661, -42.62036431917817], [171.27572405244823, -42.62029837226914], [171.2755185901367, -42.6202322415295], [171.27532531657542, -42.62016629396083], [171.27513204343066, -42.620100346072505], [171.27493877070242, -42.62003439786453], [171.27473331012757, -42.61996826574332], [171.27454028686225, -42.6198933152765], [171.27433482719186, -42.61982718245458], [171.27414155618516, -42.619761232928155], [171.273948285595, -42.619695283082116], [171.2737428272307, -42.61962914921863], [171.27354955748768, -42.61956319871298], [171.27334409999887, -42.61949706414795], [171.27315083110295, -42.619431112982696], [171.27294537448964, -42.6193649777161], [171.27275235530897, -42.619290024299595], [171.27254689960014, -42.619223888332336], [171.27235288565248, -42.619184940618695], [171.27214668387063, -42.6191458087145], [171.2719526704357, -42.61910686033107], [171.27174646918434, -42.61906772771478], [171.27155245626207, -42.61902877866157], [171.27134625554123, -42.61898964533324], [171.27115224313164, -42.618950695610245], [171.27094604294132, -42.618911561569824], [171.27075203104448, -42.61887261117709], [171.27054583138468, -42.61883347642458], [171.27035182000054, -42.618794525362084], [171.2701456208713, -42.61875538989754], [171.26993942201176, -42.61871625406604], [171.26973322342198, -42.618677117867634], [171.26953946239726, -42.61862916386767], [171.26933326436742, -42.61859002695814], [171.26912706660733, -42.61855088968166], [171.268920869117, -42.61851175203828], [171.26872710926983, -42.61846379668282], [171.26852091233945, -42.61842465832831], [171.26831521467724, -42.61836751646282], [171.26810951740177, -42.61831037423403], [171.26791575884215, -42.61826241752644], [171.2677100622986, -42.618205274591844], [171.2675043661418, -42.61814813129399], [171.26729867037176, -42.61809098763284], [171.2670929749885, -42.61803384360839], [171.26689946781622, -42.61797688364201], [171.26669377319402, -42.617919738912676], [171.26648807895856, -42.61786259382007], [171.26628238510992, -42.6178054483642], [171.26607669164804, -42.61774830254504], [171.2658709985729, -42.61769115636261], [171.2656653058846, -42.617634009816896], [171.26545961358303, -42.61757686290794], [171.26525392166826, -42.617519715635694], [171.26506041785237, -42.61746275261542], [171.2648547266987, -42.61740560463835], [171.26464903593182, -42.61734845629801], [171.26444334555174, -42.61729130759442], [171.2642379056349, -42.617225156973156], [171.2640444037056, -42.61716819226623], [171.26385115226938, -42.61710222568534], [171.26364546346977, -42.61704507557389], [171.26345221285357, -42.61697910833281], [171.26324652484422, -42.61692195751745], [171.2630532750481, -42.61685598961616], [171.2628597753975, -42.61679902294391], [171.26265408855272, -42.61674187108308], [171.262460839966, -42.616675902201294], [171.26226734144106, -42.61661893454598], [171.26207384327807, -42.6165619665695], [171.2618803454771, -42.61650499827187], [171.2616868480381, -42.61644802965307], [171.26149335096108, -42.61639106071312], [171.26130010473773, -42.61632508991019], [171.26110660841204, -42.616268120328776], [171.26091311244838, -42.616211150426196], [171.2607196168467, -42.61615418020247], [171.26051393419047, -42.616097024564795], [171.26032068995528, -42.616031052140784], [171.2601150080894, -42.61597389579926], [171.2599217646743, -42.61590792271514], [171.2597160835987, -42.61585076566979], [171.25952284100373, -42.61578479192557], [171.2593171607185, -42.61572763417638], [171.2591239189436, -42.615661659772044], [171.2589182394487, -42.615604501319055], [171.25872499849393, -42.61553852625462], [171.25851957067403, -42.61547236556796], [171.25832607965475, -42.61541539137331], [171.25814477625457, -42.615358602201084], [171.2579515369118, -42.61529262585717], [171.2577580469936, -42.6152356507204]], [[171.05392589628883, -42.7743254465287], [171.0541594282283, -42.77428439104819], [171.05438074291277, -42.77424312745137], [171.05460205731785, -42.77420186342046], [171.05482308966532, -42.774169599203255], [171.05504440354417, -42.77412833430541], [171.05526571714364, -42.77408706897345], [171.05548703046375, -42.77404580320745], [171.05572027878318, -42.774013744750995], [171.0559415915705, -42.7739724780943], [171.05615040558033, -42.7739400038154], [171.0563717178478, -42.773898736315545], [171.05659274831692, -42.77386646863933], [171.05681377857135, -42.773834200531525], [171.0570350900656, -42.77379293173195], [171.05725611985847, -42.77376066275972], [171.05747743082637, -42.77371939309324], [171.05769846015767, -42.77368712325659], [171.05791977059917, -42.77364585272322], [171.0581283013084, -42.77362237505736], [171.05833711313744, -42.773589896740845], [171.05854592476143, -42.773557418038855], [171.0587547361804, -42.773524938951404], [171.0589635473943, -42.773492459478454], [171.0591723584032, -42.77345997962004], [171.05938088809592, -42.773436499649414], [171.05960191556088, -42.77340422609567], [171.05981072598024, -42.77337174505958], [171.06001953619457, -42.77333926363803], [171.06022806521662, -42.77331578210899], [171.0604490918694, -42.77328350690127], [171.06065762056974, -42.773260024582434], [171.06086643002, -42.77322754159892], [171.0610871752088, -42.77320426542787], [171.0612957034433, -42.77318078193608], [171.06151672913376, -42.773148504645306], [171.0617252570465, -42.773125020363736], [171.06194600160825, -42.773101742522236], [171.0621548099356, -42.77306925716339], [171.06236361805787, -42.773036771419086], [171.06258492339657, -42.77299549175303], [171.06279373107319, -42.772963005214265], [171.06300253854468, -42.77293051829002], [171.06321162636218, -42.7728890306858], [171.0634326501486, -42.77285674965321], [171.06364173745743, -42.772815261252106], [171.06385054404248, -42.77278277276133], [171.06405935042235, -42.77275028388512], [171.06428065372626, -42.77270900089567], [171.06448945966045, -42.77267651122501], [171.0646982653895, -42.772644021168865], [171.0649070709134, -42.77261153072732], [171.0651161565044, -42.772570039595145], [171.06532496158744, -42.77253754838153], [171.06553376646534, -42.772505056782485], [171.06574257113806, -42.772472564798], [171.06595137560564, -42.772440072428054], [171.06616017986806, -42.7724075796727], [171.0663814806947, -42.772366292566986], [171.06657778777736, -42.77234259300569], [171.06677437475176, -42.77230989279021], [171.06697096153087, -42.772277192232806], [171.0671794848069, -42.77225369791174], [171.0673760712192, -42.77222099665047], [171.0675726574362, -42.77218829504727], [171.06778118022498, -42.77216479961918], [171.06797776607513, -42.77213209731213], [171.06817435173, -42.772099394663144], [171.06837093718954, -42.77206669167223], [171.0685794593195, -42.77204319477524], [171.06878826104023, -42.7720106971696], [171.0689848459326, -42.771977993111804], [171.0691936472478, -42.77194549475771], [171.0693902317445, -42.77191278999497], [171.06959903265414, -42.77188029089243], [171.06979533716756, -42.77185658575592], [171.0700041377022, -42.77182408590611], [171.07020072143632, -42.77179137973462], [171.07040952156535, -42.77175887913638], [171.07061860095632, -42.77171737781702], [171.07083961722313, -42.77168508231585], [171.07104869610518, -42.77164358019969], [171.07125777472075, -42.771602077695825], [171.07147906962882, -42.77156078060456], [171.07168786839438, -42.77152827764447], [171.0719091627821, -42.77148697971026], [171.07211824034908, -42.7714454756117], [171.07232703843283, -42.77141297147069], [171.07254833202703, -42.771371672283394], [171.07275740881852, -42.77133016700036], [171.07297870185985, -42.771288866968916], [171.07319971553267, -42.77125656685367], [171.073408791542, -42.7712150603637], [171.0736300837832, -42.77117375905543], [171.07383915925283, -42.77113225176756], [171.07406017197846, -42.7710999499701], [171.07426924693905, -42.771058441885515], [171.07449053810694, -42.77101713889021], [171.0747115501278, -42.770984835819554], [171.07490812900528, -42.7709521214569], [171.07511692414647, -42.770919612162174], [171.0753135026281, -42.77088689709464], [171.07552201861478, -42.77086338741461], [171.07571859672933, -42.7708306716433], [171.07592739108955, -42.770798160853], [171.07612369014748, -42.7707744447432], [171.07633248413245, -42.770741933205706], [171.07652906148405, -42.77070921602577], [171.07673785506324, -42.77067670373992], [171.07694636989663, -42.77065319143963], [171.07714294668062, -42.770620473192935], [171.07735173967922, -42.77058795977456], [171.0775605324724, -42.77055544597077], [171.07775710866005, -42.770522726656274], [171.07796590104743, -42.77049021210417], [171.07817441486858, -42.77046669754439], [171.0783709904886, -42.77043397716318], [171.0785797822953, -42.770401461478535], [171.0787885738966, -42.77036894540853], [171.07900958166502, -42.77033663394551], [171.0792186510588, -42.77029511669892], [171.07943965836955, -42.77026280439548], [171.07966066546527, -42.77023049166058], [171.07986973410723, -42.770188973208356], [171.08009074074528, -42.77015665963305], [171.08029980887798, -42.77011514038422], [171.08052081505832, -42.770082825968494], [171.08074182102365, -42.770050511121326], [171.08095088840446, -42.770008990666895], [171.08117189391203, -42.76997667497932], [171.0813931770943, -42.7699353584648], [171.0816141821394, -42.76990304191314], [171.08183518696936, -42.769870724930044], [171.08205646937694, -42.76982940711633], [171.08226525745454, -42.76979688462745], [171.08248653934137, -42.769755565970975], [171.08270754325108, -42.76972324728341], [171.0829288246106, -42.76968192776041], [171.08314982805777, -42.769649608208795], [171.0833463987652, -42.769616879175665], [171.08354324685212, -42.7695751493933], [171.08373981713973, -42.76954241967542], [171.08393638723177, -42.76950968961568], [171.08413323461681, -42.76946795880345], [171.084329804289, -42.76943522805897], [171.08452665119648, -42.76939349655978], [171.0847232204488, -42.76936076513051], [171.08491978950553, -42.76932803335943], [171.08511663571113, -42.76928630083038], [171.08532542055286, -42.769253772689034], [171.08552198898914, -42.76922103987027], [171.08573105067916, -42.76917951056113], [171.08592761869048, -42.76914677703653], [171.08613640268948, -42.76911424739756], [171.08633324747078, -42.769072512745346], [171.08654203103313, -42.76903998235699], [171.08673887533, -42.76899824699669], [171.08694765845567, -42.76896571585895], [171.08714422522087, -42.76893298021795], [171.08736494707534, -42.76890965285615], [171.08758539179604, -42.76889532549509], [171.08779362028096, -42.76888079365894], [171.08801434175064, -42.76885746503618], [171.0882347861811, -42.768843136417665], [171.0884430143813, -42.76882860339357], [171.08866345863999, -42.76881427394542], [171.08888417960628, -42.76879094363393], [171.0891046236599, -42.76877661333139], [171.08931285149015, -42.76876207871627], [171.08953357207156, -42.768738747143864], [171.08976623196736, -42.76872461942267], [171.0899869522764, -42.76870128696987], [171.09020739583326, -42.76868695453195], [171.09042811587295, -42.76866362122237], [171.0906485592247, -42.76864928793006], [171.09088149511615, -42.76862615748318], [171.09110193826146, -42.76861182331292], [171.09132265775935, -42.768588488266204], [171.09154310069948, -42.76857415324156], [171.09175188019182, -42.76854161326092], [171.09194844337273, -42.76850886929109], [171.09215722245878, -42.76847632856225], [171.0923537852433, -42.76844358388775], [171.092562563923, -42.76841104241076], [171.09275885008202, -42.76838729748928], [171.09295541230327, -42.76835455176939], [171.09316419040644, -42.76832200918247], [171.0933607522313, -42.768289262757904], [171.09356952992815, -42.768256719422816], [171.0937658152747, -42.768232972756834], [171.09397459259574, -42.76820042867476], [171.09418336971112, -42.768167884207415], [171.09439214662083, -42.768135339354785], [171.09458870728014, -42.76810259079622], [171.09479748378345, -42.76807004519545], [171.09500598418063, -42.76804649967944], [171.0952025442715, -42.76801375005443], [171.09541132019328, -42.7679812033214], [171.09562009590942, -42.76794865620312], [171.09582887141988, -42.76791610869958], [171.09603764672462, -42.76788356081076], [171.09624642182374, -42.7678510125367], [171.09645519671713, -42.76781846387738], [171.09666397140484, -42.76778591483279], [171.09687274588688, -42.767753365402974], [171.09708152016324, -42.76772081558787], [171.0972902942339, -42.76768826538753], [171.0974990680988, -42.76765571480193], [171.09770784175805, -42.767623163831075], [171.09791661521157, -42.76759061247499], [171.09813732897976, -42.767567264162174], [171.0983461020475, -42.76753471201434], [171.09856681548465, -42.7675113628661], [171.09877558816655, -42.7674788099265], [171.09899630127262, -42.767455459942816], [171.09920507356873, -42.76742290621149], [171.0994135704029, -42.767399352589024], [171.09963455825394, -42.76736700086934], [171.099843054765, -42.76734344645748], [171.10006321673814, -42.76733809539281], [171.1002711627547, -42.76733254119228], [171.1004791087476, -42.767326986613206], [171.10069927065138, -42.76732163432286], [171.10090721659734, -42.767316078964555], [171.1011151625196, -42.7673105232277], [171.101335324354, -42.76730516971166], [171.10154327022929, -42.76729961319556], [171.10175121608088, -42.76729405630092], [171.10197137784587, -42.767288701559174], [171.10217932365046, -42.76728314388528], [171.10238726943135, -42.76727758583287], [171.1026074311269, -42.76727222986543], [171.10281537686075, -42.76726667103377], [171.10302332257086, -42.76726111182355], [171.10324348419692, -42.76725575463043], [171.10345142986, -42.76725019464097], [171.10365937549935, -42.767244634273], [171.10387953705583, -42.76723927585418], [171.1040874826481, -42.76723371470694], [171.10430736961231, -42.76723735598304], [171.10452753113168, -42.76723199631617], [171.1047352021995, -42.76723543451216], [171.1049550892522, -42.76723907454475], [171.10517497634578, -42.767242714155394], [171.10539486348017, -42.76724635334409], [171.1056147506554, -42.76724999211088], [171.10583463787148, -42.7672536304557], [171.1060423091686, -42.76725706628284], [171.10626219646406, -42.76726070380724], [171.10648208380036, -42.76726434090968], [171.10670197117744, -42.767267977590215], [171.1069218585954, -42.7672716138488], [171.10714174605408, -42.76727524968543], [171.1073616335536, -42.767278885100126], [171.10758152109395, -42.767282520092905], [171.10780168271577, -42.76727715412575], [171.10802157030588, -42.76728078827348], [171.10824145793677, -42.76728442199929], [171.10846134560845, -42.767288055303155], [171.10868150723425, -42.76728268764252], [171.10888945285333, -42.76727711776556], [171.10910961443273, -42.76727174927996], [171.10931756000448, -42.76726617862373], [171.1095255055524, -42.76726060758897], [171.10974566706193, -42.767255237877706], [171.10995361256255, -42.7672496660637], [171.11017377402558, -42.76724429552747], [171.11038171947885, -42.767238722934216], [171.11060188089544, -42.76723335157304], [171.11080982630136, -42.76722777820054], [171.11102998767143, -42.76722240601441], [171.1112501490185, -42.767217033404066], [171.11147031034258, -42.76721166036949], [171.11167825565414, -42.76720608541627], [171.11189841693167, -42.767200711556754], [171.1121185781862, -42.767195337272994], [171.11232652342682, -42.76718976113983], [171.11254668463476, -42.76718438603112], [171.1127668458197, -42.76717901049816], [171.11298673369254, -42.767182635106074], [171.11320689486328, -42.76717725872583], [171.11343899878258, -42.767181083796494], [171.1136588867479, -42.76718470711398], [171.11387904791383, -42.76717932943988], [171.1140989359287, -42.76718295191233], [171.11433131308291, -42.76717777460349], [171.1145512011495, -42.76718139620751], [171.11477136228748, -42.76717601681528], [171.1149912504036, -42.767179637574266], [171.1152236275354, -42.767174458452125], [171.11544351570322, -42.76717807834267], [171.11566367681317, -42.76717269723232], [171.1158838379, -42.76716731569771], [171.11610399896372, -42.76716193373891], [171.1163238871986, -42.76716555193828], [171.116544048248, -42.76716016913217], [171.11676420927427, -42.76715478590183], [171.11698437027744, -42.767149402247284], [171.11720425857928, -42.76715301875546], [171.11742441956812, -42.7671476342536], [171.11764458053378, -42.76714224932752], [171.11785252545698, -42.76713666314167], [171.11807268637585, -42.76713127739065], [171.11829284727156, -42.7671258912154], [171.1185130081441, -42.76712050461591], [171.11872095297238, -42.7671149168494], [171.1189411137981, -42.767109529424964], [171.11916127460063, -42.767104141576326], [171.11938143538, -42.76709875330346], [171.11958938011324, -42.76709316395626], [171.1197970525202, -42.76709657483101], [171.12001721326098, -42.76709118533362], [171.1202251579526, -42.76708559482976], [171.12044504643808, -42.76708920511125], [171.12065299111214, -42.76708361382922], [171.12087315179102, -42.76707822268311], [171.12108109641733, -42.76707263062186], [171.12128876893348, -42.767076038790286], [171.12150892957365, -42.767070646419654], [171.12172909019057, -42.76706525362479], [171.1219495227746, -42.76705085979412], [171.12218189934478, -42.76704566652437], [171.12240205986055, -42.7670402724322], [171.1226224922457, -42.76702587730069], [171.12284265268306, -42.76702048235894], [171.12306281309714, -42.76701508699296], [171.12329518952035, -42.76700989145858], [171.12351562165142, -42.76699549460088], [171.12373578196426, -42.7669900979376], [171.12395594225376, -42.766984700850095], [171.12418831855274, -42.76697950349881], [171.12440847879617, -42.76697410553937], [171.12462863901632, -42.76696870715571], [171.12484879921317, -42.76696330834783], [171.12508117542149, -42.76695810918085], [171.12530133557217, -42.766952709501034], [171.12552176717165, -42.76693830876677], [171.12574192724384, -42.766932908237386], [171.12596208729266, -42.76692750728377], [171.12618224731818, -42.766922105905934], [171.12640240732034, -42.766916704103885], [171.1266225672992, -42.76691130187761], [171.1268305112179, -42.76690569935012], [171.12705067114956, -42.76690029629892], [171.12727083105787, -42.76689489282352], [171.12749099094285, -42.76688948892389], [171.12769893476587, -42.76688388481575], [171.12791909460364, -42.76687848009119], [171.12813925441804, -42.76687307494241], [171.12834719816917, -42.76686746965433], [171.12856735793636, -42.76686206368064], [171.12878751768014, -42.76685665728271], [171.12899546135935, -42.76685105081471], [171.12921562105586, -42.76684564359188], [171.12943578072898, -42.76684023594483], [171.12964372433626, -42.76683462829688], [171.1298638839621, -42.7668292198249], [171.13008404356452, -42.76682381092869], [171.13029198709975, -42.76681820210084], [171.13049993061077, -42.76681259289445], [171.13070760337754, -42.76681598396669], [171.1309155468702, -42.766810374004365], [171.1311112742918, -42.76680456424354], [171.1313189471042, -42.766807954206676], [171.1315268905539, -42.76680234313212], [171.13173483397938, -42.76679673167906], [171.13194250683947, -42.766800120510965], [171.13213823419457, -42.766794308991535], [171.13234617757703, -42.76678869642622], [171.13255412093517, -42.766783083482395], [171.13276206426906, -42.76677747016009], [171.13297000757862, -42.76677185645926], [171.13316573481038, -42.76676604317921], [171.13337367807102, -42.76676042874357], [171.13358162130734, -42.76675481392942], [171.1337895645194, -42.76674919873677], [171.1339975077071, -42.76674358316562], [171.13420545087052, -42.76673796721596], [171.13441339400964, -42.76673235088779], [171.13463328302944, -42.766735933903824], [171.1348529019702, -42.766748517176396], [171.13507252101465, -42.766761100029235], [171.1353046262867, -42.76676488075552], [171.13552424551085, -42.76677746274443], [171.13574413482928, -42.76678104363061], [171.13596375422904, -42.76679362477894], [171.1361955898149, -42.76680640438656], [171.13641547931968, -42.76680998398567], [171.13663509900277, -42.76682256385033], [171.1368672047107, -42.76682634141412], [171.13708709437006, -42.76682991972505], [171.13730698406954, -42.766833497614044], [171.13753908990702, -42.76683727381686], [171.13775897968904, -42.766840850838484], [171.1379785998435, -42.766853428132485], [171.13821070584402, -42.76685720297556], [171.13843059578048, -42.76686077870902], [171.1386504857571, -42.766864354020484], [171.13888259188704, -42.766868127502626], [171.13910275145128, -42.76686270124671], [171.1393351271062, -42.76685747311085], [171.13955528662368, -42.766852045983015], [171.13978766223283, -42.76684681692693], [171.14000782170353, -42.76684138892717], [171.14024019726693, -42.766836158950845], [171.14046008738254, -42.7668397307862], [171.14069246293386, -42.766834499890834], [171.1409248384626, -42.766829268522955], [171.1411449978484, -42.76682383833277], [171.14137737333132, -42.766818606044666], [171.14161001793326, -42.76680437257108], [171.1418301772171, -42.76679894106013], [171.14206255259785, -42.76679370737807], [171.14229492795602, -42.76678847322349], [171.14251508716973, -42.766783040392916], [171.142747462482, -42.76677780531812], [171.1429798377716, -42.76677256977079], [171.14321221303857, -42.766767333750956], [171.14343237215888, -42.76676189915302], [171.14364031513114, -42.76675626604749], [171.14383604195433, -42.76675043450096], [171.14403149996198, -42.76675360334446], [171.14423944289024, -42.7667479691489], [171.14443516966688, -42.76674213657628], [171.14464284384385, -42.76674550237448], [171.14483857059898, -42.76673966911119], [171.1450342973291, -42.76673383551249], [171.1452419715488, -42.76673720022369], [171.14543769825735, -42.76673136593431], [171.14563342494083, -42.766725531309525], [171.14584109920324, -42.76672889493378], [171.14603682586517, -42.76672305961832], [171.1462322840304, -42.766726224704115], [171.1464402268071, -42.76672058650474], [171.14663595342236, -42.76671475016319], [171.14683141162777, -42.766717914225964], [171.14703935436032, -42.76671227493657], [171.1472348126025, -42.76671543831072], [171.14744275531575, -42.76670979828759], [171.14766291414628, -42.76670435554139], [171.14789555732597, -42.76669010925639], [171.14812793221864, -42.766684863242865], [171.14836057525162, -42.766670616009264], [171.14859295006502, -42.76666536904952], [171.14881310871445, -42.76665992408603], [171.14904575154534, -42.766645675454974], [171.1492781262561, -42.766640427101315], [171.1495107689402, -42.766626177521644], [171.1497431435716, -42.76662092822176], [171.1499755181802, -42.76661567844937], [171.15020789276602, -42.76661042820448], [171.150440267329, -42.766605177487065], [171.1506726418691, -42.76659992629713], [171.15091723252917, -42.766594871942594], [171.15114960702417, -42.76658961978284], [171.1513819814963, -42.76658436715056], [171.1516143559456, -42.7665791140458], [171.15184673037206, -42.76657386046851], [171.15209132092136, -42.766568803601245], [171.1522989954182, -42.76657215550513], [171.15251888610064, -42.76657570416961], [171.15273877682293, -42.7665792524121], [171.152958667585, -42.76658280023265], [171.1531663422302, -42.766586150564585], [171.1533862330697, -42.766589697564655], [171.153606123949, -42.766593244142754], [171.15382601486812, -42.76659679029887], [171.15404590582702, -42.766600336033044]], [[171.32333727831698, -42.581741763675204], [171.32322475284863, -42.581848181607775], [171.3231119856963, -42.58196360130733], [171.32301164062466, -42.58207019733266], [171.32289911400377, -42.582176614919526], [171.32279828552842, -42.58230121451057], [171.32268551675907, -42.582416633753574], [171.32258468746204, -42.58254123313745], [171.32247167646145, -42.582665654033164], [171.32237084632717, -42.582790253209176], [171.32225807587196, -42.582905671992805], [171.32215724491596, -42.58303027096162], [171.32204423216385, -42.5831546913952], [171.32194364184866, -42.583270288277504], [171.32183062822943, -42.58339470848038], [171.32171761415626, -42.5835191285613], [171.32161678111078, -42.58364372700555], [171.3215040076986, -42.58375914497917], [171.32140317383136, -42.583883743216205], [171.32129015800655, -42.58400816283495], [171.32117738332326, -42.58412358045799], [171.3210765482038, -42.58424817837828], [171.3209635310578, -42.58437259764437], [171.320862695101, -42.584497195356775], [171.32074991873168, -42.58461261252034], [171.320636658586, -42.584746033304015], [171.32051097453842, -42.58488827722817], [171.32039771337259, -42.58502169775183], [171.32028445171798, -42.585155118152066], [171.3201590077817, -42.58528835978444], [171.3200457451243, -42.58542177992539], [171.3199203001348, -42.58555502127218], [171.31980703647457, -42.58568844115381], [171.31969377232556, -42.58582186091202], [171.31956832576873, -42.58595510183732], [171.3194550606169, -42.58608852133622], [171.3193296130068, -42.58622176197591], [171.31921634685207, -42.58635518121546], [171.31909089818868, -42.58648842156954], [171.3189776310311, -42.58662184054977], [171.31885218131436, -42.58675508061822], [171.31873891315385, -42.58688849933912], [171.3186134623838, -42.58702173912195], [171.3185001932204, -42.58715515758349], [171.31837474139698, -42.5872883970807], [171.3182619553162, -42.58740381157261], [171.31814892675587, -42.587528227798394], [171.31803589774148, -42.5876526439022], [171.317922868273, -42.587777059884004], [171.31781008046227, -42.58789247389157], [171.31769705010288, -42.58801688963015], [171.31758401928937, -42.588141305246715], [171.31747098802174, -42.58826572074129], [171.31735819848103, -42.58838113426446], [171.3172451663225, -42.58850554951579], [171.3171321337098, -42.5886299646451], [171.31701910064302, -42.58875437965242], [171.31690606712206, -42.58887879453774], [171.316793033147, -42.58900320930107], [171.31667999871777, -42.58912762394239], [171.31656696383442, -42.58925203846172], [171.3164539284969, -42.58937645285906], [171.31634065036835, -42.589509868977316], [171.31622761410523, -42.5896342831299], [171.3161145773879, -42.58975869716048], [171.31598911516426, -42.589891933806506], [171.31586365240125, -42.590025170302795], [171.31575037181244, -42.59015858578024], [171.3156249079959, -42.59029182199082], [171.31549944363996, -42.59042505805165], [171.31537397874465, -42.59055829396272], [171.31526069612428, -42.59069170890877], [171.3151354726969, -42.59081594269883], [171.31501000622782, -42.59094917817521], [171.3148967221075, -42.59108259272657], [171.3147710120075, -42.59122482975021], [171.31464554392622, -42.59135806479028], [171.31452007530552, -42.5914912996806], [171.3144067891361, -42.59162471369982], [171.31428131946174, -42.591757948304384], [171.31415584924798, -42.59189118275917], [171.31404256156108, -42.59202459638295], [171.31391709029361, -42.592157830551955], [171.31379161848676, -42.59229106457121], [171.31366614614046, -42.592424298440676], [171.31355285642175, -42.59255771153298], [171.31342762580482, -42.59268194329221], [171.31330239468673, -42.592806174903245], [171.3131891034853, -42.59293958760152], [171.31306387136917, -42.59306381892907], [171.31293839589407, -42.59319705192978], [171.31282534606768, -42.593321462412646], [171.31269986955797, -42.59345469512833], [171.31258681878222, -42.59357910535394], [171.31246158416874, -42.59370333596627], [171.31234828951276, -42.59383674775296], [171.31222305390116, -42.59396097808175], [171.3121100012439, -42.59408538779355], [171.31199670513035, -42.594218799198664], [171.31188365154716, -42.5943432086656], [171.31175841398183, -42.59446743844189], [171.31164535946652, -42.594591847652254], [171.31153206142378, -42.594725258553005], [171.31141900598251, -42.59484966751853], [171.31130595008696, -42.594974076361964], [171.3111802238359, -42.595116309071585], [171.3110666806843, -42.59525872127592], [171.31094119646804, -42.59539195188791], [171.31082765225878, -42.595534363830396], [171.31070216696943, -42.595667594155756], [171.3105886217025, -42.595810005836384], [171.31046289210255, -42.59595223768062], [171.3103495890154, -42.59608564729385], [171.31022385830553, -42.596227878849874], [171.31011031090566, -42.59637029000605], [171.30999700629096, -42.59650369923467], [171.30987127392, -42.59664593036489], [171.30975796828434, -42.59677933933319], [171.309644418796, -42.59692174997816], [171.30953086878355, -42.597064160498086], [171.30940537760068, -42.59719738926623], [171.3092918265304, -42.59733979952427], [171.309178274936, -42.59748220965726], [171.30905278214627, -42.597615438001874], [171.30893922949403, -42.59775784787296], [171.30881373563105, -42.59789107593085], [171.30868799771778, -42.5980333056329], [171.30856225922642, -42.59817553518349], [171.30843676370617, -42.598308762790204], [171.3083110240778, -42.59845099203867], [171.3081852838713, -42.598593221135665], [171.30805978669372, -42.59872644829121], [171.3079340453502, -42.59886867708607], [171.30782048781663, -42.59901108573345], [171.30769498900685, -42.59914431245157], [171.30756924597506, -42.59928654080667], [171.30744374606675, -42.59941976722425], [171.30731824561877, -42.599552993491955], [171.3072049291469, -42.599686399681524], [171.30707918388723, -42.59982862744695], [171.30695368182614, -42.599961853278], [171.30684036381857, -42.60009525907108], [171.3067146168898, -42.60023748639752], [171.3065891132156, -42.60037071179191], [171.30647579367223, -42.600504117188464], [171.30635028894378, -42.600637342296864], [171.3062372122834, -42.600761745655426], [171.30612413516852, -42.600886148891846], [171.3060108136777, -42.60101955378299], [171.3058977356365, -42.601143956774415], [171.30578441318457, -42.60127736141911], [171.30567133421704, -42.60140176416551], [171.3055460699311, -42.60152598653669], [171.3054327460209, -42.60165939079953], [171.30531966564902, -42.60178379316634], [171.30520658482257, -42.60190819541103], [171.3051056885014, -42.60203277783648], [171.30499260678945, -42.602157179849286], [171.3048792805278, -42.602290583509536], [171.3047661978895, -42.60241498527732], [171.30466529985242, -42.60253956727445], [171.30455221632855, -42.602663968810354], [171.30443913235015, -42.60278837022413], [171.3043260479172, -42.60291277151573], [171.30422514817968, -42.60303735308517], [171.30409963347276, -42.60317057549703], [171.30397387399174, -42.60331279952269], [171.303848358186, -42.6034460216339], [171.30372284184043, -42.603579243595135], [171.30359732495506, -42.60371246540645], [171.30347156321864, -42.6038546888284], [171.3033460452344, -42.60398791033904], [171.30322052671033, -42.60412113169974], [171.30309476327753, -42.60426335466866], [171.3029692436546, -42.60439657572868], [171.3028437234918, -42.604529796638744], [171.3027179583625, -42.60467201915461], [171.30258025161663, -42.604805059184336], [171.3024547297899, -42.604938279629955], [171.30232896293717, -42.605080501678906], [171.3022034400115, -42.605213721823816], [171.30207791654598, -42.605346941818745], [171.30195239254058, -42.60548016166373], [171.30181443779358, -42.605622202444984], [171.30168891266405, -42.60575542197542], [171.30157581728508, -42.605879820298874], [171.3014505357408, -42.60600403779624], [171.30133768406697, -42.606119434115826], [171.30121240156203, -42.60624365133095], [171.30109930433485, -42.60636804914142], [171.3009740208501, -42.60649226607349], [171.30086116740077, -42.606607661883075], [171.3007358829554, -42.60673187853288], [171.30062278387987, -42.606856275830346], [171.30049749845466, -42.60698049219707], [171.3003724573131, -42.60709570667442], [171.30025935684387, -42.6072201035811], [171.30013406995633, -42.60734431951711], [171.30000878256718, -42.60746853530472], [171.2998956806869, -42.60759293181985], [171.29977039231787, -42.60771714732438], [171.29964510344723, -42.60784136268048], [171.29952005899025, -42.60795657615253], [171.29940695523797, -42.608080972142155], [171.2992816649049, -42.60820518706753], [171.29916831525057, -42.608338584533655], [171.29906739626813, -42.6084631611104], [171.29895404567748, -42.60859655834239], [171.29885288082284, -42.6087301364414], [171.29873977431376, -42.60885453170795], [171.29862642229727, -42.6089879285821], [171.29852550115942, -42.60911250463028], [171.29841214820658, -42.609245901270285], [171.29831098111288, -42.60937947883715], [171.29819787232518, -42.60950387351526], [171.29808451794645, -42.6096372697974], [171.29797116307813, -42.60977066595585], [171.29787023933793, -42.609895241364974], [171.29775688353325, -42.61002863728926], [171.297643527239, -42.610162033089836], [171.29753017045516, -42.6102954287667], [171.29741705842096, -42.61041982259792], [171.29730370067543, -42.610553218028095], [171.2971903424403, -42.61068661333455], [171.29707698371558, -42.61082000851731], [171.29696362450125, -42.61095340357632], [171.29683807812503, -42.61108661729986], [171.29671253120878, -42.61121983087338], [171.29658698375243, -42.61135304429686], [171.29647386788795, -42.61147743710761], [171.29634831939583, -42.611610650245595], [171.29622277036364, -42.61174386323352], [171.29610940761305, -42.61187725736465], [171.2959838575258, -42.612010470066274], [171.2958583068985, -42.612143682617855], [171.2957327557311, -42.61227689501939], [171.29561939094606, -42.61241028861802], [171.29549383872362, -42.61254350073323], [171.29536853151455, -42.6126677109896], [171.29525516522747, -42.612801104192734], [171.29512961142902, -42.61293431587236], [171.29500405709047, -42.61306752740192], [171.29487874784033, -42.61319173707574], [171.29476537953613, -42.61332512974708], [171.29463982362154, -42.61345834084103], [171.29452645431272, -42.61359173325237], [171.2944130845142, -42.613725125539965], [171.29429946850829, -42.61386751940568], [171.2941860977129, -42.614000911445], [171.2940727264278, -42.614134303360565], [171.29395910888277, -42.61427669685202], [171.2938457366008, -42.61441008851933], [171.2937323638291, -42.61454348006287], [171.29361899056764, -42.614676871482665], [171.2935053709763, -42.61481926447536], [171.29339199671796, -42.61495265564686], [171.29327862196985, -42.61508604669457], [171.29316524673203, -42.61521943761854], [171.29305187100445, -42.615352828418736], [171.29293874071473, -42.6154772174022], [171.29282536402513, -42.61561060795559], [171.2927119868458, -42.615743998385184], [171.29259860917668, -42.61587738869101], [171.29248523101782, -42.61601077887306], [171.2923718523692, -42.61614416893133], [171.2922465316097, -42.61626837545948], [171.2921336440765, -42.6163837618829], [171.2920205100544, -42.61650814987251], [171.29189543394287, -42.61662335429709], [171.2917825451097, -42.61673874034477], [171.29165722196828, -42.61686294617386], [171.2915443322554, -42.61697833196666], [171.29143119596358, -42.61710271932192], [171.29130611756008, -42.61721792305113], [171.29119322654714, -42.61733330846817], [171.29108008890162, -42.617457695445445], [171.29096719703074, -42.61757308061998], [171.29085405849264, -42.61769746735332], [171.29072897781882, -42.61781267040082], [171.29061583836457, -42.61793705687776], [171.29050269845538, -42.61806144323236], [171.29038980440913, -42.618176827787906], [171.29027666360733, -42.61830121389855], [171.29016376870308, -42.61841659821157], [171.29005062700864, -42.61854098407826], [171.2899374848592, -42.61866536982262], [171.28982409585007, -42.61879875711776], [171.2897107063511, -42.61893214428906], [171.28959731636223, -42.61906553133656], [171.28948417234062, -42.61918991658934], [171.28937078138955, -42.61932330338993], [171.28925738994855, -42.61945669006671], [171.28914424452714, -42.619581074950986], [171.2890308521239, -42.61971446138086], [171.28891745923073, -42.619847847686906], [171.28880406584767, -42.619981233869105], [171.28869067197473, -42.62011461992748], [171.2885772776119, -42.62024800586203], [171.28846388275915, -42.62038139167275], [171.2883382989598, -42.62051459521152], [171.2882249031019, -42.62064798076205], [171.28811150675412, -42.62078136618871], [171.2879981099164, -42.62091475149157], [171.28788471258875, -42.62104813667056], [171.2877715614921, -42.62117252006602], [171.28765816320208, -42.621305904998074], [171.28753282254775, -42.621430105911124], [171.28741967004495, -42.621554488926265], [171.28730651708705, -42.62167887181902], [171.28719336367405, -42.62180325458941], [171.28706802108178, -42.62192745494934], [171.28695486673504, -42.6220518374625], [171.28684171193322, -42.622176219853266], [171.28672855667628, -42.622300602121676], [171.28661540096422, -42.62242498426768], [171.2864900559553, -42.622549183939604], [171.28636471044427, -42.6226733834629], [171.28623936443117, -42.6227975828376], [171.28612595985499, -42.62293096610585], [171.28600061284197, -42.62305516519628], [171.28587526532687, -42.62317936413808], [171.28574991730966, -42.623303562931284], [171.285636757798, -42.62342794402262], [171.28551140879998, -42.623552142532326], [171.28538605929987, -42.623676340893404], [171.28528484035198, -42.623809905721934], [171.28518386808233, -42.6239344688072], [171.28508264827153, -42.62406803343619], [171.28498142802144, -42.62420159796504], [171.28488045449663, -42.62432616075265], [171.28476704418017, -42.624459542540365], [171.28466606980015, -42.62458410511858], [171.28456484779878, -42.624717669237064], [171.28446362535806, -42.62485123325537], [171.28436264972282, -42.624975795535924], [171.28426142641916, -42.62510935935465], [171.28414801332383, -42.62524274046316], [171.28404703640973, -42.62536730243484], [171.2839458117783, -42.62550086594262], [171.2838445867075, -42.62563442935025], [171.28373141908781, -42.62575880836805], [171.2836301931286, -42.625892371564845], [171.28352896673, -42.6260259346615], [171.28342773989198, -42.626159497657994], [171.28331457046997, -42.626283876221294], [171.28320115316814, -42.62641725629207], [171.28308773537623, -42.62655063623894], [171.28297456455374, -42.62667501443348], [171.2828611457991, -42.62680839413329], [171.28273578437583, -42.626932589316056], [171.2826223646331, -42.627065968756256], [171.28250894440032, -42.627199348072544], [171.2823957712259, -42.62732372564023], [171.2822701602581, -42.62745692189193], [171.28215673854706, -42.62759030082467], [171.28204356394858, -42.627714678011095], [171.28191795142848, -42.62784787384042], [171.2818045282392, -42.62798125238962], [171.2816911045598, -42.6281146308149], [171.2815657381442, -42.628238824601745], [171.28145231347665, -42.62837220276737], [171.28133888831894, -42.62850558080908], [171.28121327267493, -42.62863877579283], [171.28110009425927, -42.62876315195787], [171.28097447757838, -42.628896346655665], [171.28084886035683, -42.62902954120319], [171.28071105249953, -42.62916255261116], [171.2805854341714, -42.6292957468443], [171.28044762515728, -42.629428757908904], [171.2803220057226, -42.62956195182761], [171.28018419555164, -42.629694962548875], [171.2800585750104, -42.62982815615315], [171.27992076368255, -42.62996116653106], [171.27979514203471, -42.6300943598209], [171.27965732955002, -42.630227369855426], [171.27951951647438, -42.63036037971067], [171.27939364514546, -42.630502574127455], [171.27925583089188, -42.63063558363845], [171.2791180160473, -42.63076859297021], [171.27897995254006, -42.63091060372556], [171.27885432694268, -42.63104379589251], [171.27871651032913, -42.63117680470073], [171.27857844499152, -42.63131881493002], [171.278440627175, -42.631451823378825], [171.27831499931978, -42.63158501490219], [171.27818937092377, -42.63171820627524], [171.27806399019892, -42.63184239590087], [171.27793836074065, -42.63197558697406], [171.27782516964163, -42.63209995960917], [171.27769953914625, -42.63223315039633], [171.27757415639704, -42.632357339439196], [171.277460715563, -42.63249071327432], [171.27733508348967, -42.63262390362508], [171.27720969921847, -42.632748092233925], [171.2770840660828, -42.632881282284806], [171.27697087160863, -42.63300565399709], [171.27685767667901, -42.633130025586865], [171.27673229042588, -42.63325421362743], [171.27661884612843, -42.633387586547514], [171.27649345887474, -42.63351177430353], [171.27638026205892, -42.63363614537759], [171.2762546253346, -42.63376933443535], [171.27614142756696, -42.63389370525114], [171.2760160383313, -42.634017892438884], [171.27590259108592, -42.63415126458037], [171.27577720084966, -42.63427545148355], [171.2756640011957, -42.63439982178357], [171.2755383613789, -42.634533009983855], [171.27542516077307, -42.63465738002562], [171.27529951991897, -42.634790567939824], [171.27518631836125, -42.6349149377233], [171.2750609251423, -42.635039123773566], [171.27494747396022, -42.63517249487659], [171.2748342709951, -42.63529686427928], [171.27470862756996, -42.63543005148549], [171.2745954236529, -42.635554420629894], [171.2744700279536, -42.63567860597596], [171.274356823102, -42.63580297486281], [171.27423142642115, -42.63592715992507], [171.274118220635, -42.63605152855436], [171.2739928229726, -42.63617571333281], [171.27387961625186, -42.63630008170452], [171.27375421760786, -42.63642426619915], [171.27364100995254, -42.6365486343133], [171.2735153614176, -42.636681820092], [171.27341434435027, -42.636806371741145], [171.27330113531096, -42.636930739486885], [171.27320011740335, -42.63705529092705], [171.27308690747648, -42.63717965844015], [171.27297369709407, -42.63730402583071], [171.2728726779141, -42.6374285769518], [171.27275946664417, -42.63755294410971], [171.27265844662386, -42.637677495021826], [171.27254523446635, -42.63780186194707], [171.27244421360572, -42.63792641265018], [171.2723307514685, -42.63805978090288], [171.27222972975184, -42.63818433139632], [171.27211651580174, -42.63830869785553], [171.27201524410376, -42.63844224969796], [171.27190202924868, -42.63856661592374], [171.27180100583556, -42.63869116599849], [171.27168754090135, -42.638824533547464], [171.2715865166322, -42.63894908341252], [171.2714730507598, -42.639082450726654], [171.27137202563455, -42.639207000382015], [171.2712463668031, -42.63934018342981], [171.2711331487537, -42.639464548820314], [171.27100748888466, -42.639597731581894], [171.27089402056936, -42.63973109826464], [171.27078080109476, -42.639855463273456], [171.27065513967224, -42.639988645612156], [171.2705416698775, -42.640122011910925], [171.27041625678532, -42.640246192415034], [171.27030278600168, -42.64037955845386], [171.2701773719085, -42.64050373867327], [171.27006390013594, -42.64063710445212], [171.26995017841386, -42.64077947165141], [171.26983670564266, -42.640912837181375], [171.26971104003684, -42.64104601838647], [171.26959756625914, -42.64117938365572], [171.26948409199088, -42.64131274880086], [171.26937061723197, -42.64144611382194], [171.2692571419825, -42.641579478718896], [171.269131473772, -42.64171265922702], [171.26901799751602, -42.641846023863266], [171.2688923282485, -42.64197920408427], [171.26876690808103, -42.64210338261803], [171.26864148741092, -42.64222756100292], [171.2685158165586, -42.64236074077411], [171.26839039486393, -42.64248491886047], [171.2682647229486, -42.642618098331525], [171.2681393002294, -42.64274227611929], [171.26801362725107, -42.64287545529018], [171.26790039622097, -42.64299981718096], [171.2677749719979, -42.643123994535074], [171.26764929745988, -42.64325717326995], [171.2675236223807, -42.643390351854364], [171.2673981966112, -42.64351452876022], [171.2672847133052, -42.643647891513744], [171.267159036647, -42.64378106966133], [171.2670336093544, -42.64390524613267], [171.2669201245433, -42.64403860848952], [171.26679444630602, -42.6441717862002], [171.2666690174903, -42.644295962237074], [171.2665433381899, -42.64442913964756], [171.26642985135766, -42.644562501471036], [171.26630417100003, -42.644695678594346], [171.2661784901012, -42.644828855567155], [171.2660528086612, -42.64496203238945], [171.2659271266799, -42.645095209061225], [171.26580144415743, -42.64522838558249], [171.26567576109372, -42.64536156195324], [171.26555007748877, -42.64549473817346], [171.2654243933426, -42.64562791424316], [171.26529870865517, -42.64576109016233], [171.26517302342648, -42.645894265930984], [171.26504733765657, -42.64602744154909], [171.2649214011144, -42.64616961852876], [171.26479571424267, -42.646302793844995], [171.26467002682963, -42.64643596901072], [171.2645443388754, -42.64656914402589], [171.2644184000716, -42.64671132039934], [171.26430490445682, -42.64684467991018], [171.26417921488462, -42.64697785448675], [171.26405327440668, -42.64712003041924], [171.26391564059944, -42.64724401834924], [171.26378994937818, -42.64737719246035], [171.2636642576156, -42.64751036642092], [171.26353856531173, -42.647643540230916], [171.2634006788489, -42.64777652899465], [171.26327523592082, -42.64790070098824], [171.26314954198708, -42.64803387433354], [171.26301165382068, -42.648166862589825], [171.2628859587791, -42.648300035620174], [171.2627605137586, -42.64842420700177], [171.2626348176536, -42.64855737973179], [171.26252156539678, -42.6486817358084], [171.2623958682536, -42.648814908251964], [171.26228261504403, -42.64893926406995], [171.26215691686264, -42.64907243622702], [171.26204366270028, -42.6491967917864], [171.26191796348067, -42.64932996365697]]] + }, + "properties": {} + } + ] + } + } +} diff --git a/indexer-core/src/test/resources/converter/index-virtual-properties/survey_storage_schema.json b/indexer-core/src/test/resources/converter/index-virtual-properties/survey_storage_schema.json new file mode 100644 index 0000000000000000000000000000000000000000..3423df7aeea5f49c0a97ace58b8d0422b57c26d7 --- /dev/null +++ b/indexer-core/src/test/resources/converter/index-virtual-properties/survey_storage_schema.json @@ -0,0 +1,167 @@ +{ + "kind": "osdu:wks:master-data--SeismicAcquisitionSurvey:1.0.0", + "type": "master-data--SeismicAcquisitionSurvey", + "dataSchema": { + "ProjectBeginDate": "date", + "SpatialLocation.AppliedOperations": "text_array", + "VirtualProperties.DefaultLocation.QuantitativeAccuracyBandID": "text", + "ResourceCurationStatus": "text", + "FundsAuthorizations": { + "type": "nested", + "properties": { + "AuthorizationID": "text", + "FundsAmount": "double", + "EffectiveDateTime": "date", + "CurrencyID": "text" + } + }, + "ProjectSpecifications": "flattened", + "VirtualProperties.DefaultLocation.AppliedOperations": "text_array", + "VirtualProperties.DefaultName": "text", + "CableSpacingDistance": "double", + "AreaCalculated": "double", + "VirtualProperties.DefaultLocation.CoordinateQualityCheckPerformedBy": "text", + "ResourceSecurityClassification": "text", + "SpatialLocation.SpatialParameterTypeID": "text", + "ExistenceKind": "text", + "ProjectNames": "object", + "SpatialLocation.CoordinateQualityCheckRemarks": "text_array", + "ContractIDs": "text_array", + "MinOffsetDistance": "double", + "VirtualProperties.DefaultLocation.IsDecimated": "boolean", + "Contractors": { + "type": "nested", + "properties": { + "ContractorCrew": "text", + "ContractorOrganisationID": "text", + "ContractorTypeID": "text" + } + }, + "TechnicalAssuranceTypeID": "text", + "SpatialLocation.CoordinateQualityCheckDateTime": "date", + "SpatialLocation.SpatialGeometryTypeID": "text", + "OperatingEnvironmentID": "text", + "SeismicGeometryTypeID": "text", + "ResourceHostRegionIDs": "text_array", + "AreaNominal": "double", + "VirtualProperties.DefaultLocation.QualitativeSpatialAccuracyTypeID": "text", + "SampleInterval": "double", + "EnergySourceTypeID": "text", + "Operator": "text", + "SourceArrayCount": "integer", + "ProjectName": "text", + "ShotpointIncrementDistance": "double", + "ResourceLifecycleStatus": "text", + "ProjectID": "text", + "CableCount": "integer", + "SpatialLocation.Wgs84Coordinates": "geo_shape", + "CableLength": "double", + "TechnicalAssuranceID": "text", + "Personnel": "flattened", + "VirtualProperties.DefaultLocation.SpatialLocationCoordinatesDate": "date", + "VirtualProperties.DefaultLocation.SpatialGeometryTypeID": "text", + "Source": "text", + "ProjectEndDate": "date", + "SourceArraySeparationDistance": "double", + "VersionCreationReason": "text", + "SpatialLocation.CoordinateQualityCheckPerformedBy": "text", + "VesselNames": "text_array", + "VirtualProperties.DefaultLocation.CoordinateQualityCheckRemarks": "text_array", + "ShootingAzimuthAngle": "double", + "NameAliases": { + "type": "nested", + "properties": { + "AliasName": "text", + "TerminationDateTime": "date", + "AliasNameTypeID": "text", + "EffectiveDateTime": "date", + "DefinitionOrganisationID": "text" + } + }, + "ProjectStates": "flattened", + "MaxOffsetDistance": "double", + "SpatialLocation.SpatialLocationCoordinatesDate": "date", + "GeoContexts": { + "type": "nested", + "properties": { + "BasinID": "text", + "FieldID": "text", + "PlayID": "text", + "GeoPoliticalEntityID": "text", + "GeoTypeID": "text", + "ProspectID": "text" + } + }, + "Purpose": "text", + "RecordLength": "double", + "FoldCount": "integer", + "VirtualProperties.DefaultLocation.CoordinateQualityCheckDateTime": "date", + "SpatialLocation.QualitativeSpatialAccuracyTypeID": "text", + "VirtualProperties.DefaultLocation.SpatialParameterTypeID": "text", + "ResourceHomeRegionID": "text", + "VirtualProperties.DefaultLocation.Wgs84Coordinates": "geo_shape", + "SpatialLocation.QuantitativeAccuracyBandID": "text" + }, + "metaSchema": { + "ancestry": { + "properties": { + "parents": { + "type": "keyword" + } + } + }, + "x-acl": "keyword", + "kind": "keyword", + "index": { + "properties": { + "trace": { + "type": "text" + }, + "statusCode": { + "type": "integer" + }, + "lastUpdateTime": { + "type": "date" + } + } + }, + "acl": { + "properties": { + "viewers": { + "type": "keyword" + }, + "owners": { + "type": "keyword" + } + } + }, + "source": { + "type": "constant_keyword" + }, + "type": "keyword", + "version": "long", + "tags": "flattened", + "modifyUser": "keyword", + "modifyTime": "date", + "createTime": "date", + "authority": { + "type": "constant_keyword" + }, + "namespace": "keyword", + "legal": { + "properties": { + "legaltags": { + "type": "keyword" + }, + "otherRelevantDataCountries": { + "type": "keyword" + }, + "status": { + "type": "keyword" + } + } + }, + "createUser": "keyword", + "id": "keyword" + } +} diff --git a/indexer-core/src/test/resources/converter/index-virtual-properties/virtual-properties.json b/indexer-core/src/test/resources/converter/index-virtual-properties/virtual-properties.json new file mode 100644 index 0000000000000000000000000000000000000000..9c884f69e7b786bea0aef15dd921bb4119b08c6a --- /dev/null +++ b/indexer-core/src/test/resources/converter/index-virtual-properties/virtual-properties.json @@ -0,0 +1,18 @@ +{ + "items": { + "data.VirtualProperties.DefaultLocation": { + "type": "object", + "priorities": [{ + "path": "data.SpatialLocation" + } + ] + }, + "data.VirtualProperties.DefaultName": { + "type": "string", + "priorities": [{ + "path": "data.ProjectName" + } + ] + } + } +} diff --git a/indexer-core/src/test/resources/geojson/parsing/input/valid_point_with_property.json b/indexer-core/src/test/resources/geojson/parsing/input/valid_point_with_property.json new file mode 100644 index 0000000000000000000000000000000000000000..f2b6e304a388b4e7e16caa2561601b6b365963ec --- /dev/null +++ b/indexer-core/src/test/resources/geojson/parsing/input/valid_point_with_property.json @@ -0,0 +1,19 @@ +{ + "features": [ + { + "geometry": { + "type": "Point", + "coordinates": [ + -105.01621, + 39.57422 + ] + }, + "properties": { + "id": "opendes:work-product-component--GenericRepresentation:0be3c0de-7844-4bcb-a17d-83de84cd2eca", + "uri": "wdms:opendes:1188d27c-9132-41ec-b281-502a6245d00c:f597df66-4197-4347-99c2-acb58ce27ef3:0be3c0de-7844-4bcb-a17d-83de84cd2eca" + }, + "type": "Feature" + } + ], + "type": "FeatureCollection" +} diff --git a/pom.xml b/pom.xml index 42b096b3a8a73735ae42c63baeb32638a0456fdc..95c8810bfe2cbe383adc2818fd063af924cc6b0f 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ <groupId>org.opengroup.osdu.indexer</groupId> <artifactId>indexer-service</artifactId> <packaging>pom</packaging> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <description>Indexer Service</description> <properties> @@ -13,17 +13,17 @@ <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.source>1.8</maven.compiler.source> <spring-cloud.version>Greenwich.SR2</spring-cloud.version> - <os-core-common.version>0.19.0-SNAPSHOT</os-core-common.version> - <snakeyaml.version>1.33</snakeyaml.version> + <os-core-common.version>0.19.0</os-core-common.version> + <snakeyaml.version>2.0</snakeyaml.version> <hibernate-validator.version>6.1.5.Final</hibernate-validator.version> - <jackson-databind.version>2.13.4.2</jackson-databind.version> - <jackson.version>2.13.4</jackson.version> - <tomcat-embed-core.version>9.0.68</tomcat-embed-core.version> + <jackson-databind.version>2.14.1</jackson-databind.version> + <jackson.version>2.14.1</jackson.version> + <tomcat-embed-core.version>9.0.70</tomcat-embed-core.version> <common-codec.version>1.14</common-codec.version> <elasticsearch.version>7.8.1</elasticsearch.version> <netty.version>4.1.51.Final</netty.version> <reactor-netty.version>0.8.20.RELEASE</reactor-netty.version> - <woodstox-core.version>6.2.3</woodstox-core.version> + <woodstox-core.version>6.4.0</woodstox-core.version> <log4j2.version>2.17.1</log4j2.version> <spring-boot-maven-plugin.version>2.7.6</spring-boot-maven-plugin.version> <!-- <spring-boot.version>2.1.18.RELEASE</spring-boot.version>--> @@ -33,7 +33,7 @@ <!-- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>--> <!-- <failOnMissingWebXml>false</failOnMissingWebXml>--> <!-- <spring-cloud.version>Greenwich.SR2</spring-cloud.version>--> - <openapi.version>1.6.9</openapi.version> + <openapi.version>1.6.14</openapi.version> </properties> <licenses> diff --git a/provider/indexer-aws/build-aws/Dockerfile b/provider/indexer-aws/build-aws/Dockerfile index 615dde332e1de01c951a32c0b17677bfe72ea7d2..2885b3f2ed9c1ac30a89b0c99d351c57b5fdedbf 100644 --- a/provider/indexer-aws/build-aws/Dockerfile +++ b/provider/indexer-aws/build-aws/Dockerfile @@ -17,12 +17,9 @@ FROM amazoncorretto:8 ARG JAR_FILE=provider/indexer-aws/target/*spring-boot.jar -#Default to using self signed generated TLS cert -ENV USE_SELF_SIGNED_SSL_CERT true WORKDIR / COPY ${JAR_FILE} app.jar -COPY /provider/indexer-aws/build-aws/ssl.sh /ssl.sh COPY /provider/indexer-aws/build-aws/entrypoint.sh /entrypoint.sh EXPOSE 8080 diff --git a/provider/indexer-aws/build-aws/entrypoint.sh b/provider/indexer-aws/build-aws/entrypoint.sh index 9bd3ec69d01fba69f4bece2162e7faba5cc0f0cb..412f71afd92e9c2ed3e50a2863cb5675c8a69b43 100755 --- a/provider/indexer-aws/build-aws/entrypoint.sh +++ b/provider/indexer-aws/build-aws/entrypoint.sh @@ -1,15 +1,4 @@ -if [ -n $USE_SELF_SIGNED_SSL_CERT ]; -then - export SSL_KEY_PASSWORD=$RANDOM$RANDOM$RANDOM; - export SSL_KEY_STORE_PASSWORD=$SSL_KEY_PASSWORD; - export SSL_KEY_STORE_DIR=/tmp/certs; - export SSL_KEY_STORE_NAME=osduonaws.p12; - export SSL_KEY_STORE_PATH=$SSL_KEY_STORE_DIR/$SSL_KEY_STORE_NAME; - export SSL_KEY_ALIAS=osduonaws; - - ./ssl.sh; -fi java $JAVA_OPTS -jar /app.jar \ No newline at end of file diff --git a/provider/indexer-aws/build-aws/ssl.sh b/provider/indexer-aws/build-aws/ssl.sh deleted file mode 100755 index 9ede565684bdd46cb09e56fce721ced55206ca07..0000000000000000000000000000000000000000 --- a/provider/indexer-aws/build-aws/ssl.sh +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright © 2021 Amazon Web Services -# -# 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. - -#!/usr/bin/env bash - -#Future: Support for using Amazon Cert Manager -# if [ "$1" == "webserver" ] && [ -n $ACM_CERTIFICATE_ARN ]; -# then - -# aws acm export-certificate --certificate-arn $ACM_CERTIFICATE_ARN --passphrase $(echo -n 'aws123' | openssl base64 -e) | jq -r '"\(.PrivateKey)"' > ${SSL_KEY_PATH}.enc -# openssl rsa -in ${SSL_KEY_PATH}.enc -out $SSL_KEY_PATH -passin pass:aws123 -# aws acm get-certificate --certificate-arn $ACM_CERTIFICATE_ARN | jq -r '"\(.CertificateChain)"' > $SSL_CERT_PATH -# aws acm get-certificate --certificate-arn $ACM_CERTIFICATE_ARN | jq -r '"\(.Certificate)"' >> $SSL_CERT_PATH - -# fi - -if [ -n $USE_SELF_SIGNED_SSL_CERT ]; -then - mkdir -p $SSL_KEY_STORE_DIR - pushd $SSL_KEY_STORE_DIR - keytool -genkeypair -alias $SSL_KEY_ALIAS -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore $SSL_KEY_STORE_NAME -validity 3650 -keypass $SSL_KEY_PASSWORD -storepass $SSL_KEY_PASSWORD -dname "CN=localhost, OU=AWS, O=Energy, L=Houston, ST=TX, C=US" - popd -fi diff --git a/provider/indexer-aws/pom.xml b/provider/indexer-aws/pom.xml index 8e684095d54b76281ee4113058ce3f5df5ad694e..a1487720ee43997c12f46d62575342ce74d75006 100644 --- a/provider/indexer-aws/pom.xml +++ b/provider/indexer-aws/pom.xml @@ -18,7 +18,7 @@ <parent> <groupId>org.opengroup.osdu.indexer</groupId> <artifactId>indexer-service</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <relativePath>../../pom.xml</relativePath> </parent> @@ -26,7 +26,7 @@ <artifactId>indexer-aws</artifactId> <description>Indexer service on AWS</description> <packaging>jar</packaging> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <properties> <aws.version>1.11.1018</aws.version> @@ -66,12 +66,12 @@ <dependency> <groupId>org.opengroup.osdu.indexer</groupId> <artifactId>indexer-core</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.opengroup.osdu.core.aws</groupId> <artifactId>os-core-lib-aws</artifactId> - <version>0.18.0</version> + <version>0.21.0-rc1</version> </dependency> <!-- AWS managed packages --> diff --git a/provider/indexer-aws/src/main/java/org/opengroup/osdu/indexer/aws/IndexerAwsApplication.java b/provider/indexer-aws/src/main/java/org/opengroup/osdu/indexer/aws/IndexerAwsApplication.java index 04de6340810e6d84e8c551a70d9b7e353b08b265..fb73bef6d03fb9c606b555d9187d9b1373e4399c 100644 --- a/provider/indexer-aws/src/main/java/org/opengroup/osdu/indexer/aws/IndexerAwsApplication.java +++ b/provider/indexer-aws/src/main/java/org/opengroup/osdu/indexer/aws/IndexerAwsApplication.java @@ -21,6 +21,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.FilterType; +import org.springframework.context.annotation.PropertySource; @SpringBootApplication(exclude = { SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class }) @ComponentScan( @@ -30,6 +31,7 @@ import org.springframework.context.annotation.FilterType; type=FilterType.ASSIGNABLE_TYPE, value=IndexerQueueTaskBuilder.class) }) +@PropertySource("classpath:swagger.properties") public class IndexerAwsApplication { public static void main(String[] args) { diff --git a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/IndexCopyService.java b/provider/indexer-aws/src/main/java/org/opengroup/osdu/indexer/aws/util/AccessToken.java similarity index 63% rename from indexer-core/src/main/java/org/opengroup/osdu/indexer/service/IndexCopyService.java rename to provider/indexer-aws/src/main/java/org/opengroup/osdu/indexer/aws/util/AccessToken.java index 88e20720f510b3f7d0f31c31707b2501ddd1ba5c..08c5b2f898850668dc95b41e3aed500faade8168 100644 --- a/indexer-core/src/main/java/org/opengroup/osdu/indexer/service/IndexCopyService.java +++ b/provider/indexer-aws/src/main/java/org/opengroup/osdu/indexer/aws/util/AccessToken.java @@ -1,4 +1,4 @@ -// Copyright 2017-2019, Schlumberger +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,16 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -package org.opengroup.osdu.indexer.service; +package org.opengroup.osdu.indexer.aws.util; +import lombok.Data; -import org.opengroup.osdu.core.common.model.http.AppException; +@Data +public class AccessToken { + public String access_token; + public String expires_in; + public String token_type; -import java.io.IOException; - -public interface IndexCopyService { - - String fetchTaskStatus(String taskId) throws AppException; - - String copyIndex(String kind) throws IOException; } diff --git a/provider/indexer-aws/src/main/java/org/opengroup/osdu/indexer/aws/util/AwsServiceAccountAuthToken.java b/provider/indexer-aws/src/main/java/org/opengroup/osdu/indexer/aws/util/AwsServiceAccountAuthToken.java new file mode 100644 index 0000000000000000000000000000000000000000..b875de3cad198022045d6071293980c30464fbb0 --- /dev/null +++ b/provider/indexer-aws/src/main/java/org/opengroup/osdu/indexer/aws/util/AwsServiceAccountAuthToken.java @@ -0,0 +1,145 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// +// 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. + +package org.opengroup.osdu.indexer.aws.util; + +import com.amazonaws.auth.AWSCredentialsProvider; +import com.amazonaws.services.simplesystemsmanagement.AWSSimpleSystemsManagement; +import com.amazonaws.services.simplesystemsmanagement.AWSSimpleSystemsManagementClientBuilder; +import com.amazonaws.services.simplesystemsmanagement.model.GetParameterRequest; +import com.amazonaws.services.simplesystemsmanagement.model.GetParameterResult; +import org.opengroup.osdu.core.aws.iam.IAMConfig; +import org.opengroup.osdu.core.aws.secrets.SecretsManager; + +import org.opengroup.osdu.core.common.model.http.AppException; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.opengroup.osdu.core.common.http.HttpClient; +import org.opengroup.osdu.core.common.http.HttpRequest; +import org.opengroup.osdu.core.common.http.HttpResponse; +import org.opengroup.osdu.core.common.http.IHttpClient; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; + +import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; +import javax.annotation.PostConstruct; + +@Component +public class AwsServiceAccountAuthToken { + + @Value("${ENVIRONMENT}") + private String awsEnvironment; + + @Value("${AWS_REGION}") + private String awsRegion; + + private final static String ENVIRONMENT = "ENVIRONMENT"; + private final static String REGION = "AWS_REGION"; + + private String client_credentials_secret; + private String client_credentials_clientid; + private String tokenUrl; + private String oauthCustomScope; + private String token= null; + private long expirationTimeMillis; + private AWSSimpleSystemsManagement ssmManager; + + @PostConstruct + private void init() { + SecretsManager sm = new SecretsManager(); + String environment = awsEnvironment; + if (environment == null) { + environment = System.getProperty(ENVIRONMENT, System.getenv(ENVIRONMENT)); + } + String amazonRegion = awsRegion; + if (amazonRegion == null) { + amazonRegion = System.getProperty(REGION, System.getenv(REGION)); + } + + String oauth_token_url = "/osdu/" + environment + "/oauth-token-uri"; + String oauth_custom_scope = "/osdu/" + environment + "/oauth-custom-scope"; + + String client_credentials_client_id = "/osdu/" + environment + "/client-credentials-client-id"; + String client_secret_key = "client_credentials_client_secret"; + String client_secret_secretName = "/osdu/" + environment + "/client_credentials_secret"; + AWSCredentialsProvider amazonAWSCredentials = IAMConfig.amazonAWSCredentials(); + this.ssmManager= AWSSimpleSystemsManagementClientBuilder.standard() + .withCredentials(amazonAWSCredentials) + .withRegion(amazonRegion) + .build(); + + this.client_credentials_clientid = getSsmParameter(client_credentials_client_id); + this.client_credentials_secret = sm.getSecret(client_secret_secretName, amazonRegion, client_secret_key); + this.tokenUrl = getSsmParameter(oauth_token_url); + this.oauthCustomScope = getSsmParameter(oauth_custom_scope); + } + + public String getAuthToken() throws AppException { + if (expiredToken()){ + Map<String,String> headers = new HashMap<>(); + String authorizationHeaderContents=getEncodedAuthorization(this.client_credentials_clientid,this.client_credentials_secret); + headers.put("Authorization","Basic "+authorizationHeaderContents); + headers.put("Content-Type", "application/x-www-form-urlencoded"); + + IHttpClient httpClient = new HttpClient(); + HttpRequest rq = HttpRequest.post().url(this.tokenUrl).headers(headers).body( + String.format("%s=%s&%s=%s", "grant_type", "client_credentials", "scope", this.oauthCustomScope)).build(); + HttpResponse result = httpClient.send(rq); + try { + AccessToken accessToken = this.getResult(result, AccessToken.class); + this.token = accessToken.getAccess_token(); + int duration = Integer.parseInt(accessToken.getExpires_in()); + this.expirationTimeMillis = System.currentTimeMillis()+duration*1000; + }catch(Exception e) { + System.out.println("Could not parse AccessToken result"); + } + } + return this.token; + } + + private boolean expiredToken() { + if(this.token == null) + return true; + // get a new token if token has 2 minutes to expire + long diff = this.expirationTimeMillis - System.currentTimeMillis(); + long diffMinutes = (diff / 1000) / 60; + return diffMinutes <= 2; + } + + private String getEncodedAuthorization(String clientID, String clientSecret) + { + return Base64.getEncoder().encodeToString((clientID+":"+ clientSecret).getBytes()); + } + + private <T> T getResult(HttpResponse result, Class<T> type) throws Exception { + Gson gson = new Gson(); + if (result.isSuccessCode()) { + try { + return gson.fromJson(result.getBody(), type); + } catch (JsonSyntaxException e) { + throw new IllegalArgumentException("array parsing error in getResult of HttpResonse, not a valid array"); + } + } else { + throw new Exception("Invalid Response"); + } + } + + private String getSsmParameter(String parameterKey) { + GetParameterRequest paramRequest = (new GetParameterRequest()).withName(parameterKey).withWithDecryption(true); + GetParameterResult paramResult = ssmManager.getParameter(paramRequest); + return paramResult.getParameter().getValue(); + } +} diff --git a/provider/indexer-aws/src/main/java/org/opengroup/osdu/indexer/aws/util/RequestInfoImpl.java b/provider/indexer-aws/src/main/java/org/opengroup/osdu/indexer/aws/util/RequestInfoImpl.java index 8471336a90549dd5c0d74af9b0603f39507bf0bb..d352c5a7c03dd8864a5d6a18bfa5e782a6b4856e 100644 --- a/provider/indexer-aws/src/main/java/org/opengroup/osdu/indexer/aws/util/RequestInfoImpl.java +++ b/provider/indexer-aws/src/main/java/org/opengroup/osdu/indexer/aws/util/RequestInfoImpl.java @@ -22,11 +22,11 @@ import org.opengroup.osdu.core.common.provider.interfaces.IRequestInfo; import org.opengroup.osdu.core.common.search.Preconditions; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; - +import org.springframework.web.context.annotation.RequestScope; import javax.inject.Inject; import java.util.HashSet; import java.util.Map; - +import static org.opengroup.osdu.core.common.model.http.DpsHeaders.AUTHORIZATION; @Primary @Log @@ -36,6 +36,8 @@ public class RequestInfoImpl implements IRequestInfo { @Inject private DpsHeaders headersMap; + @Inject + private AwsServiceAccountAuthToken awsServiceAccountAuthToken; private static final HashSet<String> FORBIDDEN_FROM_LOGGING = new HashSet<>(); static { @@ -83,7 +85,9 @@ public class RequestInfoImpl implements IRequestInfo { @Override public DpsHeaders getHeadersWithDwdAuthZ() { - return getHeaders(); + DpsHeaders ret = getHeaders(); + ret.put(AUTHORIZATION, this.checkOrGetAuthorizationHeader()); + return ret; } @@ -104,4 +108,9 @@ public class RequestInfoImpl implements IRequestInfo { public boolean isTaskQueueRequest() { return false; } + + private String checkOrGetAuthorizationHeader() { + return "Bearer " + this.awsServiceAccountAuthToken.getAuthToken(); + } + } diff --git a/provider/indexer-azure/README.md b/provider/indexer-azure/README.md index 9b8842fbbbac2f3fc449c23ef8967c28e3ad5569..cb13417cb40902bdfa6cea76f058604ad25bae21 100644 --- a/provider/indexer-azure/README.md +++ b/provider/indexer-azure/README.md @@ -118,7 +118,7 @@ $ mvn spring-boot:run ### Test the application -After the service has started it should be accessible via a web browser by visiting [http://localhost:8080/swagger-ui/index.html](http://localhost:8080/swagger-ui/index.html). If the request does not fail, you can then run the integration tests. +After the service has started it should be accessible via a web browser by visiting [http://localhost:8080/api/indexer/v2/swagger](http://localhost:8080/api/indexer/v2/swagger). If the request does not fail, you can then run the integration tests. > **Note**: the integration tests for `os-indexer-azure` work by validating that records submitted to `os-storage-azure` can eventually be queried by `os-search-azure`. This only works if the messages emitted by `os-storage-azure` can be consumed by `os-indexer-queue-azure`, which will submit the indexing request to `os-indexer-azure`. > @@ -140,6 +140,13 @@ $ (cd testing/indexer-test-core/ && mvn clean install) $ (cd testing/indexer-test-azure/ && mvn clean test) ``` +## Open API 3.0 - Swagger +- Swagger UI: http://localhost:8080/api/indexer/v2/swagger (will redirect to http://localhost:8080/api/indexer/v2/swagger-ui/index.html) +- api-docs (JSON) : http://localhost:8080/api/indexer/v2/api-docs +- api-docs (YAML) : http://localhost:8080/api/indexer/v2/api-docs.yaml + +All the Swagger and OpenAPI related common properties are managed here [swagger.properties](../../indexer-core/src/main/resources/swagger.properties) + ## Debugging Jet Brains - the authors of Intellij IDEA, have written an [excellent guide](https://www.jetbrains.com/help/idea/debugging-your-first-java-application.html) on how to debug java programs. diff --git a/provider/indexer-azure/pom.xml b/provider/indexer-azure/pom.xml index cb769aeaf75e06a34316ffd3cea9a60fc1fcdff2..3ae26a7809760cdb5a0478f946872f920fabbe23 100644 --- a/provider/indexer-azure/pom.xml +++ b/provider/indexer-azure/pom.xml @@ -21,12 +21,12 @@ <parent> <groupId>org.opengroup.osdu.indexer</groupId> <artifactId>indexer-service</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <relativePath>../../pom.xml</relativePath> </parent> <artifactId>indexer-azure</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <name>indexer-azure</name> <description>Indexer Service Azure</description> <packaging>jar</packaging> @@ -38,22 +38,20 @@ <azure.appservice.appname /> <azure.appservice.subscription /> <log4j.version>2.17.1</log4j.version> - <nimbus-jose-jwt.version>8.2</nimbus-jose-jwt.version> - <indexer-core.version>0.20.0-SNAPSHOT</indexer-core.version> + <nimbus-jose-jwt.version>8.20.2</nimbus-jose-jwt.version> + <indexer-core.version>0.21.0-SNAPSHOT</indexer-core.version> <spring-security-jwt.version>1.1.1.RELEASE</spring-security-jwt.version> - <osdu.corelibazure.version>0.18.0-rc3</osdu.corelibazure.version> + <osdu.corelibazure.version>0.20.0-rc5</osdu.corelibazure.version> + <os-core-common.version>0.19.0-rc6</os-core-common.version> <reactor-netty.version>0.9.12.RELEASE</reactor-netty.version> <java-jwt.version>3.8.1</java-jwt.version> <powermock.version>2.0.2</powermock.version> <mockito.version>3.11.2</mockito.version> <cobertura-maven-plugin.version>2.7</cobertura-maven-plugin.version> <spring-security-oauth2.version>2.3.6.RELEASE</spring-security-oauth2.version> - <spring-boot.version>2.1.18.RELEASE</spring-boot.version> <reactor-netty.version>1.0.7</reactor-netty.version> <reactor-core.version>3.4.24</reactor-core.version> <oauth2-oidc-sdk.version>6.5</oauth2-oidc-sdk.version> - <jackson-databind.version>2.13.4</jackson-databind.version> - <jackson.version>2.13.2</jackson.version> <spring-webmvc.version>5.3.22</spring-webmvc.version> <azure-core.version>1.31.0</azure-core.version> <azure-security-keyvault-keys.version>4.4.6</azure-security-keyvault-keys.version> @@ -71,6 +69,11 @@ <type>pom</type> <scope>import</scope> </dependency> + <dependency> + <groupId>org.opengroup.osdu</groupId> + <artifactId>os-core-common</artifactId> + <version>${os-core-common.version}</version> + </dependency> </dependencies> </dependencyManagement> @@ -173,10 +176,6 @@ <artifactId>core-lib-azure</artifactId> <version>${osdu.corelibazure.version}</version> <exclusions> - <exclusion> - <groupId>org.opengroup.osdu</groupId> - <artifactId>os-core-common</artifactId> - </exclusion> <exclusion> <artifactId>azure-security-keyvault-keys</artifactId> <groupId>com.azure</groupId> @@ -219,22 +218,18 @@ <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> - <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> - <version>${jackson-databind.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> - <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-cbor</artifactId> - <version>${jackson.version}</version> </dependency> <!-- Resilience4j Dependencies--> @@ -339,7 +334,6 @@ <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> - <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.nimbusds</groupId> diff --git a/provider/indexer-azure/src/main/java/org/opengroup/osdu/indexer/azure/IndexerAzureApplication.java b/provider/indexer-azure/src/main/java/org/opengroup/osdu/indexer/azure/IndexerAzureApplication.java index f0ed79107e68a6d71bb98296734c237de5a62c4a..d09c7c85a851b8697f80745faa9362824f1e67a4 100644 --- a/provider/indexer-azure/src/main/java/org/opengroup/osdu/indexer/azure/IndexerAzureApplication.java +++ b/provider/indexer-azure/src/main/java/org/opengroup/osdu/indexer/azure/IndexerAzureApplication.java @@ -23,6 +23,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.FilterType; +import org.springframework.context.annotation.PropertySource; @SpringBootApplication(exclude = { SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class }) @@ -34,6 +35,7 @@ import org.springframework.context.annotation.FilterType; @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value=ElasticSettingServiceImpl.class), } ) +@PropertySource("classpath:swagger.properties") public class IndexerAzureApplication { public static void main(String[] args) { diff --git a/provider/indexer-azure/src/main/java/org/opengroup/osdu/indexer/azure/di/PublisherConfig.java b/provider/indexer-azure/src/main/java/org/opengroup/osdu/indexer/azure/di/PublisherConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..9c14375ec8816a88e30a56259a3a4d5d9e60f08f --- /dev/null +++ b/provider/indexer-azure/src/main/java/org/opengroup/osdu/indexer/azure/di/PublisherConfig.java @@ -0,0 +1,28 @@ +// Copyright © Schlumberger +// +// 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. + +package org.opengroup.osdu.indexer.azure.di; + +import lombok.Getter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +@Configuration +@Getter +public class PublisherConfig { + + @Value("${azure.publisher.batchsize:50}") + private Integer pubSubBatchSize; +} + diff --git a/provider/indexer-azure/src/main/java/org/opengroup/osdu/indexer/azure/security/AADSecurityConfig.java b/provider/indexer-azure/src/main/java/org/opengroup/osdu/indexer/azure/security/AADSecurityConfig.java index a1261867617574a2ae0ea39f9648998e1db880e8..62427d5ea6e94f7d054219196aa9904e14905325 100644 --- a/provider/indexer-azure/src/main/java/org/opengroup/osdu/indexer/azure/security/AADSecurityConfig.java +++ b/provider/indexer-azure/src/main/java/org/opengroup/osdu/indexer/azure/security/AADSecurityConfig.java @@ -32,24 +32,26 @@ public class AADSecurityConfig extends WebSecurityConfigurerAdapter { @Inject private AADAppRoleStatelessAuthenticationFilter appRoleAuthFilter; + private static final String[] AUTH_ALLOWLIST = {"/", "/index.html", + "/index-worker", "/_dps/task-handlers", "/_dps/task-handlers/**", + "/reindex", + "/actuator/*", + "/v2/api-docs.yaml", + "/v2/api-docs/swagger-config", + "/v2/api-docs/**", + "/info", + "/v2/swagger", + "/v2/swagger-ui/**" + }; + @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER) .and() .authorizeRequests() - .antMatchers("/", "/index.html", - "/index-worker", "/_dps/task-handlers", "/_dps/task-handlers/**", - "/reindex", - "/v2/api-docs", - "/v3/api-docs", - "/swagger-resources/**", - "/configuration/security", - "/swagger", - "/info", - "/swagger-ui/index.html", - "/swagger-ui/**", - "/webjars/**").permitAll() + .antMatchers(AUTH_ALLOWLIST).permitAll() .anyRequest().authenticated() .and().addFilterBefore(appRoleAuthFilter, UsernamePasswordAuthenticationFilter.class); } + } diff --git a/provider/indexer-azure/src/main/java/org/opengroup/osdu/indexer/azure/security/WhoamiController.java b/provider/indexer-azure/src/main/java/org/opengroup/osdu/indexer/azure/security/WhoamiController.java index 6f83843d54672a3d8f5bb47152e02d82431d3779..70828d0e9ad608987a19db399763566901a9422c 100644 --- a/provider/indexer-azure/src/main/java/org/opengroup/osdu/indexer/azure/security/WhoamiController.java +++ b/provider/indexer-azure/src/main/java/org/opengroup/osdu/indexer/azure/security/WhoamiController.java @@ -14,12 +14,14 @@ package org.opengroup.osdu.indexer.azure.security; +import io.swagger.v3.oas.annotations.Hidden; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; +@Hidden @Controller public class WhoamiController { @RequestMapping(value = {"/", "/whoami"}) diff --git a/provider/indexer-azure/src/main/java/org/opengroup/osdu/indexer/azure/util/IndexerQueueTaskBuilderAzure.java b/provider/indexer-azure/src/main/java/org/opengroup/osdu/indexer/azure/util/IndexerQueueTaskBuilderAzure.java index f7cabb70c42148fac7ddf806c811d3976b80aa91..639f6e4a0e7fbf9b2bd56656d68e593df70b18c7 100644 --- a/provider/indexer-azure/src/main/java/org/opengroup/osdu/indexer/azure/util/IndexerQueueTaskBuilderAzure.java +++ b/provider/indexer-azure/src/main/java/org/opengroup/osdu/indexer/azure/util/IndexerQueueTaskBuilderAzure.java @@ -15,8 +15,10 @@ package org.opengroup.osdu.indexer.azure.util; import com.google.common.base.Strings; +import com.google.common.collect.Lists; import com.google.common.reflect.TypeToken; -import com.google.gson.*; +import com.google.gson.Gson; +import com.google.gson.JsonObject; import com.microsoft.azure.servicebus.Message; import lombok.extern.java.Log; import org.apache.http.HttpStatus; @@ -29,6 +31,7 @@ import org.opengroup.osdu.core.common.model.indexer.RecordInfo; import org.opengroup.osdu.core.common.model.indexer.RecordQueryResponse; import org.opengroup.osdu.core.common.model.indexer.RecordReindexRequest; import org.opengroup.osdu.core.common.model.search.RecordChangedMessages; +import org.opengroup.osdu.indexer.azure.di.PublisherConfig; import org.opengroup.osdu.indexer.config.IndexerConfigurationProperties; import org.opengroup.osdu.indexer.service.StorageService; import org.opengroup.osdu.indexer.util.IndexerQueueTaskBuilder; @@ -41,10 +44,10 @@ import javax.inject.Inject; import javax.inject.Named; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; -import java.util.stream.Collectors; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import static org.opengroup.osdu.core.common.model.http.DpsHeaders.AUTHORIZATION; @@ -72,6 +75,8 @@ public class IndexerQueueTaskBuilderAzure extends IndexerQueueTaskBuilder { @Inject private RequestInfoImpl requestInfo; + @Autowired + private PublisherConfig publisherConfig; @Override public void createWorkerTask(String payload, DpsHeaders headers) { @@ -99,7 +104,7 @@ public class IndexerQueueTaskBuilderAzure extends IndexerQueueTaskBuilder { private void publishAllRecordsToServiceBus(String payload, DpsHeaders headers) { // fetch all the remaining records // This logic is temporary and would be updated to call the storage service async. - // Currently the storage client can't be called out of request scope hence making the + // Currently, the storage client can't be called out of request scope hence making the // storage calls sync here Gson gson = new Gson(); RecordReindexRequest recordReindexRequest = gson.fromJson(payload, RecordReindexRequest.class); @@ -116,17 +121,20 @@ public class IndexerQueueTaskBuilderAzure extends IndexerQueueTaskBuilder { recordQueryResponse = this.storageService.getRecordsByKind(recordReindexRequest); if (recordQueryResponse.getResults() != null && recordQueryResponse.getResults().size() != 0) { - List<RecordInfo> records = recordQueryResponse.getResults().stream() - .map(record -> RecordInfo.builder().id(record).kind(recordKind).op(OperationType.create.name()).build()).collect(Collectors.toList()); + List<List<String>> batch = Lists.partition(recordQueryResponse.getResults(), publisherConfig.getPubSubBatchSize()); + for (List<String> recordsBatch : batch) { + List<RecordInfo> records = recordsBatch.stream() + .map(record -> RecordInfo.builder().id(record).kind(recordKind).op(OperationType.create.name()).build()).collect(Collectors.toList()); - Map<String, String> attributes = new HashMap<>(); - attributes.put(DpsHeaders.ACCOUNT_ID, headers.getPartitionIdWithFallbackToAccountId()); - attributes.put(DpsHeaders.DATA_PARTITION_ID, headers.getPartitionIdWithFallbackToAccountId()); - attributes.put(DpsHeaders.CORRELATION_ID, headers.getCorrelationId()); + Map<String, String> attributes = new HashMap<>(); + attributes.put(DpsHeaders.ACCOUNT_ID, headers.getPartitionIdWithFallbackToAccountId()); + attributes.put(DpsHeaders.DATA_PARTITION_ID, headers.getPartitionIdWithFallbackToAccountId()); + attributes.put(DpsHeaders.CORRELATION_ID, headers.getCorrelationId()); - RecordChangedMessages recordChangedMessages = RecordChangedMessages.builder().data(gson.toJson(records)).attributes(attributes).build(); - String recordChangedMessagePayload = gson.toJson(recordChangedMessages); - createTask(recordChangedMessagePayload, headers); + RecordChangedMessages recordChangedMessages = RecordChangedMessages.builder().data(gson.toJson(records)).attributes(attributes).build(); + String recordChangedMessagePayload = gson.toJson(recordChangedMessages); + createTask(recordChangedMessagePayload, headers); + } } } while (!Strings.isNullOrEmpty(recordQueryResponse.getCursor()) && recordQueryResponse.getResults().size() == configurationProperties.getStorageRecordsByKindBatchSize()); @@ -178,8 +186,8 @@ public class IndexerQueueTaskBuilderAzure extends IndexerQueueTaskBuilder { private List<RecordInfo> parseRecordsAsJSON(String inputPayload) { Gson gson = new Gson(); - Type type = new TypeToken<List<RecordInfo>>(){}.getType(); + Type type = new TypeToken<List<RecordInfo>>() {}.getType(); List<RecordInfo> recordInfoList = gson.fromJson(inputPayload, type); - return recordInfoList; + return recordInfoList; } } diff --git a/provider/indexer-azure/src/main/resources/application.properties b/provider/indexer-azure/src/main/resources/application.properties index ba855b47b9e34e9720a1be7d51b26ef02d44abe8..d2dd19ac5bc19b00222901d71b828f970198f90a 100644 --- a/provider/indexer-azure/src/main/resources/application.properties +++ b/provider/indexer-azure/src/main/resources/application.properties @@ -46,7 +46,7 @@ STORAGE_QUERY_RECORD_HOST=${storage_service_url}/query/records STORAGE_QUERY_KINDS_HOST=${storage_service_url}/query/kinds STORAGE_QUERY_RECORD_FOR_CONVERSION_HOST=${storage_service_url}/query/records:batch STORAGE_RECORDS_BATCH_SIZE=20 -STORAGE_RECORDS_BY_KIND_BATCH_SIZE=100 +STORAGE_RECORDS_BY_KIND_BATCH_SIZE=1000 INDEXER_QUEUE_HOST=http://127.0.0.1:9000 diff --git a/provider/indexer-azure/src/test/java/org/opengroup/osdu/indexer/azure/service/IndexCopyServiceImplTest.java b/provider/indexer-azure/src/test/java/org/opengroup/osdu/indexer/azure/service/IndexCopyServiceImplTest.java deleted file mode 100644 index 6fa376a3f6d5a14fe151f2c881202809c220f700..0000000000000000000000000000000000000000 --- a/provider/indexer-azure/src/test/java/org/opengroup/osdu/indexer/azure/service/IndexCopyServiceImplTest.java +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright 2017-2019, Schlumberger -// -// 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. - -package org.opengroup.osdu.indexer.azure.service; - -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import org.apache.http.HttpEntity; -import org.apache.http.util.EntityUtils; -import org.elasticsearch.client.Request; -import org.elasticsearch.client.Response; -import org.elasticsearch.client.RestClient; -import org.elasticsearch.client.RestHighLevelClient; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentMatchers; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.opengroup.osdu.core.common.model.http.DpsHeaders; -import org.opengroup.osdu.indexer.logging.AuditLogger; -import org.opengroup.osdu.indexer.service.IMappingService; -import org.opengroup.osdu.indexer.service.IndexCopyServiceImpl; -import org.opengroup.osdu.core.common.model.search.ClusterSettings; -import org.opengroup.osdu.core.common.provider.interfaces.IRequestInfo; -import org.opengroup.osdu.core.common.model.indexer.IElasticSettingService; -import org.opengroup.osdu.core.common.model.http.AppException; -import org.opengroup.osdu.indexer.service.IndicesService; -import org.opengroup.osdu.indexer.util.ElasticClientHandler; -import org.opengroup.osdu.core.common.search.ElasticIndexNameResolver; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.springframework.test.context.junit4.SpringRunner; - -import java.io.IOException; -import java.lang.reflect.Type; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -import static org.junit.Assert.fail; -import static org.mockito.Mockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; - -@RunWith(SpringRunner.class) -@PrepareForTest({RestHighLevelClient.class, Response.class, RestClient.class, HttpEntity.class, EntityUtils.class}) -public class IndexCopyServiceImplTest { - private final String correlationId = UUID.randomUUID().toString(); - - @Mock - private HttpEntity httpEntity; - @Mock - private HttpEntity httpEntityRequest; - @Mock - private IRequestInfo requestInfo; - @Mock - private DpsHeaders dpsHeaders; - @Mock - private RestClient restClient; - @Mock - private RestHighLevelClient restHighLevelClient; - @Mock - private IndicesService indicesService; - @Mock - private IMappingService mappingService; - @Mock - private ElasticClientHandler elasticClientHandler; - @Mock - private ElasticIndexNameResolver elasticIndexNameResolver; - @Mock - private Response response; - @Mock - private IElasticSettingService elasticSettingService; - @Mock - private AuditLogger auditLogger; - @Mock - private Map<String, String> httpHeaders; - @InjectMocks - private IndexCopyServiceImpl sut; - - private ClusterSettings commonCluster; - - private Map<String, Object> correctMap; - - @Before - public void setup() { - - commonCluster = ClusterSettings.builder().host("commonhost").port(8080).userNameAndPassword("username:pwd").build(); - - httpHeaders = new HashMap<>(); - httpHeaders.put(DpsHeaders.AUTHORIZATION, "testAuth"); - httpHeaders.put(DpsHeaders.CORRELATION_ID, correlationId); - when(requestInfo.getHeadersMapWithDwdAuthZ()).thenReturn(httpHeaders); - when(response.getEntity()).thenReturn(httpEntity); - - Type mapType = new TypeToken<Map<String, Object>>() {}.getType(); - String afterFormat = "{\"properties\":{\"id\":{\"type\":\"keyword\"}}}"; - correctMap = new Gson().fromJson(afterFormat, mapType); - - restHighLevelClient = mock(RestHighLevelClient.class); - - } - - @Test(expected = IOException.class) - public void should_throwIOException_when_indexMappingNotFound() throws Exception { - IOException exception = new IOException("Fail to get mapping for the given index from common cluster."); - - when(this.mappingService.getIndexMapping(ArgumentMatchers.any(), ArgumentMatchers.any())).thenThrow(exception); - - this.sut.copyIndex("common:metadata:entity:1.0.0"); - } - - @Test(expected = IllegalArgumentException.class) - public void should_throwIllegalArgExceptionCopyIndexRequest_copyIndexTest() { - try { - this.sut.copyIndex(null); - } catch (IOException e) { - fail("Should not throw IOException but illegalArgumentException."); - } - } - - @Test - public void should_returnIndexMapping_getIndexMappingFromCommonClustertest() { - String mappingJson = "{\"common-metadata-entity-1.0.0\":{\"mappings\":{\"entity\":{\"properties\":{\"id\":{\"type\":\"keyword\"}}}}}}"; - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - try { - when(this.mappingService.getIndexMapping(ArgumentMatchers.any(), ArgumentMatchers.any())).thenReturn(mappingJson); - Map<String, Object> resultMap = this.sut.getIndexMappingsFromCommonCluster("test", "test"); - Assert.assertEquals(resultMap, correctMap); - } catch (Exception ignored) { - } - } - - @Test - public void should_returnClusterInfo_getCommonClusterInformationtest() { - try { - String[] correctCommonCluster = {"https://commonhost:8080", "username", "pwd"}; - - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - - when(elasticSettingService.getElasticClusterInformation()).thenReturn(commonCluster); - - String[] resultCommonCluster = this.sut.getCommonClusterInformation(); - Assert.assertEquals(correctCommonCluster[0], resultCommonCluster[0]); - Assert.assertEquals(correctCommonCluster[1], resultCommonCluster[1]); - Assert.assertEquals(correctCommonCluster[2], resultCommonCluster[2]); - } catch (IOException ignored) { - fail("Should not throw this exception " + ignored.getMessage()); - } - } - - @Test(expected = AppException.class) - public void should_throwException_failToCreateIndexInTenantCluster_createIndexInTenantClustertest() { - try { - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - when(indicesService.createIndex(ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any())).thenReturn(false); - this.sut.createIndexInTenantCluster("test", "test", "test", correctMap); - } catch (IOException ignored) { - fail("Should not throw this exception " + ignored.getMessage()); - } - } - - @Ignore - public void should_returnTaskIdResponse_reindexRequestSucceed_reindexInTenantClustertest() { - //TODO: fix the null Response from restHighLevelClient.getLowLevelClient().performRequest(). - try { - String[] correctCommonCluster = {"https://commonhost:8080", "username", "pwd"}; - Request request = new Request("POST", "/_reindex?wait_for_completion=false"); - request.setEntity(httpEntityRequest); - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - when(indicesService.createIndex(ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any())).thenReturn(false); - when(restHighLevelClient.getLowLevelClient()).thenReturn(restClient); - when(restClient.performRequest(request)).thenReturn(response); - when(response.getEntity()).thenReturn(httpEntity); - Assert.assertEquals(httpEntity, this.sut.reindexInTenantCluster("test", "test", correctCommonCluster)); - } catch (IOException ignored) { - } - } -} diff --git a/provider/indexer-azure/src/test/java/org/opengroup/osdu/indexer/azure/service/IndexerMappingServiceTest.java b/provider/indexer-azure/src/test/java/org/opengroup/osdu/indexer/azure/service/IndexerMappingServiceTest.java index 01b50be0be12488791a03f54b8c46dce65c4bbd6..faf5b53af92eb0b65bf15667c577307a09964c3e 100644 --- a/provider/indexer-azure/src/test/java/org/opengroup/osdu/indexer/azure/service/IndexerMappingServiceTest.java +++ b/provider/indexer-azure/src/test/java/org/opengroup/osdu/indexer/azure/service/IndexerMappingServiceTest.java @@ -15,17 +15,13 @@ package org.opengroup.osdu.indexer.azure.service; import org.apache.http.StatusLine; -import org.elasticsearch.ElasticsearchException; -import org.elasticsearch.action.admin.indices.mapping.get.GetFieldMappingsRequest; -import org.elasticsearch.action.admin.indices.mapping.get.GetFieldMappingsResponse; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; -import org.elasticsearch.action.bulk.BulkItemResponse.Failure; import org.elasticsearch.action.support.master.AcknowledgedResponse; -import org.elasticsearch.client.*; -import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentFactory; -import org.elasticsearch.index.reindex.BulkByScrollResponse; +import org.elasticsearch.client.IndicesClient; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.Response; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestHighLevelClient; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @@ -34,284 +30,105 @@ import org.mockito.ArgumentMatchers; import org.mockito.InjectMocks; import org.mockito.Mock; import org.opengroup.osdu.core.common.model.indexer.IndexSchema; -import org.opengroup.osdu.indexer.service.IndexerMappingServiceImpl; import org.opengroup.osdu.core.common.model.search.RecordMetaAttribute; -import org.opengroup.osdu.core.common.model.http.AppException; -import org.opengroup.osdu.indexer.util.ElasticClientHandler; +import org.opengroup.osdu.indexer.service.IndexerMappingServiceImpl; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.springframework.test.context.junit4.SpringRunner; import java.io.IOException; -import java.util.*; +import java.util.HashMap; +import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; -import static org.mockito.Matchers.any; import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; import static org.powermock.api.mockito.PowerMockito.when; @Ignore @RunWith(SpringRunner.class) -@PrepareForTest({ RestHighLevelClient.class, IndicesClient.class }) +@PrepareForTest({RestHighLevelClient.class, IndicesClient.class}) public class IndexerMappingServiceTest { - private final String kind = "tenant:test:test:1.0.0"; - private final String index = "tenant-test-test-1.0.0"; - private final String type = "test"; - private final String mappingValid = "{\"dynamic\":false,\"properties\":{\"data\":{\"properties\":{\"Location\":{\"type\":\"geo_point\"}}},\"id\":{\"type\":\"keyword\"}}}"; - - @Mock - private RestClient restClient; - @Mock - private Response response; - @Mock - private StatusLine statusLine; - - @InjectMocks - private IndexerMappingServiceImpl sut; - - @Mock - private ElasticClientHandler elasticClientHandler; - - @InjectMocks - private RestHighLevelClient restHighLevelClient; - - @InjectMocks - private IndexSchema indexSchema; - @InjectMocks - private IndicesClient indicesClient; - - @InjectMocks - private AcknowledgedResponse mappingResponse; - - @Before - public void setup() throws IOException { - Map<String, Object> dataMapping = new HashMap<>(); - dataMapping.put("Location", "geo_point"); - Map<String, Object> metaMapping = new HashMap<>(); - metaMapping.put(RecordMetaAttribute.ID.getValue(), "keyword"); - this.indexSchema = IndexSchema.builder().kind(kind).type(type).dataSchema(dataMapping).metaSchema(metaMapping) - .build(); - - this.indicesClient = PowerMockito.mock(IndicesClient.class); - this.restHighLevelClient = PowerMockito.mock(RestHighLevelClient.class); - - when(this.restHighLevelClient.getLowLevelClient()).thenReturn(restClient); - when(this.restClient.performRequest(ArgumentMatchers.any())).thenReturn(response); - when(this.response.getStatusLine()).thenReturn(statusLine); - when(this.statusLine.getStatusCode()).thenReturn(200); - } - - @Test - public void should_returnValidMapping_givenFalseMerge_createMappingTest() { - try { - String mapping = this.sut.createMapping(restHighLevelClient, indexSchema, index, false); - assertEquals(mappingValid, mapping); - } catch (Exception e) { - fail("Should not throw this exception" + e.getMessage()); - } - } - - @Test - public void should_returnValidMapping_givenTrueMerge_createMappingTest() { - try { - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - - String mapping = this.sut.createMapping(this.restHighLevelClient, this.indexSchema, this.index, true); - assertEquals(this.mappingValid, mapping); - } catch (Exception e) { - fail("Should not throw this exception" + e.getMessage()); - } - } - - @Test - public void should_returnValidMapping_givenExistType_createMappingTest() { - try { - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - - IndexerMappingServiceImpl indexerMappingServiceLocal = PowerMockito.spy(new IndexerMappingServiceImpl()); - doReturn(false).when(indexerMappingServiceLocal).isTypeExist(ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any()); - String mapping = this.sut.createMapping(this.restHighLevelClient, this.indexSchema, this.index, true); - assertEquals(this.mappingValid, mapping); - } catch (Exception e) { - fail("Should not throw this exception" + e.getMessage()); - } - } - - @Test - public void should_update_indices_field_with_keyword_when_valid_indices() throws Exception { - try { - Set<String> indices = new HashSet<String>(); - indices.add("indices 1"); - GetFieldMappingsResponse getFieldMappingsResponse = mock(GetFieldMappingsResponse.class); - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - when(this.indicesClient.getFieldMapping(ArgumentMatchers.any(GetFieldMappingsRequest.class), ArgumentMatchers.any())).thenReturn(getFieldMappingsResponse); - XContentBuilder builder = XContentFactory.jsonBuilder(); - builder.startObject(); - builder.field("any field", new HashMap()); - builder.endObject(); - BytesReference bytesReference = BytesReference.bytes(builder); - GetFieldMappingsResponse.FieldMappingMetadata mappingMetaData = new GetFieldMappingsResponse.FieldMappingMetadata(index, bytesReference); - Map<String, GetFieldMappingsResponse.FieldMappingMetadata> mapBuilder = new HashMap<>(); - mapBuilder.put("data.any field", mappingMetaData); - Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>> mappingBuilder = new HashMap<>(); - mappingBuilder.put("any index 1", mapBuilder); - mappingBuilder.put("any index 2", mapBuilder); - Map<String, Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>>> mapping = new HashMap<>(); - mapping.put("indices 1", mappingBuilder); - when(getFieldMappingsResponse.mappings()).thenReturn(mapping); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - BulkByScrollResponse response = mock(BulkByScrollResponse.class); - doReturn(response).when(this.restHighLevelClient).updateByQuery(ArgumentMatchers.any(), ArgumentMatchers.any(RequestOptions.class)); - when(response.getBulkFailures()).thenReturn(new ArrayList<Failure>()); - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - - this.sut.updateIndexMappingForIndicesOfSameType( indices,"any field"); - } catch (Exception e) { - fail("Should not throw this exception" + e.getMessage()); - } - } - - @Test(expected = AppException.class) - public void should_throw_exception_if_someIndex_is_invalid_andWeIndexfield_with_keyword() throws Exception { - try { - Set<String> indices = new HashSet<String>(); - indices.add("invalid 1"); - GetFieldMappingsResponse getFieldMappingsResponse = mock(GetFieldMappingsResponse.class); - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - when(this.indicesClient.getFieldMapping(ArgumentMatchers.any(GetFieldMappingsRequest.class), ArgumentMatchers.any())).thenReturn(getFieldMappingsResponse); - XContentBuilder builder = XContentFactory.jsonBuilder(); - builder.startObject(); - builder.field("any field", new HashMap()); - builder.endObject(); - BytesReference bytesReference = BytesReference.bytes(builder); - GetFieldMappingsResponse.FieldMappingMetadata mappingMetaData = new GetFieldMappingsResponse.FieldMappingMetadata(index, bytesReference); - Map<String, GetFieldMappingsResponse.FieldMappingMetadata> mapBuilder = new HashMap<>(); - mapBuilder.put("data.any field", mappingMetaData); - Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>> mappingBuilder = new HashMap<>(); - mappingBuilder.put("any index 1", mapBuilder); - mappingBuilder.put("any index 2", mapBuilder); - Map<String, Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>>> mapping = new HashMap<>(); - mapping.put("indices 1", mappingBuilder); - when(getFieldMappingsResponse.mappings()).thenReturn(mapping); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - BulkByScrollResponse response = mock(BulkByScrollResponse.class); - doReturn(response).when(this.restHighLevelClient).updateByQuery(ArgumentMatchers.any(), ArgumentMatchers.any(RequestOptions.class)); - when(response.getBulkFailures()).thenReturn(new ArrayList<Failure>()); - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - - this.sut.updateIndexMappingForIndicesOfSameType(indices,"any field"); - } catch (Exception e) { - throw e; - } - } - - @Test(expected = AppException.class) - public void should_throw_exception_if_type_of_index_is_invalid_andWeIndexfield_with_keyword() throws Exception { - try { - Set<String> indices = new HashSet<String>(); - indices.add("indices 1"); - GetFieldMappingsResponse getFieldMappingsResponse = mock(GetFieldMappingsResponse.class); - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - when(this.indicesClient.getFieldMapping(ArgumentMatchers.any(GetFieldMappingsRequest.class), ArgumentMatchers.any())).thenReturn(getFieldMappingsResponse); - XContentBuilder builder = XContentFactory.jsonBuilder(); - builder.startObject(); - builder.field("any field", new HashMap()); - builder.endObject(); - BytesReference bytesReference = BytesReference.bytes(builder); - GetFieldMappingsResponse.FieldMappingMetadata mappingMetaData = new GetFieldMappingsResponse.FieldMappingMetadata(index, bytesReference); - Map<String, GetFieldMappingsResponse.FieldMappingMetadata> mapBuilder = new HashMap<>(); - mapBuilder.put("data.any field", mappingMetaData); - Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>> mappingBuilder = new HashMap<>(); - mappingBuilder.put("any index 1", mapBuilder); - mappingBuilder.put("any index 2", mapBuilder); - Map<String, Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>>> mapping = new HashMap<>(); - mapping.put("indices 1", mappingBuilder); - when(getFieldMappingsResponse.mappings()).thenReturn(mapping); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - BulkByScrollResponse response = mock(BulkByScrollResponse.class); - doReturn(response).when(this.restHighLevelClient).updateByQuery(ArgumentMatchers.any(), ArgumentMatchers.any(RequestOptions.class)); - when(response.getBulkFailures()).thenReturn(new ArrayList<Failure>()); - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - this.sut.updateIndexMappingForIndicesOfSameType(indices,"any field invalid"); - } catch (Exception e) { - throw e; - } - } - - @Test(expected = AppException.class) - public void should_throw_exception_if_elastic_search_failedToFetch_andWeIndexfield_with_keyword() throws Exception { - try { - - Set<String> indices = new HashSet<String>(); - indices.add("indices 1"); - indices.add("indices Invalid"); - GetFieldMappingsResponse getFieldMappingsResponse = mock(GetFieldMappingsResponse.class); - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - when(this.indicesClient.getFieldMapping(ArgumentMatchers.any(GetFieldMappingsRequest.class), ArgumentMatchers.any())).thenThrow(new ElasticsearchException("")); - XContentBuilder builder = XContentFactory.jsonBuilder(); - builder.startObject(); - builder.field("any field", new HashMap()); - builder.endObject(); - BytesReference bytesReference = BytesReference.bytes(builder); - GetFieldMappingsResponse.FieldMappingMetadata mappingMetaData = new GetFieldMappingsResponse.FieldMappingMetadata(index, bytesReference); - Map<String, GetFieldMappingsResponse.FieldMappingMetadata> mapBuilder = new HashMap<>(); - mapBuilder.put("data.any field", mappingMetaData); - Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>> mappingBuilder = new HashMap<>(); - mappingBuilder.put("any index 1", mapBuilder); - mappingBuilder.put("any index 2", mapBuilder); - Map<String, Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>>> mapping = new HashMap<>(); - mapping.put("indices 1", mappingBuilder); - when(getFieldMappingsResponse.mappings()).thenReturn(mapping); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - BulkByScrollResponse response = mock(BulkByScrollResponse.class); - doReturn(response).when(this.restHighLevelClient).updateByQuery(ArgumentMatchers.any(), ArgumentMatchers.any(RequestOptions.class)); - when(response.getBulkFailures()).thenReturn(new ArrayList<Failure>()); - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - this.sut.updateIndexMappingForIndicesOfSameType(indices,"any field"); - } catch (AppException e) { - throw e; - } - } - - @Test(expected = AppException.class) - public void should_throw_exception_when_elastic_failedToIndex_indices_field_with_keyword() { - try { - Set<String> indices = new HashSet<String>(); - indices.add("indices 1"); - indices.add("indices Invalid"); - GetFieldMappingsResponse getFieldMappingsResponse = mock(GetFieldMappingsResponse.class); - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - when(this.indicesClient.getFieldMapping(ArgumentMatchers.any(GetFieldMappingsRequest.class), ArgumentMatchers.any())).thenReturn(getFieldMappingsResponse); - XContentBuilder builder = XContentFactory.jsonBuilder(); - builder.startObject(); - builder.field("any field", new HashMap()); - builder.endObject(); - BytesReference bytesReference = BytesReference.bytes(builder); - GetFieldMappingsResponse.FieldMappingMetadata mappingMetaData = new GetFieldMappingsResponse.FieldMappingMetadata(index, bytesReference); - Map<String, GetFieldMappingsResponse.FieldMappingMetadata> mapBuilder = new HashMap<>(); - mapBuilder.put("data.any field", mappingMetaData); - Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>> mappingBuilder = new HashMap<>(); - mappingBuilder.put("any index 1", mapBuilder); - mappingBuilder.put("any index 2", mapBuilder); - Map<String, Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>>> mapping = new HashMap<>(); - mapping.put("indices 1", mappingBuilder); - when(getFieldMappingsResponse.mappings()).thenReturn(mapping); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - BulkByScrollResponse response = mock(BulkByScrollResponse.class); - doReturn(response).when(this.restHighLevelClient).updateByQuery(ArgumentMatchers.any(), ArgumentMatchers.any(RequestOptions.class)); - when(response.getBulkFailures()).thenReturn(new ArrayList<Failure>()); - when(this.indicesClient.putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class))).thenThrow(new ElasticsearchException("")); - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - this.sut.updateIndexMappingForIndicesOfSameType(indices,"any field"); - } catch (AppException e) { - throw e; - } catch (Exception e) { - fail("Should not throw this exception" + e.getMessage()); - } - } + private final String kind = "tenant:test:test:1.0.0"; + private final String index = "tenant-test-test-1.0.0"; + private final String type = "test"; + private final String mappingValid = "{\"dynamic\":false,\"properties\":{\"data\":{\"properties\":{\"Location\":{\"type\":\"geo_point\"}}},\"id\":{\"type\":\"keyword\"}}}"; + + @Mock + private RestClient restClient; + @Mock + private Response response; + @Mock + private StatusLine statusLine; + + @InjectMocks + private IndexerMappingServiceImpl sut; + + @InjectMocks + private RestHighLevelClient restHighLevelClient; + + @InjectMocks + private IndexSchema indexSchema; + @InjectMocks + private IndicesClient indicesClient; + + @InjectMocks + private AcknowledgedResponse mappingResponse; + + @Before + public void setup() throws IOException { + Map<String, Object> dataMapping = new HashMap<>(); + dataMapping.put("Location", "geo_point"); + Map<String, Object> metaMapping = new HashMap<>(); + metaMapping.put(RecordMetaAttribute.ID.getValue(), "keyword"); + this.indexSchema = IndexSchema.builder().kind(kind).type(type).dataSchema(dataMapping).metaSchema(metaMapping) + .build(); + + this.indicesClient = PowerMockito.mock(IndicesClient.class); + this.restHighLevelClient = PowerMockito.mock(RestHighLevelClient.class); + + when(this.restHighLevelClient.getLowLevelClient()).thenReturn(restClient); + when(this.restClient.performRequest(ArgumentMatchers.any())).thenReturn(response); + when(this.response.getStatusLine()).thenReturn(statusLine); + when(this.statusLine.getStatusCode()).thenReturn(200); + } + + @Test + public void should_returnValidMapping_givenFalseMerge_createMappingTest() { + try { + String mapping = this.sut.createMapping(restHighLevelClient, indexSchema, index, false); + assertEquals(mappingValid, mapping); + } catch (Exception e) { + fail("Should not throw this exception" + e.getMessage()); + } + } + + @Test + public void should_returnValidMapping_givenTrueMerge_createMappingTest() { + try { + doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); + doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); + + String mapping = this.sut.createMapping(this.restHighLevelClient, this.indexSchema, this.index, true); + assertEquals(this.mappingValid, mapping); + } catch (Exception e) { + fail("Should not throw this exception" + e.getMessage()); + } + } + + @Test + public void should_returnValidMapping_givenExistType_createMappingTest() { + try { + doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); + doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); + + IndexerMappingServiceImpl indexerMappingServiceLocal = PowerMockito.spy(new IndexerMappingServiceImpl()); + doReturn(false).when(indexerMappingServiceLocal).isTypeExist(ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any()); + String mapping = this.sut.createMapping(this.restHighLevelClient, this.indexSchema, this.index, true); + assertEquals(this.mappingValid, mapping); + } catch (Exception e) { + fail("Should not throw this exception" + e.getMessage()); + } + } } diff --git a/provider/indexer-azure/src/test/java/org/opengroup/osdu/indexer/azure/service/StorageServiceTest.java b/provider/indexer-azure/src/test/java/org/opengroup/osdu/indexer/azure/service/StorageServiceTest.java deleted file mode 100644 index 218488386affee78476390c4ba1081774ce6a3a5..0000000000000000000000000000000000000000 --- a/provider/indexer-azure/src/test/java/org/opengroup/osdu/indexer/azure/service/StorageServiceTest.java +++ /dev/null @@ -1,246 +0,0 @@ -// Copyright 2017-2019, Schlumberger -// -// 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. - -package org.opengroup.osdu.indexer.azure.service; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentMatchers; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.opengroup.osdu.core.common.model.indexer.IndexingStatus; -import org.opengroup.osdu.core.common.model.indexer.RecordInfo; -import org.opengroup.osdu.core.common.model.indexer.RecordQueryResponse; -import org.opengroup.osdu.core.common.model.indexer.RecordReindexRequest; -import org.opengroup.osdu.core.common.model.indexer.Records; -import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; -import org.opengroup.osdu.indexer.service.StorageServiceImpl; -import org.opengroup.osdu.core.common.model.indexer.JobStatus; -import org.opengroup.osdu.core.common.model.http.HttpResponse; -import org.opengroup.osdu.core.common.provider.interfaces.IRequestInfo; -import org.opengroup.osdu.core.common.http.IUrlFetchService; -import org.opengroup.osdu.core.common.model.http.AppException; -import org.springframework.http.HttpStatus; -import org.springframework.test.context.junit4.SpringRunner; - -import java.lang.reflect.Type; -import java.net.URISyntaxException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; - -import static java.util.Collections.singletonList; -import static org.junit.Assert.*; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.powermock.api.mockito.PowerMockito.when; - -@Ignore -@RunWith(SpringRunner.class) -public class StorageServiceTest { - - @Mock - private IUrlFetchService urlFetchService; - @Mock - private JobStatus jobStatus; - @Mock - private JaxRsDpsLog log; - @Mock - private IRequestInfo requestInfo; - @InjectMocks - private StorageServiceImpl sut; - - private List<String> ids; - private static final String RECORD_ID1 = "tenant1:doc:1dbf528e0e0549cab7a08f29fbfc8465"; - private static final String RECORDS_ID2 = "tenant1:doc:15e790a69beb4d789b1f979e2af2e813"; - - @Before - public void setup() { - - String recordChangedMessages = "[{\"id\":\"tenant1:doc:1dbf528e0e0549cab7a08f29fbfc8465\",\"kind\":\"tenant1:testindexer1528919679710:well:1.0.0\",\"op\":\"purge\"}," + - "{\"id\":\"tenant1:doc:15e790a69beb4d789b1f979e2af2e813\",\"kind\":\"tenant1:testindexer1528919679710:well:1.0.0\",\"op\":\"create\"}]"; - - when(this.requestInfo.getHeadersMap()).thenReturn(new HashMap<>()); - - Type listType = new TypeToken<List<RecordInfo>>() {}.getType(); - - List<RecordInfo> msgs = (new Gson()).fromJson(recordChangedMessages, listType); - jobStatus.initialize(msgs); - ids = Arrays.asList(RECORD_ID1, RECORDS_ID2); - } - - @Test - public void should_return404_givenNullData_getValidStorageRecordsTest() throws URISyntaxException { - - HttpResponse httpResponse = mock(HttpResponse.class); - Mockito.when(httpResponse.getBody()).thenReturn(null); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - - should_return404_getValidStorageRecordsTest(); - } - - @Test - public void should_return404_givenEmptyData_getValidStorageRecordsTest() throws URISyntaxException { - - String emptyDataFromStorage = "{\"records\":[],\"notFound\":[]}"; - - HttpResponse httpResponse = mock(HttpResponse.class); - Mockito.when(httpResponse.getBody()).thenReturn(emptyDataFromStorage); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - - should_return404_getValidStorageRecordsTest(); - } - - @Test - public void should_returnOneValidRecords_givenValidData_getValidStorageRecordsTest() throws URISyntaxException { - - String validDataFromStorage = "{\"records\":[{\"id\":\"testid\", \"version\":1, \"kind\":\"tenant:test:test:1.0.0\"}],\"notFound\":[\"invalid1\"]}"; - - HttpResponse httpResponse = mock(HttpResponse.class); - Mockito.when(httpResponse.getBody()).thenReturn(validDataFromStorage); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - Records storageRecords = this.sut.getStorageRecords(ids); - - assertEquals(1, storageRecords.getRecords().size()); - } - - @Test - public void should_logMissingRecord_given_storageMissedRecords() throws URISyntaxException { - - String validDataFromStorage = "{\"records\":[{\"id\":\"tenant1:doc:1dbf528e0e0549cab7a08f29fbfc8465\", \"version\":1, \"kind\":\"tenant:test:test:1.0.0\"}],\"notFound\":[]}"; - - HttpResponse httpResponse = mock(HttpResponse.class); - Mockito.when(httpResponse.getBody()).thenReturn(validDataFromStorage); - - when(this.urlFetchService.sendRequest(any())).thenReturn(httpResponse); - Records storageRecords = this.sut.getStorageRecords(ids); - - assertEquals(1, storageRecords.getRecords().size()); - verify(this.jobStatus).addOrUpdateRecordStatus(singletonList(RECORDS_ID2), IndexingStatus.FAIL, org.apache.http.HttpStatus.SC_NOT_FOUND, "Partial response received from Storage service - missing records", "Partial response received from Storage service: tenant1:doc:15e790a69beb4d789b1f979e2af2e813"); - } - - @Test - public void should_returnValidJobStatus_givenFailedUnitsConversion_processRecordChangedMessageTest() throws URISyntaxException { - String validDataFromStorage = "{\"records\":[{\"id\":\"tenant1:doc:15e790a69beb4d789b1f979e2af2e813\", \"version\":1, \"kind\":\"tenant:test:test:1.0.0\"}],\"notFound\":[],\"conversionStatuses\":[{\"id\":\"tenant1:doc:15e790a69beb4d789b1f979e2af2e813\",\"status\":\"ERROR\",\"errors\":[\"crs conversion failed\"]}]}"; - - HttpResponse httpResponse = mock(HttpResponse.class); - Mockito.when(httpResponse.getBody()).thenReturn(validDataFromStorage); - - when(this.urlFetchService.sendRequest(any())).thenReturn(httpResponse); - Records storageRecords = this.sut.getStorageRecords(singletonList("tenant1:doc:15e790a69beb4d789b1f979e2af2e813")); - - assertEquals(1, storageRecords.getRecords().size()); - verify(this.jobStatus).addOrUpdateRecordStatus("tenant1:doc:15e790a69beb4d789b1f979e2af2e813", IndexingStatus.WARN, org.apache.http.HttpStatus.SC_BAD_REQUEST, "crs conversion failed", String.format("record-id: %s | %s", "tenant1:doc:15e790a69beb4d789b1f979e2af2e813", "crs conversion failed")); - } - - @Test - public void should_returnValidResponse_givenValidRecordQueryRequest_getRecordListByKind() throws Exception { - - RecordReindexRequest recordReindexRequest = RecordReindexRequest.builder().kind("tenant:test:test:1.0.0").cursor("100").build(); - - HttpResponse httpResponse = new HttpResponse(); - httpResponse.setBody(new Gson().toJson(recordReindexRequest, RecordReindexRequest.class)); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - - RecordQueryResponse recordQueryResponse = this.sut.getRecordsByKind(recordReindexRequest); - - assertEquals("100", recordQueryResponse.getCursor()); - assertNull(recordQueryResponse.getResults()); - } - - @Test - public void should_returnValidResponse_givenValidKind_getSchemaByKind() throws Exception { - - String validSchemaFromStorage = "{" + - " \"kind\": \"tenant:test:test:1.0.0\"," + - " \"schema\": [" + - " {" + - " \"path\": \"msg\"," + - " \"kind\": \"string\"" + - " }," + - " {" + - " \"path\": \"references.entity\"," + - " \"kind\": \"string\"" + - " }" + - " ]," + - " \"ext\": null" + - "}"; - String kind = "tenant:test:test:1.0.0"; - - HttpResponse httpResponse = new HttpResponse(); - httpResponse.setResponseCode(HttpStatus.OK.value()); - httpResponse.setBody(validSchemaFromStorage); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - - String recordSchemaResponse = this.sut.getStorageSchema(kind); - - assertNotNull(recordSchemaResponse); - } - - @Test - public void should_returnNullResponse_givenAbsentKind_getSchemaByKind() throws Exception { - - String kind = "tenant:test:test:1.0.0"; - - HttpResponse httpResponse = new HttpResponse(); - httpResponse.setResponseCode(HttpStatus.NOT_FOUND.value()); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - - String recordSchemaResponse = this.sut.getStorageSchema(kind); - - assertNull(recordSchemaResponse); - } - - @Test - public void should_returnOneValidRecords_givenValidData_getValidStorageRecordsWithInvalidConversionTest() throws URISyntaxException { - - String validDataFromStorage = "{\"records\":[{\"id\":\"testid\", \"version\":1, \"kind\":\"tenant:test:test:1.0.0\"}],\"notFound\":[\"invalid1\"],\"conversionStatuses\": [{\"id\":\"testid\",\"status\":\"ERROR\",\"errors\":[\"conversion error occurred\"] } ]}"; - - HttpResponse httpResponse = mock(HttpResponse.class); - Mockito.when(httpResponse.getBody()).thenReturn(validDataFromStorage); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - Records storageRecords = this.sut.getStorageRecords(ids); - - assertEquals(1, storageRecords.getRecords().size()); - - assertEquals(1, storageRecords.getConversionStatuses().get(0).getErrors().size()); - - assertEquals("conversion error occurred", storageRecords.getConversionStatuses().get(0).getErrors().get(0)); - } - - private void should_return404_getValidStorageRecordsTest() { - try { - this.sut.getStorageRecords(ids); - fail("Should throw exception"); - } catch (AppException e) { - assertEquals(HttpStatus.NOT_FOUND.value(), e.getError().getCode()); - } catch (Exception e) { - fail("Should not throw this exception" + e.getMessage()); - } - } -} diff --git a/provider/indexer-azure/src/test/java/org/opengroup/osdu/indexer/azure/util/IndexerQueueTaskBuilderAzureTest.java b/provider/indexer-azure/src/test/java/org/opengroup/osdu/indexer/azure/util/IndexerQueueTaskBuilderAzureTest.java index e1333d34f6cb7e1d3bc5ede5a642ecb8680d930c..559fc9875db254a2896cbc804e0e0e4d963922f7 100644 --- a/provider/indexer-azure/src/test/java/org/opengroup/osdu/indexer/azure/util/IndexerQueueTaskBuilderAzureTest.java +++ b/provider/indexer-azure/src/test/java/org/opengroup/osdu/indexer/azure/util/IndexerQueueTaskBuilderAzureTest.java @@ -1,41 +1,37 @@ package org.opengroup.osdu.indexer.azure.util; -import com.microsoft.azure.servicebus.TopicClient; import com.microsoft.azure.servicebus.primitives.ServiceBusException; -import org.junit.jupiter.api.BeforeEach; +import org.junit.Before; import org.junit.Test; -import org.mockito.Spy; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; +import org.mockito.Spy; import org.mockito.junit.MockitoJUnitRunner; import org.opengroup.osdu.azure.servicebus.ITopicClientFactory; import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; import org.opengroup.osdu.core.common.model.http.AppException; import org.opengroup.osdu.core.common.model.http.DpsHeaders; import org.opengroup.osdu.core.common.model.indexer.RecordQueryResponse; -import org.opengroup.osdu.core.common.model.indexer.RecordReindexRequest; -import org.opengroup.osdu.core.common.model.search.RecordChangedMessages; +import org.opengroup.osdu.indexer.azure.di.PublisherConfig; import org.opengroup.osdu.indexer.config.IndexerConfigurationProperties; import org.opengroup.osdu.indexer.service.StorageService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.util.ReflectionTestUtils; -import javax.inject.Inject; -import javax.inject.Named; + import java.net.URISyntaxException; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; + +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import static org.opengroup.osdu.core.common.model.http.DpsHeaders.AUTHORIZATION; @RunWith(MockitoJUnitRunner.class) public class IndexerQueueTaskBuilderAzureTest { - private String payload="{payload : value }"; + private String payload = "{payload : value }"; private static String partitionId = "opendes"; private static String correlationId = "correlationId"; private static String serviceBusReindexTopicNameField = "serviceBusReindexTopicName"; @@ -51,6 +47,9 @@ public class IndexerQueueTaskBuilderAzureTest { @Mock private JaxRsDpsLog logger; + @Mock + private PublisherConfig publisherConfig; + @Mock DpsHeaders dpsHeaders; @@ -63,8 +62,13 @@ public class IndexerQueueTaskBuilderAzureTest { @InjectMocks IndexerQueueTaskBuilderAzure sut; + @Before + public void setup() { + when(this.publisherConfig.getPubSubBatchSize()).thenReturn(50); + } + @Test - public void createWorkerTask_should_invoke_correctMethods() throws ServiceBusException, InterruptedException, NoSuchFieldException { + public void createWorkerTask_should_invoke_correctMethods() throws ServiceBusException, InterruptedException { when(dpsHeaders.getPartitionIdWithFallbackToAccountId()).thenReturn(partitionId); when(dpsHeaders.getPartitionId()).thenReturn(partitionId); when(dpsHeaders.getCorrelationId()).thenReturn(correlationId); @@ -79,8 +83,8 @@ public class IndexerQueueTaskBuilderAzureTest { } @Test - public void createWorkerTaskWithCountDown_should_invoke_correctMethods() throws ServiceBusException, InterruptedException, NoSuchFieldException { - Long milliseconds=8000L; + public void createWorkerTaskWithCountDown_should_invoke_correctMethods() throws ServiceBusException, InterruptedException { + Long milliseconds = 8000L; when(dpsHeaders.getPartitionIdWithFallbackToAccountId()).thenReturn(partitionId); when(dpsHeaders.getPartitionId()).thenReturn(partitionId); when(dpsHeaders.getCorrelationId()).thenReturn(correlationId); @@ -95,13 +99,12 @@ public class IndexerQueueTaskBuilderAzureTest { } @Test(expected = AppException.class) - public void createReIndexTask_InvalidParameter_ShouldThrowException() - { - sut.createReIndexTask(payload,dpsHeaders); + public void createReIndexTask_InvalidParameter_ShouldThrowException() { + sut.createReIndexTask(payload, dpsHeaders); } @Test - public void createReIndexTaskWithEmptyStorageResponse_should_invoke_correctMethods() throws ServiceBusException, InterruptedException, NoSuchFieldException, URISyntaxException { + public void createReIndexTaskWithEmptyStorageResponse_should_invoke_correctMethods() throws URISyntaxException { Long milliseconds = 8000L; RecordQueryResponse recordQueryResponse = new RecordQueryResponse(); when(requestInfo.checkOrGetAuthorizationHeader()).thenReturn(authorisedHeader); @@ -110,17 +113,17 @@ public class IndexerQueueTaskBuilderAzureTest { sut.createReIndexTask(payload, milliseconds, dpsHeaders); - verify(requestInfo,times(1)).checkOrGetAuthorizationHeader(); + verify(requestInfo, times(1)).checkOrGetAuthorizationHeader(); verify(dpsHeaders, times(1)).put(AUTHORIZATION, authorisedHeader); - verify(storageService,times(1)).getRecordsByKind(any()); + verify(storageService, times(1)).getRecordsByKind(any()); verify(dpsHeaders, times(1)).addCorrelationIdIfMissing(); } @Test - public void createReIndexTaskWithNonEmptyStorageResponse_should_invoke_correctMethods() throws ServiceBusException, InterruptedException, NoSuchFieldException, URISyntaxException { + public void createReIndexTaskWithNonEmptyStorageResponse_should_invoke_correctMethods() throws ServiceBusException, InterruptedException, URISyntaxException { Long milliseconds = 8000L; RecordQueryResponse recordQueryResponse = new RecordQueryResponse(); - List<String> res = Arrays.asList("r1","r2","r3"); + List<String> res = Arrays.asList("r1", "r2", "r3"); recordQueryResponse.setResults(res); when(dpsHeaders.getPartitionIdWithFallbackToAccountId()).thenReturn(partitionId); when(dpsHeaders.getCorrelationId()).thenReturn(correlationId); @@ -131,9 +134,9 @@ public class IndexerQueueTaskBuilderAzureTest { sut.createReIndexTask(payload, milliseconds, dpsHeaders); - verify(requestInfo,times(1)).checkOrGetAuthorizationHeader(); + verify(requestInfo, times(1)).checkOrGetAuthorizationHeader(); verify(dpsHeaders, times(1)).put(AUTHORIZATION, authorisedHeader); - verify(storageService,times(1)).getRecordsByKind(any()); + verify(storageService, times(1)).getRecordsByKind(any()); verify(dpsHeaders, times(6)).getPartitionIdWithFallbackToAccountId(); verify(dpsHeaders, times(3)).getCorrelationId(); verify(dpsHeaders, times(2)).addCorrelationIdIfMissing(); @@ -141,7 +144,31 @@ public class IndexerQueueTaskBuilderAzureTest { } @Test - public void createReIndexTaskWithCountdown_should_invoke_correctMethods() throws ServiceBusException, InterruptedException, NoSuchFieldException, URISyntaxException { + public void createReIndexTaskWithNonEmptyStorageResponse_1KBatch_should_invoke_correctMethods() throws ServiceBusException, InterruptedException, URISyntaxException { + Long milliseconds = 8000L; + RecordQueryResponse recordQueryResponse = new RecordQueryResponse(); + List<String> res = Arrays.asList("r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39", "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47", "r48", "r49", "r50", "r51", "r52", "r53", "r54", "r55", "r56", "r57", "r58", "r59", "r60", "r61", "r62", "r63", "r64", "r65", "r66", "r67", "r68", "r69", "r70", "r71", "r72", "r73", "r74", "r75", "r76", "r77", "r78", "r79", "r80", "r81", "r82", "r83", "r84", "r85", "r86", "r87", "r88", "r89", "r90", "r91", "r92", "r93", "r94", "r95", "r96", "r97", "r98", "r99", "r100", "r101", "r102", "r103", "r104", "r105", "r106", "r107", "r108", "r109", "r110", "r111", "r112", "r113", "r114", "r115", "r116", "r117", "r118", "r119", "r120", "r121", "r122", "r123", "r124", "r125", "r126", "r127", "r128", "r129", "r130", "r131", "r132", "r133", "r134", "r135", "r136", "r137", "r138", "r139", "r140", "r141", "r142", "r143", "r144", "r145", "r146", "r147", "r148", "r149", "r150", "r151", "r152", "r153", "r154", "r155", "r156", "r157", "r158", "r159", "r160", "r161", "r162", "r163", "r164", "r165", "r166", "r167", "r168", "r169", "r170", "r171", "r172", "r173", "r174", "r175", "r176", "r177", "r178", "r179", "r180", "r181", "r182", "r183", "r184", "r185", "r186", "r187", "r188", "r189", "r190", "r191", "r192", "r193", "r194", "r195", "r196", "r197", "r198", "r199", "r200", "r201", "r202", "r203", "r204", "r205", "r206", "r207", "r208", "r209", "r210", "r211", "r212", "r213", "r214", "r215", "r216", "r217", "r218", "r219", "r220", "r221", "r222", "r223", "r224", "r225", "r226", "r227", "r228", "r229", "r230", "r231", "r232", "r233", "r234", "r235", "r236", "r237", "r238", "r239", "r240", "r241", "r242", "r243", "r244", "r245", "r246", "r247", "r248", "r249", "r250", "r251", "r252", "r253", "r254", "r255", "r256", "r257", "r258", "r259", "r260", "r261", "r262", "r263", "r264", "r265", "r266", "r267", "r268", "r269", "r270", "r271", "r272", "r273", "r274", "r275", "r276", "r277", "r278", "r279", "r280", "r281", "r282", "r283", "r284", "r285", "r286", "r287", "r288", "r289", "r290", "r291", "r292", "r293", "r294", "r295", "r296", "r297", "r298", "r299", "r300", "r301", "r302", "r303", "r304", "r305", "r306", "r307", "r308", "r309", "r310", "r311", "r312", "r313", "r314", "r315", "r316", "r317", "r318", "r319", "r320", "r321", "r322", "r323", "r324", "r325", "r326", "r327", "r328", "r329", "r330", "r331", "r332", "r333", "r334", "r335", "r336", "r337", "r338", "r339", "r340", "r341", "r342", "r343", "r344", "r345", "r346", "r347", "r348", "r349", "r350", "r351", "r352", "r353", "r354", "r355", "r356", "r357", "r358", "r359", "r360", "r361", "r362", "r363", "r364", "r365", "r366", "r367", "r368", "r369", "r370", "r371", "r372", "r373", "r374", "r375", "r376", "r377", "r378", "r379", "r380", "r381", "r382", "r383", "r384", "r385", "r386", "r387", "r388", "r389", "r390", "r391", "r392", "r393", "r394", "r395", "r396", "r397", "r398", "r399", "r400", "r401", "r402", "r403", "r404", "r405", "r406", "r407", "r408", "r409", "r410", "r411", "r412", "r413", "r414", "r415", "r416", "r417", "r418", "r419", "r420", "r421", "r422", "r423", "r424", "r425", "r426", "r427", "r428", "r429", "r430", "r431", "r432", "r433", "r434", "r435", "r436", "r437", "r438", "r439", "r440", "r441", "r442", "r443", "r444", "r445", "r446", "r447", "r448", "r449", "r450", "r451", "r452", "r453", "r454", "r455", "r456", "r457", "r458", "r459", "r460", "r461", "r462", "r463", "r464", "r465", "r466", "r467", "r468", "r469", "r470", "r471", "r472", "r473", "r474", "r475", "r476", "r477", "r478", "r479", "r480", "r481", "r482", "r483", "r484", "r485", "r486", "r487", "r488", "r489", "r490", "r491", "r492", "r493", "r494", "r495", "r496", "r497", "r498", "r499", "r500", "r501", "r502", "r503", "r504", "r505", "r506", "r507", "r508", "r509", "r510", "r511", "r512", "r513", "r514", "r515", "r516", "r517", "r518", "r519", "r520", "r521", "r522", "r523", "r524", "r525", "r526", "r527", "r528", "r529", "r530", "r531", "r532", "r533", "r534", "r535", "r536", "r537", "r538", "r539", "r540", "r541", "r542", "r543", "r544", "r545", "r546", "r547", "r548", "r549", "r550", "r551", "r552", "r553", "r554", "r555", "r556", "r557", "r558", "r559", "r560", "r561", "r562", "r563", "r564", "r565", "r566", "r567", "r568", "r569", "r570", "r571", "r572", "r573", "r574", "r575", "r576", "r577", "r578", "r579", "r580", "r581", "r582", "r583", "r584", "r585", "r586", "r587", "r588", "r589", "r590", "r591", "r592", "r593", "r594", "r595", "r596", "r597", "r598", "r599", "r600", "r601", "r602", "r603", "r604", "r605", "r606", "r607", "r608", "r609", "r610", "r611", "r612", "r613", "r614", "r615", "r616", "r617", "r618", "r619", "r620", "r621", "r622", "r623", "r624", "r625", "r626", "r627", "r628", "r629", "r630", "r631", "r632", "r633", "r634", "r635", "r636", "r637", "r638", "r639", "r640", "r641", "r642", "r643", "r644", "r645", "r646", "r647", "r648", "r649", "r650", "r651", "r652", "r653", "r654", "r655", "r656", "r657", "r658", "r659", "r660", "r661", "r662", "r663", "r664", "r665", "r666", "r667", "r668", "r669", "r670", "r671", "r672", "r673", "r674", "r675", "r676", "r677", "r678", "r679", "r680", "r681", "r682", "r683", "r684", "r685", "r686", "r687", "r688", "r689", "r690", "r691", "r692", "r693", "r694", "r695", "r696", "r697", "r698", "r699", "r700", "r701", "r702", "r703", "r704", "r705", "r706", "r707", "r708", "r709", "r710", "r711", "r712", "r713", "r714", "r715", "r716", "r717", "r718", "r719", "r720", "r721", "r722", "r723", "r724", "r725", "r726", "r727", "r728", "r729", "r730", "r731", "r732", "r733", "r734", "r735", "r736", "r737", "r738", "r739", "r740", "r741", "r742", "r743", "r744", "r745", "r746", "r747", "r748", "r749", "r750", "r751", "r752", "r753", "r754", "r755", "r756", "r757", "r758", "r759", "r760", "r761", "r762", "r763", "r764", "r765", "r766", "r767", "r768", "r769", "r770", "r771", "r772", "r773", "r774", "r775", "r776", "r777", "r778", "r779", "r780", "r781", "r782", "r783", "r784", "r785", "r786", "r787", "r788", "r789", "r790", "r791", "r792", "r793", "r794", "r795", "r796", "r797", "r798", "r799", "r800", "r801", "r802", "r803", "r804", "r805", "r806", "r807", "r808", "r809", "r810", "r811", "r812", "r813", "r814", "r815", "r816", "r817", "r818", "r819", "r820", "r821", "r822", "r823", "r824", "r825", "r826", "r827", "r828", "r829", "r830", "r831", "r832", "r833", "r834", "r835", "r836", "r837", "r838", "r839", "r840", "r841", "r842", "r843", "r844", "r845", "r846", "r847", "r848", "r849", "r850", "r851", "r852", "r853", "r854", "r855", "r856", "r857", "r858", "r859", "r860", "r861", "r862", "r863", "r864", "r865", "r866", "r867", "r868", "r869", "r870", "r871", "r872", "r873", "r874", "r875", "r876", "r877", "r878", "r879", "r880", "r881", "r882", "r883", "r884", "r885", "r886", "r887", "r888", "r889", "r890", "r891", "r892", "r893", "r894", "r895", "r896", "r897", "r898", "r899", "r900", "r901", "r902", "r903", "r904", "r905", "r906", "r907", "r908", "r909", "r910", "r911", "r912", "r913", "r914", "r915", "r916", "r917", "r918", "r919", "r920", "r921", "r922", "r923", "r924", "r925", "r926", "r927", "r928", "r929", "r930", "r931", "r932", "r933", "r934", "r935", "r936", "r937", "r938", "r939", "r940", "r941", "r942", "r943", "r944", "r945", "r946", "r947", "r948", "r949", "r950", "r951", "r952", "r953", "r954", "r955", "r956", "r957", "r958", "r959", "r960", "r961", "r962", "r963", "r964", "r965", "r966", "r967", "r968", "r969", "r970", "r971", "r972", "r973", "r974", "r975", "r976", "r977", "r978", "r979", "r980", "r981", "r982", "r983", "r984", "r985", "r986", "r987", "r988", "r989", "r990", "r991", "r992", "r993", "r994", "r995", "r996", "r997", "r998", "r999", "r1000"); + recordQueryResponse.setResults(res); + when(dpsHeaders.getPartitionIdWithFallbackToAccountId()).thenReturn(partitionId); + when(dpsHeaders.getCorrelationId()).thenReturn(correlationId); + when(dpsHeaders.getPartitionId()).thenReturn(partitionId); + when(requestInfo.checkOrGetAuthorizationHeader()).thenReturn(authorisedHeader); + when(storageService.getRecordsByKind(any())).thenReturn(recordQueryResponse); + ReflectionTestUtils.setField(sut, serviceBusReindexTopicNameField, serviceBusReindexTopicNameValue); + + sut.createReIndexTask(payload, milliseconds, dpsHeaders); + + verify(requestInfo, times(1)).checkOrGetAuthorizationHeader(); + verify(dpsHeaders, times(1)).put(AUTHORIZATION, authorisedHeader); + verify(storageService, times(1)).getRecordsByKind(any()); + verify(dpsHeaders, times(120)).getPartitionIdWithFallbackToAccountId(); + verify(dpsHeaders, times(60)).getCorrelationId(); + verify(dpsHeaders, times(21)).addCorrelationIdIfMissing(); + verify(topicClientFactory, times(20)).getClient(partitionId, serviceBusReindexTopicNameValue); + } + + @Test + public void createReIndexTaskWithCountdown_should_invoke_correctMethods() throws URISyntaxException { Long milliseconds = 8000L; RecordQueryResponse recordQueryResponse = new RecordQueryResponse(); when(requestInfo.checkOrGetAuthorizationHeader()).thenReturn(authorisedHeader); @@ -150,9 +177,9 @@ public class IndexerQueueTaskBuilderAzureTest { sut.createReIndexTask(payload, milliseconds, dpsHeaders); - verify(requestInfo,times(1)).checkOrGetAuthorizationHeader(); + verify(requestInfo, times(1)).checkOrGetAuthorizationHeader(); verify(dpsHeaders, times(1)).put(AUTHORIZATION, authorisedHeader); - verify(storageService,times(1)).getRecordsByKind(any()); + verify(storageService, times(1)).getRecordsByKind(any()); verify(dpsHeaders, times(1)).addCorrelationIdIfMissing(); } } diff --git a/provider/indexer-gc/docs/anthos/README.md b/provider/indexer-gc/docs/anthos/README.md index 70276024394e1452e3380c89cefc0e2603ea66df..9800216a3e1cdb6ccc86f5537f108206e179dfd2 100644 --- a/provider/indexer-gc/docs/anthos/README.md +++ b/provider/indexer-gc/docs/anthos/README.md @@ -49,7 +49,7 @@ Note that properties can be set in Partition as `sensitive` in that case in prop This variable should be present in environment of service that need that variable. Example: -``` +```json "elasticsearch.port": { "sensitive": false, <- value not sensitive "value": "9243" <- will be used as is. @@ -60,6 +60,17 @@ Example: } ``` +## Indexer account configuration +Google cloud OSDU platform doesn't use a single Tenant account which provides access to all groups for each service, +instead, separate accounts should be used. But the Indexer should have access to all data groups, no matter when they were created. +To achieve that add an Indexer account to the partition configuration: +```json + "indexer.service.account": { + "sensitive": false, + "value": "indexer@service.local" + } +``` +Related issue: https://community.opengroup.org/osdu/platform/system/storage/-/issues/153 ## Elasticsearch configuration diff --git a/provider/indexer-gc/docs/gc/README.md b/provider/indexer-gc/docs/gc/README.md index 7c390dea4b1046123997f174c8f41165c90c53e4..8edb09a7137f11a0a93a89ffab304faa2a81e472 100644 --- a/provider/indexer-gc/docs/gc/README.md +++ b/provider/indexer-gc/docs/gc/README.md @@ -9,8 +9,8 @@ Must have: | name | value | description | sensitive? | source | |----------------------------------------------|---------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|---------------------------------------------------| | `SPRING_PROFILES_ACTIVE` | ex `gcp` | Spring profile that activate default configuration for Google Cloud environment | false | - | -| `<ELASTICSEARCH_USER_ENV_VARIABLE_NAME>` | ex `user` | Elasticsearch user, name of that variable not defined at the service level, the name will be received through partition service. Each tenant can have it's own ENV name value, and it must be present in ENV of Indexer service, see [Partition properties set](#Properties-set-in-Partition-service) | yes | - | -| `<ELASTICSEARCH_PASSWORD_ENV_VARIABLE_NAME>` | ex `password` | Elasticsearch password, name of that variable not defined at the service level, the name will be received through partition service. Each tenant can have it's own ENV name value, and it must be present in ENV of Indexer service, see [Partition properties set](#Properties-set-in-Partition-service) | false | - | +| `<ELASTICSEARCH_USER_ENV_VARIABLE_NAME>` | ex `user` | Elasticsearch user, name of that variable not defined at the service level, the name will be received through partition service. Each tenant can have it's own ENV name value, and it must be present in ENV of Indexer service, see [Partition properties set](#properties-set-in-partition-service) | yes | - | +| `<ELASTICSEARCH_PASSWORD_ENV_VARIABLE_NAME>` | ex `password` | Elasticsearch password, name of that variable not defined at the service level, the name will be received through partition service. Each tenant can have it's own ENV name value, and it must be present in ENV of Indexer service, see [Partition properties set](#properties-set-in-partition-service) | false | - | Defined in default application property file but possible to override: @@ -27,7 +27,6 @@ Defined in default application property file but possible to override: | `PARTITION_HOST` | ex `https://partition.com` | Partition host | no | output of infrastructure deployment | | `ENTITLEMENTS_HOST` | ex `https://entitlements.com` | Entitlements host | no | output of infrastructure deployment | | `STORAGE_HOST` | ex `https://storage.com` | Storage host | no | output of infrastructure deployment | -| `INDEXER_QUEUE_HOST` | ex `http://indexer-queue/api/indexer-queue/v1/_dps/task-handlers/enqueue` | Indexer-Queue host endpoint used for reprocessing tasks | no | output of infrastructure deployment | | `SCHEMA_BASE_HOST` | ex `https://schema.com` | Schema service host | no | output of infrastructure deployment | | `GOOGLE_APPLICATION_CREDENTIALS` | ex `/path/to/directory/service-key.json` | Service account credentials, you only need this if running locally | yes | <https://console.cloud.google.com/iam-admin/serviceaccounts> | @@ -62,9 +61,9 @@ It is possible, but not necessary to adjust consumer throughput via Partition se *MID* - for consumers with the average load, defaults(streams = 2, threads = 2, outstanding elements = 40) *MAX* - for maximum loaded consumers, defaults(streams = 2, threads = 5, outstanding elements = 100) -https://community.opengroup.org/osdu/platform/system/lib/cloud/gcp/oqm/-/blob/master/src/main/java/org/opengroup/osdu/core/gcp/oqm/driver/pubsub/config/PsThroughputConfiguration.java +<https://community.opengroup.org/osdu/platform/system/lib/cloud/gcp/oqm/-/blob/master/src/main/java/org/opengroup/osdu/core/gcp/oqm/driver/pubsub/config/PsThroughputConfiguration.java> -``` +```json "max.sub.parallel.streams": { "sensitive": false, "value": 2 @@ -79,7 +78,6 @@ https://community.opengroup.org/osdu/platform/system/lib/cloud/gcp/oqm/-/blob/ma } ``` - ### Properties set in Partition service Note that properties can be set in Partition as `sensitive` in that case in property `value` should be present not value itself, but ENV variable name. @@ -87,7 +85,7 @@ This variable should be present in environment of service that need that variabl Example: -``` +```json "elasticsearch.port": { "sensitive": false, <- value not sensitive "value": "9243" <- will be used as is. @@ -100,6 +98,18 @@ Example: There is no hardcode in services, all behaviour defined by sensitivity of property. +## Indexer account configuration +Google cloud OSDU platform doesn't use a single Tenant account which provides access to all groups for each service, +instead, separate accounts should be used. But the Indexer should have access to all data groups, no matter when they were created. +To achieve that add an Indexer account to the partition configuration: +```json + "indexer.service.account": { + "sensitive": false, + "value": "indexer@service.local" + } +``` +Related issue: https://community.opengroup.org/osdu/platform/system/storage/-/issues/153 + ## Elasticsearch configuration **prefix:** `elasticsearch` diff --git a/provider/indexer-gc/pom.xml b/provider/indexer-gc/pom.xml index 48d5ee51792ed554536e3772c4379f31f48898f3..451d58a47610924ac4133b9c4893a4a0ba29d902 100644 --- a/provider/indexer-gc/pom.xml +++ b/provider/indexer-gc/pom.xml @@ -5,30 +5,45 @@ <parent> <groupId>org.opengroup.osdu.indexer</groupId> <artifactId>indexer-service</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <relativePath>../../pom.xml</relativePath> </parent> <artifactId>indexer-gc</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <name>indexer-gc</name> <description>Indexer Service Google Cloud</description> <packaging>jar</packaging> - <properties> - <os-core-common.version>0.19.0-rc3</os-core-common.version> - </properties> + <dependencyManagement> + <dependencies> + <dependency> + <groupId>com.fasterxml.jackson</groupId> + <artifactId>jackson-bom</artifactId> + <version>2.14.2</version> + <type>pom</type> + <scope>import</scope> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-dependencies</artifactId> + <version>2.7.10</version> + <type>pom</type> + <scope>import</scope> + </dependency> + </dependencies> + </dependencyManagement> <dependencies> <dependency> <groupId>org.opengroup.osdu</groupId> <artifactId>core-lib-gcp</artifactId> - <version>0.19.0-rc7</version> + <version>0.20.0-rc2</version> </dependency> <dependency> <groupId>org.opengroup.osdu.indexer</groupId> <artifactId>indexer-core</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <!-- excluded due to runtime conflict with latest core-lib-gcp transient dependencies --> <exclusions> <exclusion> diff --git a/provider/indexer-gc/src/main/java/org/opengroup/osdu/indexer/provider/gcp/IndexerGcpApplication.java b/provider/indexer-gc/src/main/java/org/opengroup/osdu/indexer/provider/gcp/IndexerGcpApplication.java index 418959415ebd132ccc18f9c7089169a91f09be3e..f9252594aef24cd48d66d5509cd7d1672bfba863 100644 --- a/provider/indexer-gc/src/main/java/org/opengroup/osdu/indexer/provider/gcp/IndexerGcpApplication.java +++ b/provider/indexer-gc/src/main/java/org/opengroup/osdu/indexer/provider/gcp/IndexerGcpApplication.java @@ -23,8 +23,10 @@ import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.WebApplicationType; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.PropertySource; @SpringBootConfiguration +@PropertySource("classpath:swagger.properties") public class IndexerGcpApplication { public static void main(String[] args) { diff --git a/provider/indexer-gc/src/main/java/org/opengroup/osdu/indexer/provider/gcp/common/cache/CacheConfig.java b/provider/indexer-gc/src/main/java/org/opengroup/osdu/indexer/provider/gcp/common/cache/CacheConfig.java index 7db632b473b5e2c83ef93f662163b7c29b944d15..05757b74681b2c9d8771558200b11355f92619a0 100644 --- a/provider/indexer-gc/src/main/java/org/opengroup/osdu/indexer/provider/gcp/common/cache/CacheConfig.java +++ b/provider/indexer-gc/src/main/java/org/opengroup/osdu/indexer/provider/gcp/common/cache/CacheConfig.java @@ -32,6 +32,10 @@ import org.springframework.context.annotation.Configuration; @RequiredArgsConstructor public class CacheConfig { + private final RedisCacheBuilder<String, String> schemaCacheBuilder; + private final RedisCacheBuilder<String, ClusterSettings> clusterSettingsCacheBuilder; + private final RedisCacheBuilder<String, Boolean> redisCacheBuilder; + @Bean public ISchemaCache fieldTypeMappingCache(RedisCache<String, String> schemaCache) { return new SchemaCache(schemaCache); @@ -39,8 +43,7 @@ public class CacheConfig { @Bean public RedisCache<String, String> schemaCache(GcpConfigurationProperties appProperties) { - RedisCacheBuilder<String, String> cacheBuilder = new RedisCacheBuilder<>(); - return cacheBuilder.buildRedisCache( + return schemaCacheBuilder.buildRedisCache( appProperties.getRedisSearchHost(), Integer.parseInt(appProperties.getRedisSearchPort()), appProperties.getRedisSearchPassword(), @@ -58,8 +61,7 @@ public class CacheConfig { @Bean public RedisCache<String, ClusterSettings> elasticCache(GcpConfigurationProperties gcpAppServiceConfig) { - RedisCacheBuilder<String, ClusterSettings> cacheBuilder = new RedisCacheBuilder<>(); - return cacheBuilder.buildRedisCache( + return clusterSettingsCacheBuilder.buildRedisCache( gcpAppServiceConfig.getRedisSearchHost(), Integer.parseInt(gcpAppServiceConfig.getRedisSearchPort()), gcpAppServiceConfig.getRedisSearchPassword(), @@ -77,8 +79,7 @@ public class CacheConfig { @Bean public RedisCache<String, Boolean> redisCache(GcpConfigurationProperties gcpAppServiceConfig) { - RedisCacheBuilder<String, Boolean> cacheBuilder = new RedisCacheBuilder<>(); - return cacheBuilder.buildRedisCache( + return redisCacheBuilder.buildRedisCache( gcpAppServiceConfig.getRedisSearchHost(), Integer.parseInt(gcpAppServiceConfig.getRedisSearchPort()), gcpAppServiceConfig.getRedisSearchPassword(), diff --git a/provider/indexer-gc/src/main/java/org/opengroup/osdu/indexer/provider/gcp/common/publish/ReprocessingTaskPublisher.java b/provider/indexer-gc/src/main/java/org/opengroup/osdu/indexer/provider/gcp/common/publish/ReprocessingTaskPublisher.java index 4caa625e53d6687f4362c6892182dae7f2676407..5a1efac6f08a34ae3f32ccbd2b1adb6a3abb335f 100644 --- a/provider/indexer-gc/src/main/java/org/opengroup/osdu/indexer/provider/gcp/common/publish/ReprocessingTaskPublisher.java +++ b/provider/indexer-gc/src/main/java/org/opengroup/osdu/indexer/provider/gcp/common/publish/ReprocessingTaskPublisher.java @@ -1,6 +1,6 @@ /* - * Copyright 2020-2022 Google LLC - * Copyright 2020-2022 EPAM Systems, Inc + * Copyright 2020-2023 Google LLC + * Copyright 2020-2023 EPAM Systems, Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,19 +17,18 @@ package org.opengroup.osdu.indexer.provider.gcp.common.publish; -import static org.opengroup.osdu.core.common.Constants.REINDEX_RELATIVE_URL; -import static org.opengroup.osdu.core.common.Constants.WORKER_RELATIVE_URL; - import com.google.gson.Gson; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; import javax.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; import org.opengroup.osdu.core.common.model.http.DpsHeaders; import org.opengroup.osdu.core.common.model.search.RecordChangedMessages; -import org.opengroup.osdu.core.common.model.tenant.TenantInfo; import org.opengroup.osdu.core.gcp.oqm.driver.OqmDriver; import org.opengroup.osdu.core.gcp.oqm.model.OqmDestination; import org.opengroup.osdu.core.gcp.oqm.model.OqmMessage; @@ -47,9 +46,9 @@ public class ReprocessingTaskPublisher extends IndexerQueueTaskBuilder { private final Gson gson = new Gson(); - private final OqmDriver driver; + private final ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); - private final TenantInfo tenantInfo; + private final OqmDriver driver; private final IndexerMessagingConfigProperties properties; @@ -64,23 +63,54 @@ public class ReprocessingTaskPublisher extends IndexerQueueTaskBuilder { } public void createWorkerTask(String payload, DpsHeaders headers) { - publishRecordsChangedTask(WORKER_RELATIVE_URL, payload, 0l, headers); + publishRecordsChangedTask(payload, headers); } public void createWorkerTask(String payload, Long countdownMillis, DpsHeaders headers) { - publishRecordsChangedTask(WORKER_RELATIVE_URL, payload, countdownMillis, headers); + DpsHeaders headersCopy = DpsHeaders.createFromMap(headers.getHeaders()); + scheduledExecutorService.schedule( + () -> { + try { + publishRecordsChangedTask(payload, headersCopy); + } catch (Exception e) { + // If error or exception not caught, executor will die out silently. + log.error("The exception was thrown during scheduled event publishing!", e); + throw e; + } catch (Throwable e) { + log.error("The Error was thrown during scheduled event publishing!", e); + throw e; + } + }, + countdownMillis, + TimeUnit.MILLISECONDS + ); } public void createReIndexTask(String payload, DpsHeaders headers) { - publishReindexTask(REINDEX_RELATIVE_URL, payload, 0l, headers); + publishReindexTask(payload, headers); } public void createReIndexTask(String payload, Long countdownMillis, DpsHeaders headers) { - publishReindexTask(REINDEX_RELATIVE_URL, payload, countdownMillis, headers); + DpsHeaders headersCopy = DpsHeaders.createFromMap(headers.getHeaders()); + scheduledExecutorService.schedule( + () -> { + try { + publishReindexTask(payload, headersCopy); + } catch (Exception e) { + // If error or exception not caught, executor will die out silently. + log.error("The exception was thrown during scheduled event publishing!", e); + throw e; + } catch (Throwable e) { + log.error("The Error was thrown during scheduled event publishing!", e); + throw e; + } + }, + countdownMillis, + TimeUnit.MILLISECONDS + ); } - private void publishReindexTask(String url, String payload, Long countdownMillis, - DpsHeaders headers) { + private void publishReindexTask(String payload, DpsHeaders headers) { OqmDestination oqmDestination = OqmDestination.builder().partitionId(headers.getPartitionId()) .build(); Map<String, String> attributes = getAttributesFromHeaders(headers); @@ -89,8 +119,7 @@ public class ReprocessingTaskPublisher extends IndexerQueueTaskBuilder { driver.publish(oqmMessage, reprocessOqmTopic, oqmDestination); } - private void publishRecordsChangedTask(String url, String payload, Long countdownMillis, - DpsHeaders headers) { + private void publishRecordsChangedTask(String payload, DpsHeaders headers) { OqmDestination oqmDestination = OqmDestination.builder() .partitionId(headers.getPartitionId()) .build(); @@ -112,7 +141,7 @@ public class ReprocessingTaskPublisher extends IndexerQueueTaskBuilder { private Map<String, String> getAttributesFromHeaders(DpsHeaders headers) { Map<String, String> attributes = new HashMap<>(); attributes.put(DpsHeaders.USER_EMAIL, headers.getUserEmail()); - attributes.put(DpsHeaders.ACCOUNT_ID, this.tenantInfo.getName()); + attributes.put(DpsHeaders.ACCOUNT_ID, headers.getPartitionId()); attributes.put(DpsHeaders.DATA_PARTITION_ID, headers.getPartitionIdWithFallbackToAccountId()); headers.addCorrelationIdIfMissing(); attributes.put(DpsHeaders.CORRELATION_ID, headers.getCorrelationId()); diff --git a/provider/indexer-gc/src/main/java/org/opengroup/osdu/indexer/provider/gcp/indexing/processing/IndexerOqmMessageReceiver.java b/provider/indexer-gc/src/main/java/org/opengroup/osdu/indexer/provider/gcp/indexing/processing/IndexerOqmMessageReceiver.java index 973372f431e5d29c333affcd43932736132dbe16..82204d3e02aacd6b1b8f3d511c0272e9c2d25985 100644 --- a/provider/indexer-gc/src/main/java/org/opengroup/osdu/indexer/provider/gcp/indexing/processing/IndexerOqmMessageReceiver.java +++ b/provider/indexer-gc/src/main/java/org/opengroup/osdu/indexer/provider/gcp/indexing/processing/IndexerOqmMessageReceiver.java @@ -1,6 +1,6 @@ /* - * Copyright 2020-2022 Google LLC - * Copyright 2020-2022 EPAM Systems, Inc + * Copyright 2020-2023 Google LLC + * Copyright 2020-2023 EPAM Systems, Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ package org.opengroup.osdu.indexer.provider.gcp.indexing.processing; import com.google.common.base.Strings; -import java.io.IOException; + import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -42,60 +42,73 @@ public abstract class IndexerOqmMessageReceiver implements OqmMessageReceiver { @Override public void receiveMessage(OqmMessage oqmMessage, OqmAckReplier oqmAckReplier) { - log.info("OQM message: {} - {} - {}", oqmMessage.getId(), oqmMessage.getData(), - oqmMessage.getAttributes()); - boolean acked = false; + log.info("OQM message: {} - {} - {}", oqmMessage.getId(), oqmMessage.getData(), oqmMessage.getAttributes()); + if (!validInput(oqmMessage)) { + log.error("Not valid event payload, event will not be processed."); + oqmAckReplier.ack(); + return; + } + try { - if (!validInput(oqmMessage)) { - log.warn("Not valid event payload, event will not be processed."); - oqmAckReplier.ack(); - return; - } DpsHeaders headers = getHeaders(oqmMessage); // Filling thread context required by the core services. dpsHeaders.setThreadContext(headers.getHeaders()); sendMessage(oqmMessage); - acked = true; + oqmAckReplier.ack(); } catch (AppException appException) { int statusCode = appException.getError().getCode(); if (statusCode > 199 && statusCode < 300 && statusCode != RequestStatus.INVALID_RECORD) { - log.info( - "Event id : " + oqmMessage.getId() + ", was not processed, and will NOT be rescheduled.", - appException - ); - acked = true; + skipMessage(oqmMessage, dpsHeaders, oqmAckReplier, appException); } else { - //It is possible to get both AppException with wrapped in original Exception or the original Exception without any wrapper - Exception exception = Optional.ofNullable(appException.getOriginalException()).orElse(appException); - log.warn( - "Event id : " + oqmMessage.getId() + ", was not processed, and will BE rescheduled.", - exception - ); + rescheduleMessage(oqmMessage, dpsHeaders, oqmAckReplier, getException(appException)); } } catch (Exception exception) { + rescheduleMessage(oqmMessage, dpsHeaders, oqmAckReplier, exception); + } catch (Throwable e) { + //Catching throwable is necessary, otherwise, errors like NoSuchMethodError will slip through silently. log.error( - "Event id : " + oqmMessage.getId() + ", was not processed, and will BE rescheduled.", - exception - ); + "HALT! Unrecoverable malfunction! Unexpected error was thrown during processing! Event ID: " + + oqmMessage.getId() + ". Correlation ID: " + dpsHeaders.getCorrelationId(), e); + throw e; } finally { - if (!acked) { - oqmAckReplier.nack(); - } else { - oqmAckReplier.ack(); - } // Cleaning thread context after processing is finished and the thread dies out. ThreadScopeContextHolder.currentThreadScopeAttributes().clear(); } } + private static void skipMessage(OqmMessage oqmMessage, DpsHeaders dpsHeaders, + OqmAckReplier oqmAckReplier, AppException appException) { + log.info( + "Event ID: " + oqmMessage.getId() + ". Correlation ID: " + dpsHeaders.getCorrelationId() + + ", was not processed, and will NOT be rescheduled.", appException); + oqmAckReplier.ack(); + } + + private static void rescheduleMessage(OqmMessage oqmMessage, DpsHeaders dpsHeaders, + OqmAckReplier oqmAckReplier, Exception exception) { + log.error( + "Event id : " + oqmMessage.getId() + ". Correlation ID: " + dpsHeaders.getCorrelationId() + + ", was not processed, and will BE rescheduled.", exception); + oqmAckReplier.nack(); + } + + /** + * It is possible to get both AppException with wrapped in original Exception + * or the original Exception without any wrapper. + */ + @NotNull + private static Exception getException(AppException appException) { + return Optional.ofNullable(appException.getOriginalException()).orElse(appException); + } + private boolean validInput(OqmMessage oqmMessage) { boolean isValid = true; if (Strings.isNullOrEmpty(oqmMessage.getData()) || oqmMessage.getData().equals("{}")) { - log.warn("Message body is empty, message id: {}, attributes: {}", oqmMessage.getId(), oqmMessage.getAttributes()); + log.error("Message body is empty, message id: {}, attributes: {}", oqmMessage.getId(), oqmMessage.getAttributes()); isValid = false; } if (oqmMessage.getAttributes() == null || oqmMessage.getAttributes().size() == 0) { - log.warn("Attribute map not found, message id: {}, attributes: {}", oqmMessage.getId(), oqmMessage.getAttributes()); + log.error("Attribute map not found, message id: {}, attributes: {}", oqmMessage.getId(), oqmMessage.getAttributes()); isValid = false; } return isValid; diff --git a/provider/indexer-gc/src/main/resources/application.properties b/provider/indexer-gc/src/main/resources/application.properties index 721d5d180b4acc19d9ac61a0c525a5683980c8c4..c9933e687eea8a33965f8e35ee19945d6c8a7baa 100644 --- a/provider/indexer-gc/src/main/resources/application.properties +++ b/provider/indexer-gc/src/main/resources/application.properties @@ -24,7 +24,7 @@ cron-empty-index-cleanup-threshold-days=7 DEFAULT_DATA_COUNTRY=US gae-service=indexer security.https.certificate.trust=false -storage-records-by-kind-batch-size=20 +storage-records-by-kind-batch-size=1000 storage-records-batch-size=20 REDIS_SEARCH_PORT=6379 @@ -54,4 +54,3 @@ records-changed-topic-name=records-changed schema-changed-topic-name=schema-changed reprocess-topic-name=reprocess status-changed-topic-name=indexing-progress - diff --git a/provider/indexer-gc/src/test/java/org/opengroup/osdu/indexer/service/IndexCopyServiceImplTest.java b/provider/indexer-gc/src/test/java/org/opengroup/osdu/indexer/service/IndexCopyServiceImplTest.java deleted file mode 100644 index 7b26ad8a3a283adb917ffc00c41dd27d58f40b1a..0000000000000000000000000000000000000000 --- a/provider/indexer-gc/src/test/java/org/opengroup/osdu/indexer/service/IndexCopyServiceImplTest.java +++ /dev/null @@ -1,189 +0,0 @@ -// Copyright 2017-2019, Schlumberger -// -// 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. - -package org.opengroup.osdu.indexer.service; - -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; - -import org.apache.http.HttpEntity; -import org.apache.http.util.EntityUtils; -import org.elasticsearch.client.Request; -import org.elasticsearch.client.Response; -import org.elasticsearch.client.RestClient; -import org.elasticsearch.client.RestHighLevelClient; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentMatchers; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.opengroup.osdu.core.common.model.search.ClusterSettings; -import org.opengroup.osdu.core.common.model.http.DpsHeaders; -import org.opengroup.osdu.core.common.model.http.AppException; -import org.opengroup.osdu.indexer.logging.AuditLogger; -import org.opengroup.osdu.core.common.provider.interfaces.IRequestInfo; -import org.opengroup.osdu.core.common.model.indexer.IElasticSettingService; -import org.opengroup.osdu.indexer.util.ElasticClientHandler; -import org.opengroup.osdu.core.common.search.ElasticIndexNameResolver; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.springframework.test.context.junit4.SpringRunner; - -import java.io.IOException; -import java.lang.reflect.Type; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -import static org.junit.Assert.fail; -import static org.mockito.Mockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; - -@RunWith(SpringRunner.class) -@PrepareForTest({RestHighLevelClient.class, Response.class, RestClient.class, HttpEntity.class, EntityUtils.class}) -public class IndexCopyServiceImplTest { - private final String correlationId = UUID.randomUUID().toString(); - - @Mock - private HttpEntity httpEntity; - @Mock - private HttpEntity httpEntityRequest; - @Mock - private IRequestInfo requestInfo; - @Mock - private DpsHeaders headersInfo; - @Mock - private RestClient restClient; - @Mock - private RestHighLevelClient restHighLevelClient; - @Mock - private IndicesService indicesService; - @Mock - private IMappingService mappingService; - @Mock - private ElasticClientHandler elasticClientHandler; - @Mock - private ElasticIndexNameResolver elasticIndexNameResolver; - @Mock - private Response response; - @Mock - private IElasticSettingService elasticSettingService; - @Mock - private AuditLogger auditLogger; - @Mock - private Map<String, String> httpHeaders; - @InjectMocks - private IndexCopyServiceImpl sut; - - private ClusterSettings commonCluster; - - private Map<String, Object> correctMap; - - @Before - public void setup() { - - commonCluster = ClusterSettings.builder().host("commonhost").port(8080).userNameAndPassword("username:pwd").build(); - - httpHeaders = new HashMap<>(); - httpHeaders.put(DpsHeaders.AUTHORIZATION, "testAuth"); - httpHeaders.put(DpsHeaders.CORRELATION_ID, correlationId); - when(requestInfo.getHeadersMapWithDwdAuthZ()).thenReturn(httpHeaders); - when(response.getEntity()).thenReturn(httpEntity); - - Type mapType = new TypeToken<Map<String, Object>>() {}.getType(); - String afterFormat = "{\"properties\":{\"id\":{\"type\":\"keyword\"}}}"; - correctMap = new Gson().fromJson(afterFormat, mapType); - - restHighLevelClient = mock(RestHighLevelClient.class); - - } - - @Test(expected = IOException.class) - public void should_throwIOException_when_indexMappingNotFound() throws Exception { - IOException exception = new IOException("Fail to get mapping for the given index from common cluster."); - - when(this.mappingService.getIndexMapping(ArgumentMatchers.any(), ArgumentMatchers.any())).thenThrow(exception); - - this.sut.copyIndex("common:metadata:entity:1.0.0"); - } - - @Test(expected = IllegalArgumentException.class) - public void should_throwIllegalArgExceptionCopyIndexRequest_copyIndexTest() { - try { - this.sut.copyIndex(null); - } catch (IOException e) { - fail("Should not throw IOException but illegalArgumentException."); - } - } - - @Test - public void should_returnIndexMapping_getIndexMappingFromCommonClustertest() { - String mappingJson = "{\"common-metadata-entity-1.0.0\":{\"mappings\":{\"entity\":{\"properties\":{\"id\":{\"type\":\"keyword\"}}}}}}"; - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - try { - when(this.mappingService.getIndexMapping(ArgumentMatchers.any(), ArgumentMatchers.any())).thenReturn(mappingJson); - Map<String, Object> resultMap = this.sut.getIndexMappingsFromCommonCluster("test", "test"); - Assert.assertEquals(resultMap, correctMap); - } catch (Exception ignored) { - } - } - - @Test - public void should_returnClusterInfo_getCommonClusterInformationtest() { - try { - String[] correctCommonCluster = {"https://commonhost:8080", "username", "pwd"}; - - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - - when(elasticSettingService.getElasticClusterInformation()).thenReturn(commonCluster); - - String[] resultCommonCluster = this.sut.getCommonClusterInformation(); - Assert.assertEquals(correctCommonCluster[0], resultCommonCluster[0]); - Assert.assertEquals(correctCommonCluster[1], resultCommonCluster[1]); - Assert.assertEquals(correctCommonCluster[2], resultCommonCluster[2]); - } catch (IOException ignored) { - fail("Should not throw this exception " + ignored.getMessage()); - } - } - - @Test(expected = AppException.class) - public void should_throwException_failToCreateIndexInTenantCluster_createIndexInTenantClustertest() { - try { - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - when(indicesService.createIndex(ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any())).thenReturn(false); - this.sut.createIndexInTenantCluster("test", "test", "test", correctMap); - } catch (IOException ignored) { - fail("Should not throw this exception " + ignored.getMessage()); - } - } - - @Ignore - public void should_returnTaskIdResponse_reindexRequestSucceed_reindexInTenantClustertest() { - //TODO: fix the null Response from restHighLevelClient.getLowLevelClient().performRequest(). - try { - String[] correctCommonCluster = {"https://commonhost:8080", "username", "pwd"}; - Request request = new Request("POST", "/_reindex?wait_for_completion=false"); - request.setEntity(httpEntityRequest); - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - when(indicesService.createIndex(ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any())).thenReturn(false); - when(restHighLevelClient.getLowLevelClient()).thenReturn(restClient); - when(restClient.performRequest(request)).thenReturn(response); - when(response.getEntity()).thenReturn(httpEntity); - Assert.assertEquals(httpEntity, this.sut.reindexInTenantCluster("test", "test", correctCommonCluster)); - } catch (IOException ignored) { - } - } -} diff --git a/provider/indexer-gc/src/test/java/org/opengroup/osdu/indexer/service/IndexerMappingServiceTest.java b/provider/indexer-gc/src/test/java/org/opengroup/osdu/indexer/service/IndexerMappingServiceTest.java index 87dea8ec4ca8573a2b5e588fd13c978816a5898f..4d77b8d4ce9bf63cdca9c36ec0b5cd77a8c0f304 100644 --- a/provider/indexer-gc/src/test/java/org/opengroup/osdu/indexer/service/IndexerMappingServiceTest.java +++ b/provider/indexer-gc/src/test/java/org/opengroup/osdu/indexer/service/IndexerMappingServiceTest.java @@ -1,17 +1,13 @@ package org.opengroup.osdu.indexer.service; import org.apache.http.StatusLine; -import org.elasticsearch.ElasticsearchException; -import org.elasticsearch.action.admin.indices.mapping.get.GetFieldMappingsRequest; -import org.elasticsearch.action.admin.indices.mapping.get.GetFieldMappingsResponse; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; -import org.elasticsearch.action.bulk.BulkItemResponse.Failure; import org.elasticsearch.action.support.master.AcknowledgedResponse; -import org.elasticsearch.client.*; -import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentFactory; -import org.elasticsearch.index.reindex.BulkByScrollResponse; +import org.elasticsearch.client.IndicesClient; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.Response; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestHighLevelClient; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @@ -20,284 +16,104 @@ import org.mockito.ArgumentMatchers; import org.mockito.InjectMocks; import org.mockito.Mock; import org.opengroup.osdu.core.common.model.indexer.IndexSchema; -import org.opengroup.osdu.indexer.service.IndexerMappingServiceImpl; import org.opengroup.osdu.core.common.model.search.RecordMetaAttribute; -import org.opengroup.osdu.core.common.model.http.AppException; -import org.opengroup.osdu.indexer.util.ElasticClientHandler; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.springframework.test.context.junit4.SpringRunner; import java.io.IOException; -import java.util.*; +import java.util.HashMap; +import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; -import static org.mockito.Matchers.any; import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; import static org.powermock.api.mockito.PowerMockito.when; @Ignore @RunWith(SpringRunner.class) -@PrepareForTest({ RestHighLevelClient.class, IndicesClient.class }) +@PrepareForTest({RestHighLevelClient.class, IndicesClient.class}) public class IndexerMappingServiceTest { - private final String kind = "tenant:test:test:1.0.0"; - private final String index = "tenant-test-test-1.0.0"; - private final String type = "test"; - private final String mappingValid = "{\"dynamic\":false,\"properties\":{\"data\":{\"properties\":{\"Location\":{\"type\":\"geo_point\"}}},\"id\":{\"type\":\"keyword\"}}}"; - - @Mock - private RestClient restClient; - @Mock - private Response response; - @Mock - private StatusLine statusLine; - - @InjectMocks - private IndexerMappingServiceImpl sut; - - @Mock - private ElasticClientHandler elasticClientHandler; - - @InjectMocks - private RestHighLevelClient restHighLevelClient; - - @InjectMocks - private IndexSchema indexSchema; - @InjectMocks - private IndicesClient indicesClient; - - @InjectMocks - private AcknowledgedResponse mappingResponse; - - @Before - public void setup() throws IOException { - Map<String, Object> dataMapping = new HashMap<>(); - dataMapping.put("Location", "geo_point"); - Map<String, Object> metaMapping = new HashMap<>(); - metaMapping.put(RecordMetaAttribute.ID.getValue(), "keyword"); - this.indexSchema = IndexSchema.builder().kind(kind).type(type).dataSchema(dataMapping).metaSchema(metaMapping) - .build(); - - this.indicesClient = PowerMockito.mock(IndicesClient.class); - this.restHighLevelClient = PowerMockito.mock(RestHighLevelClient.class); - - when(this.restHighLevelClient.getLowLevelClient()).thenReturn(restClient); - when(this.restClient.performRequest(ArgumentMatchers.any())).thenReturn(response); - when(this.response.getStatusLine()).thenReturn(statusLine); - when(this.statusLine.getStatusCode()).thenReturn(200); - } - - @Test - public void should_returnValidMapping_givenFalseMerge_createMappingTest() { - try { - String mapping = this.sut.createMapping(restHighLevelClient, indexSchema, index, false); - assertEquals(mappingValid, mapping); - } catch (Exception e) { - fail("Should not throw this exception" + e.getMessage()); - } - } - - @Test - public void should_returnValidMapping_givenTrueMerge_createMappingTest() { - try { - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - - String mapping = this.sut.createMapping(this.restHighLevelClient, this.indexSchema, this.index, true); - assertEquals(this.mappingValid, mapping); - } catch (Exception e) { - fail("Should not throw this exception" + e.getMessage()); - } - } - - @Test - public void should_returnValidMapping_givenExistType_createMappingTest() { - try { - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - - IndexerMappingServiceImpl indexerMappingServiceLocal = PowerMockito.spy(new IndexerMappingServiceImpl()); - doReturn(false).when(indexerMappingServiceLocal).isTypeExist(ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any()); - String mapping = this.sut.createMapping(this.restHighLevelClient, this.indexSchema, this.index, true); - assertEquals(this.mappingValid, mapping); - } catch (Exception e) { - fail("Should not throw this exception" + e.getMessage()); - } - } - - @Test - public void should_update_indices_field_with_keyword_when_valid_indices() throws Exception { - try { - Set<String> indices = new HashSet<String>(); - indices.add("indices 1"); - GetFieldMappingsResponse getFieldMappingsResponse = mock(GetFieldMappingsResponse.class); - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - when(this.indicesClient.getFieldMapping(ArgumentMatchers.any(GetFieldMappingsRequest.class), ArgumentMatchers.any())).thenReturn(getFieldMappingsResponse); - XContentBuilder builder = XContentFactory.jsonBuilder(); - builder.startObject(); - builder.field("any field", new HashMap()); - builder.endObject(); - BytesReference bytesReference = BytesReference.bytes(builder); - GetFieldMappingsResponse.FieldMappingMetadata mappingMetaData = new GetFieldMappingsResponse.FieldMappingMetadata(index, bytesReference); - Map<String, GetFieldMappingsResponse.FieldMappingMetadata> mapBuilder = new HashMap<>(); - mapBuilder.put("data.any field", mappingMetaData); - Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>> mappingBuilder = new HashMap<>(); - mappingBuilder.put("any index 1", mapBuilder); - mappingBuilder.put("any index 2", mapBuilder); - Map<String, Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>>> mapping = new HashMap<>(); - mapping.put("indices 1", mappingBuilder); - when(getFieldMappingsResponse.mappings()).thenReturn(mapping); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - BulkByScrollResponse response = mock(BulkByScrollResponse.class); - doReturn(response).when(this.restHighLevelClient).updateByQuery(ArgumentMatchers.any(), ArgumentMatchers.any(RequestOptions.class)); - when(response.getBulkFailures()).thenReturn(new ArrayList<Failure>()); - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - - this.sut.updateIndexMappingForIndicesOfSameType( indices,"any field"); - } catch (Exception e) { - fail("Should not throw this exception" + e.getMessage()); - } - } - - @Test(expected = AppException.class) - public void should_throw_exception_if_someIndex_is_invalid_andWeIndexfield_with_keyword() throws Exception { - try { - Set<String> indices = new HashSet<String>(); - indices.add("invalid 1"); - GetFieldMappingsResponse getFieldMappingsResponse = mock(GetFieldMappingsResponse.class); - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - when(this.indicesClient.getFieldMapping(ArgumentMatchers.any(GetFieldMappingsRequest.class), ArgumentMatchers.any())).thenReturn(getFieldMappingsResponse); - XContentBuilder builder = XContentFactory.jsonBuilder(); - builder.startObject(); - builder.field("any field", new HashMap()); - builder.endObject(); - BytesReference bytesReference = BytesReference.bytes(builder); - GetFieldMappingsResponse.FieldMappingMetadata mappingMetaData = new GetFieldMappingsResponse.FieldMappingMetadata(index, bytesReference); - Map<String, GetFieldMappingsResponse.FieldMappingMetadata> mapBuilder = new HashMap<>(); - mapBuilder.put("data.any field", mappingMetaData); - Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>> mappingBuilder = new HashMap<>(); - mappingBuilder.put("any index 1", mapBuilder); - mappingBuilder.put("any index 2", mapBuilder); - Map<String, Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>>> mapping = new HashMap<>(); - mapping.put("indices 1", mappingBuilder); - when(getFieldMappingsResponse.mappings()).thenReturn(mapping); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - BulkByScrollResponse response = mock(BulkByScrollResponse.class); - doReturn(response).when(this.restHighLevelClient).updateByQuery(ArgumentMatchers.any(), ArgumentMatchers.any(RequestOptions.class)); - when(response.getBulkFailures()).thenReturn(new ArrayList<Failure>()); - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - - this.sut.updateIndexMappingForIndicesOfSameType(indices,"any field"); - } catch (Exception e) { - throw e; - } - } - - @Test(expected = AppException.class) - public void should_throw_exception_if_type_of_index_is_invalid_andWeIndexfield_with_keyword() throws Exception { - try { - Set<String> indices = new HashSet<String>(); - indices.add("indices 1"); - GetFieldMappingsResponse getFieldMappingsResponse = mock(GetFieldMappingsResponse.class); - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - when(this.indicesClient.getFieldMapping(ArgumentMatchers.any(GetFieldMappingsRequest.class), ArgumentMatchers.any())).thenReturn(getFieldMappingsResponse); - XContentBuilder builder = XContentFactory.jsonBuilder(); - builder.startObject(); - builder.field("any field", new HashMap()); - builder.endObject(); - BytesReference bytesReference = BytesReference.bytes(builder); - GetFieldMappingsResponse.FieldMappingMetadata mappingMetaData = new GetFieldMappingsResponse.FieldMappingMetadata(index, bytesReference); - Map<String, GetFieldMappingsResponse.FieldMappingMetadata> mapBuilder = new HashMap<>(); - mapBuilder.put("data.any field", mappingMetaData); - Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>> mappingBuilder = new HashMap<>(); - mappingBuilder.put("any index 1", mapBuilder); - mappingBuilder.put("any index 2", mapBuilder); - Map<String, Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>>> mapping = new HashMap<>(); - mapping.put("indices 1", mappingBuilder); - when(getFieldMappingsResponse.mappings()).thenReturn(mapping); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - BulkByScrollResponse response = mock(BulkByScrollResponse.class); - doReturn(response).when(this.restHighLevelClient).updateByQuery(ArgumentMatchers.any(), ArgumentMatchers.any(RequestOptions.class)); - when(response.getBulkFailures()).thenReturn(new ArrayList<Failure>()); - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - this.sut.updateIndexMappingForIndicesOfSameType(indices,"any field invalid"); - } catch (Exception e) { - throw e; - } - } - - @Test(expected = AppException.class) - public void should_throw_exception_if_elastic_search_failedToFetch_andWeIndexfield_with_keyword() throws Exception { - try { - - Set<String> indices = new HashSet<String>(); - indices.add("indices 1"); - indices.add("indices Invalid"); - GetFieldMappingsResponse getFieldMappingsResponse = mock(GetFieldMappingsResponse.class); - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - when(this.indicesClient.getFieldMapping(ArgumentMatchers.any(GetFieldMappingsRequest.class), ArgumentMatchers.any())).thenThrow(new ElasticsearchException("")); - XContentBuilder builder = XContentFactory.jsonBuilder(); - builder.startObject(); - builder.field("any field", new HashMap()); - builder.endObject(); - BytesReference bytesReference = BytesReference.bytes(builder); - GetFieldMappingsResponse.FieldMappingMetadata mappingMetaData = new GetFieldMappingsResponse.FieldMappingMetadata(index, bytesReference); - Map<String, GetFieldMappingsResponse.FieldMappingMetadata> mapBuilder = new HashMap<>(); - mapBuilder.put("data.any field", mappingMetaData); - Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>> mappingBuilder = new HashMap<>(); - mappingBuilder.put("any index 1", mapBuilder); - mappingBuilder.put("any index 2", mapBuilder); - Map<String, Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>>> mapping = new HashMap<>(); - mapping.put("indices 1", mappingBuilder); - when(getFieldMappingsResponse.mappings()).thenReturn(mapping); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - BulkByScrollResponse response = mock(BulkByScrollResponse.class); - doReturn(response).when(this.restHighLevelClient).updateByQuery(ArgumentMatchers.any(), ArgumentMatchers.any(RequestOptions.class)); - when(response.getBulkFailures()).thenReturn(new ArrayList<Failure>()); - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - this.sut.updateIndexMappingForIndicesOfSameType(indices,"any field"); - } catch (AppException e) { - throw e; - } - } - - @Test(expected = AppException.class) - public void should_throw_exception_when_elastic_failedToIndex_indices_field_with_keyword() { - try { - Set<String> indices = new HashSet<String>(); - indices.add("indices 1"); - indices.add("indices Invalid"); - GetFieldMappingsResponse getFieldMappingsResponse = mock(GetFieldMappingsResponse.class); - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - when(this.indicesClient.getFieldMapping(ArgumentMatchers.any(GetFieldMappingsRequest.class), ArgumentMatchers.any())).thenReturn(getFieldMappingsResponse); - XContentBuilder builder = XContentFactory.jsonBuilder(); - builder.startObject(); - builder.field("any field", new HashMap()); - builder.endObject(); - BytesReference bytesReference = BytesReference.bytes(builder); - GetFieldMappingsResponse.FieldMappingMetadata mappingMetaData = new GetFieldMappingsResponse.FieldMappingMetadata(index, bytesReference); - Map<String, GetFieldMappingsResponse.FieldMappingMetadata> mapBuilder = new HashMap<>(); - mapBuilder.put("data.any field", mappingMetaData); - Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>> mappingBuilder = new HashMap<>(); - mappingBuilder.put("any index 1", mapBuilder); - mappingBuilder.put("any index 2", mapBuilder); - Map<String, Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>>> mapping = new HashMap<>(); - mapping.put("indices 1", mappingBuilder); - when(getFieldMappingsResponse.mappings()).thenReturn(mapping); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - BulkByScrollResponse response = mock(BulkByScrollResponse.class); - doReturn(response).when(this.restHighLevelClient).updateByQuery(ArgumentMatchers.any(), ArgumentMatchers.any(RequestOptions.class)); - when(response.getBulkFailures()).thenReturn(new ArrayList<Failure>()); - when(this.indicesClient.putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class))).thenThrow(new ElasticsearchException("")); - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - this.sut.updateIndexMappingForIndicesOfSameType(indices,"any field"); - } catch (AppException e) { - throw e; - } catch (Exception e) { - fail("Should not throw this exception" + e.getMessage()); - } - } + private final String kind = "tenant:test:test:1.0.0"; + private final String index = "tenant-test-test-1.0.0"; + private final String type = "test"; + private final String mappingValid = "{\"dynamic\":false,\"properties\":{\"data\":{\"properties\":{\"Location\":{\"type\":\"geo_point\"}}},\"id\":{\"type\":\"keyword\"}}}"; + + @Mock + private RestClient restClient; + @Mock + private Response response; + @Mock + private StatusLine statusLine; + + @InjectMocks + private IndexerMappingServiceImpl sut; + + @InjectMocks + private RestHighLevelClient restHighLevelClient; + + @InjectMocks + private IndexSchema indexSchema; + @InjectMocks + private IndicesClient indicesClient; + + @InjectMocks + private AcknowledgedResponse mappingResponse; + + @Before + public void setup() throws IOException { + Map<String, Object> dataMapping = new HashMap<>(); + dataMapping.put("Location", "geo_point"); + Map<String, Object> metaMapping = new HashMap<>(); + metaMapping.put(RecordMetaAttribute.ID.getValue(), "keyword"); + this.indexSchema = IndexSchema.builder().kind(kind).type(type).dataSchema(dataMapping).metaSchema(metaMapping) + .build(); + + this.indicesClient = PowerMockito.mock(IndicesClient.class); + this.restHighLevelClient = PowerMockito.mock(RestHighLevelClient.class); + + when(this.restHighLevelClient.getLowLevelClient()).thenReturn(restClient); + when(this.restClient.performRequest(ArgumentMatchers.any())).thenReturn(response); + when(this.response.getStatusLine()).thenReturn(statusLine); + when(this.statusLine.getStatusCode()).thenReturn(200); + } + + @Test + public void should_returnValidMapping_givenFalseMerge_createMappingTest() { + try { + String mapping = this.sut.createMapping(restHighLevelClient, indexSchema, index, false); + assertEquals(mappingValid, mapping); + } catch (Exception e) { + fail("Should not throw this exception" + e.getMessage()); + } + } + + @Test + public void should_returnValidMapping_givenTrueMerge_createMappingTest() { + try { + doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); + doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); + + String mapping = this.sut.createMapping(this.restHighLevelClient, this.indexSchema, this.index, true); + assertEquals(this.mappingValid, mapping); + } catch (Exception e) { + fail("Should not throw this exception" + e.getMessage()); + } + } + + @Test + public void should_returnValidMapping_givenExistType_createMappingTest() { + try { + doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); + doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); + + IndexerMappingServiceImpl indexerMappingServiceLocal = PowerMockito.spy(new IndexerMappingServiceImpl()); + doReturn(false).when(indexerMappingServiceLocal).isTypeExist(ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any()); + String mapping = this.sut.createMapping(this.restHighLevelClient, this.indexSchema, this.index, true); + assertEquals(this.mappingValid, mapping); + } catch (Exception e) { + fail("Should not throw this exception" + e.getMessage()); + } + } } diff --git a/provider/indexer-gc/src/test/java/org/opengroup/osdu/indexer/service/StorageServiceTest.java b/provider/indexer-gc/src/test/java/org/opengroup/osdu/indexer/service/StorageServiceTest.java deleted file mode 100644 index 3ff767ebe5c4f5cb638cef9eeb8e440eecd7db19..0000000000000000000000000000000000000000 --- a/provider/indexer-gc/src/test/java/org/opengroup/osdu/indexer/service/StorageServiceTest.java +++ /dev/null @@ -1,254 +0,0 @@ -// Copyright 2017-2019, Schlumberger -// -// 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. - -package org.opengroup.osdu.indexer.service; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentMatchers; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.Spy; -import org.opengroup.osdu.core.common.model.http.DpsHeaders; -import org.opengroup.osdu.core.common.model.http.AppException; -import org.opengroup.osdu.core.common.model.indexer.IndexingStatus; -import org.opengroup.osdu.core.common.model.indexer.JobStatus; -import org.opengroup.osdu.core.common.model.indexer.RecordInfo; -import org.opengroup.osdu.core.common.model.http.HttpResponse; -import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; -import org.opengroup.osdu.core.common.provider.interfaces.IRequestInfo; -import org.opengroup.osdu.core.common.http.IUrlFetchService; -import org.opengroup.osdu.core.common.model.indexer.RecordQueryResponse; -import org.opengroup.osdu.core.common.model.indexer.RecordReindexRequest; -import org.opengroup.osdu.core.common.model.indexer.Records; -import org.opengroup.osdu.indexer.config.IndexerConfigurationProperties; -import org.springframework.http.HttpStatus; -import org.springframework.test.context.junit4.SpringRunner; - -import java.lang.reflect.Type; -import java.net.URISyntaxException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; - -import static java.util.Collections.singletonList; -import static org.junit.Assert.*; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.powermock.api.mockito.PowerMockito.when; - -@RunWith(SpringRunner.class) -public class StorageServiceTest { - - @Mock - private IUrlFetchService urlFetchService; - @Mock - private JobStatus jobStatus; - @Mock - private JaxRsDpsLog log; - @Mock - private IRequestInfo requestInfo; - @Mock - private IndexerConfigurationProperties configurationProperties; - @Spy - private ObjectMapper objectMapper = new ObjectMapper(); - @InjectMocks - private StorageServiceImpl sut; - - private List<String> ids; - private static final String RECORD_ID1 = "tenant1:doc:1dbf528e0e0549cab7a08f29fbfc8465"; - private static final String RECORDS_ID2 = "tenant1:doc:15e790a69beb4d789b1f979e2af2e813"; - - @Before - public void setup() { - - String recordChangedMessages = "[{\"id\":\"tenant1:doc:1dbf528e0e0549cab7a08f29fbfc8465\",\"kind\":\"tenant1:testindexer1528919679710:well:1.0.0\",\"op\":\"purge\"}," + - "{\"id\":\"tenant1:doc:15e790a69beb4d789b1f979e2af2e813\",\"kind\":\"tenant1:testindexer1528919679710:well:1.0.0\",\"op\":\"create\"}]"; - - when(this.requestInfo.getHeadersMap()).thenReturn(new HashMap<>()); - when(this.requestInfo.getHeaders()).thenReturn(new DpsHeaders()); - - Type listType = new TypeToken<List<RecordInfo>>() {}.getType(); - - List<RecordInfo> msgs = (new Gson()).fromJson(recordChangedMessages, listType); - jobStatus.initialize(msgs); - ids = Arrays.asList(RECORD_ID1, RECORDS_ID2); - - when(configurationProperties.getStorageRecordsBatchSize()).thenReturn(20); - } - - @Test - public void should_return404_givenNullData_getValidStorageRecordsTest() throws URISyntaxException { - - HttpResponse httpResponse = mock(HttpResponse.class); - Mockito.when(httpResponse.getBody()).thenReturn(null); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - - should_return404_getValidStorageRecordsTest(); - } - - @Test - public void should_return404_givenEmptyData_getValidStorageRecordsTest() throws URISyntaxException { - - String emptyDataFromStorage = "{\"records\":[],\"notFound\":[]}"; - - HttpResponse httpResponse = mock(HttpResponse.class); - Mockito.when(httpResponse.getBody()).thenReturn(emptyDataFromStorage); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - - should_return404_getValidStorageRecordsTest(); - } - - @Test - public void should_returnOneValidRecords_givenValidData_getValidStorageRecordsTest() throws URISyntaxException { - - String validDataFromStorage = "{\"records\":[{\"id\":\"testid\", \"version\":1, \"kind\":\"tenant:test:test:1.0.0\"}],\"notFound\":[\"invalid1\"], \"conversionStatuses\": []}"; - - HttpResponse httpResponse = mock(HttpResponse.class); - Mockito.when(httpResponse.getBody()).thenReturn(validDataFromStorage); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - Records storageRecords = this.sut.getStorageRecords(ids); - - assertEquals(1, storageRecords.getRecords().size()); - } - - @Test - public void should_logMissingRecord_given_storageMissedRecords() throws URISyntaxException { - - String validDataFromStorage = "{\"records\":[{\"id\":\"tenant1:doc:1dbf528e0e0549cab7a08f29fbfc8465\", \"version\":1, \"kind\":\"tenant:test:test:1.0.0\"}],\"notFound\":[]}"; - - HttpResponse httpResponse = mock(HttpResponse.class); - Mockito.when(httpResponse.getBody()).thenReturn(validDataFromStorage); - - when(this.urlFetchService.sendRequest(any())).thenReturn(httpResponse); - Records storageRecords = this.sut.getStorageRecords(ids); - - assertEquals(1, storageRecords.getRecords().size()); - verify(this.jobStatus).addOrUpdateRecordStatus(singletonList(RECORDS_ID2), IndexingStatus.FAIL, HttpStatus.NOT_FOUND.value(), "Partial response received from Storage service - missing records", "Partial response received from Storage service: tenant1:doc:15e790a69beb4d789b1f979e2af2e813"); - } - - @Test - public void should_returnValidJobStatus_givenFailedUnitsConversion_processRecordChangedMessageTest() throws URISyntaxException { - String validDataFromStorage = "{\"records\":[{\"id\":\"tenant1:doc:15e790a69beb4d789b1f979e2af2e813\", \"version\":1, \"kind\":\"tenant:test:test:1.0.0\"}],\"notFound\":[],\"conversionStatuses\":[{\"id\":\"tenant1:doc:15e790a69beb4d789b1f979e2af2e813\",\"status\":\"ERROR\",\"errors\":[\"crs conversion failed\"]}]}"; - - HttpResponse httpResponse = mock(HttpResponse.class); - Mockito.when(httpResponse.getBody()).thenReturn(validDataFromStorage); - - when(this.urlFetchService.sendRequest(any())).thenReturn(httpResponse); - Records storageRecords = this.sut.getStorageRecords(singletonList(RECORDS_ID2)); - - assertEquals(1, storageRecords.getRecords().size()); - verify(this.jobStatus).addOrUpdateRecordStatus(RECORDS_ID2, IndexingStatus.WARN, HttpStatus.BAD_REQUEST.value(), "crs conversion failed", String.format("record-id: %s | %s", "tenant1:doc:15e790a69beb4d789b1f979e2af2e813", "crs conversion failed")); - } - - @Test - public void should_returnValidResponse_givenValidRecordQueryRequest_getRecordListByKind() throws Exception { - - RecordReindexRequest recordReindexRequest = RecordReindexRequest.builder().kind("tenant:test:test:1.0.0").cursor("100").build(); - - HttpResponse httpResponse = new HttpResponse(); - httpResponse.setBody(new Gson().toJson(recordReindexRequest, RecordReindexRequest.class)); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - - RecordQueryResponse recordQueryResponse = this.sut.getRecordsByKind(recordReindexRequest); - - assertEquals("100", recordQueryResponse.getCursor()); - assertNull(recordQueryResponse.getResults()); - } - - @Test - public void should_returnValidResponse_givenValidKind_getSchemaByKind() throws Exception { - - String validSchemaFromStorage = "{" + - " \"kind\": \"tenant:test:test:1.0.0\"," + - " \"schema\": [" + - " {" + - " \"path\": \"msg\"," + - " \"kind\": \"string\"" + - " }," + - " {" + - " \"path\": \"references.entity\"," + - " \"kind\": \"string\"" + - " }" + - " ]," + - " \"ext\": null" + - "}"; - String kind = "tenant:test:test:1.0.0"; - - HttpResponse httpResponse = new HttpResponse(); - httpResponse.setResponseCode(HttpStatus.OK.value()); - httpResponse.setBody(validSchemaFromStorage); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - - String recordSchemaResponse = this.sut.getStorageSchema(kind); - - assertNotNull(recordSchemaResponse); - } - - @Test - public void should_returnNullResponse_givenAbsentKind_getSchemaByKind() throws Exception { - - String kind = "tenant:test:test:1.0.0"; - - HttpResponse httpResponse = new HttpResponse(); - httpResponse.setResponseCode(HttpStatus.NOT_FOUND.value()); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - - String recordSchemaResponse = this.sut.getStorageSchema(kind); - - assertNull(recordSchemaResponse); - } - - @Test - public void should_returnOneValidRecords_givenValidData_getValidStorageRecordsWithInvalidConversionTest() throws URISyntaxException { - - String validDataFromStorage = "{\"records\":[{\"id\":\"testid\", \"version\":1, \"kind\":\"tenant:test:test:1.0.0\"}],\"notFound\":[\"invalid1\"],\"conversionStatuses\": [{\"id\":\"testid\",\"status\":\"ERROR\",\"errors\":[\"conversion error occurred\"] } ]}"; - - HttpResponse httpResponse = mock(HttpResponse.class); - Mockito.when(httpResponse.getBody()).thenReturn(validDataFromStorage); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - Records storageRecords = this.sut.getStorageRecords(ids); - - assertEquals(1, storageRecords.getRecords().size()); - - assertEquals(1, storageRecords.getConversionStatuses().get(0).getErrors().size()); - - assertEquals("conversion error occurred", storageRecords.getConversionStatuses().get(0).getErrors().get(0)); - } - - private void should_return404_getValidStorageRecordsTest() { - try { - this.sut.getStorageRecords(ids); - fail("Should throw exception"); - } catch (AppException e) { - assertEquals(HttpStatus.NOT_FOUND.value(), e.getError().getCode()); - } catch (Exception e) { - fail("Should not throw this exception" + e.getMessage()); - } - } -} diff --git a/provider/indexer-ibm/pom.xml b/provider/indexer-ibm/pom.xml index 787b45c6de6af106eb6b1f4e708b903bbffd5dbc..82d58bd58e8364de9c639bb2ae4b24433ae9b1d1 100644 --- a/provider/indexer-ibm/pom.xml +++ b/provider/indexer-ibm/pom.xml @@ -21,7 +21,7 @@ <parent> <groupId>org.opengroup.osdu.indexer</groupId> <artifactId>indexer-service</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <relativePath>../../pom.xml</relativePath> </parent> @@ -31,7 +31,7 @@ <packaging>jar</packaging> <properties> - <tomcat.embed.core.version>9.0.68</tomcat.embed.core.version> + <tomcat.embed.core.version>9.0.69</tomcat.embed.core.version> <os-core-lib-ibm.version>0.16.0-rc1</os-core-lib-ibm.version> <spring-webmvc.version>5.3.22</spring-webmvc.version> <jackson-databind.version>2.13.4.2</jackson-databind.version> @@ -57,7 +57,7 @@ <dependency> <groupId>org.opengroup.osdu.indexer</groupId> <artifactId>indexer-core</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <exclusions> <exclusion> <groupId>io.netty</groupId> @@ -87,7 +87,7 @@ <dependency> <groupId>io.netty</groupId> <artifactId>netty-codec</artifactId> - <version>4.1.68.Final</version> + <version>4.1.86.Final</version> </dependency> <dependency> <groupId>org.opengroup.osdu</groupId> diff --git a/provider/indexer-ibm/src/main/java/org/opengroup/osdu/indexer/ibm/IndexerIBMApplication.java b/provider/indexer-ibm/src/main/java/org/opengroup/osdu/indexer/ibm/IndexerIBMApplication.java index 3e8637487818bc8d46c1ad5547513ff5a309ff87..c92579519b64e659604161554c5e1ce7846008ef 100644 --- a/provider/indexer-ibm/src/main/java/org/opengroup/osdu/indexer/ibm/IndexerIBMApplication.java +++ b/provider/indexer-ibm/src/main/java/org/opengroup/osdu/indexer/ibm/IndexerIBMApplication.java @@ -10,6 +10,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.FilterType; +import org.springframework.context.annotation.PropertySource; @SpringBootApplication @@ -21,6 +22,7 @@ import org.springframework.context.annotation.FilterType; @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value=ElasticSettingServiceImpl.class), } ) +@PropertySource("classpath:swagger.properties") public class IndexerIBMApplication { public static void main(String[] args) throws Exception { diff --git a/provider/indexer-ibm/src/main/java/org/opengroup/osdu/indexer/ibm/security/WhoamiController.java b/provider/indexer-ibm/src/main/java/org/opengroup/osdu/indexer/ibm/security/WhoamiController.java index abf80357b50f2ffa5f42fa8dba7631622673e265..b0d399ff56660a897ce89c6520e98406c692366c 100644 --- a/provider/indexer-ibm/src/main/java/org/opengroup/osdu/indexer/ibm/security/WhoamiController.java +++ b/provider/indexer-ibm/src/main/java/org/opengroup/osdu/indexer/ibm/security/WhoamiController.java @@ -3,12 +3,14 @@ package org.opengroup.osdu.indexer.ibm.security; +import io.swagger.v3.oas.annotations.Hidden; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; +@Hidden @Controller public class WhoamiController { @RequestMapping(value = { "/", "/whoami" }) diff --git a/provider/indexer-ibm/src/test/java/org/opengroup/osdu/indexer/ibm/service/IndexCopyServiceImplTest.java b/provider/indexer-ibm/src/test/java/org/opengroup/osdu/indexer/ibm/service/IndexCopyServiceImplTest.java deleted file mode 100644 index a12e905f8d6602f52701806e51c58cffecf66688..0000000000000000000000000000000000000000 --- a/provider/indexer-ibm/src/test/java/org/opengroup/osdu/indexer/ibm/service/IndexCopyServiceImplTest.java +++ /dev/null @@ -1,180 +0,0 @@ -/* Licensed Materials - Property of IBM */ -/* (c) Copyright IBM Corp. 2020. All Rights Reserved.*/ - -package org.opengroup.osdu.indexer.ibm.service; - -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import org.apache.http.HttpEntity; -import org.apache.http.util.EntityUtils; -import org.elasticsearch.client.Request; -import org.elasticsearch.client.Response; -import org.elasticsearch.client.RestClient; -import org.elasticsearch.client.RestHighLevelClient; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentMatchers; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.opengroup.osdu.core.common.model.http.DpsHeaders; -import org.opengroup.osdu.indexer.logging.AuditLogger; -import org.opengroup.osdu.indexer.service.IMappingService; -import org.opengroup.osdu.indexer.service.IndexCopyServiceImpl; -import org.opengroup.osdu.core.common.model.search.ClusterSettings; -import org.opengroup.osdu.core.common.provider.interfaces.IRequestInfo; -import org.opengroup.osdu.core.common.model.indexer.IElasticSettingService; -import org.opengroup.osdu.core.common.model.http.AppException; -import org.opengroup.osdu.indexer.service.IndicesService; -import org.opengroup.osdu.indexer.util.ElasticClientHandler; -import org.opengroup.osdu.core.common.search.ElasticIndexNameResolver; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.springframework.test.context.junit4.SpringRunner; - -import java.io.IOException; -import java.lang.reflect.Type; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -import static org.junit.Assert.fail; -import static org.mockito.Mockito.mock; -import static org.powermock.api.mockito.PowerMockito.when; - -@RunWith(SpringRunner.class) -@PrepareForTest({RestHighLevelClient.class, Response.class, RestClient.class, HttpEntity.class, EntityUtils.class}) -public class IndexCopyServiceImplTest { - private final String correlationId = UUID.randomUUID().toString(); - - @Mock - private HttpEntity httpEntity; - @Mock - private HttpEntity httpEntityRequest; - @Mock - private IRequestInfo requestInfo; - @Mock - private DpsHeaders dpsHeaders; - @Mock - private RestClient restClient; - @Mock - private RestHighLevelClient restHighLevelClient; - @Mock - private IndicesService indicesService; - @Mock - private IMappingService mappingService; - @Mock - private ElasticClientHandler elasticClientHandler; - @Mock - private ElasticIndexNameResolver elasticIndexNameResolver; - @Mock - private Response response; - @Mock - private IElasticSettingService elasticSettingService; - @Mock - private AuditLogger auditLogger; - @Mock - private Map<String, String> httpHeaders; - @InjectMocks - private IndexCopyServiceImpl sut; - - private ClusterSettings commonCluster; - - private Map<String, Object> correctMap; - - @Before - public void setup() { - - commonCluster = ClusterSettings.builder().host("commonhost").port(8080).userNameAndPassword("username:pwd").build(); - - httpHeaders = new HashMap<>(); - httpHeaders.put(DpsHeaders.AUTHORIZATION, "testAuth"); - httpHeaders.put(DpsHeaders.CORRELATION_ID, correlationId); - when(requestInfo.getHeadersMapWithDwdAuthZ()).thenReturn(httpHeaders); - when(response.getEntity()).thenReturn(httpEntity); - - Type mapType = new TypeToken<Map<String, Object>>() {}.getType(); - String afterFormat = "{\"properties\":{\"id\":{\"type\":\"keyword\"}}}"; - correctMap = new Gson().fromJson(afterFormat, mapType); - - restHighLevelClient = mock(RestHighLevelClient.class); - - } - - @Test(expected = IOException.class) - public void should_throwIOException_when_indexMappingNotFound() throws Exception { - IOException exception = new IOException("Fail to get mapping for the given index from common cluster."); - - when(this.mappingService.getIndexMapping(ArgumentMatchers.any(), ArgumentMatchers.any())).thenThrow(exception); - - this.sut.copyIndex("common:metadata:entity:1.0.0"); - } - - @Test(expected = IllegalArgumentException.class) - public void should_throwIllegalArgExceptionCopyIndexRequest_copyIndexTest() { - try { - this.sut.copyIndex(null); - } catch (IOException e) { - fail("Should not throw IOException but illegalArgumentException."); - } - } - - @Test - public void should_returnIndexMapping_getIndexMappingFromCommonClustertest() { - String mappingJson = "{\"common-metadata-entity-1.0.0\":{\"mappings\":{\"entity\":{\"properties\":{\"id\":{\"type\":\"keyword\"}}}}}}"; - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - try { - when(this.mappingService.getIndexMapping(ArgumentMatchers.any(), ArgumentMatchers.any())).thenReturn(mappingJson); - Map<String, Object> resultMap = this.sut.getIndexMappingsFromCommonCluster("test", "test"); - Assert.assertEquals(resultMap, correctMap); - } catch (Exception ignored) { - } - } - - @Test - public void should_returnClusterInfo_getCommonClusterInformationtest() { - try { - String[] correctCommonCluster = {"https://commonhost:8080", "username", "pwd"}; - - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - - when(elasticSettingService.getElasticClusterInformation()).thenReturn(commonCluster); - - String[] resultCommonCluster = this.sut.getCommonClusterInformation(); - Assert.assertEquals(correctCommonCluster[0], resultCommonCluster[0]); - Assert.assertEquals(correctCommonCluster[1], resultCommonCluster[1]); - Assert.assertEquals(correctCommonCluster[2], resultCommonCluster[2]); - } catch (IOException ignored) { - fail("Should not throw this exception " + ignored.getMessage()); - } - } - - @Test(expected = AppException.class) - public void should_throwException_failToCreateIndexInTenantCluster_createIndexInTenantClustertest() { - try { - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - when(indicesService.createIndex(ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any())).thenReturn(false); - this.sut.createIndexInTenantCluster("test", "test", "test", correctMap); - } catch (IOException ignored) { - fail("Should not throw this exception " + ignored.getMessage()); - } - } - - @Ignore - public void should_returnTaskIdResponse_reindexRequestSucceed_reindexInTenantClustertest() { - //TODO: fix the null Response from restHighLevelClient.getLowLevelClient().performRequest(). - try { - String[] correctCommonCluster = {"https://commonhost:8080", "username", "pwd"}; - Request request = new Request("POST", "/_reindex?wait_for_completion=false"); - request.setEntity(httpEntityRequest); - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - when(indicesService.createIndex(ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any())).thenReturn(false); - when(restHighLevelClient.getLowLevelClient()).thenReturn(restClient); - when(restClient.performRequest(request)).thenReturn(response); - when(response.getEntity()).thenReturn(httpEntity); - Assert.assertEquals(httpEntity, this.sut.reindexInTenantCluster("test", "test", correctCommonCluster)); - } catch (IOException ignored) { - } - } -} diff --git a/provider/indexer-ibm/src/test/java/org/opengroup/osdu/indexer/ibm/service/IndexerMappingServiceTest.java b/provider/indexer-ibm/src/test/java/org/opengroup/osdu/indexer/ibm/service/IndexerMappingServiceTest.java index 9e22a80fce0c02ff55d9bd940c07279dfcd39472..7f1f5a7d587538f3b376e1002224831b20f42871 100644 --- a/provider/indexer-ibm/src/test/java/org/opengroup/osdu/indexer/ibm/service/IndexerMappingServiceTest.java +++ b/provider/indexer-ibm/src/test/java/org/opengroup/osdu/indexer/ibm/service/IndexerMappingServiceTest.java @@ -1,19 +1,15 @@ -/* Licensed Materials - Property of IBM */ +/* Licensed Materials - Property of IBM */ /* (c) Copyright IBM Corp. 2020. All Rights Reserved.*/ package org.opengroup.osdu.indexer.ibm.service; import org.apache.http.StatusLine; -import org.elasticsearch.ElasticsearchException; -import org.elasticsearch.action.admin.indices.mapping.get.GetFieldMappingsRequest; -import org.elasticsearch.action.admin.indices.mapping.get.GetFieldMappingsResponse; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; -import org.elasticsearch.action.bulk.BulkItemResponse.Failure; import org.elasticsearch.action.support.master.AcknowledgedResponse; -import org.elasticsearch.client.*; -import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentFactory; -import org.elasticsearch.index.reindex.BulkByScrollResponse; +import org.elasticsearch.client.IndicesClient; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.Response; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestHighLevelClient; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @@ -22,283 +18,104 @@ import org.mockito.ArgumentMatchers; import org.mockito.InjectMocks; import org.mockito.Mock; import org.opengroup.osdu.core.common.model.indexer.IndexSchema; -import org.opengroup.osdu.indexer.service.IndexerMappingServiceImpl; import org.opengroup.osdu.core.common.model.search.RecordMetaAttribute; -import org.opengroup.osdu.core.common.model.http.AppException; -import org.opengroup.osdu.indexer.util.ElasticClientHandler; +import org.opengroup.osdu.indexer.service.IndexerMappingServiceImpl; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.springframework.test.context.junit4.SpringRunner; import java.io.IOException; -import java.util.*; +import java.util.HashMap; +import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; -import static org.mockito.Matchers.any; import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; import static org.powermock.api.mockito.PowerMockito.when; @Ignore @RunWith(SpringRunner.class) -@PrepareForTest({ RestHighLevelClient.class, IndicesClient.class }) +@PrepareForTest({RestHighLevelClient.class, IndicesClient.class}) public class IndexerMappingServiceTest { - private final String kind = "tenant:test:test:1.0.0"; - private final String index = "tenant-test-test-1.0.0"; - private final String type = "test"; - private final String mappingValid = "{\"dynamic\":false,\"properties\":{\"data\":{\"properties\":{\"Location\":{\"type\":\"geo_point\"}}},\"id\":{\"type\":\"keyword\"}}}"; - - @Mock - private RestClient restClient; - @Mock - private Response response; - @Mock - private StatusLine statusLine; - - @InjectMocks - private IndexerMappingServiceImpl sut; - - @Mock - private ElasticClientHandler elasticClientHandler; - - @InjectMocks - private RestHighLevelClient restHighLevelClient; - - @InjectMocks - private IndexSchema indexSchema; - @InjectMocks - private IndicesClient indicesClient; - - @InjectMocks - private AcknowledgedResponse mappingResponse; - - @Before - public void setup() throws IOException { - Map<String, Object> dataMapping = new HashMap<>(); - dataMapping.put("Location", "geo_point"); - Map<String, Object> metaMapping = new HashMap<>(); - metaMapping.put(RecordMetaAttribute.ID.getValue(), "keyword"); - this.indexSchema = IndexSchema.builder().kind(kind).type(type).dataSchema(dataMapping).metaSchema(metaMapping) - .build(); - - this.indicesClient = PowerMockito.mock(IndicesClient.class); - this.restHighLevelClient = PowerMockito.mock(RestHighLevelClient.class); - - when(this.restHighLevelClient.getLowLevelClient()).thenReturn(restClient); - when(this.restClient.performRequest(ArgumentMatchers.any())).thenReturn(response); - when(this.response.getStatusLine()).thenReturn(statusLine); - when(this.statusLine.getStatusCode()).thenReturn(200); - } - - @Test - public void should_returnValidMapping_givenFalseMerge_createMappingTest() { - try { - String mapping = this.sut.createMapping(restHighLevelClient, indexSchema, index, false); - assertEquals(mappingValid, mapping); - } catch (Exception e) { - fail("Should not throw this exception" + e.getMessage()); - } - } - - @Test - public void should_returnValidMapping_givenTrueMerge_createMappingTest() { - try { - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - String mapping = this.sut.createMapping(this.restHighLevelClient, this.indexSchema, this.index, true); - assertEquals(this.mappingValid, mapping); - } catch (Exception e) { - fail("Should not throw this exception" + e.getMessage()); - } - } - - @Test - public void should_returnValidMapping_givenExistType_createMappingTest() { - try { - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - IndexerMappingServiceImpl indexerMappingServiceLocal = PowerMockito.spy(new IndexerMappingServiceImpl()); - doReturn(false).when(indexerMappingServiceLocal).isTypeExist(ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any()); - String mapping = this.sut.createMapping(this.restHighLevelClient, this.indexSchema, this.index, true); - assertEquals(this.mappingValid, mapping); - } catch (Exception e) { - fail("Should not throw this exception" + e.getMessage()); - } - } - - @Test - public void should_update_indices_field_with_keyword_when_valid_indices() throws Exception { - try { - Set<String> indices = new HashSet<String>(); - indices.add("indices 1"); - GetFieldMappingsResponse getFieldMappingsResponse = mock(GetFieldMappingsResponse.class); - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - when(this.indicesClient.getFieldMapping(ArgumentMatchers.any(GetFieldMappingsRequest.class), ArgumentMatchers.any())).thenReturn(getFieldMappingsResponse); - XContentBuilder builder = XContentFactory.jsonBuilder(); - builder.startObject(); - builder.field("any field", new HashMap()); - builder.endObject(); - BytesReference bytesReference = BytesReference.bytes(builder); - GetFieldMappingsResponse.FieldMappingMetadata mappingMetaData = new GetFieldMappingsResponse.FieldMappingMetadata(index, bytesReference); - Map<String, GetFieldMappingsResponse.FieldMappingMetadata> mapBuilder = new HashMap<>(); - mapBuilder.put("data.any field", mappingMetaData); - Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>> mappingBuilder = new HashMap<>(); - mappingBuilder.put("any index 1", mapBuilder); - mappingBuilder.put("any index 2", mapBuilder); - Map<String, Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>>> mapping = new HashMap<>(); - mapping.put("indices 1", mappingBuilder); - when(getFieldMappingsResponse.mappings()).thenReturn(mapping); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - BulkByScrollResponse response = mock(BulkByScrollResponse.class); - doReturn(response).when(this.restHighLevelClient).updateByQuery(ArgumentMatchers.any(), ArgumentMatchers.any(RequestOptions.class)); - when(response.getBulkFailures()).thenReturn(new ArrayList<Failure>()); - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - - this.sut.updateIndexMappingForIndicesOfSameType( indices,"any field"); - } catch (Exception e) { - fail("Should not throw this exception" + e.getMessage()); - } - } - - @Test(expected = AppException.class) - public void should_throw_exception_if_someIndex_is_invalid_andWeIndexfield_with_keyword() throws Exception { - try { - Set<String> indices = new HashSet<String>(); - indices.add("invalid 1"); - GetFieldMappingsResponse getFieldMappingsResponse = mock(GetFieldMappingsResponse.class); - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - when(this.indicesClient.getFieldMapping(ArgumentMatchers.any(GetFieldMappingsRequest.class), ArgumentMatchers.any())).thenReturn(getFieldMappingsResponse); - XContentBuilder builder = XContentFactory.jsonBuilder(); - builder.startObject(); - builder.field("any field", new HashMap()); - builder.endObject(); - BytesReference bytesReference = BytesReference.bytes(builder); - GetFieldMappingsResponse.FieldMappingMetadata mappingMetaData = new GetFieldMappingsResponse.FieldMappingMetadata(index, bytesReference); - Map<String, GetFieldMappingsResponse.FieldMappingMetadata> mapBuilder = new HashMap<>(); - mapBuilder.put("data.any field", mappingMetaData); - Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>> mappingBuilder = new HashMap<>(); - mappingBuilder.put("any index 1", mapBuilder); - mappingBuilder.put("any index 2", mapBuilder); - Map<String, Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>>> mapping = new HashMap<>(); - mapping.put("indices 1", mappingBuilder); - when(getFieldMappingsResponse.mappings()).thenReturn(mapping); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - BulkByScrollResponse response = mock(BulkByScrollResponse.class); - doReturn(response).when(this.restHighLevelClient).updateByQuery(ArgumentMatchers.any(), ArgumentMatchers.any(RequestOptions.class)); - when(response.getBulkFailures()).thenReturn(new ArrayList<Failure>()); - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - - this.sut.updateIndexMappingForIndicesOfSameType(indices,"any field"); - } catch (Exception e) { - throw e; - } - } - - @Test(expected = AppException.class) - public void should_throw_exception_if_type_of_index_is_invalid_andWeIndexfield_with_keyword() throws Exception { - try { - Set<String> indices = new HashSet<String>(); - indices.add("indices 1"); - GetFieldMappingsResponse getFieldMappingsResponse = mock(GetFieldMappingsResponse.class); - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - when(this.indicesClient.getFieldMapping(ArgumentMatchers.any(GetFieldMappingsRequest.class), ArgumentMatchers.any())).thenReturn(getFieldMappingsResponse); - XContentBuilder builder = XContentFactory.jsonBuilder(); - builder.startObject(); - builder.field("any field", new HashMap()); - builder.endObject(); - BytesReference bytesReference = BytesReference.bytes(builder); - GetFieldMappingsResponse.FieldMappingMetadata mappingMetaData = new GetFieldMappingsResponse.FieldMappingMetadata(index, bytesReference); - Map<String, GetFieldMappingsResponse.FieldMappingMetadata> mapBuilder = new HashMap<>(); - mapBuilder.put("data.any field", mappingMetaData); - Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>> mappingBuilder = new HashMap<>(); - mappingBuilder.put("any index 1", mapBuilder); - mappingBuilder.put("any index 2", mapBuilder); - Map<String, Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>>> mapping = new HashMap<>(); - mapping.put("indices 1", mappingBuilder); - when(getFieldMappingsResponse.mappings()).thenReturn(mapping); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - BulkByScrollResponse response = mock(BulkByScrollResponse.class); - doReturn(response).when(this.restHighLevelClient).updateByQuery(ArgumentMatchers.any(), ArgumentMatchers.any(RequestOptions.class)); - when(response.getBulkFailures()).thenReturn(new ArrayList<Failure>()); - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - this.sut.updateIndexMappingForIndicesOfSameType(indices,"any field invalid"); - } catch (Exception e) { - throw e; - } - } - - @Test(expected = AppException.class) - public void should_throw_exception_if_elastic_search_failedToFetch_andWeIndexfield_with_keyword() throws Exception { - try { - - Set<String> indices = new HashSet<String>(); - indices.add("indices 1"); - indices.add("indices Invalid"); - GetFieldMappingsResponse getFieldMappingsResponse = mock(GetFieldMappingsResponse.class); - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - when(this.indicesClient.getFieldMapping(ArgumentMatchers.any(GetFieldMappingsRequest.class), ArgumentMatchers.any())).thenThrow(new ElasticsearchException("")); - XContentBuilder builder = XContentFactory.jsonBuilder(); - builder.startObject(); - builder.field("any field", new HashMap()); - builder.endObject(); - BytesReference bytesReference = BytesReference.bytes(builder); - GetFieldMappingsResponse.FieldMappingMetadata mappingMetaData = new GetFieldMappingsResponse.FieldMappingMetadata(index, bytesReference); - Map<String, GetFieldMappingsResponse.FieldMappingMetadata> mapBuilder = new HashMap<>(); - mapBuilder.put("data.any field", mappingMetaData); - Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>> mappingBuilder = new HashMap<>(); - mappingBuilder.put("any index 1", mapBuilder); - mappingBuilder.put("any index 2", mapBuilder); - Map<String, Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>>> mapping = new HashMap<>(); - mapping.put("indices 1", mappingBuilder); - when(getFieldMappingsResponse.mappings()).thenReturn(mapping); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - BulkByScrollResponse response = mock(BulkByScrollResponse.class); - doReturn(response).when(this.restHighLevelClient).updateByQuery(ArgumentMatchers.any(), ArgumentMatchers.any(RequestOptions.class)); - when(response.getBulkFailures()).thenReturn(new ArrayList<Failure>()); - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - this.sut.updateIndexMappingForIndicesOfSameType(indices,"any field"); - } catch (AppException e) { - throw e; - } - } - - @Test(expected = AppException.class) - public void should_throw_exception_when_elastic_failedToIndex_indices_field_with_keyword() { - try { - Set<String> indices = new HashSet<String>(); - indices.add("indices 1"); - indices.add("indices Invalid"); - GetFieldMappingsResponse getFieldMappingsResponse = mock(GetFieldMappingsResponse.class); - doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); - when(this.indicesClient.getFieldMapping(ArgumentMatchers.any(GetFieldMappingsRequest.class), ArgumentMatchers.any())).thenReturn(getFieldMappingsResponse); - XContentBuilder builder = XContentFactory.jsonBuilder(); - builder.startObject(); - builder.field("any field", new HashMap()); - builder.endObject(); - BytesReference bytesReference = BytesReference.bytes(builder); - GetFieldMappingsResponse.FieldMappingMetadata mappingMetaData = new GetFieldMappingsResponse.FieldMappingMetadata(index, bytesReference); - Map<String, GetFieldMappingsResponse.FieldMappingMetadata> mapBuilder = new HashMap<>(); - mapBuilder.put("data.any field", mappingMetaData); - Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>> mappingBuilder = new HashMap<>(); - mappingBuilder.put("any index 1", mapBuilder); - mappingBuilder.put("any index 2", mapBuilder); - Map<String, Map<String, Map<String, GetFieldMappingsResponse.FieldMappingMetadata>>> mapping = new HashMap<>(); - mapping.put("indices 1", mappingBuilder); - when(getFieldMappingsResponse.mappings()).thenReturn(mapping); - doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); - BulkByScrollResponse response = mock(BulkByScrollResponse.class); - doReturn(response).when(this.restHighLevelClient).updateByQuery(ArgumentMatchers.any(), ArgumentMatchers.any(RequestOptions.class)); - when(response.getBulkFailures()).thenReturn(new ArrayList<Failure>()); - when(this.indicesClient.putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class))).thenThrow(new ElasticsearchException("")); - when(elasticClientHandler.createRestClient()).thenReturn(restHighLevelClient); - this.sut.updateIndexMappingForIndicesOfSameType(indices,"any field"); - } catch (AppException e) { - throw e; - } catch (Exception e) { - fail("Should not throw this exception" + e.getMessage()); - } - } + private final String kind = "tenant:test:test:1.0.0"; + private final String index = "tenant-test-test-1.0.0"; + private final String type = "test"; + private final String mappingValid = "{\"dynamic\":false,\"properties\":{\"data\":{\"properties\":{\"Location\":{\"type\":\"geo_point\"}}},\"id\":{\"type\":\"keyword\"}}}"; + + @Mock + private RestClient restClient; + @Mock + private Response response; + @Mock + private StatusLine statusLine; + + @InjectMocks + private IndexerMappingServiceImpl sut; + + @InjectMocks + private RestHighLevelClient restHighLevelClient; + + @InjectMocks + private IndexSchema indexSchema; + @InjectMocks + private IndicesClient indicesClient; + + @InjectMocks + private AcknowledgedResponse mappingResponse; + + @Before + public void setup() throws IOException { + Map<String, Object> dataMapping = new HashMap<>(); + dataMapping.put("Location", "geo_point"); + Map<String, Object> metaMapping = new HashMap<>(); + metaMapping.put(RecordMetaAttribute.ID.getValue(), "keyword"); + this.indexSchema = IndexSchema.builder().kind(kind).type(type).dataSchema(dataMapping).metaSchema(metaMapping) + .build(); + + this.indicesClient = PowerMockito.mock(IndicesClient.class); + this.restHighLevelClient = PowerMockito.mock(RestHighLevelClient.class); + + when(this.restHighLevelClient.getLowLevelClient()).thenReturn(restClient); + when(this.restClient.performRequest(ArgumentMatchers.any())).thenReturn(response); + when(this.response.getStatusLine()).thenReturn(statusLine); + when(this.statusLine.getStatusCode()).thenReturn(200); + } + + @Test + public void should_returnValidMapping_givenFalseMerge_createMappingTest() { + try { + String mapping = this.sut.createMapping(restHighLevelClient, indexSchema, index, false); + assertEquals(mappingValid, mapping); + } catch (Exception e) { + fail("Should not throw this exception" + e.getMessage()); + } + } + + @Test + public void should_returnValidMapping_givenTrueMerge_createMappingTest() { + try { + doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); + doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); + String mapping = this.sut.createMapping(this.restHighLevelClient, this.indexSchema, this.index, true); + assertEquals(this.mappingValid, mapping); + } catch (Exception e) { + fail("Should not throw this exception" + e.getMessage()); + } + } + + @Test + public void should_returnValidMapping_givenExistType_createMappingTest() { + try { + doReturn(this.indicesClient).when(this.restHighLevelClient).indices(); + doReturn(mappingResponse).when(this.indicesClient).putMapping(ArgumentMatchers.any(PutMappingRequest.class), ArgumentMatchers.any(RequestOptions.class)); + IndexerMappingServiceImpl indexerMappingServiceLocal = PowerMockito.spy(new IndexerMappingServiceImpl()); + doReturn(false).when(indexerMappingServiceLocal).isTypeExist(ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any()); + String mapping = this.sut.createMapping(this.restHighLevelClient, this.indexSchema, this.index, true); + assertEquals(this.mappingValid, mapping); + } catch (Exception e) { + fail("Should not throw this exception" + e.getMessage()); + } + } } diff --git a/provider/indexer-ibm/src/test/java/org/opengroup/osdu/indexer/ibm/service/StorageServiceTest.java b/provider/indexer-ibm/src/test/java/org/opengroup/osdu/indexer/ibm/service/StorageServiceTest.java deleted file mode 100644 index dfbdb4396509ef1678d845fa12f1b9515654c120..0000000000000000000000000000000000000000 --- a/provider/indexer-ibm/src/test/java/org/opengroup/osdu/indexer/ibm/service/StorageServiceTest.java +++ /dev/null @@ -1,219 +0,0 @@ -/* Licensed Materials - Property of IBM */ -/* (c) Copyright IBM Corp. 2020. All Rights Reserved.*/ - -package org.opengroup.osdu.indexer.ibm.service; - -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentMatchers; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.opengroup.osdu.core.common.model.indexer.IndexingStatus; -import org.opengroup.osdu.core.common.model.indexer.RecordInfo; -import org.opengroup.osdu.core.common.model.indexer.RecordQueryResponse; -import org.opengroup.osdu.core.common.model.indexer.RecordReindexRequest; -import org.opengroup.osdu.core.common.model.indexer.Records; -import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; -import org.opengroup.osdu.indexer.service.StorageServiceImpl; -import org.opengroup.osdu.core.common.model.indexer.JobStatus; -import org.opengroup.osdu.core.common.model.http.HttpResponse; -import org.opengroup.osdu.core.common.provider.interfaces.IRequestInfo; -import org.opengroup.osdu.core.common.http.IUrlFetchService; -import org.opengroup.osdu.core.common.model.http.AppException; -import org.springframework.http.HttpStatus; -import org.springframework.test.context.junit4.SpringRunner; - -import java.lang.reflect.Type; -import java.net.URISyntaxException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; - -import static java.util.Collections.singletonList; -import static org.junit.Assert.*; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.powermock.api.mockito.PowerMockito.when; - -@Ignore -@RunWith(SpringRunner.class) -public class StorageServiceTest { - - @Mock - private IUrlFetchService urlFetchService; - @Mock - private JobStatus jobStatus; - @Mock - private JaxRsDpsLog log; - @Mock - private IRequestInfo requestInfo; - @InjectMocks - private StorageServiceImpl sut; - - private List<String> ids; - private static final String RECORD_ID1 = "tenant1:doc:1dbf528e0e0549cab7a08f29fbfc8465"; - private static final String RECORDS_ID2 = "tenant1:doc:15e790a69beb4d789b1f979e2af2e813"; - - @Before - public void setup() { - - String recordChangedMessages = "[{\"id\":\"tenant1:doc:1dbf528e0e0549cab7a08f29fbfc8465\",\"kind\":\"tenant1:testindexer1528919679710:well:1.0.0\",\"op\":\"purge\"}," + - "{\"id\":\"tenant1:doc:15e790a69beb4d789b1f979e2af2e813\",\"kind\":\"tenant1:testindexer1528919679710:well:1.0.0\",\"op\":\"create\"}]"; - - when(this.requestInfo.getHeadersMap()).thenReturn(new HashMap<>()); - - Type listType = new TypeToken<List<RecordInfo>>() {}.getType(); - - List<RecordInfo> msgs = (new Gson()).fromJson(recordChangedMessages, listType); - jobStatus.initialize(msgs); - ids = Arrays.asList(RECORD_ID1, RECORDS_ID2); - } - - @Test - public void should_return404_givenNullData_getValidStorageRecordsTest() throws URISyntaxException { - - HttpResponse httpResponse = mock(HttpResponse.class); - Mockito.when(httpResponse.getBody()).thenReturn(null); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - - should_return404_getValidStorageRecordsTest(); - } - - @Test - public void should_return404_givenEmptyData_getValidStorageRecordsTest() throws URISyntaxException { - - String emptyDataFromStorage = "{\"records\":[],\"notFound\":[]}"; - - HttpResponse httpResponse = mock(HttpResponse.class); - Mockito.when(httpResponse.getBody()).thenReturn(emptyDataFromStorage); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - - should_return404_getValidStorageRecordsTest(); - } - - @Test - public void should_returnOneValidRecords_givenValidData_getValidStorageRecordsTest() throws URISyntaxException { - - String validDataFromStorage = "{\"records\":[{\"id\":\"testid\", \"version\":1, \"kind\":\"tenant:test:test:1.0.0\"}],\"notFound\":[\"invalid1\"]}"; - - HttpResponse httpResponse = mock(HttpResponse.class); - Mockito.when(httpResponse.getBody()).thenReturn(validDataFromStorage); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - Records storageRecords = this.sut.getStorageRecords(ids); - - assertEquals(1, storageRecords.getRecords().size()); - } - - @Test - public void should_returnValidResponse_givenValidRecordQueryRequest_getRecordListByKind() throws Exception { - - RecordReindexRequest recordReindexRequest = RecordReindexRequest.builder().kind("tenant:test:test:1.0.0").cursor("100").build(); - - HttpResponse httpResponse = new HttpResponse(); - httpResponse.setBody(new Gson().toJson(recordReindexRequest, RecordReindexRequest.class)); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - - RecordQueryResponse recordQueryResponse = this.sut.getRecordsByKind(recordReindexRequest); - - assertEquals("100", recordQueryResponse.getCursor()); - assertNull(recordQueryResponse.getResults()); - } - - @Test - public void should_returnValidJobStatus_givenFailedUnitsConversion_processRecordChangedMessageTest() throws URISyntaxException { - String validDataFromStorage = "{\"records\":[{\"id\":\"tenant1:doc:15e790a69beb4d789b1f979e2af2e813\", \"version\":1, \"kind\":\"tenant:test:test:1.0.0\"}],\"notFound\":[],\"conversionStatuses\":[{\"id\":\"tenant1:doc:15e790a69beb4d789b1f979e2af2e813\",\"status\":\"ERROR\",\"errors\":[\"crs conversion failed\"]}]}"; - - HttpResponse httpResponse = mock(HttpResponse.class); - Mockito.when(httpResponse.getBody()).thenReturn(validDataFromStorage); - - when(this.urlFetchService.sendRequest(any())).thenReturn(httpResponse); - Records storageRecords = this.sut.getStorageRecords(singletonList("tenant1:doc:15e790a69beb4d789b1f979e2af2e813")); - - assertEquals(1, storageRecords.getRecords().size()); - verify(this.jobStatus).addOrUpdateRecordStatus(RECORDS_ID2, IndexingStatus.WARN, HttpStatus.BAD_REQUEST.value(), "crs conversion failed", String.format("record-id: %s | %s", "tenant1:doc:15e790a69beb4d789b1f979e2af2e813", "crs conversion failed")); - } - - @Test - public void should_returnValidResponse_givenValidKind_getSchemaByKind() throws Exception { - - String validSchemaFromStorage = "{" + - " \"kind\": \"tenant:test:test:1.0.0\"," + - " \"schema\": [" + - " {" + - " \"path\": \"msg\"," + - " \"kind\": \"string\"" + - " }," + - " {" + - " \"path\": \"references.entity\"," + - " \"kind\": \"string\"" + - " }" + - " ]," + - " \"ext\": null" + - "}"; - String kind = "tenant:test:test:1.0.0"; - - HttpResponse httpResponse = new HttpResponse(); - httpResponse.setResponseCode(HttpStatus.OK.value()); - httpResponse.setBody(validSchemaFromStorage); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - - String recordSchemaResponse = this.sut.getStorageSchema(kind); - - assertNotNull(recordSchemaResponse); - } - - @Test - public void should_returnNullResponse_givenAbsentKind_getSchemaByKind() throws Exception { - - String kind = "tenant:test:test:1.0.0"; - - HttpResponse httpResponse = new HttpResponse(); - httpResponse.setResponseCode(HttpStatus.NOT_FOUND.value()); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - - String recordSchemaResponse = this.sut.getStorageSchema(kind); - - assertNull(recordSchemaResponse); - } - - @Test - public void should_returnOneValidRecords_givenValidData_getValidStorageRecordsWithInvalidConversionTest() throws URISyntaxException { - - String validDataFromStorage = "{\"records\":[{\"id\":\"testid\", \"version\":1, \"kind\":\"tenant:test:test:1.0.0\"}],\"notFound\":[\"invalid1\"],\"conversionStatuses\": [{\"id\":\"testid\",\"status\":\"ERROR\",\"errors\":[\"conversion error occurred\"] } ]}"; - - HttpResponse httpResponse = mock(HttpResponse.class); - Mockito.when(httpResponse.getBody()).thenReturn(validDataFromStorage); - - when(this.urlFetchService.sendRequest(ArgumentMatchers.any())).thenReturn(httpResponse); - Records storageRecords = this.sut.getStorageRecords(ids); - - assertEquals(1, storageRecords.getRecords().size()); - - assertEquals(1, storageRecords.getConversionStatuses().get(0).getErrors().size()); - - assertEquals("conversion error occurred", storageRecords.getConversionStatuses().get(0).getErrors().get(0)); - } - - private void should_return404_getValidStorageRecordsTest() { - try { - this.sut.getStorageRecords(ids); - fail("Should throw exception"); - } catch (AppException e) { - assertEquals(HttpStatus.NOT_FOUND, e.getError().getCode()); - } catch (Exception e) { - fail("Should not throw this exception" + e.getMessage()); - } - } -} diff --git a/testing/indexer-test-anthos/pom.xml b/testing/indexer-test-anthos/pom.xml index 1a521499d7790f7ea1e1df1a51cc8eebe957ff45..c1c1191aa79fadaff4e64c4c9deb6e6a91fbce22 100644 --- a/testing/indexer-test-anthos/pom.xml +++ b/testing/indexer-test-anthos/pom.xml @@ -20,7 +20,7 @@ <parent> <artifactId>indexer-test</artifactId> <groupId>org.opengroup.osdu</groupId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -36,7 +36,7 @@ <dependency> <groupId>org.opengroup.osdu.indexer</groupId> <artifactId>indexer-test-core</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.nimbusds</groupId> diff --git a/testing/indexer-test-aws/pom.xml b/testing/indexer-test-aws/pom.xml index 5a33fa2c96c7f7e87e87e5ef13d18eef22b371f0..4873e4dd208a357a1edd026e1c49b299ca5dded0 100644 --- a/testing/indexer-test-aws/pom.xml +++ b/testing/indexer-test-aws/pom.xml @@ -21,13 +21,13 @@ <parent> <groupId>org.opengroup.osdu</groupId> <artifactId>indexer-test</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <groupId>org.opengroup.osdu.indexer</groupId> <artifactId>indexer-test-aws</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> @@ -44,14 +44,14 @@ <dependency> <groupId>org.opengroup.osdu.indexer</groupId> <artifactId>indexer-test-core</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> </dependency> <!-- AWS specific packages --> <dependency> <groupId>org.opengroup.osdu.core.aws</groupId> <artifactId>os-core-lib-aws</artifactId> - <version>0.14.0-rc2</version> + <version>0.19.0-rc3</version> </dependency> <!-- Testing --> diff --git a/testing/indexer-test-azure/pom.xml b/testing/indexer-test-azure/pom.xml index 1f441ec059f5a65b4a6cc6764190e068b1cc20c9..c636dad6ad94d6143ef73dbef89a7bcc0e753fb2 100644 --- a/testing/indexer-test-azure/pom.xml +++ b/testing/indexer-test-azure/pom.xml @@ -21,13 +21,13 @@ <parent> <groupId>org.opengroup.osdu</groupId> <artifactId>indexer-test</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <groupId>org.opengroup.osdu.indexer</groupId> <artifactId>indexer-test-azure</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> @@ -46,7 +46,7 @@ <dependency> <groupId>org.opengroup.osdu.indexer</groupId> <artifactId>indexer-test-core</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> diff --git a/testing/indexer-test-core/pom.xml b/testing/indexer-test-core/pom.xml index b1a4bb19f0985c899b10a85a162cd8b1ce0f6934..c5e856334d3d9cb01b22885714b3841db7668a3e 100644 --- a/testing/indexer-test-core/pom.xml +++ b/testing/indexer-test-core/pom.xml @@ -5,13 +5,13 @@ <parent> <groupId>org.opengroup.osdu</groupId> <artifactId>indexer-test</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <groupId>org.opengroup.osdu.indexer</groupId> <artifactId>indexer-test-core</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <properties> <maven.compiler.target>1.8</maven.compiler.target> diff --git a/testing/indexer-test-gc/pom.xml b/testing/indexer-test-gc/pom.xml index 5873bff29b58b84629d995b20d44ecdaa86eda90..db3c4f41e71c5524572f9f433a4d7288532370e1 100644 --- a/testing/indexer-test-gc/pom.xml +++ b/testing/indexer-test-gc/pom.xml @@ -6,13 +6,13 @@ <parent> <groupId>org.opengroup.osdu</groupId> <artifactId>indexer-test</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <groupId>org.opengroup.osdu.indexer</groupId> <artifactId>indexer-test-gc</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> @@ -37,7 +37,7 @@ <dependency> <groupId>org.opengroup.osdu.indexer</groupId> <artifactId>indexer-test-core</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> </dependency> <!-- Cucumber --> diff --git a/testing/indexer-test-ibm/pom.xml b/testing/indexer-test-ibm/pom.xml index a749aeda28ce6bea5d50fdc801e80cccef7936a4..6d27a4904bff803ef284949fd99b9730e0bd6f28 100644 --- a/testing/indexer-test-ibm/pom.xml +++ b/testing/indexer-test-ibm/pom.xml @@ -6,13 +6,13 @@ <parent> <groupId>org.opengroup.osdu</groupId> <artifactId>indexer-test</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <groupId>org.opengroup.osdu.indexer</groupId> <artifactId>indexer-test-ibm</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> @@ -38,7 +38,7 @@ <dependency> <groupId>org.opengroup.osdu.indexer</groupId> <artifactId>indexer-test-core</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> </dependency> <dependency> diff --git a/testing/pom.xml b/testing/pom.xml index ddaf9284a1e76083eddc4c097f9768cbef2080b6..0af155f036c2d6b01b7720d850d3555e49beef36 100644 --- a/testing/pom.xml +++ b/testing/pom.xml @@ -18,7 +18,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>org.opengroup.osdu</groupId> <artifactId>indexer-test</artifactId> - <version>0.20.0-SNAPSHOT</version> + <version>0.21.0-SNAPSHOT</version> <description>Indexer Service Integration Test Root Project</description> <properties> <spring.version>5.3.23</spring.version>