From 9e10731e22ac470d6af89b57a8b75e8d1ff41d41 Mon Sep 17 00:00:00 2001 From: Filip Proborszcz Date: Thu, 1 Jul 2021 14:58:32 +0200 Subject: [PATCH 1/4] Onboard new Maps SDK --- rush.json | 45 + sdk/maps/maps-creator/LICENSE.txt | 21 + sdk/maps/maps-creator/README.md | 91 + sdk/maps/maps-creator/api-extractor.json | 18 + sdk/maps/maps-creator/package.json | 87 + .../maps-creator/review/maps-creator.api.md | 1213 +++++++ sdk/maps/maps-creator/rollup.config.js | 188 ++ .../samples/resources/data_sample_update.json | 19 + .../samples/resources/data_sample_upload.json | 19 + .../samples/resources/data_sample_upload.zip | Bin 0 -> 946883 bytes .../resources/featurestate_sample_create.json | 57 + .../resources/featurestate_sample_put.json | 57 + .../featurestate_sample_update_states.json | 9 + .../spatial_buffer_request_body.json | 23 + .../spatial_closest_point_request_body.json | 44 + .../spatial_geofence_request_body.json | 93 + ...spatial_point_in_polygon_request_body.json | 34 + .../samples/v1/javascript/README.md | 68 + .../samples/v1/javascript/alias.js | 79 + .../samples/v1/javascript/conversion.js | 117 + .../samples/v1/javascript/data.js | 165 + .../samples/v1/javascript/dataset.js | 117 + .../samples/v1/javascript/featurestate.js | 107 + .../samples/v1/javascript/package.json | 28 + .../samples/v1/javascript/sample.env | 15 + .../samples/v1/javascript/spatial.js | 106 + .../samples/v1/javascript/tileset.js | 115 + .../maps-creator/samples/v1/javascript/wfs.js | 89 + .../samples/v1/typescript/README.md | 81 + .../samples/v1/typescript/package.json | 36 + .../samples/v1/typescript/sample.env | 15 + .../samples/v1/typescript/src/alias.ts | 85 + .../samples/v1/typescript/src/conversion.ts | 121 + .../samples/v1/typescript/src/data.ts | 169 + .../samples/v1/typescript/src/dataset.ts | 121 + .../samples/v1/typescript/src/featurestate.ts | 113 + .../samples/v1/typescript/src/spatial.ts | 112 + .../samples/v1/typescript/src/tileset.ts | 119 + .../samples/v1/typescript/src/wfs.ts | 95 + .../samples/v1/typescript/tsconfig.json | 17 + sdk/maps/maps-creator/src/creatorClient.ts | 62 + .../maps-creator/src/creatorClientContext.ts | 61 + sdk/maps/maps-creator/src/index.ts | 13 + .../maps-creator/src/lro/azureAsyncPolling.ts | 83 + sdk/maps/maps-creator/src/lro/bodyPolling.ts | 45 + sdk/maps/maps-creator/src/lro/index.ts | 10 + .../maps-creator/src/lro/locationPolling.ts | 32 + sdk/maps/maps-creator/src/lro/lroPoller.ts | 66 + sdk/maps/maps-creator/src/lro/models.ts | 52 + sdk/maps/maps-creator/src/lro/operation.ts | 132 + sdk/maps/maps-creator/src/lro/passthrough.ts | 24 + .../maps-creator/src/lro/pollingMethod.ts | 91 + sdk/maps/maps-creator/src/lro/requestUtils.ts | 194 ++ sdk/maps/maps-creator/src/lro/stateMachine.ts | 216 ++ sdk/maps/maps-creator/src/models/index.ts | 1742 ++++++++++ sdk/maps/maps-creator/src/models/mappers.ts | 2429 ++++++++++++++ .../maps-creator/src/models/parameters.ts | 629 ++++ sdk/maps/maps-creator/src/operations/alias.ts | 445 +++ .../maps-creator/src/operations/conversion.ts | 593 ++++ sdk/maps/maps-creator/src/operations/data.ts | 1051 ++++++ .../maps-creator/src/operations/dataset.ts | 635 ++++ .../src/operations/featureState.ts | 484 +++ sdk/maps/maps-creator/src/operations/index.ts | 16 + .../maps-creator/src/operations/spatial.ts | 631 ++++ .../maps-creator/src/operations/tileset.ts | 442 +++ sdk/maps/maps-creator/src/operations/wfs.ts | 431 +++ .../src/operationsInterfaces/alias.ts | 207 ++ .../src/operationsInterfaces/conversion.ts | 276 ++ .../src/operationsInterfaces/data.ts | 521 +++ .../src/operationsInterfaces/dataset.ts | 293 ++ .../src/operationsInterfaces/featureState.ts | 195 ++ .../src/operationsInterfaces/index.ts | 16 + .../src/operationsInterfaces/spatial.ts | 338 ++ .../src/operationsInterfaces/tileset.ts | 179 + .../src/operationsInterfaces/wfs.ts | 211 ++ sdk/maps/maps-creator/tsconfig.json | 20 + sdk/maps/maps-elevation/LICENSE.txt | 21 + sdk/maps/maps-elevation/README.md | 91 + sdk/maps/maps-elevation/api-extractor.json | 18 + sdk/maps/maps-elevation/package.json | 84 + .../review/maps-elevation.api.md | 166 + sdk/maps/maps-elevation/rollup.config.js | 188 ++ .../samples/v1/javascript/README.md | 54 + .../samples/v1/javascript/elevation.js | 70 + .../samples/v1/javascript/package.json | 28 + .../samples/v1/javascript/sample.env | 7 + .../samples/v1/typescript/README.md | 67 + .../samples/v1/typescript/package.json | 36 + .../samples/v1/typescript/sample.env | 7 + .../samples/v1/typescript/src/elevation.ts | 76 + .../samples/v1/typescript/tsconfig.json | 17 + .../maps-elevation/src/elevationClient.ts | 30 + .../src/elevationClientContext.ts | 63 + sdk/maps/maps-elevation/src/index.ts | 12 + sdk/maps/maps-elevation/src/models/index.ts | 215 ++ sdk/maps/maps-elevation/src/models/mappers.ts | 236 ++ .../maps-elevation/src/models/parameters.ts | 222 ++ .../src/operations/elevation.ts | 304 ++ .../maps-elevation/src/operations/index.ts | 9 + .../src/operationsInterfaces/elevation.ts | 156 + .../src/operationsInterfaces/index.ts | 9 + sdk/maps/maps-elevation/tsconfig.json | 20 + sdk/maps/maps-geolocation/LICENSE.txt | 21 + sdk/maps/maps-geolocation/README.md | 91 + sdk/maps/maps-geolocation/api-extractor.json | 18 + sdk/maps/maps-geolocation/package.json | 84 + .../review/maps-geolocation.api.md | 110 + sdk/maps/maps-geolocation/rollup.config.js | 188 ++ .../samples/v1/javascript/README.md | 54 + .../samples/v1/javascript/geolocation.js | 60 + .../samples/v1/javascript/package.json | 28 + .../samples/v1/javascript/sample.env | 7 + .../samples/v1/typescript/README.md | 67 + .../samples/v1/typescript/package.json | 36 + .../samples/v1/typescript/sample.env | 7 + .../samples/v1/typescript/src/geolocation.ts | 66 + .../samples/v1/typescript/tsconfig.json | 17 + .../maps-geolocation/src/geolocationClient.ts | 30 + .../src/geolocationClientContext.ts | 63 + sdk/maps/maps-geolocation/src/index.ts | 12 + sdk/maps/maps-geolocation/src/models/index.ts | 150 + .../maps-geolocation/src/models/mappers.ts | 144 + .../maps-geolocation/src/models/parameters.ts | 80 + .../src/operations/geolocation.ts | 76 + .../maps-geolocation/src/operations/index.ts | 9 + .../src/operationsInterfaces/geolocation.ts | 37 + .../src/operationsInterfaces/index.ts | 9 + sdk/maps/maps-geolocation/tsconfig.json | 20 + sdk/maps/maps-render/LICENSE.txt | 21 + sdk/maps/maps-render/README.md | 91 + sdk/maps/maps-render/api-extractor.json | 18 + sdk/maps/maps-render/package.json | 84 + .../maps-render/review/maps-render.api.md | 378 +++ sdk/maps/maps-render/rollup.config.js | 188 ++ .../samples/v1/javascript/README.md | 54 + .../samples/v1/javascript/package.json | 28 + .../samples/v1/javascript/render.js | 100 + .../samples/v1/javascript/sample.env | 7 + .../samples/v1/typescript/README.md | 67 + .../samples/v1/typescript/package.json | 36 + .../samples/v1/typescript/sample.env | 7 + .../samples/v1/typescript/src/render.ts | 107 + .../samples/v1/typescript/tsconfig.json | 17 + sdk/maps/maps-render/src/index.ts | 12 + sdk/maps/maps-render/src/models/index.ts | 1041 ++++++ sdk/maps/maps-render/src/models/mappers.ts | 377 +++ sdk/maps/maps-render/src/models/parameters.ts | 424 +++ sdk/maps/maps-render/src/operations/index.ts | 10 + sdk/maps/maps-render/src/operations/render.ts | 565 ++++ .../maps-render/src/operations/renderV2.ts | 110 + .../src/operationsInterfaces/index.ts | 10 + .../src/operationsInterfaces/render.ts | 310 ++ .../src/operationsInterfaces/renderV2.ts | 57 + sdk/maps/maps-render/src/renderClient.ts | 32 + .../maps-render/src/renderClientContext.ts | 61 + sdk/maps/maps-render/tsconfig.json | 20 + sdk/maps/maps-route/LICENSE.txt | 21 + sdk/maps/maps-route/README.md | 91 + sdk/maps/maps-route/api-extractor.json | 18 + sdk/maps/maps-route/package.json | 86 + sdk/maps/maps-route/review/maps-route.api.md | 882 +++++ sdk/maps/maps-route/rollup.config.js | 188 ++ .../route_directions_batch_request_body.json | 13 + .../route_directions_request_body.json | 78 + .../resources/route_matrix_request_body.json | 28 + .../samples/v1/javascript/README.md | 54 + .../samples/v1/javascript/elevation.js | 70 + .../samples/v1/javascript/package.json | 28 + .../samples/v1/javascript/sample.env | 7 + .../samples/v1/typescript/README.md | 67 + .../samples/v1/typescript/package.json | 36 + .../samples/v1/typescript/sample.env | 7 + .../samples/v1/typescript/src/elevation.ts | 76 + .../samples/v1/typescript/tsconfig.json | 17 + sdk/maps/maps-route/src/index.ts | 12 + .../maps-route/src/lro/azureAsyncPolling.ts | 83 + sdk/maps/maps-route/src/lro/bodyPolling.ts | 45 + sdk/maps/maps-route/src/lro/index.ts | 10 + .../maps-route/src/lro/locationPolling.ts | 32 + sdk/maps/maps-route/src/lro/lroPoller.ts | 66 + sdk/maps/maps-route/src/lro/models.ts | 52 + sdk/maps/maps-route/src/lro/operation.ts | 132 + sdk/maps/maps-route/src/lro/passthrough.ts | 24 + sdk/maps/maps-route/src/lro/pollingMethod.ts | 91 + sdk/maps/maps-route/src/lro/requestUtils.ts | 194 ++ sdk/maps/maps-route/src/lro/stateMachine.ts | 216 ++ sdk/maps/maps-route/src/models/index.ts | 2287 +++++++++++++ sdk/maps/maps-route/src/models/mappers.ts | 1619 +++++++++ sdk/maps/maps-route/src/models/parameters.ts | 597 ++++ sdk/maps/maps-route/src/operations/index.ts | 9 + sdk/maps/maps-route/src/operations/route.ts | 1595 +++++++++ .../src/operationsInterfaces/index.ts | 9 + .../src/operationsInterfaces/route.ts | 1118 +++++++ sdk/maps/maps-route/src/routeClient.ts | 30 + sdk/maps/maps-route/src/routeClientContext.ts | 63 + sdk/maps/maps-route/tsconfig.json | 20 + sdk/maps/maps-search/LICENSE.txt | 21 + sdk/maps/maps-search/README.md | 91 + sdk/maps/maps-search/api-extractor.json | 18 + sdk/maps/maps-search/package.json | 86 + .../maps-search/review/maps-search.api.md | 850 +++++ sdk/maps/maps-search/rollup.config.js | 188 ++ .../search_address_batch_request_body.json | 13 + ...ch_address_reverse_batch_request_body.json | 13 + .../search_along_route_request_body.json | 23 + .../search_fuzzy_batch_request_body.json | 13 + .../search_inside_geometry_request_body.json | 25 + .../samples/v1/javascript/README.md | 54 + .../samples/v1/javascript/elevation.js | 70 + .../samples/v1/javascript/package.json | 28 + .../samples/v1/javascript/sample.env | 7 + .../samples/v1/typescript/README.md | 67 + .../samples/v1/typescript/package.json | 36 + .../samples/v1/typescript/sample.env | 7 + .../samples/v1/typescript/src/elevation.ts | 76 + .../samples/v1/typescript/tsconfig.json | 17 + sdk/maps/maps-search/src/index.ts | 12 + .../maps-search/src/lro/azureAsyncPolling.ts | 83 + sdk/maps/maps-search/src/lro/bodyPolling.ts | 45 + sdk/maps/maps-search/src/lro/index.ts | 10 + .../maps-search/src/lro/locationPolling.ts | 32 + sdk/maps/maps-search/src/lro/lroPoller.ts | 66 + sdk/maps/maps-search/src/lro/models.ts | 52 + sdk/maps/maps-search/src/lro/operation.ts | 132 + sdk/maps/maps-search/src/lro/passthrough.ts | 24 + sdk/maps/maps-search/src/lro/pollingMethod.ts | 91 + sdk/maps/maps-search/src/lro/requestUtils.ts | 194 ++ sdk/maps/maps-search/src/lro/stateMachine.ts | 216 ++ sdk/maps/maps-search/src/models/index.ts | 2088 ++++++++++++ sdk/maps/maps-search/src/models/mappers.ts | 1893 +++++++++++ sdk/maps/maps-search/src/models/parameters.ts | 620 ++++ sdk/maps/maps-search/src/operations/index.ts | 9 + sdk/maps/maps-search/src/operations/search.ts | 2899 +++++++++++++++++ .../src/operationsInterfaces/index.ts | 9 + .../src/operationsInterfaces/search.ts | 2121 ++++++++++++ sdk/maps/maps-search/src/searchClient.ts | 30 + .../maps-search/src/searchClientContext.ts | 63 + sdk/maps/maps-search/tsconfig.json | 20 + sdk/maps/maps-timezone/LICENSE.txt | 21 + sdk/maps/maps-timezone/README.md | 91 + sdk/maps/maps-timezone/api-extractor.json | 18 + sdk/maps/maps-timezone/package.json | 84 + .../maps-timezone/review/maps-timezone.api.md | 268 ++ sdk/maps/maps-timezone/rollup.config.js | 188 ++ .../samples/v1/javascript/README.md | 54 + .../samples/v1/javascript/elevation.js | 70 + .../samples/v1/javascript/package.json | 28 + .../samples/v1/javascript/sample.env | 7 + .../samples/v1/typescript/README.md | 67 + .../samples/v1/typescript/package.json | 36 + .../samples/v1/typescript/sample.env | 7 + .../samples/v1/typescript/src/elevation.ts | 76 + .../samples/v1/typescript/tsconfig.json | 17 + sdk/maps/maps-timezone/src/index.ts | 12 + sdk/maps/maps-timezone/src/models/index.ts | 528 +++ sdk/maps/maps-timezone/src/models/mappers.ts | 657 ++++ .../maps-timezone/src/models/parameters.ts | 140 + .../maps-timezone/src/operations/index.ts | 9 + .../maps-timezone/src/operations/timezone.ts | 321 ++ .../src/operationsInterfaces/index.ts | 9 + .../src/operationsInterfaces/timezone.ts | 129 + sdk/maps/maps-timezone/src/timezoneClient.ts | 30 + .../src/timezoneClientContext.ts | 63 + sdk/maps/maps-timezone/tsconfig.json | 20 + sdk/maps/maps-traffic/LICENSE.txt | 21 + sdk/maps/maps-traffic/README.md | 91 + sdk/maps/maps-traffic/api-extractor.json | 18 + sdk/maps/maps-traffic/package.json | 84 + .../maps-traffic/review/maps-traffic.api.md | 336 ++ sdk/maps/maps-traffic/rollup.config.js | 188 ++ .../samples/v1/javascript/README.md | 54 + .../samples/v1/javascript/elevation.js | 70 + .../samples/v1/javascript/package.json | 28 + .../samples/v1/javascript/sample.env | 7 + .../samples/v1/typescript/README.md | 67 + .../samples/v1/typescript/package.json | 36 + .../samples/v1/typescript/sample.env | 7 + .../samples/v1/typescript/src/elevation.ts | 76 + .../samples/v1/typescript/tsconfig.json | 17 + sdk/maps/maps-traffic/src/index.ts | 12 + sdk/maps/maps-traffic/src/models/index.ts | 657 ++++ sdk/maps/maps-traffic/src/models/mappers.ts | 563 ++++ .../maps-traffic/src/models/parameters.ts | 364 +++ sdk/maps/maps-traffic/src/operations/index.ts | 9 + .../maps-traffic/src/operations/traffic.ts | 397 +++ .../src/operationsInterfaces/index.ts | 9 + .../src/operationsInterfaces/traffic.ts | 222 ++ sdk/maps/maps-traffic/src/trafficClient.ts | 30 + .../maps-traffic/src/trafficClientContext.ts | 63 + sdk/maps/maps-traffic/tsconfig.json | 20 + sdk/maps/maps-weather/LICENSE.txt | 21 + sdk/maps/maps-weather/README.md | 91 + sdk/maps/maps-weather/api-extractor.json | 18 + sdk/maps/maps-weather/package.json | 84 + .../maps-weather/review/maps-weather.api.md | 636 ++++ sdk/maps/maps-weather/rollup.config.js | 188 ++ .../samples/v1/javascript/README.md | 54 + .../samples/v1/javascript/elevation.js | 70 + .../samples/v1/javascript/package.json | 28 + .../samples/v1/javascript/sample.env | 7 + .../samples/v1/typescript/README.md | 67 + .../samples/v1/typescript/package.json | 36 + .../samples/v1/typescript/sample.env | 7 + .../samples/v1/typescript/src/elevation.ts | 76 + .../samples/v1/typescript/tsconfig.json | 17 + sdk/maps/maps-weather/src/index.ts | 12 + sdk/maps/maps-weather/src/models/index.ts | 1069 ++++++ sdk/maps/maps-weather/src/models/mappers.ts | 2159 ++++++++++++ .../maps-weather/src/models/parameters.ts | 150 + sdk/maps/maps-weather/src/operations/index.ts | 9 + .../maps-weather/src/operations/weather.ts | 486 +++ .../src/operationsInterfaces/index.ts | 9 + .../src/operationsInterfaces/weather.ts | 247 ++ sdk/maps/maps-weather/src/weatherClient.ts | 30 + .../maps-weather/src/weatherClientContext.ts | 63 + sdk/maps/maps-weather/tsconfig.json | 20 + 316 files changed, 59428 insertions(+) create mode 100644 sdk/maps/maps-creator/LICENSE.txt create mode 100644 sdk/maps/maps-creator/README.md create mode 100644 sdk/maps/maps-creator/api-extractor.json create mode 100644 sdk/maps/maps-creator/package.json create mode 100644 sdk/maps/maps-creator/review/maps-creator.api.md create mode 100644 sdk/maps/maps-creator/rollup.config.js create mode 100644 sdk/maps/maps-creator/samples/resources/data_sample_update.json create mode 100644 sdk/maps/maps-creator/samples/resources/data_sample_upload.json create mode 100644 sdk/maps/maps-creator/samples/resources/data_sample_upload.zip create mode 100644 sdk/maps/maps-creator/samples/resources/featurestate_sample_create.json create mode 100644 sdk/maps/maps-creator/samples/resources/featurestate_sample_put.json create mode 100644 sdk/maps/maps-creator/samples/resources/featurestate_sample_update_states.json create mode 100644 sdk/maps/maps-creator/samples/resources/spatial_buffer_request_body.json create mode 100644 sdk/maps/maps-creator/samples/resources/spatial_closest_point_request_body.json create mode 100644 sdk/maps/maps-creator/samples/resources/spatial_geofence_request_body.json create mode 100644 sdk/maps/maps-creator/samples/resources/spatial_point_in_polygon_request_body.json create mode 100644 sdk/maps/maps-creator/samples/v1/javascript/README.md create mode 100644 sdk/maps/maps-creator/samples/v1/javascript/alias.js create mode 100644 sdk/maps/maps-creator/samples/v1/javascript/conversion.js create mode 100644 sdk/maps/maps-creator/samples/v1/javascript/data.js create mode 100644 sdk/maps/maps-creator/samples/v1/javascript/dataset.js create mode 100644 sdk/maps/maps-creator/samples/v1/javascript/featurestate.js create mode 100644 sdk/maps/maps-creator/samples/v1/javascript/package.json create mode 100644 sdk/maps/maps-creator/samples/v1/javascript/sample.env create mode 100644 sdk/maps/maps-creator/samples/v1/javascript/spatial.js create mode 100644 sdk/maps/maps-creator/samples/v1/javascript/tileset.js create mode 100644 sdk/maps/maps-creator/samples/v1/javascript/wfs.js create mode 100644 sdk/maps/maps-creator/samples/v1/typescript/README.md create mode 100644 sdk/maps/maps-creator/samples/v1/typescript/package.json create mode 100644 sdk/maps/maps-creator/samples/v1/typescript/sample.env create mode 100644 sdk/maps/maps-creator/samples/v1/typescript/src/alias.ts create mode 100644 sdk/maps/maps-creator/samples/v1/typescript/src/conversion.ts create mode 100644 sdk/maps/maps-creator/samples/v1/typescript/src/data.ts create mode 100644 sdk/maps/maps-creator/samples/v1/typescript/src/dataset.ts create mode 100644 sdk/maps/maps-creator/samples/v1/typescript/src/featurestate.ts create mode 100644 sdk/maps/maps-creator/samples/v1/typescript/src/spatial.ts create mode 100644 sdk/maps/maps-creator/samples/v1/typescript/src/tileset.ts create mode 100644 sdk/maps/maps-creator/samples/v1/typescript/src/wfs.ts create mode 100644 sdk/maps/maps-creator/samples/v1/typescript/tsconfig.json create mode 100644 sdk/maps/maps-creator/src/creatorClient.ts create mode 100644 sdk/maps/maps-creator/src/creatorClientContext.ts create mode 100644 sdk/maps/maps-creator/src/index.ts create mode 100644 sdk/maps/maps-creator/src/lro/azureAsyncPolling.ts create mode 100644 sdk/maps/maps-creator/src/lro/bodyPolling.ts create mode 100644 sdk/maps/maps-creator/src/lro/index.ts create mode 100644 sdk/maps/maps-creator/src/lro/locationPolling.ts create mode 100644 sdk/maps/maps-creator/src/lro/lroPoller.ts create mode 100644 sdk/maps/maps-creator/src/lro/models.ts create mode 100644 sdk/maps/maps-creator/src/lro/operation.ts create mode 100644 sdk/maps/maps-creator/src/lro/passthrough.ts create mode 100644 sdk/maps/maps-creator/src/lro/pollingMethod.ts create mode 100644 sdk/maps/maps-creator/src/lro/requestUtils.ts create mode 100644 sdk/maps/maps-creator/src/lro/stateMachine.ts create mode 100644 sdk/maps/maps-creator/src/models/index.ts create mode 100644 sdk/maps/maps-creator/src/models/mappers.ts create mode 100644 sdk/maps/maps-creator/src/models/parameters.ts create mode 100644 sdk/maps/maps-creator/src/operations/alias.ts create mode 100644 sdk/maps/maps-creator/src/operations/conversion.ts create mode 100644 sdk/maps/maps-creator/src/operations/data.ts create mode 100644 sdk/maps/maps-creator/src/operations/dataset.ts create mode 100644 sdk/maps/maps-creator/src/operations/featureState.ts create mode 100644 sdk/maps/maps-creator/src/operations/index.ts create mode 100644 sdk/maps/maps-creator/src/operations/spatial.ts create mode 100644 sdk/maps/maps-creator/src/operations/tileset.ts create mode 100644 sdk/maps/maps-creator/src/operations/wfs.ts create mode 100644 sdk/maps/maps-creator/src/operationsInterfaces/alias.ts create mode 100644 sdk/maps/maps-creator/src/operationsInterfaces/conversion.ts create mode 100644 sdk/maps/maps-creator/src/operationsInterfaces/data.ts create mode 100644 sdk/maps/maps-creator/src/operationsInterfaces/dataset.ts create mode 100644 sdk/maps/maps-creator/src/operationsInterfaces/featureState.ts create mode 100644 sdk/maps/maps-creator/src/operationsInterfaces/index.ts create mode 100644 sdk/maps/maps-creator/src/operationsInterfaces/spatial.ts create mode 100644 sdk/maps/maps-creator/src/operationsInterfaces/tileset.ts create mode 100644 sdk/maps/maps-creator/src/operationsInterfaces/wfs.ts create mode 100644 sdk/maps/maps-creator/tsconfig.json create mode 100644 sdk/maps/maps-elevation/LICENSE.txt create mode 100644 sdk/maps/maps-elevation/README.md create mode 100644 sdk/maps/maps-elevation/api-extractor.json create mode 100644 sdk/maps/maps-elevation/package.json create mode 100644 sdk/maps/maps-elevation/review/maps-elevation.api.md create mode 100644 sdk/maps/maps-elevation/rollup.config.js create mode 100644 sdk/maps/maps-elevation/samples/v1/javascript/README.md create mode 100644 sdk/maps/maps-elevation/samples/v1/javascript/elevation.js create mode 100644 sdk/maps/maps-elevation/samples/v1/javascript/package.json create mode 100644 sdk/maps/maps-elevation/samples/v1/javascript/sample.env create mode 100644 sdk/maps/maps-elevation/samples/v1/typescript/README.md create mode 100644 sdk/maps/maps-elevation/samples/v1/typescript/package.json create mode 100644 sdk/maps/maps-elevation/samples/v1/typescript/sample.env create mode 100644 sdk/maps/maps-elevation/samples/v1/typescript/src/elevation.ts create mode 100644 sdk/maps/maps-elevation/samples/v1/typescript/tsconfig.json create mode 100644 sdk/maps/maps-elevation/src/elevationClient.ts create mode 100644 sdk/maps/maps-elevation/src/elevationClientContext.ts create mode 100644 sdk/maps/maps-elevation/src/index.ts create mode 100644 sdk/maps/maps-elevation/src/models/index.ts create mode 100644 sdk/maps/maps-elevation/src/models/mappers.ts create mode 100644 sdk/maps/maps-elevation/src/models/parameters.ts create mode 100644 sdk/maps/maps-elevation/src/operations/elevation.ts create mode 100644 sdk/maps/maps-elevation/src/operations/index.ts create mode 100644 sdk/maps/maps-elevation/src/operationsInterfaces/elevation.ts create mode 100644 sdk/maps/maps-elevation/src/operationsInterfaces/index.ts create mode 100644 sdk/maps/maps-elevation/tsconfig.json create mode 100644 sdk/maps/maps-geolocation/LICENSE.txt create mode 100644 sdk/maps/maps-geolocation/README.md create mode 100644 sdk/maps/maps-geolocation/api-extractor.json create mode 100644 sdk/maps/maps-geolocation/package.json create mode 100644 sdk/maps/maps-geolocation/review/maps-geolocation.api.md create mode 100644 sdk/maps/maps-geolocation/rollup.config.js create mode 100644 sdk/maps/maps-geolocation/samples/v1/javascript/README.md create mode 100644 sdk/maps/maps-geolocation/samples/v1/javascript/geolocation.js create mode 100644 sdk/maps/maps-geolocation/samples/v1/javascript/package.json create mode 100644 sdk/maps/maps-geolocation/samples/v1/javascript/sample.env create mode 100644 sdk/maps/maps-geolocation/samples/v1/typescript/README.md create mode 100644 sdk/maps/maps-geolocation/samples/v1/typescript/package.json create mode 100644 sdk/maps/maps-geolocation/samples/v1/typescript/sample.env create mode 100644 sdk/maps/maps-geolocation/samples/v1/typescript/src/geolocation.ts create mode 100644 sdk/maps/maps-geolocation/samples/v1/typescript/tsconfig.json create mode 100644 sdk/maps/maps-geolocation/src/geolocationClient.ts create mode 100644 sdk/maps/maps-geolocation/src/geolocationClientContext.ts create mode 100644 sdk/maps/maps-geolocation/src/index.ts create mode 100644 sdk/maps/maps-geolocation/src/models/index.ts create mode 100644 sdk/maps/maps-geolocation/src/models/mappers.ts create mode 100644 sdk/maps/maps-geolocation/src/models/parameters.ts create mode 100644 sdk/maps/maps-geolocation/src/operations/geolocation.ts create mode 100644 sdk/maps/maps-geolocation/src/operations/index.ts create mode 100644 sdk/maps/maps-geolocation/src/operationsInterfaces/geolocation.ts create mode 100644 sdk/maps/maps-geolocation/src/operationsInterfaces/index.ts create mode 100644 sdk/maps/maps-geolocation/tsconfig.json create mode 100644 sdk/maps/maps-render/LICENSE.txt create mode 100644 sdk/maps/maps-render/README.md create mode 100644 sdk/maps/maps-render/api-extractor.json create mode 100644 sdk/maps/maps-render/package.json create mode 100644 sdk/maps/maps-render/review/maps-render.api.md create mode 100644 sdk/maps/maps-render/rollup.config.js create mode 100644 sdk/maps/maps-render/samples/v1/javascript/README.md create mode 100644 sdk/maps/maps-render/samples/v1/javascript/package.json create mode 100644 sdk/maps/maps-render/samples/v1/javascript/render.js create mode 100644 sdk/maps/maps-render/samples/v1/javascript/sample.env create mode 100644 sdk/maps/maps-render/samples/v1/typescript/README.md create mode 100644 sdk/maps/maps-render/samples/v1/typescript/package.json create mode 100644 sdk/maps/maps-render/samples/v1/typescript/sample.env create mode 100644 sdk/maps/maps-render/samples/v1/typescript/src/render.ts create mode 100644 sdk/maps/maps-render/samples/v1/typescript/tsconfig.json create mode 100644 sdk/maps/maps-render/src/index.ts create mode 100644 sdk/maps/maps-render/src/models/index.ts create mode 100644 sdk/maps/maps-render/src/models/mappers.ts create mode 100644 sdk/maps/maps-render/src/models/parameters.ts create mode 100644 sdk/maps/maps-render/src/operations/index.ts create mode 100644 sdk/maps/maps-render/src/operations/render.ts create mode 100644 sdk/maps/maps-render/src/operations/renderV2.ts create mode 100644 sdk/maps/maps-render/src/operationsInterfaces/index.ts create mode 100644 sdk/maps/maps-render/src/operationsInterfaces/render.ts create mode 100644 sdk/maps/maps-render/src/operationsInterfaces/renderV2.ts create mode 100644 sdk/maps/maps-render/src/renderClient.ts create mode 100644 sdk/maps/maps-render/src/renderClientContext.ts create mode 100644 sdk/maps/maps-render/tsconfig.json create mode 100644 sdk/maps/maps-route/LICENSE.txt create mode 100644 sdk/maps/maps-route/README.md create mode 100644 sdk/maps/maps-route/api-extractor.json create mode 100644 sdk/maps/maps-route/package.json create mode 100644 sdk/maps/maps-route/review/maps-route.api.md create mode 100644 sdk/maps/maps-route/rollup.config.js create mode 100644 sdk/maps/maps-route/samples/resources/route_directions_batch_request_body.json create mode 100644 sdk/maps/maps-route/samples/resources/route_directions_request_body.json create mode 100644 sdk/maps/maps-route/samples/resources/route_matrix_request_body.json create mode 100644 sdk/maps/maps-route/samples/v1/javascript/README.md create mode 100644 sdk/maps/maps-route/samples/v1/javascript/elevation.js create mode 100644 sdk/maps/maps-route/samples/v1/javascript/package.json create mode 100644 sdk/maps/maps-route/samples/v1/javascript/sample.env create mode 100644 sdk/maps/maps-route/samples/v1/typescript/README.md create mode 100644 sdk/maps/maps-route/samples/v1/typescript/package.json create mode 100644 sdk/maps/maps-route/samples/v1/typescript/sample.env create mode 100644 sdk/maps/maps-route/samples/v1/typescript/src/elevation.ts create mode 100644 sdk/maps/maps-route/samples/v1/typescript/tsconfig.json create mode 100644 sdk/maps/maps-route/src/index.ts create mode 100644 sdk/maps/maps-route/src/lro/azureAsyncPolling.ts create mode 100644 sdk/maps/maps-route/src/lro/bodyPolling.ts create mode 100644 sdk/maps/maps-route/src/lro/index.ts create mode 100644 sdk/maps/maps-route/src/lro/locationPolling.ts create mode 100644 sdk/maps/maps-route/src/lro/lroPoller.ts create mode 100644 sdk/maps/maps-route/src/lro/models.ts create mode 100644 sdk/maps/maps-route/src/lro/operation.ts create mode 100644 sdk/maps/maps-route/src/lro/passthrough.ts create mode 100644 sdk/maps/maps-route/src/lro/pollingMethod.ts create mode 100644 sdk/maps/maps-route/src/lro/requestUtils.ts create mode 100644 sdk/maps/maps-route/src/lro/stateMachine.ts create mode 100644 sdk/maps/maps-route/src/models/index.ts create mode 100644 sdk/maps/maps-route/src/models/mappers.ts create mode 100644 sdk/maps/maps-route/src/models/parameters.ts create mode 100644 sdk/maps/maps-route/src/operations/index.ts create mode 100644 sdk/maps/maps-route/src/operations/route.ts create mode 100644 sdk/maps/maps-route/src/operationsInterfaces/index.ts create mode 100644 sdk/maps/maps-route/src/operationsInterfaces/route.ts create mode 100644 sdk/maps/maps-route/src/routeClient.ts create mode 100644 sdk/maps/maps-route/src/routeClientContext.ts create mode 100644 sdk/maps/maps-route/tsconfig.json create mode 100644 sdk/maps/maps-search/LICENSE.txt create mode 100644 sdk/maps/maps-search/README.md create mode 100644 sdk/maps/maps-search/api-extractor.json create mode 100644 sdk/maps/maps-search/package.json create mode 100644 sdk/maps/maps-search/review/maps-search.api.md create mode 100644 sdk/maps/maps-search/rollup.config.js create mode 100644 sdk/maps/maps-search/samples/resources/search_address_batch_request_body.json create mode 100644 sdk/maps/maps-search/samples/resources/search_address_reverse_batch_request_body.json create mode 100644 sdk/maps/maps-search/samples/resources/search_along_route_request_body.json create mode 100644 sdk/maps/maps-search/samples/resources/search_fuzzy_batch_request_body.json create mode 100644 sdk/maps/maps-search/samples/resources/search_inside_geometry_request_body.json create mode 100644 sdk/maps/maps-search/samples/v1/javascript/README.md create mode 100644 sdk/maps/maps-search/samples/v1/javascript/elevation.js create mode 100644 sdk/maps/maps-search/samples/v1/javascript/package.json create mode 100644 sdk/maps/maps-search/samples/v1/javascript/sample.env create mode 100644 sdk/maps/maps-search/samples/v1/typescript/README.md create mode 100644 sdk/maps/maps-search/samples/v1/typescript/package.json create mode 100644 sdk/maps/maps-search/samples/v1/typescript/sample.env create mode 100644 sdk/maps/maps-search/samples/v1/typescript/src/elevation.ts create mode 100644 sdk/maps/maps-search/samples/v1/typescript/tsconfig.json create mode 100644 sdk/maps/maps-search/src/index.ts create mode 100644 sdk/maps/maps-search/src/lro/azureAsyncPolling.ts create mode 100644 sdk/maps/maps-search/src/lro/bodyPolling.ts create mode 100644 sdk/maps/maps-search/src/lro/index.ts create mode 100644 sdk/maps/maps-search/src/lro/locationPolling.ts create mode 100644 sdk/maps/maps-search/src/lro/lroPoller.ts create mode 100644 sdk/maps/maps-search/src/lro/models.ts create mode 100644 sdk/maps/maps-search/src/lro/operation.ts create mode 100644 sdk/maps/maps-search/src/lro/passthrough.ts create mode 100644 sdk/maps/maps-search/src/lro/pollingMethod.ts create mode 100644 sdk/maps/maps-search/src/lro/requestUtils.ts create mode 100644 sdk/maps/maps-search/src/lro/stateMachine.ts create mode 100644 sdk/maps/maps-search/src/models/index.ts create mode 100644 sdk/maps/maps-search/src/models/mappers.ts create mode 100644 sdk/maps/maps-search/src/models/parameters.ts create mode 100644 sdk/maps/maps-search/src/operations/index.ts create mode 100644 sdk/maps/maps-search/src/operations/search.ts create mode 100644 sdk/maps/maps-search/src/operationsInterfaces/index.ts create mode 100644 sdk/maps/maps-search/src/operationsInterfaces/search.ts create mode 100644 sdk/maps/maps-search/src/searchClient.ts create mode 100644 sdk/maps/maps-search/src/searchClientContext.ts create mode 100644 sdk/maps/maps-search/tsconfig.json create mode 100644 sdk/maps/maps-timezone/LICENSE.txt create mode 100644 sdk/maps/maps-timezone/README.md create mode 100644 sdk/maps/maps-timezone/api-extractor.json create mode 100644 sdk/maps/maps-timezone/package.json create mode 100644 sdk/maps/maps-timezone/review/maps-timezone.api.md create mode 100644 sdk/maps/maps-timezone/rollup.config.js create mode 100644 sdk/maps/maps-timezone/samples/v1/javascript/README.md create mode 100644 sdk/maps/maps-timezone/samples/v1/javascript/elevation.js create mode 100644 sdk/maps/maps-timezone/samples/v1/javascript/package.json create mode 100644 sdk/maps/maps-timezone/samples/v1/javascript/sample.env create mode 100644 sdk/maps/maps-timezone/samples/v1/typescript/README.md create mode 100644 sdk/maps/maps-timezone/samples/v1/typescript/package.json create mode 100644 sdk/maps/maps-timezone/samples/v1/typescript/sample.env create mode 100644 sdk/maps/maps-timezone/samples/v1/typescript/src/elevation.ts create mode 100644 sdk/maps/maps-timezone/samples/v1/typescript/tsconfig.json create mode 100644 sdk/maps/maps-timezone/src/index.ts create mode 100644 sdk/maps/maps-timezone/src/models/index.ts create mode 100644 sdk/maps/maps-timezone/src/models/mappers.ts create mode 100644 sdk/maps/maps-timezone/src/models/parameters.ts create mode 100644 sdk/maps/maps-timezone/src/operations/index.ts create mode 100644 sdk/maps/maps-timezone/src/operations/timezone.ts create mode 100644 sdk/maps/maps-timezone/src/operationsInterfaces/index.ts create mode 100644 sdk/maps/maps-timezone/src/operationsInterfaces/timezone.ts create mode 100644 sdk/maps/maps-timezone/src/timezoneClient.ts create mode 100644 sdk/maps/maps-timezone/src/timezoneClientContext.ts create mode 100644 sdk/maps/maps-timezone/tsconfig.json create mode 100644 sdk/maps/maps-traffic/LICENSE.txt create mode 100644 sdk/maps/maps-traffic/README.md create mode 100644 sdk/maps/maps-traffic/api-extractor.json create mode 100644 sdk/maps/maps-traffic/package.json create mode 100644 sdk/maps/maps-traffic/review/maps-traffic.api.md create mode 100644 sdk/maps/maps-traffic/rollup.config.js create mode 100644 sdk/maps/maps-traffic/samples/v1/javascript/README.md create mode 100644 sdk/maps/maps-traffic/samples/v1/javascript/elevation.js create mode 100644 sdk/maps/maps-traffic/samples/v1/javascript/package.json create mode 100644 sdk/maps/maps-traffic/samples/v1/javascript/sample.env create mode 100644 sdk/maps/maps-traffic/samples/v1/typescript/README.md create mode 100644 sdk/maps/maps-traffic/samples/v1/typescript/package.json create mode 100644 sdk/maps/maps-traffic/samples/v1/typescript/sample.env create mode 100644 sdk/maps/maps-traffic/samples/v1/typescript/src/elevation.ts create mode 100644 sdk/maps/maps-traffic/samples/v1/typescript/tsconfig.json create mode 100644 sdk/maps/maps-traffic/src/index.ts create mode 100644 sdk/maps/maps-traffic/src/models/index.ts create mode 100644 sdk/maps/maps-traffic/src/models/mappers.ts create mode 100644 sdk/maps/maps-traffic/src/models/parameters.ts create mode 100644 sdk/maps/maps-traffic/src/operations/index.ts create mode 100644 sdk/maps/maps-traffic/src/operations/traffic.ts create mode 100644 sdk/maps/maps-traffic/src/operationsInterfaces/index.ts create mode 100644 sdk/maps/maps-traffic/src/operationsInterfaces/traffic.ts create mode 100644 sdk/maps/maps-traffic/src/trafficClient.ts create mode 100644 sdk/maps/maps-traffic/src/trafficClientContext.ts create mode 100644 sdk/maps/maps-traffic/tsconfig.json create mode 100644 sdk/maps/maps-weather/LICENSE.txt create mode 100644 sdk/maps/maps-weather/README.md create mode 100644 sdk/maps/maps-weather/api-extractor.json create mode 100644 sdk/maps/maps-weather/package.json create mode 100644 sdk/maps/maps-weather/review/maps-weather.api.md create mode 100644 sdk/maps/maps-weather/rollup.config.js create mode 100644 sdk/maps/maps-weather/samples/v1/javascript/README.md create mode 100644 sdk/maps/maps-weather/samples/v1/javascript/elevation.js create mode 100644 sdk/maps/maps-weather/samples/v1/javascript/package.json create mode 100644 sdk/maps/maps-weather/samples/v1/javascript/sample.env create mode 100644 sdk/maps/maps-weather/samples/v1/typescript/README.md create mode 100644 sdk/maps/maps-weather/samples/v1/typescript/package.json create mode 100644 sdk/maps/maps-weather/samples/v1/typescript/sample.env create mode 100644 sdk/maps/maps-weather/samples/v1/typescript/src/elevation.ts create mode 100644 sdk/maps/maps-weather/samples/v1/typescript/tsconfig.json create mode 100644 sdk/maps/maps-weather/src/index.ts create mode 100644 sdk/maps/maps-weather/src/models/index.ts create mode 100644 sdk/maps/maps-weather/src/models/mappers.ts create mode 100644 sdk/maps/maps-weather/src/models/parameters.ts create mode 100644 sdk/maps/maps-weather/src/operations/index.ts create mode 100644 sdk/maps/maps-weather/src/operations/weather.ts create mode 100644 sdk/maps/maps-weather/src/operationsInterfaces/index.ts create mode 100644 sdk/maps/maps-weather/src/operationsInterfaces/weather.ts create mode 100644 sdk/maps/maps-weather/src/weatherClient.ts create mode 100644 sdk/maps/maps-weather/src/weatherClientContext.ts create mode 100644 sdk/maps/maps-weather/tsconfig.json diff --git a/rush.json b/rush.json index ddf01f788db5..0c8a4a220845 100644 --- a/rush.json +++ b/rush.json @@ -784,6 +784,51 @@ "packageName": "@azure-tests/perf-core-rest-pipeline", "projectFolder": "sdk/core/perf-tests/core-rest-pipeline", "versionPolicyName": "test" + }, + { + "packageName": "@azure/maps-creator", + "projectFolder": "sdk/maps/maps-creator", + "versionPolicyName": "client" + }, + { + "packageName": "@azure/maps-elevation", + "projectFolder": "sdk/maps/maps-elevation", + "versionPolicyName": "client" + }, + { + "packageName": "@azure/maps-geolocation", + "projectFolder": "sdk/maps/maps-geolocation", + "versionPolicyName": "client" + }, + { + "packageName": "@azure/maps-render", + "projectFolder": "sdk/maps/maps-render", + "versionPolicyName": "client" + }, + { + "packageName": "@azure/maps-route", + "projectFolder": "sdk/maps/maps-route", + "versionPolicyName": "client" + }, + { + "packageName": "@azure/maps-search", + "projectFolder": "sdk/maps/maps-search", + "versionPolicyName": "client" + }, + { + "packageName": "@azure/maps-timezone", + "projectFolder": "sdk/maps/maps-timezone", + "versionPolicyName": "client" + }, + { + "packageName": "@azure/maps-traffic", + "projectFolder": "sdk/maps/maps-traffic", + "versionPolicyName": "client" + }, + { + "packageName": "@azure/maps-weather", + "projectFolder": "sdk/maps/maps-weather", + "versionPolicyName": "client" } ] } diff --git a/sdk/maps/maps-creator/LICENSE.txt b/sdk/maps/maps-creator/LICENSE.txt new file mode 100644 index 000000000000..ccb63b166732 --- /dev/null +++ b/sdk/maps/maps-creator/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2021 Microsoft + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/sdk/maps/maps-creator/README.md b/sdk/maps/maps-creator/README.md new file mode 100644 index 000000000000..d9d4bd1ccbb1 --- /dev/null +++ b/sdk/maps/maps-creator/README.md @@ -0,0 +1,91 @@ +# Azure Creator client library for JavaScript + +This package contains an isomorphic SDK (runs both in Node.js and in browsers) for Azure Creator client. + +APIs for managing aliases in Azure Maps. + +[Source code](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-creator) | +[Package (NPM)](https://www.npmjs.com/package/@azure/maps-creator) | +[API reference documentation](https://docs.microsoft.com/javascript/api/@azure/maps-creator) | +[Samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-creator/samples) + +## Getting started + +### Currently supported environments + +- [LTS versions of Node.js](https://nodejs.org/about/releases/) +- Latest versions of Safari, Chrome, Edge and Firefox. + +### Prerequisites + +- An [Azure subscription][azure_sub]. + +### Install the `@azure/maps-creator` package + +Install the Azure Creator client library for JavaScript with `npm`: + +```bash +npm install @azure/maps-creator +``` + +### Create and authenticate a `CreatorClient` + +To create a client object to access the Azure Creator API, you will need the `endpoint` of your Azure Creator resource and a `credential`. The Azure Creator client can use Azure Active Directory credentials to authenticate. +You can find the endpoint for your Azure Creator resource in the [Azure Portal][azure_portal]. + +#### Using an Azure Active Directory Credential + +You can authenticate with Azure Active Directory using the [Azure Identity library][azure_identity]. To use the [DefaultAzureCredential][defaultazurecredential] provider shown below, or other credential providers provided with the Azure SDK, please install the `@azure/identity` package: + +```bash +npm install @azure/identity +``` + +You will also need to register a new AAD application and grant access to Azure Creator by assigning the suitable role to your service principal (note: roles such as `"Owner"` will not grant the necessary permissions). +Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`. + +```javascript +const { CreatorClient } = require("@azure/maps-creator"); +const { DefaultAzureCredential } = require("@azure/identity"); +const client = new CreatorClient("", new DefaultAzureCredential()); +``` + +## Key concepts + +### CreatorClient + +`CreatorClient` is the primary interface for developers using the Azure Creator client library. Explore the methods on this client object to understand the different features of the Azure Creator service that you can access. + +## Troubleshooting + +### Logging + +Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: + +```javascript +import { setLogLevel } from "@azure/logger"; +setLogLevel("info"); +``` + +For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger). + +## Next steps + +Please take a look at the [samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-creator/samples) directory for detailed examples on how to use this library. + +## Contributing + +If you'd like to contribute to this library, please read the [contributing guide](https://github.com/Azure/azure-sdk-for-js/blob/master/CONTRIBUTING.md) to learn more about how to build and test the code. + +## Related projects + +- [Microsoft Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) + +![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fmaps%2Fmaps-creator%2FREADME.png) + +[azure_cli]: https://docs.microsoft.com/cli/azure +[azure_sub]: https://azure.microsoft.com/free/ +[azure_sub]: https://azure.microsoft.com/free/ +[azure_portal]: https://portal.azure.com +[azure_identity]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity +[defaultazurecredential]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity#defaultazurecredential diff --git a/sdk/maps/maps-creator/api-extractor.json b/sdk/maps/maps-creator/api-extractor.json new file mode 100644 index 000000000000..5fb5b21b56f2 --- /dev/null +++ b/sdk/maps/maps-creator/api-extractor.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "mainEntryPointFilePath": "./esm/index.d.ts", + "docModel": { "enabled": true }, + "apiReport": { "enabled": true, "reportFolder": "./review" }, + "dtsRollup": { + "enabled": true, + "untrimmedFilePath": "", + "publicTrimmedFilePath": "./esm/index.d.ts" + }, + "messages": { + "tsdocMessageReporting": { "default": { "logLevel": "none" } }, + "extractorMessageReporting": { + "ae-missing-release-tag": { "logLevel": "none" }, + "ae-unresolved-link": { "logLevel": "none" } + } + } +} diff --git a/sdk/maps/maps-creator/package.json b/sdk/maps/maps-creator/package.json new file mode 100644 index 000000000000..f60bd7c01534 --- /dev/null +++ b/sdk/maps/maps-creator/package.json @@ -0,0 +1,87 @@ +{ + "name": "@azure/maps-creator", + "sdk-type": "client", + "author": "Microsoft Corporation", + "description": "A generated SDK for CreatorClient.", + "version": "1.0.0-beta.1", + "engines": { "node": ">=12.0.0" }, + "dependencies": { + "@azure/core-lro": "^1.0.6", + "@azure/abort-controller": "^1.0.0", + "@azure/core-paging": "^1.1.1", + "@azure/core-client": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-rest-pipeline": "^1.1.0", + "tslib": "^2.2.0" + }, + "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], + "license": "MIT", + "main": "./dist/index.js", + "module": "./esm/index.js", + "types": "./esm/index.d.ts", + "devDependencies": { + "@microsoft/api-extractor": "7.7.11", + "@rollup/plugin-commonjs": "11.0.2", + "@rollup/plugin-json": "^4.0.0", + "@rollup/plugin-multi-entry": "^3.0.0", + "@rollup/plugin-node-resolve": "^8.0.0", + "mkdirp": "^1.0.4", + "rollup": "^1.16.3", + "rollup-plugin-sourcemaps": "^0.4.2", + "rollup-plugin-node-resolve": "^3.4.0", + "typescript": "~4.2.0", + "uglify-js": "^3.4.9" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js", + "repository": { + "type": "git", + "url": "https://github.com/Azure/azure-sdk-for-js.git" + }, + "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, + "files": [ + "dist/**/*.js", + "dist/**/*.js.map", + "dist/**/*.d.ts", + "dist/**/*.d.ts.map", + "esm/**/*.js", + "esm/**/*.js.map", + "esm/**/*.d.ts", + "esm/**/*.d.ts.map", + "src/**/*.ts", + "README.md", + "rollup.config.js", + "tsconfig.json", + "review/*", + "CHANGELOG.md" + ], + "scripts": { + "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", + "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js", + "prepack": "npm install && npm run build", + "pack": "npm pack 2>&1", + "extract-api": "mkdirp ./review && api-extractor run --local", + "lint": "echo skipped", + "audit": "echo skipped", + "clean": "echo skipped", + "build:node": "echo skipped", + "build:browser": "echo skipped", + "build:test": "echo skipped", + "build:samples": "echo skipped.", + "check-format": "echo skipped", + "execute:samples": "echo skipped", + "format": "echo skipped", + "test": "echo skipped", + "prebuild": "echo skipped", + "test:node": "echo skipped", + "test:browser": "echo skipped", + "unit-test": "echo skipped", + "unit-test:node": "echo skipped", + "unit-test:browser": "echo skipped", + "integration-test:browser": "echo skipped", + "integration-test:node": "echo skipped", + "integration-test": "echo skipped", + "docs": "echo skipped" + }, + "sideEffects": false, + "autoPublish": true +} diff --git a/sdk/maps/maps-creator/review/maps-creator.api.md b/sdk/maps/maps-creator/review/maps-creator.api.md new file mode 100644 index 000000000000..9d11f13508b1 --- /dev/null +++ b/sdk/maps/maps-creator/review/maps-creator.api.md @@ -0,0 +1,1213 @@ +## API Report File for "@azure/maps-creator" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import * as coreAuth from '@azure/core-auth'; +import * as coreClient from '@azure/core-client'; +import * as coreRestPipeline from '@azure/core-rest-pipeline'; +import { PagedAsyncIterableIterator } from '@azure/core-paging'; +import { PollerLike } from '@azure/core-lro'; +import { PollOperationState } from '@azure/core-lro'; + +// @public +export interface Alias { + assign(aliasId: string, creatorDataItemId: string, options?: AliasAssignOptionalParams): Promise; + create(options?: AliasCreateOptionalParams): Promise; + delete(aliasId: string, options?: AliasDeleteOptionalParams): Promise; + getDetails(aliasId: string, options?: AliasGetDetailsOptionalParams): Promise; + list(options?: AliasListOptionalParams): PagedAsyncIterableIterator; +} + +// @public +export interface AliasAssignOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type AliasAssignResponse = AliasListItem; + +// @public +export interface AliasCreateHeaders { + accessControlExposeHeaders?: string; +} + +// @public +export interface AliasCreateOptionalParams extends coreClient.OperationOptions { + creatorDataItemId?: string; +} + +// @public +export type AliasCreateResponse = AliasCreateHeaders & AliasesCreateResponse; + +// @public +export interface AliasDeleteOptionalParams extends coreClient.OperationOptions { +} + +// @public +export interface AliasesCreateResponse { + readonly aliasId?: string; + readonly createdTimestamp?: string; + readonly creatorDataItemId?: string; + readonly lastUpdatedTimestamp?: string; +} + +// @public +export interface AliasGetDetailsOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type AliasGetDetailsResponse = AliasListItem; + +// @public +export interface AliasListItem { + readonly aliasId?: string; + readonly createdTimestamp?: string; + readonly creatorDataItemId?: string | null; + readonly lastUpdatedTimestamp?: string; +} + +// @public +export interface AliasListNextOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type AliasListNextResponse = AliasListResponse; + +// @public +export type AliasListOperationResponse = AliasListResponse; + +// @public +export interface AliasListOptionalParams extends coreClient.OperationOptions { +} + +// @public +export interface AliasListResponse { + readonly aliases?: AliasListItem[]; + readonly nextLink?: string; +} + +// @public +export interface BooleanRuleObject { + false?: string; + true?: string; +} + +// @public +export type BooleanTypeStyleRule = StyleObject & { + type: "boolean"; + rules: BooleanRuleObject[]; +}; + +// @public +export interface BufferRequestBody { + distances?: number[]; + geometries?: Record; +} + +// @public +export interface BufferResponse { + result?: GeoJsonFeatureCollectionUnion; + readonly summary?: BufferResponseSummary; +} + +// @public +export interface BufferResponseSummary { + readonly information?: string; + readonly udid?: string; +} + +// @public +export interface ClosestPointResponse { + result?: ClosestPointResultEntry[]; + readonly summary?: ClosestPointSummary; +} + +// @public +export interface ClosestPointResultEntry { + readonly distanceInMeters?: number; + readonly geometryId?: string; + position?: SpatialCoordinate; +} + +// @public +export interface ClosestPointSummary { + readonly information?: string; + sourcePoint?: SpatialCoordinate; + readonly udid?: string; +} + +// @public +export interface CollectionDefinitionResponse { + description?: string; + featureTypes: string[]; + geometryType: GeoJsonGeometryType; + idPrefix: string; + links?: WfsEndpointLink[]; + name: string; + readonly ontology?: string; + properties?: DefinitionProperties[]; + title?: string; +} + +// @public (undocumented) +export interface CollectionInfo { + description?: string; + links: WfsEndpointLink[]; + name: string; + readonly ontology?: string; + title?: string; +} + +// @public (undocumented) +export interface CollectionsResponse { + collections: CollectionInfo[]; + links: WfsEndpointLink[]; + readonly ontology?: string; +} + +// @public (undocumented) +export interface ConformanceResponse { + conformsTo: string[]; +} + +// @public +export interface Conversion { + beginConvert(udid: string, outputOntology: string, options?: ConversionConvertOptionalParams): Promise, ConversionConvertResponse>>; + beginConvertAndWait(udid: string, outputOntology: string, options?: ConversionConvertOptionalParams): Promise; + delete(conversionId: string, options?: ConversionDeleteOptionalParams): Promise; + get(conversionId: string, options?: ConversionGetOptionalParams): Promise; + getOperation(operationId: string, options?: ConversionGetOperationOptionalParams): Promise; + list(options?: ConversionListOptionalParams): PagedAsyncIterableIterator; +} + +// @public +export interface ConversionConvertHeaders { + resourceLocation?: string; +} + +// @public +export interface ConversionConvertOptionalParams extends coreClient.OperationOptions { + description?: string; + resumeFrom?: string; + updateIntervalInMs?: number; +} + +// @public +export type ConversionConvertResponse = ConversionConvertHeaders & LongRunningOperationResult; + +// @public +export interface ConversionDeleteOptionalParams extends coreClient.OperationOptions { +} + +// @public +export interface ConversionGetOperationHeaders { + resourceLocation?: string; +} + +// @public +export interface ConversionGetOperationOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type ConversionGetOperationResponse = ConversionGetOperationHeaders & LongRunningOperationResult; + +// @public +export interface ConversionGetOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type ConversionGetResponse = ConversionListDetailInfo; + +// @public +export interface ConversionListDetailInfo { + readonly conversionId?: string; + readonly created?: string; + readonly description?: string; + readonly featureCounts?: Record; + readonly ontology?: string; + readonly udid?: string; +} + +// @public +export interface ConversionListNextOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type ConversionListNextResponse = ConversionListResponse; + +// @public +export type ConversionListOperationResponse = ConversionListResponse; + +// @public +export interface ConversionListOptionalParams extends coreClient.OperationOptions { +} + +// @public +export interface ConversionListResponse { + readonly conversions?: ConversionListDetailInfo[]; + readonly nextLink?: string; +} + +// @public (undocumented) +export class CreatorClient extends CreatorClientContext { + constructor(credentials: coreAuth.TokenCredential, options?: CreatorClientOptionalParams); + // (undocumented) + alias: Alias; + // (undocumented) + conversion: Conversion; + // (undocumented) + data: Data; + // (undocumented) + dataset: Dataset; + // (undocumented) + featureState: FeatureState; + // (undocumented) + spatial: Spatial; + // (undocumented) + tileset: Tileset; + // (undocumented) + wfs: Wfs; +} + +// @public (undocumented) +export class CreatorClientContext extends coreClient.ServiceClient { + constructor(credentials: coreAuth.TokenCredential, options?: CreatorClientOptionalParams); + // (undocumented) + geography: Geography; + // (undocumented) + xMsClientId?: string; +} + +// @public +export interface CreatorClientOptionalParams extends coreClient.ServiceClientOptions { + endpoint?: string; + geography?: Geography; + xMsClientId?: string; +} + +// @public +export interface Data { + beginUpdatePreview(uniqueDataId: string, updateContent: Record, options?: DataUpdatePreviewOptionalParams): Promise, DataUpdatePreviewResponse>>; + beginUpdatePreviewAndWait(uniqueDataId: string, updateContent: Record, options?: DataUpdatePreviewOptionalParams): Promise; + beginUploadPreview(...args: [ + UploadDataFormat, + "application/octet-stream", + coreRestPipeline.RequestBodyType, + DataUploadPreview$binaryOptionalParams? + ] | [ + UploadDataFormat, + "application/json", + Record, + DataUploadPreview$jsonOptionalParams? + ]): Promise, DataUploadPreviewResponse>>; + beginUploadPreviewAndWait(...args: [ + UploadDataFormat, + "application/octet-stream", + coreRestPipeline.RequestBodyType, + DataUploadPreview$binaryOptionalParams? + ] | [ + UploadDataFormat, + "application/json", + Record, + DataUploadPreview$jsonOptionalParams? + ]): Promise; + deletePreview(uniqueDataId: string, options?: DataDeletePreviewOptionalParams): Promise; + downloadPreview(uniqueDataId: string, options?: DataDownloadPreviewOptionalParams): Promise; + getOperationPreview(operationId: string, options?: DataGetOperationPreviewOptionalParams): Promise; + listPreview(options?: DataListPreviewOptionalParams): Promise; +} + +// @public +export interface DataDeletePreviewOptionalParams extends coreClient.OperationOptions { +} + +// @public +export interface DataDownloadPreviewHeaders { + contentType?: string; +} + +// @public +export interface DataDownloadPreviewOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type DataDownloadPreviewResponse = DataDownloadPreviewHeaders & { + blobBody?: Promise; + readableStreamBody?: NodeJS.ReadableStream; +}; + +// @public +export interface DataGetOperationPreviewHeaders { + resourceLocation?: string; +} + +// @public +export interface DataGetOperationPreviewOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type DataGetOperationPreviewResponse = DataGetOperationPreviewHeaders & LongRunningOperationResult; + +// @public +export interface DataListPreviewOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type DataListPreviewResponse = MapDataListResponse; + +// @public +export interface Dataset { + beginCreate(conversionId: string, options?: DatasetCreateOptionalParams): Promise, DatasetCreateResponse>>; + beginCreateAndWait(conversionId: string, options?: DatasetCreateOptionalParams): Promise; + delete(datasetId: string, options?: DatasetDeleteOptionalParams): Promise; + get(datasetId: string, options?: DatasetGetOptionalParams): Promise; + getOperation(operationId: string, options?: DatasetGetOperationOptionalParams): Promise; + list(options?: DatasetListOptionalParams): PagedAsyncIterableIterator; +} + +// @public +export interface DatasetCreateHeaders { + resourceLocation?: string; +} + +// @public +export interface DatasetCreateOptionalParams extends coreClient.OperationOptions { + datasetId?: string; + descriptionDataset?: string; + resumeFrom?: string; + updateIntervalInMs?: number; +} + +// @public +export type DatasetCreateResponse = DatasetCreateHeaders & LongRunningOperationResult; + +// @public +export interface DatasetDeleteOptionalParams extends coreClient.OperationOptions { +} + +// @public +export interface DatasetDetailInfo { + readonly created?: string; + readonly datasetId?: string; + datasetSources?: DatasetSources; + readonly description?: string; + readonly featureCounts?: Record; + readonly ontology?: string; +} + +// @public +export interface DatasetGetOperationHeaders { + resourceLocation?: string; +} + +// @public +export interface DatasetGetOperationOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type DatasetGetOperationResponse = DatasetGetOperationHeaders & LongRunningOperationResult; + +// @public +export interface DatasetGetOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type DatasetGetResponse = DatasetDetailInfo; + +// @public +export interface DatasetListNextOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type DatasetListNextResponse = DatasetListResponse; + +// @public +export type DatasetListOperationResponse = DatasetListResponse; + +// @public +export interface DatasetListOptionalParams extends coreClient.OperationOptions { +} + +// @public +export interface DatasetListResponse { + readonly datasets?: DatasetDetailInfo[]; + readonly nextLink?: string; +} + +// @public +export interface DatasetSources { + readonly appendDatasetId?: string; + readonly conversionIds?: string[]; +} + +// @public +export interface DataUpdatePreviewHeaders { + resourceLocation?: string; +} + +// @public +export interface DataUpdatePreviewOptionalParams extends coreClient.OperationOptions { + resumeFrom?: string; + updateIntervalInMs?: number; + uploadDataDescription?: string; +} + +// @public +export type DataUpdatePreviewResponse = DataUpdatePreviewHeaders & LongRunningOperationResult; + +// @public +export interface DataUploadPreview$binaryOptionalParams extends coreClient.OperationOptions { + resumeFrom?: string; + updateIntervalInMs?: number; + uploadDataDescription?: string; +} + +// @public +export interface DataUploadPreview$jsonOptionalParams extends coreClient.OperationOptions { + resumeFrom?: string; + updateIntervalInMs?: number; + uploadDataDescription?: string; +} + +// @public +export interface DataUploadPreviewHeaders { + resourceLocation?: string; +} + +// @public +export type DataUploadPreviewResponse = DataUploadPreviewHeaders & LongRunningOperationResult; + +// @public (undocumented) +export interface DefinitionProperties { + name: string; + required: boolean; + type: Record; +} + +// @public +export interface ErrorAdditionalInfo { + readonly info?: Record; + readonly type?: string; +} + +// @public +export interface ErrorDetail { + readonly additionalInfo?: ErrorAdditionalInfo[]; + readonly code?: string; + readonly details?: ErrorDetail[]; + readonly message?: string; + readonly target?: string; +} + +// @public +export interface ErrorResponse { + error?: ErrorDetail; +} + +// @public +export type ExtendedGeoJsonFeatureCollection = GeoJsonFeatureCollection & ExtendedGeoJsonFeatureCollectionData & {}; + +// @public (undocumented) +export interface ExtendedGeoJsonFeatureCollectionData { + links?: WfsEndpointLink[]; + numberReturned?: number; + readonly ontology?: string; +} + +// @public (undocumented) +export interface FeatureResponse { + feature: GeoJsonFeature; + links?: WfsEndpointLink[]; + readonly ontology?: string; +} + +// @public +export interface FeatureState { + createStateset(datasetId: string, statesetCreateRequestBody: StylesObject, options?: FeatureStateCreateStatesetOptionalParams): Promise; + deleteState(statesetId: string, featureId: string, stateKeyName: string, options?: FeatureStateDeleteStateOptionalParams): Promise; + deleteStateset(statesetId: string, options?: FeatureStateDeleteStatesetOptionalParams): Promise; + getStates(statesetId: string, featureId: string, options?: FeatureStateGetStatesOptionalParams): Promise; + getStateset(statesetId: string, options?: FeatureStateGetStatesetOptionalParams): Promise; + listStateset(options?: FeatureStateListStatesetOptionalParams): PagedAsyncIterableIterator; + putStateset(statesetId: string, statesetStyleUpdateRequestBody: StylesObject, options?: FeatureStatePutStatesetOptionalParams): Promise; + updateStates(statesetId: string, featureId: string, featureStateUpdateRequestBody: FeatureStatesStructure, options?: FeatureStateUpdateStatesOptionalParams): Promise; +} + +// @public +export interface FeatureStateCreateStatesetOptionalParams extends coreClient.OperationOptions { + description?: string; +} + +// @public +export type FeatureStateCreateStatesetResponse = StatesetCreatedResponse; + +// @public +export interface FeatureStateDeleteStateOptionalParams extends coreClient.OperationOptions { +} + +// @public +export interface FeatureStateDeleteStatesetOptionalParams extends coreClient.OperationOptions { +} + +// @public +export interface FeatureStateGetStatesetOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type FeatureStateGetStatesetResponse = StatesetGetResponse; + +// @public +export interface FeatureStateGetStatesOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type FeatureStateGetStatesResponse = FeatureStatesStructure; + +// @public +export interface FeatureStateListStatesetNextOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type FeatureStateListStatesetNextResponse = StatesetListResponse; + +// @public +export interface FeatureStateListStatesetOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type FeatureStateListStatesetResponse = StatesetListResponse; + +// @public +export interface FeatureStateObject { + eventTimestamp?: string; + keyName?: string; + value?: string; +} + +// @public +export interface FeatureStatePutStatesetOptionalParams extends coreClient.OperationOptions { +} + +// @public +export interface FeatureStatesStructure { + states?: FeatureStateObject[]; +} + +// @public +export interface FeatureStateUpdateStatesOptionalParams extends coreClient.OperationOptions { +} + +// @public +export interface GeofenceGeometry { + readonly deviceId?: string; + readonly distance?: number; + readonly geometryId?: string; + readonly nearestLat?: number; + readonly nearestLon?: number; + readonly nearestZ?: number; + readonly udId?: string; +} + +// @public +export type GeofenceMode = string; + +// @public +export interface GeofenceResponse { + readonly expiredGeofenceGeometryId?: string[]; + readonly geometries?: GeofenceGeometry[]; + readonly invalidPeriodGeofenceGeometryId?: string[]; + readonly isEventPublished?: boolean; +} + +// @public +export type GeographicResourceLocation = string; + +// @public +export type Geography = string; + +// @public +export type GeoJsonFeature = GeoJsonObject & GeoJsonFeatureData & { + type: "Feature"; +}; + +// @public +export type GeoJsonFeatureCollection = GeoJsonObject & GeoJsonFeatureCollectionData & { + type: "FeatureCollection" | "FeatureCollection"; +}; + +// @public (undocumented) +export interface GeoJsonFeatureCollectionData { + features: GeoJsonFeature[]; +} + +// @public (undocumented) +export type GeoJsonFeatureCollectionUnion = GeoJsonFeatureCollection | ExtendedGeoJsonFeatureCollection; + +// @public (undocumented) +export interface GeoJsonFeatureData { + featureType?: string; + geometry: GeoJsonGeometryUnion; + id?: string; + properties?: Record; +} + +// @public +export type GeoJsonGeometry = GeoJsonObject & { + type: "GeoJsonGeometry" | "Point" | "MultiPoint" | "LineString" | "MultiLineString" | "Polygon" | "MultiPolygon" | "GeometryCollection"; +}; + +// @public +export type GeoJsonGeometryCollection = GeoJsonGeometry & GeoJsonGeometryCollectionData & {}; + +// @public (undocumented) +export interface GeoJsonGeometryCollectionData { + geometries: GeoJsonGeometryUnion[]; +} + +// @public +export type GeoJsonGeometryType = string; + +// @public (undocumented) +export type GeoJsonGeometryUnion = GeoJsonGeometry | GeoJsonPoint | GeoJsonMultiPoint | GeoJsonLineString | GeoJsonMultiLineString | GeoJsonPolygon | GeoJsonMultiPolygon | GeoJsonGeometryCollection; + +// @public +export type GeoJsonLineString = GeoJsonGeometry & GeoJsonLineStringData & {}; + +// @public (undocumented) +export interface GeoJsonLineStringData { + coordinates: number[][]; +} + +// @public +export type GeoJsonMultiLineString = GeoJsonGeometry & GeoJsonMultiLineStringData & {}; + +// @public (undocumented) +export interface GeoJsonMultiLineStringData { + coordinates: number[][][]; +} + +// @public +export type GeoJsonMultiPoint = GeoJsonGeometry & GeoJsonMultiPointData & {}; + +// @public +export interface GeoJsonMultiPointData { + coordinates: number[][]; +} + +// @public +export type GeoJsonMultiPolygon = GeoJsonGeometry & GeoJsonMultiPolygonData & {}; + +// @public (undocumented) +export interface GeoJsonMultiPolygonData { + coordinates: number[][][][]; +} + +// @public +export interface GeoJsonObject { + type: "GeoJsonGeometry" | "Feature" | "FeatureCollection" | "FeatureCollection" | "Point" | "MultiPoint" | "LineString" | "MultiLineString" | "Polygon" | "MultiPolygon" | "GeometryCollection"; +} + +// @public +export type GeoJsonObjectType = string; + +// @public (undocumented) +export type GeoJsonObjectUnion = GeoJsonObject | GeoJsonGeometryUnion | GeoJsonFeature | GeoJsonFeatureCollectionUnion; + +// @public +export type GeoJsonPoint = GeoJsonGeometry & GeoJsonPointData & {}; + +// @public +export interface GeoJsonPointData { + coordinates: number[]; +} + +// @public +export type GeoJsonPolygon = GeoJsonGeometry & GeoJsonPolygonData & {}; + +// @public (undocumented) +export interface GeoJsonPolygonData { + coordinates: number[][][]; +} + +// @public +export interface GreatCircleDistanceResponse { + readonly result?: GreatCircleDistanceResponseResult; + readonly summary?: GreatCircleDistanceResponseSummary; +} + +// @public +export interface GreatCircleDistanceResponseResult { + readonly distanceInMeters?: number; +} + +// @public +export interface GreatCircleDistanceResponseSummary { + sourcePoint?: SpatialCoordinate; + targetPoint?: SpatialCoordinate; +} + +// @public +export const enum KnownGeofenceMode { + All = "All", + EnterAndExit = "EnterAndExit" +} + +// @public +export const enum KnownGeographicResourceLocation { + Eu = "eu", + Us = "us" +} + +// @public +export const enum KnownGeography { + // (undocumented) + Eu = "eu", + // (undocumented) + Us = "us" +} + +// @public +export const enum KnownGeoJsonGeometryType { + GeoJsonGeometryCollection = "GeometryCollection", + GeoJsonLineString = "LineString", + GeoJsonMultiLineString = "MultiLineString", + GeoJsonMultiPoint = "MultiPoint", + GeoJsonMultiPolygon = "MultiPolygon", + GeoJsonPoint = "Point", + GeoJsonPolygon = "Polygon" +} + +// @public +export const enum KnownGeoJsonObjectType { + GeoJsonFeature = "Feature", + GeoJsonFeatureCollection = "FeatureCollection", + GeoJsonGeometryCollection = "GeometryCollection", + GeoJsonLineString = "LineString", + GeoJsonMultiLineString = "MultiLineString", + GeoJsonMultiPoint = "MultiPoint", + GeoJsonMultiPolygon = "MultiPolygon", + GeoJsonPoint = "Point", + GeoJsonPolygon = "Polygon" +} + +// @public +export const enum KnownLroStatus { + Failed = "Failed", + NotStarted = "NotStarted", + Running = "Running", + Succeeded = "Succeeded" +} + +// @public +export const enum KnownResponseFormat { + Json = "json" +} + +// @public +export const enum KnownStyleObjectType { + BooleanTypeStyleRule = "boolean", + NumberTypeStyleRule = "number", + StringTypeStyleRule = "string" +} + +// @public +export const enum KnownUploadDataFormat { + Dwgzippackage = "dwgzippackage", + Geojson = "geojson", + Zip = "zip" +} + +// @public (undocumented) +export interface LandingPageResponse { + links: WfsEndpointLink[]; + readonly ontology?: string; +} + +// @public +export interface LongRunningOperationResult { + readonly created?: string; + error?: ErrorDetail; + operationId?: string; + readonly status?: LroStatus; + warning?: ErrorDetail; +} + +// @public +export type LroStatus = string; + +// @public +export interface MapDataDetailInfo { + readonly dataFormat?: string; + readonly description?: string; + readonly location?: string; + readonly sizeInBytes?: number; + readonly udid?: string; + readonly uploadStatus?: string; +} + +// @public +export interface MapDataListResponse { + readonly mapDataList?: MapDataDetailInfo[]; +} + +// @public +export interface NumberRuleObject { + color?: string; + range?: RangeObject; +} + +// @public +export type NumberTypeStyleRule = StyleObject & { + type: "number"; + rules: NumberRuleObject[]; +}; + +// @public +export interface PointInPolygonResponse { + result?: PointInPolygonResult; + readonly summary?: PointInPolygonSummary; +} + +// @public +export interface PointInPolygonResult { + readonly intersectingGeometries?: string[]; + readonly pointInPolygons?: boolean; +} + +// @public +export interface PointInPolygonSummary { + readonly information?: string; + sourcePoint?: SpatialCoordinate; + readonly udid?: string; +} + +// @public +export interface RangeObject { + exclusiveMaximum?: number; + exclusiveMinimum?: number; + maximum?: number; + minimum?: number; +} + +// @public +export type ResponseFormat = string; + +// @public +export interface Spatial { + getBuffer(format: ResponseFormat, udid: string, distances: string, options?: SpatialGetBufferOptionalParams): Promise; + getClosestPoint(format: ResponseFormat, udid: string, latitude: number, longitude: number, options?: SpatialGetClosestPointOptionalParams): Promise; + getGeofence(format: ResponseFormat, deviceId: string, udid: string, latitude: number, longitude: number, options?: SpatialGetGeofenceOptionalParams): Promise; + getGreatCircleDistance(format: ResponseFormat, query: string, options?: SpatialGetGreatCircleDistanceOptionalParams): Promise; + getPointInPolygon(format: ResponseFormat, udid: string, latitude: number, longitude: number, options?: SpatialGetPointInPolygonOptionalParams): Promise; + postBuffer(format: ResponseFormat, bufferRequestBody: BufferRequestBody, options?: SpatialPostBufferOptionalParams): Promise; + postClosestPoint(format: ResponseFormat, latitude: number, longitude: number, closestPointRequestBody: Record, options?: SpatialPostClosestPointOptionalParams): Promise; + postGeofence(format: ResponseFormat, deviceId: string, latitude: number, longitude: number, searchGeofenceRequestBody: Record, options?: SpatialPostGeofenceOptionalParams): Promise; + postPointInPolygon(format: ResponseFormat, latitude: number, longitude: number, pointInPolygonRequestBody: Record, options?: SpatialPostPointInPolygonOptionalParams): Promise; +} + +// @public +export interface SpatialCoordinate { + readonly lat?: number; + readonly lon?: number; +} + +// @public +export interface SpatialGetBufferOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type SpatialGetBufferResponse = BufferResponse; + +// @public +export interface SpatialGetClosestPointOptionalParams extends coreClient.OperationOptions { + numberOfClosestPoints?: number; +} + +// @public +export type SpatialGetClosestPointResponse = ClosestPointResponse; + +// @public +export interface SpatialGetGeofenceHeaders { + xCorrelationId?: string; +} + +// @public +export interface SpatialGetGeofenceOptionalParams extends coreClient.OperationOptions { + isAsync?: boolean; + mode?: GeofenceMode; + searchBuffer?: number; + userTime?: Date; + z?: number; +} + +// @public +export type SpatialGetGeofenceResponse = SpatialGetGeofenceHeaders & GeofenceResponse; + +// @public +export interface SpatialGetGreatCircleDistanceOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type SpatialGetGreatCircleDistanceResponse = GreatCircleDistanceResponse; + +// @public +export interface SpatialGetPointInPolygonOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type SpatialGetPointInPolygonResponse = PointInPolygonResponse; + +// @public +export interface SpatialPostBufferOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type SpatialPostBufferResponse = BufferResponse; + +// @public +export interface SpatialPostClosestPointOptionalParams extends coreClient.OperationOptions { + numberOfClosestPoints?: number; +} + +// @public +export type SpatialPostClosestPointResponse = ClosestPointResponse; + +// @public +export interface SpatialPostGeofenceHeaders { + xCorrelationId?: string; +} + +// @public +export interface SpatialPostGeofenceOptionalParams extends coreClient.OperationOptions { + isAsync?: boolean; + mode?: GeofenceMode; + searchBuffer?: number; + userTime?: Date; + z?: number; +} + +// @public +export type SpatialPostGeofenceResponse = SpatialPostGeofenceHeaders & GeofenceResponse; + +// @public +export interface SpatialPostPointInPolygonOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type SpatialPostPointInPolygonResponse = PointInPolygonResponse; + +// @public +export interface StatesetCreatedResponse { + readonly statesetId?: string; +} + +// @public +export interface StatesetGetResponse { + datasetIds?: string[]; + readonly description?: string; + statesetStyle?: StylesObject; +} + +// @public +export interface StatesetInfoObject { + datasetIds?: string[]; + readonly description?: string; + statesetId?: string; + statesetStyle?: StylesObject; +} + +// @public +export interface StatesetListResponse { + readonly nextLink?: string; + statesets?: StatesetInfoObject[]; +} + +// @public +export type StringTypeStyleRule = StyleObject & { + type: "string"; + rules: { + [propertyName: string]: string; + }[]; +}; + +// @public +export interface StyleObject { + keyName: string; + type: "boolean" | "number" | "string"; +} + +// @public +export type StyleObjectType = string; + +// @public (undocumented) +export type StyleObjectUnion = StyleObject | BooleanTypeStyleRule | NumberTypeStyleRule | StringTypeStyleRule; + +// @public +export interface StylesObject { + styles?: StyleObjectUnion[]; +} + +// @public +export interface Tileset { + beginCreate(datasetId: string, options?: TilesetCreateOptionalParams): Promise, TilesetCreateResponse>>; + beginCreateAndWait(datasetId: string, options?: TilesetCreateOptionalParams): Promise; + delete(tilesetId: string, options?: TilesetDeleteOptionalParams): Promise; + get(tilesetId: string, options?: TilesetGetOptionalParams): Promise; + getOperation(operationId: string, options?: TilesetGetOperationOptionalParams): Promise; + list(options?: TilesetListOptionalParams): PagedAsyncIterableIterator; +} + +// @public +export interface TilesetCreateHeaders { + resourceLocation?: string; +} + +// @public +export interface TilesetCreateOptionalParams extends coreClient.OperationOptions { + description?: string; + resumeFrom?: string; + updateIntervalInMs?: number; +} + +// @public +export type TilesetCreateResponse = TilesetCreateHeaders & LongRunningOperationResult; + +// @public +export interface TilesetDeleteOptionalParams extends coreClient.OperationOptions { +} + +// @public +export interface TilesetDetailInfo { + readonly bbox?: number[]; + readonly datasetId?: string; + readonly description?: string; + readonly maxZoom?: number; + readonly minZoom?: number; + readonly ontology?: string; + readonly tilesetId?: string; +} + +// @public +export interface TilesetGetOperationHeaders { + resourceLocation?: string; +} + +// @public +export interface TilesetGetOperationOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type TilesetGetOperationResponse = TilesetGetOperationHeaders & LongRunningOperationResult; + +// @public +export interface TilesetGetOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type TilesetGetResponse = TilesetDetailInfo; + +// @public +export interface TilesetListNextOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type TilesetListNextResponse = TilesetListResponse; + +// @public +export type TilesetListOperationResponse = TilesetListResponse; + +// @public +export interface TilesetListOptionalParams extends coreClient.OperationOptions { +} + +// @public +export interface TilesetListResponse { + readonly nextLink?: string; + readonly tilesets?: TilesetDetailInfo[]; +} + +// @public +export type UploadDataFormat = string; + +// @public +export interface Wfs { + deleteFeature(datasetId: string, collectionId: string, featureId: string, options?: WfsDeleteFeatureOptionalParams): Promise; + getCollection(datasetId: string, collectionId: string, options?: WfsGetCollectionOptionalParams): Promise; + getCollectionDefinition(datasetId: string, collectionId: string, options?: WfsGetCollectionDefinitionOptionalParams): Promise; + getCollections(datasetId: string, options?: WfsGetCollectionsOptionalParams): Promise; + getConformance(datasetId: string, options?: WfsGetConformanceOptionalParams): Promise; + getFeature(datasetId: string, collectionId: string, featureId: string, options?: WfsGetFeatureOptionalParams): Promise; + getFeatures(datasetId: string, collectionId: string, options?: WfsGetFeaturesOptionalParams): Promise; + getLandingPage(datasetId: string, options?: WfsGetLandingPageOptionalParams): Promise; +} + +// @public +export interface WfsDeleteFeatureOptionalParams extends coreClient.OperationOptions { +} + +// @public +export interface WfsEndpointLink { + href: string; + hreflang?: string; + rel?: string; + title?: string; + type?: string; +} + +// @public +export interface WfsGetCollectionDefinitionOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type WfsGetCollectionDefinitionResponse = CollectionDefinitionResponse; + +// @public +export interface WfsGetCollectionOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type WfsGetCollectionResponse = CollectionInfo; + +// @public +export interface WfsGetCollectionsOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type WfsGetCollectionsResponse = CollectionsResponse; + +// @public +export interface WfsGetConformanceOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type WfsGetConformanceResponse = ConformanceResponse; + +// @public +export interface WfsGetFeatureOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type WfsGetFeatureResponse = FeatureResponse; + +// @public +export interface WfsGetFeaturesOptionalParams extends coreClient.OperationOptions { + bbox?: string; + filter?: string; + limit?: number; +} + +// @public +export type WfsGetFeaturesResponse = ExtendedGeoJsonFeatureCollection; + +// @public +export interface WfsGetLandingPageOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type WfsGetLandingPageResponse = LandingPageResponse; + + +// (No @packageDocumentation comment for this package) + +``` diff --git a/sdk/maps/maps-creator/rollup.config.js b/sdk/maps/maps-creator/rollup.config.js new file mode 100644 index 000000000000..9be1955eb7f1 --- /dev/null +++ b/sdk/maps/maps-creator/rollup.config.js @@ -0,0 +1,188 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import nodeResolve from "@rollup/plugin-node-resolve"; +import cjs from "@rollup/plugin-commonjs"; +import sourcemaps from "rollup-plugin-sourcemaps"; +import multiEntry from "@rollup/plugin-multi-entry"; +import json from "@rollup/plugin-json"; + +import nodeBuiltins from "builtin-modules"; + +/** + * Gets the proper configuration needed for rollup's commonJS plugin for @opentelemetry/api. + * + * NOTE: this manual configuration is only needed because OpenTelemetry uses an + * __exportStar downleveled helper function to declare its exports which confuses + * rollup's automatic discovery mechanism. + * + * @returns an object reference that can be `...`'d into your cjs() configuration. + */ +export function openTelemetryCommonJs() { + const namedExports = {}; + + for (const key of [ + "@opentelemetry/api", + "@azure/core-tracing/node_modules/@opentelemetry/api" + ]) { + namedExports[key] = [ + "SpanKind", + "TraceFlags", + "getSpan", + "setSpan", + "SpanStatusCode", + "getSpanContext", + "setSpanContext" + ]; + } + + const releasedOpenTelemetryVersions = ["0.10.2", "1.0.0-rc.0"]; + + for (const version of releasedOpenTelemetryVersions) { + namedExports[ + // working around a limitation in the rollup common.js plugin - it's not able to resolve these modules so the named exports listed above will not get applied. We have to drill down to the actual path. + `../../../common/temp/node_modules/.pnpm/@opentelemetry/api@${version}/node_modules/@opentelemetry/api/build/src/index.js` + ] = [ + "SpanKind", + "TraceFlags", + "getSpan", + "setSpan", + "StatusCode", + "CanonicalCode", + "getSpanContext", + "setSpanContext" + ]; + } + + return namedExports; +} + +// #region Warning Handler + +/** + * A function that can determine whether a rollupwarning should be ignored. If + * the function returns `true`, then the warning will not be displayed. + */ + +function ignoreNiseSinonEvalWarnings(warning) { + return ( + warning.code === "EVAL" && + warning.id && + (warning.id.includes("node_modules/nise") || + warning.id.includes("node_modules/sinon")) === true + ); +} + +function ignoreChaiCircularDependencyWarnings(warning) { + return ( + warning.code === "CIRCULAR_DEPENDENCY" && + warning.importer && warning.importer.includes("node_modules/chai") === true + ); +} + +const warningInhibitors = [ + ignoreChaiCircularDependencyWarnings, + ignoreNiseSinonEvalWarnings +]; + +/** + * Construct a warning handler for the shared rollup configuration + * that ignores certain warnings that are not relevant to testing. + */ +function makeOnWarnForTesting() { + return (warning, warn) => { + // If every inhibitor returns false (i.e. no inhibitors), then show the warning + if (warningInhibitors.every((inhib) => !inhib(warning))) { + warn(warning); + } + }; +} + +// #endregion + +function makeBrowserTestConfig() { + const config = { + input: { + include: ["dist-esm/test/**/*.spec.js"], + exclude: ["dist-esm/test/**/node/**"] + }, + output: { + file: `dist-test/index.browser.js`, + format: "umd", + sourcemap: true + }, + preserveSymlinks: false, + plugins: [ + multiEntry({ exports: false }), + nodeResolve({ + mainFields: ["module", "browser"] + }), + cjs({ + namedExports: { + // Chai's strange internal architecture makes it impossible to statically + // analyze its exports. + chai: [ + "version", + "use", + "util", + "config", + "expect", + "should", + "assert" + ], + ...openTelemetryCommonJs() + } + }), + json(), + sourcemaps() + //viz({ filename: "dist-test/browser-stats.html", sourcemap: true }) + ], + onwarn: makeOnWarnForTesting(), + // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, + // rollup started respecting the "sideEffects" field in package.json. Since + // our package.json sets "sideEffects=false", this also applies to test + // code, which causes all tests to be removed by tree-shaking. + treeshake: false + }; + + return config; +} + +const defaultConfigurationOptions = { + disableBrowserBundle: false +}; + +export function makeConfig(pkg, options) { + options = { + ...defaultConfigurationOptions, + ...(options || {}) + }; + + const baseConfig = { + // Use the package's module field if it has one + input: pkg["module"] || "dist-esm/src/index.js", + external: [ + ...nodeBuiltins, + ...Object.keys(pkg.dependencies), + ...Object.keys(pkg.devDependencies) + ], + output: { file: "dist/index.js", format: "cjs", sourcemap: true }, + preserveSymlinks: false, + plugins: [sourcemaps(), nodeResolve(), cjs()] + }; + + const config = [baseConfig]; + + if (!options.disableBrowserBundle) { + config.push(makeBrowserTestConfig()); + } + + return config; +} + +export default makeConfig(require("./package.json")); diff --git a/sdk/maps/maps-creator/samples/resources/data_sample_update.json b/sdk/maps/maps-creator/samples/resources/data_sample_update.json new file mode 100644 index 000000000000..5e0c29ad53e5 --- /dev/null +++ b/sdk/maps/maps-creator/samples/resources/data_sample_update.json @@ -0,0 +1,19 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -123.126986, + 48.639754 + ] + }, + "properties": { + "geometryId": "001", + "radius": 255 + } + } + ] +} \ No newline at end of file diff --git a/sdk/maps/maps-creator/samples/resources/data_sample_upload.json b/sdk/maps/maps-creator/samples/resources/data_sample_upload.json new file mode 100644 index 000000000000..d7601b903395 --- /dev/null +++ b/sdk/maps/maps-creator/samples/resources/data_sample_upload.json @@ -0,0 +1,19 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -122.126986, + 47.639754 + ] + }, + "properties": { + "geometryId": "001", + "radius": 500 + } + } + ] +} \ No newline at end of file diff --git a/sdk/maps/maps-creator/samples/resources/data_sample_upload.zip b/sdk/maps/maps-creator/samples/resources/data_sample_upload.zip new file mode 100644 index 0000000000000000000000000000000000000000..6ccd256623114fe8c582426ba2d296a459914b17 GIT binary patch literal 946883 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

ZWPOP8NcY=a* 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

s~Vp!)3gNbd$SH$rX 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

7srz6`E8O620-c;uT%iBRm`&LfU(zDiPI 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�Ip8m8NmFTkL;$jYQSz%Up_s%?ww$ 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%0D;0h(zAC&hK^dpm~3>%m0KXq@TRRe$S^9 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%0AwO>EMMj(9N{qR6nZ2@lbdJw)fL_@(o^vc@4}Na2 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%0DLmWjp+FZDy>k%1ES}C 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�)f9z?UZsnMepJDpGiGo22+ zn^OpYUju#;F8GGl0KRPnZtq5$VaXPCpq4?~y+;+s!p(YbQGl-9l?hFdu{E?R>b-nxr*NN2r@j-bmOa6G08RV#=Xwm^o3g(V^UDo9$r5%%aA{ODO6GN>3* ze^-H}E{HAaRD{)-84Nfn!Lm+^+MWANbap2J_(7cV&l>fx?$}7D0p=L{o_Ur&@cqQy zy&3%P1`<&ZV^e^tC2gI4%%b-%j7keA^=+82jp0^6J2xDyyd`Qnl;|)#sI5CHTotzF zV3+~0W1ZUi`%i@6PJ<1@cj*2NNsNOLl$XaMj;@zEVorg4l5-Ilew~QYr3q&DH+XOh zU)ZoqIjt8nD~Rd=m($O8nAKY)2za79X1^kI{&i-I+&qb>LwaOvhj7DdGa{rejQ+bc ze)<>sK&m`<&DI^b*i^}Zt0MLIAh_Pa-ne|fP5>p*$Trjq1I}TMIMU~r*wnYXH>r{x zvd&K<`!X`46A!xfjtMxT>8RjW9`*Wrf#t()81?;6lI?5udw`j;UwKt)=$V1t%fSes zys~Wf3?2XM=8na%GO@^Th7%X~dlCdy4?@y|j`WrRxBTk05b@0C7u{=K zoN`uA$gqdX3+!Am=~7ahXXVa!n%EMuU_m1I{0x=g&C5K*DIwX%b6YNq1L~e#)L=($ z-{tpBx5TdY`Qx&X0UUX-&)YJYh?$6>W{slrG^@ zizWbiY@47h@OkWNM=`W&jEJ<;-_|H$&K$cjXDpZGop6oU)Zm&z45`s#?3k1<_=2F3 z4-?Hj_F|hQ8P@c542j$;;)1&odW>jOA+%&npHwI2f~|3D3~yF?7qRi#PqV+S7uHVu z>c^m!sY8OEWGie2?wZ5cHu*-x1+ppR*mj!SE_oy57$dpYYCOW0xm%=J^&5QELZ1R(|?HAA!c< zv0U=35Fm-yv0Nibr^t|{*NyS`I9t$0wlTQ)8p)@#WC$!WoiJOf#?h8>0M?qZDMMKG zE_brfDX5oL?_mk zrqP2!v=U_v38;NHza^x^Snj5Ls0VPH9I;mDHD6Oisvq@uYm}xbKu&zY)i7%WrjKKl z4nGFbOl{)-64wW|jYY-_u*u{@tf891FT+)ott1s70CPl_kV3-e4_p9c>Y&6zB%B&@ zvE>MBE9wfWh1nRjlBf)zsE1s;9=jraM_e;E?Iq6&yC840&`5Ihr>G}f>-JHvch8CE z4Zk>MfxQrSB>>_$C0vTM!mnAIO2zASBqID7dm{1bU4dgH(+RrhCq`QhyI^gU8pE?m z+{0-EA9E!Gri&C92cc*y$lAiAC@sF$qB1Oj$dhFprmcwU>u**yvUhM`Mn@Ac$#tTD zdUK4`l6d*j;D)GyQPB@{Y{2D`@@itY;}}_E+E^x2{vG#^{x2yl z`j)^y_zm4-oTQ!M!0*dn{1C=93z(D^q?S3lLSo4r8z58u_wl|}ky@*R5e{|7%n zz`xy&&4cs5`l9Wo!uh2VIQ`?IoWNHgwfw{lt>g|&H;d`@x2I$xv8|g2C)fE3+`+w@ ziBM>I{r~tQ|DPiK-+snjr~b=hdVhZ$2x(4}lW*+D1^2`VzXNHFcX7be)pk8 zw%|uDBIE+mE-VsD8h7Z4(_#IYjetHFx4A><R9k6 zL}*~32O%N@LnvoLEWZG2a3#bV??$}a7yzV%*cx0dH#>vS%8d|v4AjU7X=8A(!Zc#^ z#&yN2W86SO9P#Ewh?7AGA%sW_&X7Tf)L;i=2$3xmI3v&#;$pA?cS3><3cxaNkM4qP ztL+`@=!#roc|2ACc38?tfnbJJF_jr(wHF?0tIM?) zH)=0sYcD5iYa+B)l-jGT_Uc3JwQ}wCjoKU8+M9{mTM^n?rS>+fz5P&ISFWw!sBOsB z-bvKnjnLjxYVWh!rfh9fx%L&SeHEd7m92eMu6@mFUq@(PXKP=VYu~WiHxb%5+1fYd z+GbYU9HDK_);5=G-?G}b5!$!e+PCG}cdYhZg!Vmt6SeQNwI4QWKSyZ4D7AmG+CLv^ zzm{uTHu5B!heV#*$W!G!^^g~^ygb=% z)kEHz<*k*xbp&sn$XjRg)*E@da^5kKcZ%R8N?uydJ8$G&vw62fzFh?0LCJSydF~(WKsg_k%|}P@16h7xIX@_y*G2GyS$=RiKO~zU z8o}#XUSG}+%jUn0;D@vP@NzyTn~#m)N3i^ea{jw)-Vni$WciWh{HSbxbOb++<;Okb z7sL<5kQHT|+R{St$xmxqYZy;ak% z{?fEHWR%EgoN;diA@c^6q}5DbC|pLi2A^x58+@Ab+u)M;%lh>?rfO_Kkqa-e-ZJ-Z z*I&X3p4862(@&=>ume=jU5Y@L1Hw{T=ql9P1U4<)-Y*woFI-u1;h~6#5M^vRD+PPYJnOR z7u{tVDjl5obR3(9p*k#*jw4pk-=d2J0(I%g7>?2eoa>^|Q4nauRHG^oMD3B_jR4mv z1?)-QY|VN$c*2Tg&=h7dusNfRo#kI}0=b|%gAIUH`H4CkascnF6}53=F-3{^pH{8< zLP*|8_x|45?@elIZ?z=d2VMjRl^ z19wMpojZtwluOLu7D4sAzQ)Ha|ChxS|HGT}0rXz7d z0$1;HBk7nP9=sum2BMp+Q7o0%375su03i(J;q^jr@=H7|B2CA~Y6hJZ7?0e@6kvx$ zYJM+i9#Azt@dTCAe?X6O$0LobUt1zDWr!C8oGgkH8GvZSUcqs*QP07aEnAH>t_1~m zh(_bY4cj2UBxM+y>3E<<&}P6lVMJ?foHKobCQmHsM1w8RAV$&kfS!1lKpfZwlThrF zFfux2D3J{zdJ;|s;&mv=g5t%$c0A$G@!?FFey^o{Sz__u?K3Rm`n=i`2I+QjUI7}K z-8wG9ezn<4aeA6ar=cw?;g_As>2&?zOz@YGSwSQhbU`s#@slV8S2U+l7s#;L8>rEHEVEPub8xXd~~#i8(#ra{`R=jJE7H1~R(Ip|{7q}iIUcfpl3 zQd2^5q-nIjj7;m0^0NT1i;Vro3ez^FQ~^obr18|hO=3zRrwcJ-xBaaV4I78kjtJ6N zIU6T1+7#Q1+UCsrv#&kz1WjI3i6w4~{1>jnk8a(k`n^hO_OmyU22zHV&4WCw?0sry zhM(P2mYN%T z?r|STR99^3;BI0Po=r@7Z#>wX;G>)It7y^o>_a+Y``}`A1%a(kG-p9!tG3-NBw_PPsDnX-yS=&D z=}@%$pf3sxuk6(*;ZcwzBw6!*3!As@q!e|MF(mZj5KrOyrQf6C(B!?nw44j$4!VlOYy%#sB3bdT z+v!Y-h{Z%s$BFSvXa|X{-kFF6v!x&$PLfF?o?TGM zbRqvD1sxkZb*$^;7&cR`?K5fcJ0Gsy&RDtFoq;`>y@C{fZhw~+EN|n^2uj1|?Gp)q z9{f(B-sL0ONzdCIHt&G8>%zhBxWct^%AKKZVr5r(=5~nD$p4!)BFL85{a1!YQTe0? zr_P zi_w9!)wrA7iNx}v0ddl_Gm4FF#LeVlYHPAESEGcu5f_b{(N<$iY>A^pOyf$*G|{bh zT0_h6%wyCHVdONfK6Et`hs;DbVQ8s^(Q!yk7{38U5lw042HpDbKMjAq3?M=&F~c&P z1SV)g#b0505*%tQuLu15)q`B}7~Pg1Wnyh|;w5n#CoTjLv06h%ZYr*Mu!MZAnQwNB(@m8 zHDBjol0e3xQXY$EGMPfs$Pkhc55zVV`#+KBND3K4CbbHYnnYA<95iB+vq_u+b`C_0 zW8$chm?StR4jMgJJDHqJ4mb=>M67YjNg%zQu*wn0%ma}4^n$_V{CqffL zkT$Uzq0XW$DMD*dTdGkd6{A}$)S=j8Xe%p4k}C$(s2YPrB*Y|`RLq*FW%k6e)DlsM zhPFU%88kr}g_+Z8Ok9nI1ww8zg^Kq`1THYi8O)4BDWic~^&>LG~SJDn;za0_b^g)?NNw+tOuxs0C+7Z2Q6y4UOr!&RS7QMsowj=F^ zOEqp}g*{?h!nk8HTcc$n*qKC_rP$Nl(BAtJR{!>m(P4jI?D|8WtxJ4ue`qn3yCHVbo})iCH;AQXscE zCZ3U?z*-a~S`Jngr71??jKZnHqgZOtrN%H3XeL6>`SDXT&JblVNk;)p!fqLZ;+KHd zlA2^<$EBnE#giW}ECX%7FbtW3?%wDQMw-#u0pAlnJyV=aGU9868A#JHj}+_yLhJa!*pVi1r-j@B+So0#fBP=BNvk5CWy!K(#gmUQzqH{h;|8X zkH?U&N`K;UQ_73u^3*q_5>reD5xC$mq3SWU!wz&sh2w5)uaT%;NyGX!NjVo8p#D(n zuiDd1jE+WwmliW}CJz;h{JNFQC9ObhB^&zv&*MmfpMy;6(Io99meDwc#5l1yjZA*S zRW`D_tIWW$?V;4~qtwmgy0qs9DLow99Yvz#w{A)uCEagI(^#(2ovUp}rQuvra~T~N zwi*|5lQ7S(lWe(%NY>L^Myw2f8(@8KKxpj#C>(}B8~`=M%WqAWMR@$&!9BpBqFgm@ z8W--1yI+vX;l6LAj0p%+32};4(-u`Jm)~-gId*rEam^is3D_;&aFD|D6t%uRpGw6V z&Rr!CYwS?#%ByO8dmNN<;y{7r^#XU`9tSctsMBgtWA-~F4OZ0nih_w2r^O&LjOgOx zh5^a@05wWm1T4qP%LpY;xKPbzF$ZqQ(DuFXy0QwQN1) zd1a`$T{3x4ib@oUeG!Gd5lsdvPRSxkm{*}HW`f*&Q|1`h{f11q z{x+z|aMB6$Q0t+R^tEy>3KBW9wxGvZhNg+4NyhD0sXws2DrXr1&m0kI{Ik{N&Y<&hFiLXX|J(6(@5F&bM*odqrWacV;ZNT+9c> zh1xi2q_}815hs(_U8w-rJc6kHT1GX6&$*w%8uayDk~AN`0&@ z-qIBg>$}~MG2BmMo7lL{DY0CU-}In78O>w!`hZL4tXN%w+#D$j_aLENGh-=>A>iWm zION;c4(t2AmNIHZS&Vl@h`hQ$+M#>C)VnsuHUw+<1CDAu%5yrIu4-2G^G@}W#8Oy8 zla#abBiz42Wg7Vn+ONlw&?w*zOvN3zZ>_3dUMM#u6?Zd=X{p@c)PeF#d7+*u)70Ln zo|!7&XjO91L8(%rQp!{1)%nsMZBwNtuFO~HindBS6Y6^tmobgI8skR1<*D3bX+JI$ zhxMp0pma8I=Y6rRd??4nnmSoB=p}RY=p~!dMKxCxjiNXa7wQC(?rSB}s;E$jN!@3z z$O#u^C)7v|8i`lbTwSufYJ>0c?(2PRY+FqXi-~J_J5m{!N?YE4yAMYd6$=D$s0)_i z{9H)4zIq9rg4|U$p(uuyomnud$ALsyoytv?#VXuKPk*f8Lkm0>wU?W&LVm zsc3B8P=#7XMWN!4j!WW1Me-|SWLfGsnFn8}{1D zeUv72Z&acD8Q%Nck+uuURe4_zk=LqJJ$n_Z6~%`rw25dr7ndqT0|jTgP%g~toTcj5 zvyjW(O7l63DMLOzK%XTq$Y>9w)O$-b1hZ!@DL)JP`KfKG6V2wgtL7C7F6)S#SRiV^LJx@P(SJJ-9$8Wd>3751AbZB03aZ=8@87DBq z4VW~LjFw;i@TOhuET z{#}mC62cez9zB_ffm)YRC3c zq1vN;16!?(aptVNXfH#oGRav|Y~zvT$2Eog$pm_Be#`Z32=ub77at0H98Pu8I7Ud_ zP2LAXlpkc7E#8fDl}#aBiHvxN)70x@0nH?_;z?l|=aL2t?ktsd{sP7NNO@I3Xh$`1 zmSjpH4b4}j*qO6!P?d&CevnM`2+UUY+2egt=Hxh%GkM*VnIwvKdn8_T11rXDloP6S zCwX;Lwpg6YDId$cO5b^9`g5LQrGJLMhbc6J;nZQu8vjfN`^{VQUa5ALUrej);r$*< z@h*$)QJ5WAA;a~RbN^BPN|Q!8;nvwzky#IDw3_^?WnQ`Ua;93w6^A+2a@@stY4Teq zWXj$q89fL$feB=iq9kp+SNsT{QW?eL5}Dzo^P>`QwTx8O)^~o2)#Wz$85MbHUYc;9 z>oVFAEm$cLE9Qqgh#ywib(t0}Degu0Y5f`YK}Gc5LSJz9@YpQl1%=PU^i zadWz4?@;5vBwS7_;wBFRy0gxi!QFooj$pN8zP-Fk<=;acu8MUY>NMRx#cP_gybXGj zoVoTn#K|k(UtZNE{DjmcvrUp%}%$UMIGrGN0pf$5UYJ5|_8syy6%`E>cEta)8cVO}F-5~EYGo#d#8 zU!$M5`Zwiszb1uu7~nRG(Nm5wc9Nex(mIX&u4&qMc@;17Ou3_8kUoTrQMkw?%RH1B z-*HA|uLbE6qgYHCJba4Nt?J^Ob(r(c`|#yN@4dn}fCow<~>! z!tPF#XS2$uB3*t%^hD!}$LDzb zF~XrsN{*szgo2;!q*wUG=g2P^Ms)d5u4bo}xmTiLAQElg;dGDQ)!!^b_(+cH!Uk3DsOQ0VDnkw@ahF#W`hJu2 zj`Ix>vw41%MH9O&^W{DUM=6%glce>M*IzH{vVNXll9bza(&t6JLzcQUn9IRs@+~E% z^Kjd8dvc|Vx;aL2%-M)sg4;xan%*L(m9cs(VRJ3e#Q8<%jODi zRkloL%cXhvY^iYZzwe{WEAkJkmx*lU4c=0ZE^pHm+lD)>|4DgtxJP(z+Ny8eCgt)q z9{1~fHfx;qo0K0WdKXvtWY+l{^^spJ*7VJjvg=#laX$*Rz6U3I$=`aLeH;TfDQ9Vh zE0Q!+7}{UMeZ%%}4}1)gLt$cZP5Vva=5BEl9o;+PK7kJIn&HDW^yBE=lmw?ix`(`@ z_)5aYuxYc^o8Ks=ea{+Q(a?7_IRyHbb>eJ?aaEmA$i7E&Ee`iWX-uWZi2)*~CaL&B z%n>oAUW{ha7&6`IaW}yLR14DycQI(XqFZU0GVQhFDv?a%nA1(*h?^jp#v?CCAj7SY zgGOEz85Ev2&oOHn9n<;>yICx3Uj`1!I`40ZW6mP3aHs*OP{NZCr=a%XM1K0I<9)GX z*eS=u0cZ$Cc`IsW3e~N@57E$`B1Pj2ZrM!7!2!Jd!uA=V-pjpkJLpCk-BC?CK0Vl0 z3&#w^M|5mxph*nJ^|j-bldm=RgQWCX>)u_*n;pC1e4R*59RP<9$A! zIhJ26=gnY$fupt=w45xF5N6wz_%RvD@zV@H4ofu-wM0lU=2EdRY!(sd1Q!21!>onW z4`zz8{4!m#kV%tMn3c8s?;n@eyI3-rGA;=-;c`214sxTXs^c#}Y=>HY59Rr(<1i*y z5CaAZEJ+O3BdIt~TVM31qnF#pjiR!MhXv3p5ZJ!5j%lMX`06MFV}L>jrAjrD5m!05 zEOeM+A_ftmgU5x99j#CLVdB_HW0F%w4;`13FmVjp5rhew(z~}lJz-2nLVWO)L1QN* zjLQfclQG6GiwL3;#*Y~{-A_ksA}7TsOiPH@rKhGPq-XeN5L z4P=<4jgHEi;$i5b$AvW$3^o~5q0ErGm)3g>>mtk*v)G$crcA+s*)%pXjOqL47Qpo0dLx%9yDNL$}gzdVKNg`bYN= zgPrFe-RF89?QWPXoP*iU#?!cXD2hOqoIBb*sE0?G0-7v=N@-#abTG@v$2`m zEV0%_>BBpEt8sWMDk}8SKwCoW0tiVYq<|1JAuR-b0Rbc+kpvWw05b__(Ftu514v>b zNh~0VW|G)qu(l}(AO(q}pnw#ZNkL1DJ+U_j5OX3i7Z9_Vm|HL((h@*g5=lz|X)%+Q z7M(0cCd7O&B}Q#AxY`8ZCov$PARxdT5YQ6S4oeA0ObkdY2uL&sB(~@~VkrRyi2(%# z0R`rOf)<@8am1MB!~kU}V1*L&S){!~&fkU}aij`VVQJSP&ya4_18O2qA_L z^c1uV8Db8IX=ll_z-%rsw-mHse_>;=JPb7#w6vIqBnOyBj43b=9?_y7IdWiPjD2iq z%g`~{%n^Y|{aQxF7X%DfV+OIZmJvx<$v}gE&}Or_1v?sh0jr7`qtA@poR&0G-!VSJ zFeNTo=b17x=EtNV2Jd*S{-?M;F{%{xkeTLy5&g{tI@ttSOUt*(EiHz?q_#v!?Ck8? zwr%U}?cJ?gx6sf~olZA$^f#H4#cu~qwCzwlP1Hj|gbkBs&Loib z%dqemkuWlRVAzh3xY_=6kB@fylImez?L}pNeP(x5Ot(JRF{O7eb;InQR>CP z77I=s?A2obdCT1Nx#qSp`C&`+x0|QJw{QF9bIolHH|2S@#NN1x{1LvS<~D5GpMPE# zMV{)_$}+LsN!(H1)=XmB|D!1XFF&rfmid^No{%sl%~3s^bN?WACOU&?A{m_s#OU}# z+r$|ZaTG(bzoV(GToCg~M%-nZ!FUx5h}<#8%iv@nvQjtnxl6aXO#mm6SbW;|7rGJ`VeB>v?+Dh{xoU7jcxQ4_pE=;{Si zoU}k~rc7$3ija=RF;Sv6*|ETxk2tl zeJ6xZ?5AJdKHkyvL|6XRx4Wsj@AjmK?20TG({`!&W@6-on0C#w$&$yZ&~x}wE7Sbj z#Xq?RE;}-G;mC$4#bcYF+Wf1lDM|6TcN^mg7-kojS9~w3src(h5=uWOx);$Z!iq+~ zBHu+&9bL^<4@s672hNV(ezK$SX{KsC92PBld7?$%J*_Hpz_Ykj^Uu(2&ysfZ=W$t+ zgr;9tv&&t>g7zC%f@@n+MK6CoRrsN=S3CM()xkY&bOrmug$@5o588d(e^$Srr`i^e zah|p&N$XT>Rl+vC>v*nUxZNUZr0BZ`OD3fh#u<$DWmAXmpVILYLk10Re7j&;kxh0r z*|+U&xpikcZiyR+G=xGaLF4Z)XTv#i^SA4Q{^VF{M9r;9bc~Z`eEX6`t5UKn3d!RR z9zSeVZr`_yDQzPs7X;Ik{9mbated7yymo%Uil>S#iIhRRO}gBHdw(tG`5(z!`_vg^ zf(D1Y$Ak~HnKtvr&G&naD@GP~k4gzLPP1F`>1mL0Uhsda13DiIKL~&N^trfvpvGdx zlKko(K3q$Sx6VUD)Zi+uER3a)^{W_=HunN^P=C~dmoDGXY_>qH=~Sm2cN@<)NYX+j}TMso4sU)YGP|>nS#I2ZHw!FvZJ~3AP z%Ge&>Lb)W4#JI~XZ5?e(lwbNvqn8uqpM72ZbdFr(HwLnbF$QK(1{=Ag!O3XnNJdfP z(ZHUfWLzD8mTIQqe%{dDK#FNO+YuLmTd|mtqh_ouFg1mevtNkZxquj@eUg=Zg5}Qc z&{`1LTStru9%0U0t$POb7a|uWqz(DsKDZnCr;u;RxM0g)C5#aK^?>NLisCY%Wh>D7 zv}lH9%g|;T>;)#n^57ccy|i4eB&$Tz#G|CdHq+Ta88|&_Wii`(>(UdZCMW!8K=ag& zbQ)}HtAm9kFB4MKRRMO>8Is~=hw-MMah{QyF+D9|beFNYtX$wiC|Arn#_T5W!g~pQ zOix*5IE?CPv^x4tzHMd)>$J4UNr|a^@|29!^yz7~a#ljX@_eyDT41vxuJ;UABFKc1 z?QM*rTDKfpZtFsloOSKy+6~EtQ7%Su)GeoP=5TuG4-+SjNuO@$nPVdtxsXEXueM^N zWh1iP00xho4wpN?K`IAFqRwy zmMu_v?}Ii1wED?uzoUx{u7U+U(ET`5WauUM+1XOZZ-WRK8GCrJS9PXfm~ZSzLD;w9 zh<_FgkYez`Oo5?D@Y(W|qbhB(;e=q58#;@T-VwOS&?(V}ctndUM+$O~jTZQKMfN3A zAjCl=-2(BFrtgZ|Ku2_`2cNi~DG)fJvnE(q`E7SXV%tyW{%|m73SyK3;TR0ieA^ql zy6r^aUSz!mqx8tU^+8sDJvMx5AYKZ87PK{Vz$FLg8G~}&Xnn%Ow3IO!@;2Kb#+B-Tx%{f577|X!cgYlFOv!Z<{Iz|Pi&Zu; zE>t^=@J2UMC$LCo+xX0)lwRf@8LM;MsL+%#Q>MtJM}g{yLHW9N$T)Nz*A*FzmSM8| zt(*S3qTCCV0$sluywK%=uI;)Kba|qSkI7zmVOFlxKaLXpHbb3KIn+*G=wR3a!&Zj%SfYBLDv2;8Hy~a|{{atDiy8bG4 z_QG@jU8&3eyHZmG%1npAXxeN(ghdv}|>$xvSyZiL__U%TcWZanes*|2^nEGam)TwRH4p~NT zPunef9Sfu9lAyNFHk^CixH`h*E%s_Vjb1oczT+p?Z+}=mSudF*kD1dW_w9n@Sg)}2 z-#gxxY@O(tx31fwLsc8^6{b$ux=XQqhkU&9LGJ3@={INWZ&$gtSSI~pben>@PUjrA zV+|TI?tRm5_qc27S z8knY-5!d@)zj{jY?XQMENl@%qz-?I-yY1a~cB?+^&vrSPdoIoOySl@d3(q$EFzWcs zpy)S`7LWS+NAJX{TaOm6`T5ZIFVA#oo>6T(Y4yy(ncEX1C!4fC-%<89BuIR=8V(cq`;t1BQ7hhn3#ob+lI|O$K?ydoX1`PogLU0J~?k*un(8USv?k>Rt zgkb;X-dC^gyLJD1Z>pw>+1l>!^!ZMo{(6|2%^K+hk--pLAQNr#8uBYnq3CGYIpFN_!DMkZiYVuFtWF%kBr=-K4}_>l%D7>Na$y=)y>Q>#)cD)zz# z%{@|X5C~y5&d6tqE0b>#06*WEORgiD zOGd%YlaKb2C$MWaF{L$AYRiMa+Rj+&J0C_qA{ zOxgSEGgvL0*-1R{*`x`{ey8%SIM-&6#X0V74Gc?t=E}f;n(ckJ-0rz6Z6jfeYoZG@ zGDX&JBIWpQoMT4$TJ*d7(aga{SH0}rhUm3vt#2q^q?@w^1KOV<2P4q_wQu{pp66u= zKF`K`bwcUG)z7Z>a^^N@QXj5uqn9Wj!(P4%iwc_71~zZJcrHx5*g_T*Weqf=e)XP- z9uS8l13GxuZjZgjk{rgXfSsU0?UHQ@sWI%=1&X;EAwI4@E`zLt|CZi7% zT}>%9^ObL4A|6E9c!FmX^BMq$%x|Oby8d*07&-40h1tw|_q~yMpV4h@@y!jB zjFAtAHI+@L6%OlFk$t~Sk7q5|n&DeE8rncQVoW02+xCqD%I@6AuXRIJ(~GbYIx$ z>hwLiJBNSMK`FoZ880%@$-|PWd?S>B0vB7~p{ga1wIVW8T3~VQ{PFqnjNGg|>RCV` z-ZyQ^puJN99=pUo!?*o5u(fYy^33Opb8nF0S(BC>6dNTvOIQnQap2^xFDq$`!^i;pDdfzd<9zyiq)oeXJ53c zCedW?Ydq~1TY=KeBa#Y}4t9uOxA#rrFNPW8iVBu%S6+{o2iq)0}x4g=JpYzbzEdgv9 z#5Cy9?Qf!&e@jnVQXWammk~zY$F$)1_!t6&>2(o|O@Es@Z1&SRN#vgYbY*Z*-p^0j z?VDXG<131;fYO&|yNQ<<8W?M2)w;31{TzMMAxFxzj|UxZAQ?paPR3 zf9J85(+y(_sV~C{addda1_9Ow8)EGTFE4^K6PaH7{x1zLFFbeWIo8K*kI-`J;0M-N zm~Z_#K=95uF_kGeOv0Q9qK|Ml9o)>mi7b~QBKl0i{GlSFwdAY(+PZom%g-pW zr;ftH!cx(-Fn)E(NiH-HUAV};gnX_4@pVAGW&e_{V{*le=SG02pr^yl!p4ig<=)8L zpE2Ve0`wABQb~m}vB3}mfv-PXh$*#YV>@9wSWemZE_(k#YAtB@B2R}%%}fp6tOtO` zZ{FR(skcDLir=~@N7g!?LqQ=f>NYqsve$ZJ8cN;3){l3~We#9oFBQ9HRw0P~4UpoL zyib_&Y}Y_x#@ouYBkSGS$!$BDSn(RmXX7_wZR90%v<7R5{}vRaV(C|&t5~NnMlz9t zaWJG^E%+?lsI+_sljc^ME_(6cPU2my>FEM`u2F07J6heiA>1?zer1AD#ipVkM}z(G%S-&urT@wrh|uL&vR!%v@lC}W~E(q`~v)3v2O^RQEhz0^wo_H~%M48_e7iIQ!*J6{^7_zKIy zHh0eio-;dc1af_F?E9-!?CV?ruDDk@Ed_mu;G38Fm#5b+>@VGr*LN?^sT(g(8yoiy zj(ee6hO_h$iv5YF8jnd`CEegPQGCed}>c3#&sy+8P3nA{?Z~9QP+XFao8< zxHkkD;{b}}-hoqt)XbS~@$OHzhGiXWHf|jl#mf=F$~LRwNK;a;+02ya9&O$+noHM| z$TKwKWI6pF5@hNQ(^|dE$zYtX_8C%1Lqv^FgP_Y$N-0vWF>>v_eE((Nv=7DigIo^m z$_0rC@lJe^<@N$3;U*eBAEQujrh~I%`iy;Q-vPycGn!1$$a7H3@heAb@T40z!8mxZ zBXo4oABoq@NIvBF7S$ovWN|gzO4o3)k($_`Ic(`Flo&RJ&v)vX-+C8oH&SlI|J2TD z{+sibAA4%*=e+y=;<;Yw$li2@?+HC!y9tDhr_hp+)z`)G&v7Mp-i!IFJVvV1LZ$X8 zgP;LzNdT4cQjAD^TJai0$mDAQ2`h|)`4gRzYsGpoxO31exNuD%nLxDlty;{5Nm2sR z!h2LOep@`R#RWG0_Y=139NEbOYB{%s$5$GAp>30oK>Nm^Zy5+uJmud)Gdotza+|B$ zd@gtH+oyD86DnL>-Y7(u7l6##zq(z9io6(Bd!!`KIXTUf^RPaw@3h$Z2z@Mo&4ou} zzUr`z7h<+sJ4VLLn9#9Cp4h!wG!sF5DIe`fIXyge73+=*=l6ypZf)%@j5lwv~FB>5=;TVHHtF$5Sz1UBLGC_M#j$J)!5% z_l$OSZUe;p#bf+gPP*A<@{he_1!a}3mu93%!RPE`&PFAsvrs5;pAvNr?*r#)TtwFd zR};DIy>Vw?-PXNvjjqvTW~wB-&rB42+veI#Fv#oRM#s@cIDey+`lRjV&zK=h2lGHl z$srV^thll3Y&RM?nqyj{lDT4dWky_19vJ3C#zCwRNFu>O)wYU8>mdDH%#7;;{)aPS zPHCSrg37ti!$TJS8&$UwbRIcj)M@hQBgvnyerQkA?8e@o6o2mDAq*!cp4md=QZ7S{OvSKghgA%!~ zPM;k4Jfz`fYeMQ?l`T+w?=F_cp+{E44HhBB$U%L!ceSEu3Btv@fNhv{H5`0CT( zU|1N6D5kvq(bC_a6Sv!K7-Wvn%_}0@5cM^Cd3bqPs#^DN6ZiK#Ba%=e^rAYLs zs8mEz$I)3u#&9ri>x z4oYTC54JsPEEy|30-hdTe#>vfN`r4!tUx*gb;oz+AvolG?AZH^kY-{9H!!@!vKyf4%3dtTn3l@+8C%Be&xPhyxnW2}DF2|M;QO~$l67`<^-8E{t z`Rlc%UY?i(Hec@zsurz=`6g!0o{@55zs?kbrFcDQt%3PDY`SsEwK_P_o?n?pxT`ZQ zWCfQo_OEp)ffj6h<-T8F2*#({JKJp8wfS^(Y+9QJI#xGMxUhDB+ND(a_t=nS&PP#n zo5}AKIY&C^==IME0VpIExyTm^MGTWaTa4cqwyd-1R+&1J1s#1SAh~%_tN+TND485} z;<4wuS&Q691y7Ag>eZhvqkfI0G|oz|$oBanvvkyw2z$RDPpd`?1Ez!B;nAv!KYhl& zNTIq(_8dWVR#w(yF8Qz9PDAWui%lYeX{hl!vtqJ*Ujhib0rV{PQb!VVqMzX&&P{N0 zzAp$>8{cpZNL1L9+f@BdHQAPo_0}*K#kfAze7<&P;-U6Q#`bHhRE)xosnhllPu692d(R>pCp ztn0)nY@p*~D0%yRjk~rr1l~G`$eSomW|XcuF&sORdySTNoVI@4#)RJZjK{Xz??=Z2 zC`SGxS8bWwXHu{0^h*Ep%GR>O!=F(c*A@wjo!IbB4FU2^2%Ejozq?CtFt)xqUXE?Q zLVh?R(Qy$6haM{bxLkgVPYWbis9;@N7AGt3G~r7n0qXSS$$(n-O=XPR&q_%``o5`MxQ*!0$x?*r+`EA{F;x#rqT zN`d74qd%(9;GmtloKNguTOcySLM$B}-+ZX9nL$2qv&8w8dBS(zjJEl$5JdXNM^KR0 zLt95jZ(}2{y-^9q!TkYWLgeL}s%)*`G%Gas&740!WD8{x_Ya3@B4Pw`rg;4aeV51^ zhnVkIv7rD7R(5ZLylq_VCsKyk|VKaIw(Z0x2joC(| zd-TLQo+k48t$Z)WHS*M}UNJEvVEir>jY<=*F&0&_=i6L57=q!IjMqVSTR++7QBdSR z>M&H>jq}L@KcaG zwtd3a3gynuh!q%u9moLljawEX=1%y%am0NCG!D;}J;V2L+~cMOCod~KBdI)63FlV= zLx35M&P>LruySd3@27CF-4<0Zc9&8A%c1Z}9c?+hedK9Ifkj_h4HaX0o;MZR4NV^( zS0AFTkRVYJUg+0vhN9!>x=_x^9qu*7*)nm^9F9{e=f2wEyO-*0o%*pPjdj;c#E92HcJqMY&e6&F5>uVvQR zLS%}fDf;#6>2H;GcW}T+_S&_)bst;1INf86=Gi>skvvbXwEn?!lZFtBndLa4N{-6c zg-Z+}#b&5H@x2^3HMf=EK7Usm0hb(8?*eWprm*xFMcBF6HERh?Q*GV8811LK9D~pB zK=ndiHJhABH(4Jq$2g739{@Q(#=qr1jcl_U8?()9XEyLpwmCn;=EC-~dKm%h&7UXd zuV(KKI#M3lP$Ud9i_K^{dTa#NAL5Qdf;n5CPrX zpqvj_7}T!={vGn*$77y zBB_G!SX})HW_ayqN;2GCKT&Ykki+wmQ2>~3t^slk(P6n#^%`E66_w1<6()?sTRDKP zZGcOxxGsc_zh$X_V(p~5brj%M&s6*o4L#jgw1xiwP!@Z8Gdc&W(w3~qyemB;=VECt z-$q8BbfPx3I@>h=z|yx*0Q&d`89ymF?!wuOC6oj=#&Mf5ugMThGw698@vVMFAozd` z(r7E?ds-ksOQL70#m&DhmS*7OTM?xEkihsHven0oNRKni{_}iF)p)k4e7r~o{B4XB zwNOR3*Tl$-yZ5_fEsTT9P}cXVH5`wS;>*BapN3Xl7pc@UdL{AP(3pOed>bEmgFtVUo=7kOj#8xNiRq+&>q*HDxKV+?} zdEu)TlT&)daK3wXSK7^Zw!JLjxDb%*%@#^6YPXN9x!uuG5GbB?QMmI0$FKrC~*kHO8jQ{YEGwM+To6JjE^ikKwLrJahNrLvS z+dX%pM2&)T(d%O|zi)%lq<}J12nS_ugErPL=>_xYW5_?-XK(u7zf?!GH>EgH@a&}c zafNWXv_2TZSyuG_t&!-igiagyy2ttp6^bIz3~cZ+R%A|x@Ms&dYc>`Sa^0yvzD71z zkED_ab_RLu;i48dBLjN`U8on8s1KbRYQD0~^c~XEe0CO|Ri{P<>BHe529S1PzBcj_ zwp2l|_oT!sxi&~Pb9nGJ>l8_S9K~)}s=Cx~vE!I0jAT}*haot3c_SHxdjD7$qlw1~ zMpJZMZpJQDbZkA_;7!A8<`9q&_UZ#%tlRKNi!F5kWw522QLE{l6n(-ZJeXzlpLhx{ zuDDSRSOzBJa?d{wnX0Q0s$`xSPQe{%H=0mbbvu)mlGh~7B;VkAToXUu7`6p|Fs;?d zlP7q1&N11hT!$%fl{x{eoha_?Tv_R){q>t}+o0d(m1G$Xwqb!V=N@mIbO)yVnf3jZ zSsYt@F#m&a2c5i^_mC;s`*M`-#7JDzPXHRC)bzZBKfDb_$JGvBvl<&}KwiwIE|`^2 z^7ToN-xLjJl{Gp71U0ut4CPVo$I)CSo)49I=2VCZ!Honk1g9(N-Q;?9%6t3QZn4+< z-o0$;yc@z2aR8RLMb%&4g&ZYnFFusMIoDIlVJ$Ve7$^I3S;P>S{J0=Cu<+_GhUbme z)TEBnRth3~yy((A}CN)UzQWM^Fw+P6Cz3{TFjXLX^d z2Hu`5*4Y`|nZ?eU&QO5U&xiv@MxHU(VbKs7WFxz-qA-{%FHLWGO*v&RV(CFnOmub9 zb@du9iNApaP(K$3N6qx?q!fRC@^_kj#dDd-l@{w}-FEvF*8;_OY|g@5>%uww|npxq2eH{Orm{+!l27wbfVN&~zp$PAS8w zi7$<6&hwS-RgKuu$K%U~BJy`R7%t_AocVoB+e12DT872Fi)S0<29&WT;Y2yRU{b2D z9{0uSP&&&i^5q8Jpl1})?}@Z^7bHAS^H6LI?BqFJSQhpo6za1%fpKKz)jgXu_$yh~ z{cBiyUvaN@?0P?a3g)EksCzW_?%nXbnbYz#Szn_pDJ1CD>9T&?-lM%comg%bi1?a- z#vPgMVh_DL`FCwDpw822^N120%yb&4BFb;txcx?LXT5QI6?Z%;`a7Hyk;5epHgQT4 zb_DA&hX^bStGi(l1?&((9At+>_|NvW#kbwqPRiqUj;cY2-MN%l&h65NYMMjbt`Src`7j7BV2S)R7{(^1yAZ{3 z64wuO!;&QG6}cqcv9jL`aKuZjsUHVnuWnZV-LZg4PHb?Sd=LR9iD+j}+N)9R>#TRw z{=YD31*l5(9Yh}e5-CgGL!vBOVuK$JTAoKX5t%aO8qflGfBic2yLG~^(N=MKp2mRy z2t>4ae^!klo~iqhbMKEM0wtLhfmz5iZ&F8(+E+ek=BidN>)3HN!^uZ7TDZ$IwpFCXeZ9!YOGk3ga zvh!Ub#sM@`Zn(@fvnAk*1jrLz35AQD|BMEQ7NOsRXzfg^QHWJ)LtkvQ2L}+Br*6h5 z45i_L8lyLSO+>tI$~t;`wFT8<{J^N>{Q{c{<36KiqDqNoKm4-vL@+QZ^HRC$S-(k- zCk;ZV>F{;s+eAipH>F%J##v(qPJ&3AE<-sl{7J2r?7WRQvgD~W>2UZ>6(m4*@>|Gg zrr!@f?*43PO7$J&`pWp_(^e37RS5n1hA}Vyleen))B5CFC*PtM1JWROGc~h;*FUV} zVH}(R(BR;iyiPx>$A{;})3&|xzoSz!?gwGG$Vfo&`eMdhabL_saz?WyB_ssVfeQ5r zaLA@ZoQ<4TM8QB*1B9QgSFy$I;)x`@!(GiV=$rFM;LV^T?JG_i>LVusvMK?mX=L z)ot{BeVxapIDd0!K5HATD?D|$qTVhKg?!ov3E79wKO*tPJjsfn7~1?~ER&I}?9 z!Too?Ate*Vt|Qj^Y#p67T^oQPBf&`2SV?b)4L+{dBa4F+iy~L7;t?A6RVa`D$7nm( z9tk$iP3mki;9akHAR7Ajgj%jXs-%p@>QuH?N22|47@F40MO(6zxiP_H59C=Xkm2p6 z{x?r{Es;0f@(WSuYv(UERquvE4q{*bMZk3{AwdPtl|i(IucI3}q+ux-AdV_#Ah8RM z71>%;hKFnl((-BqBbvl;t|@i6F#;w{gWg*{UN>}4f# z!uCas2V84L6TQ)_)u2bLJee3J*Z0rfgo2H%JWbncIq-DjHFbV2Sx08oa9#p1Kj^Je z;-SPUp9Wcnkgz?BS=Egr6pFAp7%`k?d?<^=#tQvxosg(MTMA8j8pHW)yr{F3H62c# zY61OOb+8!ywoh9#Er5tWR2+^fbnrYfVI(SSD@~qN(*W;EUghW|g?FE`3j**v|FKqI z=<@bg|J<_BYqsILyL%>?kdM|by)Y&Ac2s*7vhDm{Co}f3V;TU0_8pEBNv+VsuZ&IC ziJGd1!usoCp&$jjK*~uzf)H(cVeFL?Kj(u|`*)GW9&zP#TLbn5ee+eEYmiNHl#tTn zc}$`me#GcU7D$aEAZDFiY~anyr#u04mPj6=%##ze(ysTWA)DWy=~iRb*zRFjcuXA# zHEv>!Y^!3=0a0*m4d5v0k06%aL@yRo99?n?f7te{BaBLim$_Zjvbpb03d4)0^AYN} z21Y-4`;D4K^o$}HwD$c{qpc5R_BX87t(@DR(HK9WN-(L+27lGfRvYC!pDo9YN?IOw zG$F7-V`HgLa}cjd`#vWBfo^mNhG10Qgo{!S_3R?%+IM3*S*PE4v~8^;YH5aa@Y|G8 zGcab8%qWOx=hE$9S3CNB0Gb9TK&SW;Yny)OxKvyN$j{CO_UAQU~4#I3B)l`ld zuV5T@X=$%?gh->jN1Xc8NNDI&Lwn{}$&AxapB@0{LwRN4U|6Gxr^y?;?W-t*so3Fi zi`+a)jwWxz{69~4hZMBRF+0v<@5k`*bH_HxJkD_Z?nK!RSkAuN$^gKyooi2|l_UW1 znx48?JDQuWuMHjyWR@bV+QjWAaie*6#;hU~Q#@33RQ7bzx}Gtja=|au(Em8qyYtl1 z0kg5j)@v1nNV%RYz~OI%8sE-Zxy9zMC)?{NKZVJcw?qcO1xzjY@n>GD(46gDnj(0` za{A&^yt8h)g^;*%-W&A4_YXGWdN@Z}8<&rC@O1(aSKea}ZupDyzMWS)oE8Xr2#(o- zY;g2<%3FnPKrIDvvm5Mf`qjVjQ8R$yBen4mvh;U2E!NTW_tbhtv5N4bcZP+Y2K;IJ zX$~Vs6P{vDf>_SaM&VJ2~X?Z~(o)1y699{f=>=M9N;jkRUoW^H&RRv+tt6!St*$*wnVk;RbjG|=}pGBSc^hUE{4wDuV;`M&hieWPAbJr(N=?mIJ^XfP> z)sdE)o>4tuT56|1Ps~1|Y~WX$@=*3d>{o4k^q=~aG~(a^ZmW_4WUZL!WrU1BsFj%+ z9HRwnUG}sS1%h5y5}s;Lqhg*rCkrC~AV0mFub*Ux{hpcv&l>ic!*npM1?4gp+G@6y z_6(^eTTgmvkd64w8+LG>F=FRSb3fHQMxbn;c04W zW}R_ksZw*&5wFMzIj!>EMR%!}S!3`N%I9yYyqFgZI1?acAMg2V`6w=;mK$!N) z-URa6>jloGkshm-^X=rmNGIpz!w*ExYY_=e)P;gvL169$#aJ)+?%pbC9}H3aYG1X# zg$T|EKWfRLR4Ffe4SL%_Itpkriwx2sajonoAUvY&PfqI#m256418t zE#~Q$R>-n7&wjmwj_lU-v9v|@+f!NK)cGmhZDDxuXS{Nc%OVe0txTgWh1Jw!l2P^} zPByLx6;3I(puj*sfBdE+UB6335pQ6gK=;(1U=vt@#=oQYUdc` zOzv)7qhF^(Wri2XhY})VaM;+qV9tHF#tj392ape$-1~ODwWp=i|5CHHc*8BF5f4_$ z2M7cW*};#by!!Nbyo^~c#8)I=@NOa(G0K8d=zSo`)OW`yK~IV1lFRC}Kw69Sz#2fG zllEsKs307Y1P%Kns^+dXpJ053W=R+w5}meGmjI6TiCu1dp<9% zlbho5#i~Bbo3VWLVaP@ihc65qg4dPus+gnBu=&`^F*o;UEv>Wuv_S$pJG~HOM`ps4 zb*$3^P@vZNW3^UUl8w|YB@9}ilE`sBVx&i<1;*Ug%_06p0DilaVsg*VgNhv?|7V@n zjxKL=*cFL}jsSv~ z8!!B)4&2ul#9Lusr36U)j|XT006N$wFh5vaSxx^>4Rs{!%2J_!8v_3R*vr2hOaKUg zXe9^zKQz*azqTTlkN^N6P{6-D$P4)U0&FONI4uYL-^0NWbpKc50DuQz1J;%icEbOU zh-}?}|7!dnqe`~7&L}}8V4pw$Ac=o%NFXWkkA`CyAl0e(Sdg-6v??aLDp*Z*L|r2W zgs!1J77bgOMx(K#)l@Z9qyB$nc%Sx_Cc?%AfZO?S}lX5&ot7|A-%^gJHrs zHE|eN92tp!d&eVbFyQ|lU}Z5QU4M;irB96iy6{N^C~`+dw{MiK@W(_{YQC7!ZIfku@9~0s<5u6b=Uu3o@dyON>O8p>LGF zLTvn-7~!A5rhPG>?+An8h(C#>!TsV!S~MYteJ9(*oEQ#9%nFAf0;&{$@GomvpI}%D z{_t@0QlVwRftE;&VPhp-&G~1-eyd=ZJBOXUNcDnr^(Z zW}F6t{WrzjRdDFaenaG`Fsu}?6B81y@)iz7Oy;jzV7{42N7FGe(uqOi z*rY3C&^K9GKUAX86;-0~myOa%*H%a3SBOkAjM9zaFpO76;#P?Djia(i(`RwICAFzg z5Fv;Vd`Sp^E=AuE5d&g2iv#Wc#s*OQcQg7I`!W7E@4>=aCp7|+ryFN28?Ag%h*pjU zh7%j5tt^okrB5hin-E8-0mHE-z7S`wX6l=eO+erQa9A1SuGI-P!ezuA;d>0 z-$tYwfo!rBW_}{|vD-TF%8>hs8r**73xodFEBt=;v|2A}a8{OiHifi-a0<+0<-1VB zdMe@_Fdl=LO=1t*gz$z946*)bx){#u7wl`V#Zl`drc|o|YgU05#+3y99 z(S%L~;mP&SW6MKbH|LIhZNvRIR+-258~BkN4&Q5wSfS zt%YU%l*L)GC8ZG!K2fCwSXRBG`08$^-Z;Qd?D0oR(dxAXk6=Q53vARs$_)5sT-gx| zlwOafVPX#-swlB3D%DS2*3?+MCK2VJ{6im{3Llu?a9Vl>(S{|#4qYDk7mwk8uSIlh z1PreD0Dv{EcFIcLDB>%c@7_I`h`)-sF-cOg%v0+?((w{<19JBPgz`zYk%dYyDfbb8 z#?O92Hz=3o#z^>XZoV^c$pTkw&<$tr)x`1kh@6n_2tI7=5g8D(tWI#Ih;lc1pj)%m zXZ(h$IyJ%%i!bEt-~+Y>#r`CmjuzLcPnqq+9>1^p7Hzp{5nE^aZ~8VteqAMyJTX0M?_r&hP&uT|A6Y||l^Re43T${eh> z$K&@-VjT6rGAryT8kvr-Ug&wIFX~l;_I9*FCWqhX&9?R0rrxUN7Aupd&s%j%4D~%4 z&Tn%wEqrRB?!m1O5mZ$)Lm7hugqyA#vF02A6iFj#04GFSGyY#TRUMFP~Du0ddHr&m< zx{Mg*zx6>R4GwP-_nTE3waGud`I1Vqje+CFG1X&1BWfU3j1g7vC^$+zdNLke zJsuMqq^=&Pf`JJ_U!)fW0|2zN+PW)sLx`{7TO#KSjNn_Z@aP)}5jvBio;|w|#4||Jnlf9VT@!fdG3;?%D)YhAJ$Gldh!xAk4Pd=e zMEb(-Bcs=?u=`6DVm8l5O_$dguk~hFz%xrAHNp9Z3dP$m+aD`l_f^_Wc{w-o;oK3( zR=s`25W1OhFmpOJKsLCcNy1RQ9bc;t*8CR2pGm;uurCz`Wz0Cu;rb5P5EagWWLFKa z?)&gL0f(`AwlLeYHvqG&oWvL(-kb0fz}8d{Ol5z|s_3h~Zyq*J1_1O~t*?z>lu{FR z8#@M4?an9X(|Cdp4yhNSjgUh_M>z36KBdYOeJ_eTPWW7vp1<#@xW96Kv};Bsec5DJ zRaG9uO4igwdk_U9bya7Lo)pgix?XPJhfd-*-XC}uZ_Wwsqe#5C4Xjvb>%*#AfzDh? zJ!s7POXN6(p#b(2JZcgNR(0#+KJT>_GFe&bp>5M4){%!x1iM3`7JSVR7o0Hj^3kz7 zTQt14y-fC#e)`tsdQ9K?5Xx0^jwBr< z{Y&B8h^BtPflhP+IYMEwGO@mD>XFNfpS9{{h=TSZ*<&rtqSPQSest0#5@9s2ysSc3 z?;UdnKl0*!cj^7nSrN61V3UUx zZB*zj$p2j?^88CVDWa>p^7}NTD{`|llTaDeSSns>VJuJEp5yp$ga=b8ATMInyF=x0 z7CrIS@gp<>?KW(#1ijvdyb;@>{L#B>O3-0m)X0FUU9{j4H|Y%DY9io%)!G{Cm5S0& z+iP6G=>ayT5Jp4$qPM*Q`(#ZBRC`D|4iJyg_>MLI;Y5*p%ipf~Q^81(3c%-?;2K06w$ zzg_CIU%GW~tu2laf`0!fwH+1So<7X>&%!c{wn5C`RE~?%y}Ny8|`{tFRJ+F z@#N-EpgNL;Jp4C>Je+&FYp)~w^c&4BT-K|heIQy@W`r7Efh|v!X#3l(jvfdq6aE zP_p9$m1yYD>*1eVld>O?helosPVRg1vuY#f;cBDhiGJ77!*sBCCY{Uj@*U zF*=UbuAo)Njk>^Q+s(L(YwT_aROjOv_{)2W{x3d__nQ&=!UX3S3of8@S; z;!sUb0z=&nV_A~e;#5NL+feUDn`(O!yLTe>&&k`|To#$MIqj_^ljLJyCq|akr^%gi3s+r{kzH;z$t~q^IBa@>Z!#UoQU8Fda z8vX+qaq&UTgAulZ{s&5{MaQLR`@V(Nf6Q;P=aRlts<&#yKP~u%5tCQ#3IcK%vMkr# z$_N*v0Ig*4{`$dG7_p+G-NlzkEYgx0&GxU-wmjdi?-Zym+qT5c3WZ}vNl;98B+RD5 zn@fIcq$>9OdDVA-f|Kj9ycRnN#s%fLS(1OV8gs%piyysM{~^w~pl4$HXXjMXesELT z@Q{32_9Vgs`F)Uesk=)c*lco=^NpN;06}9T*%1%j6uA`)!L~qA(nA}&jEk1aVzKD~ z(tw$0&~E)HPCH<_lV}ZnnH{K|ZDem_E!ncx8%SO~;0hQTnh}o*op_B!z%sS>GgU1z zUW8?ZVF((*4;pba)88|7_~Mbn;o_d&)5jfuuD??+m6)&qj+?GUwDI)f}nTj`dp+s>-v5~kKF zEu{;L!wT(EPh>s&7}H-pjT>$NK#Sl}9e}ozSOeD_yNbw>;5+jTS;vh0YI3Euj48iA zy68H)q-R}wGWv7*r%yLm+U_^a`Y~(v{U>eXft75Id$8Hq(~%6JhRj&s8d&GB^*PH@x{K2W z7Im%Ja9XRvI2akm@nHduYJY;$cBOLLChr;H+(4f&sQ?z3rH$%$Xm3cN^U}A(7fqOd zTfK@?tjCwNe5nzYIpFV!rFI5MXtwsb#1PwJ*Sph7`3_S-NclcDvdfRx$SyTD$sHqt4_LX#38lW;jaE{;aDBS-#X|$44aL20YQZ^ukhR^0lArxP)8$D z_r?EQw8jJJD~h4oUrs!7#k?)z zriotOE0NfkM_o?ue-&V|@xutW3`eWxK@67S^L^iYH!tCLJ{oswg>W_WbvyO-zU##@ zr0sf#N4^=Bg{=tbUbRPyW1pF@Ii%K`-e0m=M%)G=k|kjY`_b?i1>6`nIsq5-iJ`cJ zC%w2I!C2&yuhar6n_uLtu|7sw_cADd-t!ymxLuBn2W)OWx1-GdSNZUt?=1b}RuVXl zNtpv;HpZ{b!H%fST=k0MQH!=uiwYtC)f!8S7DC!m8W8|Mk0(zfAw##SNb^>nL0_3> zR*MSg3dfqQWyF>wi=x13CT0ukkQPD{!p-K$4Ko%I4{latEkF#pHJdbS>ws;xxxagkqcgOdsdY(H(tiU zI^@VVcwU5n`$ifJMFhN1+($cWm|QMX>lI|hF#HdW*j!)Z9^{qYn<^^-b_Y&2FLBD7qFnKou0Bcr0n}df zwuRFLgzw*HV258fKMtCi!|Gc3s_nEO{F+~0EN;Vk2^PO}rP>x=gD4R2QJ(S31Ar?y9lZX0TPvqtbZ`}U>s$cF1JPY(TUP*zJWt>c#Qpc1kdXWCBaa7 zvlo_^un^ZLW?HNep|TPNT1s3U^I>yAp-wX-U!QF5{roE|e=m&xX)9a6aBZ2OAq8Wb zqk!3xxU0bd%K;v^R|-l9MLnQYA#dsQ)5{<~Oy;8wjKKL@^*%E$zaGJTi8*;AfJishb>+*;-W%J*)#NvW#n^-`C6J1xUPF|QHI=c&wAq$aCTi{UVbF>bpRBcw+`Ro{;TVPo(_>8Wq( zm3>2e{Iq}L=Dtt~ugxgFY}-V(^GL8U)dm8Y5Qz-RPN01kmY}8a<~4m%jjJTp~dnmk|9SaIQ~z1p{l1@ zII@>Oe)z#!+>J#+OnCGh;wL@=m28ZGV`P78o z{6)}VB&73@Y(&fFVHm1aH83Q{O3P+pY|6WPB1Biq+pZgFYk=)=$h2@#Mz((#M1VET z&~0e37fh`qx>EXQ&9L3qjC00h33t$I2)ktJ1_j6BEYb7uBz@wI3EZz}s@!pfmG)QN z#tY=|uYv&EjTc#QkIILUiPu^7Ay~{sj4%XC_L`-u2aUL7jp7KM?oy=<%=p)c?6?GR z+A`B2tlC<7ux)dI5lRn#pKF%6)J8{hWxQL2d>{f`>7dQeRN933EJF6;YcnS=i!Oj0 z#$OZtdsCP$iI~H~iYp5l4wkG*o))D=2UbO^RVrjrD*)5BHg0^cRA?{+06@^x#KwdC z^DQY<@Br9fxP)S*unTx&90HhitwI3^^?<*pjZ$wY6d!~M_}>mH3Pvs$FY9z1<1h!3 zrUmae3enNgk;}`5s$ejL&IY34j{Q5&jA7sEg7Xm}aFgeEAb>kS0!)MLL4tvY@BM+L zfmHys__!)|cFWv;NZdH#S&$N1g;-(5IIU_`GxW2Bb44F(|w!upZ=B9k! za4UQ<|AO>-_4@v-b-=6%)s&;)V`ZN?6%C~*7|4tWPR4h3IbYeK(}vV>8Q17mLf?{l zJ)3dbOhEvl)Md&vp)dr8kLPXcKR<`q+u%ex+R)IC@QtpLnvsQ({vX95oOzW?#DHr9raO4&n_eV4|* zWR0;Tdn#Fqtl1_ZhU}G{kbMau``9UKDr6Z;NVX(92NtQqHC0yg4YMVP<9?TmDRF0O1Y=*vW^ysrTPqB~=* zV{mRx^7Q9H&=$sNSafAf3%TV>E~)M(?)y^=?55rVTCXPwp>P(u7g?|bCrxa5`%YyM z5)I*B=*X2;nxU!Ua7|-_MpW;-2-Vsj{XuO6`EuHTj}A&mw&%}`Z#Z1l_lN4U zi48WC7h;hfgC81)X>H$7NNG3)F=nt>kyT7V2%*HB2*&W1yVeU=#)`BL4>qOgqfnj> zu#zCCE`t&*{fO&|`N2WqAjSv8DYov~-ri_OX6(a6d9--ZO3l=#FtH%U^{h1wqH{Gn z%lUbkg&!5uLOkxh_c}F=nU}l4%fuiP*~IZpR~M=V;f9eZ*~_vm4@N`<*9OZ$<)GnJ z3w*8>K`eznHI8E=o5iQRx66zRnr@r5Pm9tZ98ahBD52VOv}KAl%{o z6F&}8$5RKqfx&{r%#7lV6~fl59A!1RecVdN_jqrj(F~(#hbBcsUt?<#;DsLJT`l&U zcHQk>;^TJS+m|E-O#6h-jjW>GO{kt=WGwYd!&4Rw`3lAgHk<@xzr0d&GI6T6Y_|0I z7OA!8;(&qXDP;#r52_Jo9ZL0S*XO3oTzximig}?UzmFj=h-Lqce2?cuT_YzSsn&dC zEydYkHPt9uin-L7mp%L`vR8o@R_22^^{a-rF>dgQD{Dalt#kCXZrfYd8N0Wnq=yMs z1rEi;NF=*#5(d&WK+?Kp_`G57j5mVM0QxDH!kV!4b>xqb)< z_XBL#h6QD zL$f^27nhj#yx!%Hdy2wiaRWo2%tQN1ixvePtip)(sWx=FO&wT zv>=Rqd{+(@d$EhX<9k&?R;{l$i&K5OF?-#eot+0X<>61)Qj~_ad2cMa8QiKEu1*dd zsp{Lie{gVXWxHRT(kSC_iu4N6T%yUx!ffk1)?cT@&My;OQ6%Z8e321ibK(BC?8KWisb(PwFG;JL(=Uh&FBGCKoOW^&T?-d87I=EyI0Au%t;tS9c;SrI~or|bHlJnly= z$YfzCuy<6pRgSz>-H1t@7BTajb677(Ep6|tYA0sm5WL(wyX1{EKLN6F(P8Jk( zF0SlUUl~RR!>28DgnYqrd`I&K*4AQT26mRCqIg_SP}Oe%HJAfYyU8Ry4qYPQ`ZtoW zMbSs`2Cj&UmuEP~T(sS}#q|z89lCw0msZ(AhskZg$=GgdF0JeCOO}m&jmS>uJx0c@ zIr=w&xdD_3a=B^=Og(MD3w?1SOEmgk(z|1Z7w0dZPA)WfpwhlFUZ)-@D{O+PZN=;< zjTyR*`S|u?4@?Bm#5Py`C4{Iwhx~;rVs9!Qh9>0OP0mz)Fc)q#5;I-P@Yvy3dW$-v zCBz-Q@Y?NUYiw}h`sKH-bt;R@Uv>0lLYEeI=a+~~CY2#+qK|6_=7EA4N+)iWiTfL$ zSFPCS5lXr)4!jz=hKT0&2nOEuVFQKdT|@%I1z6{m1KL-*;+jWRFyYy2=(AEi!I4o= zOEofM1+Eygk8}z72)kDt4^txV74LjyaTC6p@_8=4(1YKz(S^akL+zP@f%oEJ@>J{5 z6MK5`lsqOS+s3#)cI%+dZr4?Pg^W58Y{8RiEakm>+%U<48S?!X0 zSC-P+H!Wl?*PZqrwctR{b#$JXB{n+R7HnyxY>Jj|B)Q}}q;5hxFn_=O2ILU3_u7HHgZH9q5!JL(St(fbLR#2@fZ1KJR zz*SMx>w{G1tPM`Y_HY0NOL8<;VRFaYtq!Q!%fbVbUMcCMkuv5Gx*}p9nIe>qS%eKW zQ|eSEXAY~e#1Wn97q9=~UFbBbBD9zOiEvx0Oj$8VbWD7}8cjl0&JZHPQll}^ z=CXUQBUqPCiJ^LT5iWE8V2@~JXY>7W>`KjY#xvDHv2lh3JIxbYzzZW|HVKNUl7CM3 zMeh$6%!;+cdp5>Mx96yeP=v8E!&z%q1z`-RdCNHM!@UC=B~L%0*b3s<(let` zyVq$}k@ho@&yTvi4nBcE*^+Ps(yDn~mK{=-tqgyPrj$b&>nlC8!{$F3=?=#2&NQO5 zX&%XMK2e8%qIOrJNqFb}ro*Zrj&qwiOlE8mu4>8u0GO>LP7ZRyE-ykjSMq?QvdSi2 z?L!djsIu&k5!)k|^%HJu6%{6;H8oydyIwZNx33zy@4wGmsGcd^)?$y+x1ljmhBnfo ztUg8auq9kod(~FE(#Eqre1aAQyfA(Hw3ZMe$7`}hBK2_jo6uJO`9L3YyiPx4xOZT$#ocyiNZF$Tz8yAXZm?jI?>Si_3J?orFIbW+> zVHr{vISutLEcDYjB|XK>TfG=cGKIZ;`?giZv&x`e+1eapvJ?FyqG24AeSlOxQ(7-qY0mW*~Yjal!szN&5|b7BfC_! zd%VQ*()bzr_IPD1F-gMy>UV(+mLG$nGd?~(wPM)}#{G)IeCL8t+7X4b(B@HwXOZb= zLOE?txP8cnUzN7y>U7@RZ9DbPoY(OscEh>sZq+=>u`_Hk#b_D(5aG zME}llhC<A}+mk?5`>wRtMWysrbK%D z8Ue3>!yCf|ZBA)d+!SF`jEEM!42%v{iRdVXN-R#9Pt)JPV$Qmwl;m(? zoqlqK)fK&Cn;JyrkAo=%18J_cRHsfHHE&Bxzs!FxNKc#)B_Bv8cD4g3m`Jjqw1&z-GU3y1Nr6!jX2@uDS4T7*jh=gw9L|*=$O;~Mj0101W7q< zc)}?2m{iDhYYrrjqakoq-i;8XjCk^(!US!Cx~+?U0SY6w%-U31P0|#@42cekfNP_~ z1g|%wJ4%lEvN=ixqINSnQvhf|l)f9oSaj|@< zpbOKmdz80*rQWyf+WNxg%Bh2c24*Qc;`_Pmiq#uJu6-;$yM@Nc>)}21@W$|k zMPP$DvtVvgHltipp25L}FzNf;M{Oy{iuevq20@VJkF*Wf4z)jMs3Pmd-sPTdk4Qbo zKp}}kcE-L>uybCFr)0PxBj7Wqt<^Jruyq@|zYE&Afq?;Vmp@}eZ>aWmnNyLetQH;u zWfh6rV?rWp`W<;rsl{vZYvv$XbkZgt;B3&9dr{D^WxBT(t%mee*}M0|(C{q7q!wj= zK|dy^XP;NAZ$tU^v zS2mYUAZ$v4ARKhh;%_R>W{lJz^44#@TNo@hKV{C$%$!>MgraO9W_zmN-BoNF3KVo{ zMt$iLBqet$O!T!h_vR1~xyLC}x_RC)$mgm~PE;bt3F|`_wOpe8U#SUMd0m@gPth>S zfRMnp1p?U1Ct=Lbl~)JlzX(XO@^6lajLNTADw6UH6EL?CnnBQo055zYo8+zDEN1rIm2#O`7!1Am8p(a8wBD$=aOL&9 z0ueu(I_wyvRb97cP;j(GCsqk5!2j65hM#Xq^Z`Wj(VMEwvyYrk@SycCaqBSo>d6cE zwlKy~eCcs|<$1}IMR5xwX-${J^ZXk1cEo%q#ekO*EH^|?VU^s(-T&EAz)&678^2sL z*|8k57Y_HF=RBg{-u@u9t^%0!f(#IR;OFOL6n1@WV=4dcEV3uAnR1^%zWi}bFXoi2 zM~U~yO1QSRic^cC^XIIx?ex_fHRIduXWRQAirhMkV@F*#Q&vl|eLl(e30z2gkFfLE z6)VWRM5|{Jgi)ep=JmWVb4<$`DCjN;vxM?ojgHERB4T1QpDk0>$!M5zrY>*BTn!^P z`N+tB@=a|_8Aaut#@^|dUF_`iB>h)>B?LTHr+XW!IHu=%Px(lR_%%dC?Zmje0~IMm zQRAw>@gStrsP^G-UoR63c2~@PX=HOCAePh9L^L$87PLwE5Br0MP?wNlK*2^0g-=Cp zlrH0d=-ADDvm$Mpezu3~+&gB2CAJAx!Ewr)pVIdp?`^#^zNBGL)j^ z!(cjN#_2U(&{Lkti>}nAIrjl=`e=ZgQY?^0Ux^jLRxIBkry7<1+*00+)XvqQYCBEn53wpEwnLuX0w9NcG%YH!&7nYi$ks=Ib z!(lxe#Wie;v2;;ZW#Purq9+ZNSY6Y@%tDYa)}yWU{kf94Pzt3VC&o5*TAIi;kJGgs zA93B^>S4+~V#1u%$&=w?%`*J7QxL^-ozH&5T=Zd$iQNk#3uPYqJC3PM6*fS@x>%U# zU^LX00~Qc)dsg9Ct??6K$$_~DS!cc8`W;*iFsqXQinEwT5QDCuaa4bKjtCC(m)zdo z-CV(dI_2%`?CtICIJUdNjAS9EL#-;TQ^hE-+|b-l6^!#do6DD}AFWy-obhspU*gsM zc_qo2M?2j{SUs0E#<#d^L`!NqRd1$57Qp1mtf}rZk3I=PQoG*MC9`!Yt(KIkJw~gl z2qRzDJmR)QZ>V*7zSrUN%E$)#;vt)El(Bz^aUd&fo=HXalgjEx`7?PHl^fWvAdr2l zZNVLWsl^0ttQy6-DtTetBR_6Ix5C-;*6&u>53d~D&6{~W2;!iNNR4H%kKm-Cigq{w zH{1HCOu z2!rq5!6pVPLe#g>9j|{mXI~Q$M<40hQ6R559d@NSdmr1w5I1+$BonecyH=5x7nm|W z&|6A_;1V9xpG^8lsX?7fYhtPP2vQ?IiGqu+W z@15KgXrZ|iJNkkm*I4irpFynkQNC-z7ZPd5)`uEbI;7|Bc&cP>8k^fCnMnk>fz$Th9)l)pXlRich|OE$D`WGEb6|vB{>@MKB^vYXwnYgxOz5BFp$90i&;1#0MYy**N*91 zSH9>f$!VU%{F*dgSIOZ$0lD4INu;qknkm*|zde9io}qdvL8W)RP70R|)wW<`8n2ZQ zaIb90KjHS?tvl4R_dqOEmf@mWLX`E{n;;TDrycl#E#PzB(3-Sx{rW9&_M6T;df2l1GoFa!<5-B5egWUZs;ko)N8-yA8^^F zuGU8@4A)0%H=pwsIA)tU9QC@ufvzwZ;&NJCDNUL5`jjq{+_GDY^HJF4Q|6hC6M3K> zyrXTPeEv+eGDyIz|BTeCNB=aYu3!_pF9KX~Pz`F);p}cbt+}=|XoZ029JHwa@@`_s} zAKxS!I`y;esJR(UC2LxP?Xf?1*+_G%7TE61(N%ztxmUN4kU$u-F>P- z(`V7Rhqa@i{nUM>3Cm)V^EHb*Tugjq=V_JCg$ozXpFc0?JTr*#aYg*{zx7=)@3Gy@ zS_DH?+li0*SvgsJ_VbDIvBPI+H16tO%5zXJjr1oHFx}Kd-ahnf2r($%P~?(@^juu* z8ZPy6O&~-$h}ICIVG0~Z@hl6|y3c8;7=ng6At+;O4!^E=fvMXp=R#<+wn~yDChuK3 zB9kt5GvutM)1zYu*BKoV2Wg<7f4Uc2b9SH?>nj1;8E|v5*1ETpU~sWIFT0k{0dj7W z2pUYx#!%hDSh+txKmU5L_>_!ymGjI3C{bCUtgfUsm=*l@bbpWwIKV$1>Hfe5Ljxk+ zDfpxNgIt(@OfByeP_y6~Zeozk@)uz%f;SbRdBC#n@ zFo6?)h<*@>%@@bDtni2E2MYFcq0~q4hv)}!u>3w>`vLwC{U8oTjYfU`Gekd3LnewG zWDkz2pZp!E53|1z1)iW)jet8TA1U52OK>_u;QXzOu>G1J3EMCmFhdPg;NaJPNxp^|gI5`XSK$EFmjCZ` zY8dQSxoh!PDt1+CNUW30vM1Pmd4Xn2%>76d~_c6|}3*h}-V3l`cPG;%& zgD?Yw<2cO!FA!$fNf0kd3lL&v*A?@BW-PGxYom5hU!Jg-UsKOV+^lX(ns ztDU&Z8js9l5F3*C*hBI3>0+umopUNk9iDo0f#-d zz#sD%*kG<9^8p^2#~>FLIhtVp_+uUe1^tiS8Q9>Dc?=XRd_E_QN9Hkz1N2dP-EjOd zkAV$7^oaW;h1?x_+uUe1qYqhDtKfb0|hfY ziE66&V;$3Q_N37i&%Kjtxr1041kg+JyoQ1EBm(f>K~_y_#vADG9$ z3m?IgjDMebjQ&gJ@z0#e9|sxwpP9#CZ*2YH%|BBSe|+<~d;gMo{0p}5&zQ$Y8{xkp zSpJk@2r5$FPZ-0$FvdUleE-Be7W<8P{2x&g|5-oo?j7gnAHj1!Ex;lV`Og>lo6O^1 z9)P>|v&4U6k-tGb{&BSYr7Lh=_~%uAgCqaE%%5Bg`o~p{D*kJa|Ll)n@yg#n7V>A8 z^E-71{)fvs8}K*Q`2(K$=QVzT;{XL{93KZl{nO=ewfv3n`Wfu}r{&~3Wac-}^N$P3 z5_jVi{8wxJX;S_|mH8DF4gYZ|-oU>IHV}z@|8lABzf90yFfG4Ary)NLlD}a=V1u7m z`{B}lFYv!{tH1vse_V^J^}jM*l!FgkMU;}#tr3`oLnotyn=uppcaWI7d^22Kg50#%+G0)tb4BN&nf z{Kg$ogX)ZXjv8btn8(c`X^>QK8t@D?oDv*UB4J1vni9u&{|z_;5}DzjckKTm82s0R zKeEBm=0m@&fdhmO|Gds`sPOOajQI87S77+}kjIJsH_&jL*nb5LN8=qDj{Xa1_z%~J zFqb!yM*iNt{MM|Tyvl$BSJOBQm6;5CLz|~EpnZ1^4ByDB6}-OGT7pgLh@wSD9fbC<~470 z+v2{avPqUYt*373cq1dE7Q3`#w2o2f<+HDT*bg166(w-&jxd`-Ti=ZE~+`+scD zer?G9Hc%YcVC(M!#ea}t_LBDIaa^VNwc-1*#ru&io^eFwA!WuhR<0b9Q2}msM(EI| zcK)v&pYmMtKpgaim6r+E)Ih{HXM^gTlb^Y$+s0XPxD=_YKe4Si_vRxbAIT=^OUyGy z+haH0MhGy-hy+!x#hxgn+d$roxnUf8GW$x9q^2QVrKI8K%o{#LsG@`op$78kR+oU| zXNXsrTJLiocV=Qt(sJ)PeMR7w-BgyHd=~u^^>}+NLAPl^O|9&7#Ka@hIGBAz z)NQqjc8>9LJtgObgj7i?>F>B3nmjW-^PDA0lMqGNcER?f;0{G@;#>Rlj+m#l_dc3T zt@KONd6MrMJ*=2BKBN@L&MwG1qN@6|r^2GWBb-#{spzZ><2PbLR%yv|w`xY^ZqhGn zjNQ{?^n=ye*ZJp00WW-Drao;Tb(ktm_Ph5X)7|Ik7o`HmYW zWqoPz(QlJarCSAf;WM#yP4LXqJ5*fkPy7;+&vG}nM?5Jvca0PeEyl0~)iT}lco{sP z9U7F7byH3x$VUHFYIg^dA(v&^mz!j^%h{Ue%cHMFRxC^RWG zHD2pzQNdnoYU#o>x;4Xe`nohP{vK=wAD-ia?FHgZrk#)aKqiSr^uPTzx1~FP5zCGONh5cHo6Z^VJ8=_cIvc4k+46 zA94+|w`7p=8xU^?Drfk_)=wP|-X=_{ny1+?W1DL)^41@Sko=-MS+pJ2zHk6d`pVd| z7j)9S1SzHw!f!=?<#teH&k07#+}uv8@l*t4h$6)>>u}Tu zzYiZv*iSvw_Q=3}qx5KKqfrRlBFBmB7G#%pgMN>;C_>eN_B`3!Yl4QKY9A|co`2-% z^u(Ab?1rFA9Q|n-CbLNnpA7@9c{AnC)z($oBc)FhPi{;H`gdOp{y*a0I;!p^+ZNtv z@ZjzeJXmno;4UG!LvVMOz$Qp=cXxMpm*4?HfZ*=Fd7JLO_w?y|PT$kt_{MuR;NM@( zT5Hy-wQB4&i@3bqqs5j%+s^cUdWm*i%Izq*936S1+5IPjMaE(3@983unxh%};)UPp zod3WLf1?$<@r9OOs5qI%x)p(Y_N4^w0LI%E=+$>JcJZG?F$C~E8lHAjIBj?sLdGJ! zSJ-OB*Hcf1znz4laos3myUcdQW@x#-yu)LG;%PcArGBdabZ@7WW8AmN$cn{>`bcb< zmtE7&jtKQr6 zon6dk9AzEDZM4@R(n$2`t(vX*-) zMak;OO(WCwUf_6#cMayp&gO{I4p97?S*?!lB9BC^eiQ~n27UaJCI*qG)x)C#;>7hT zqU4B~$4Y|ti7EG-xk+?Lo?*WD{{8XVIJ6T5PeK(rG~t3U#CD$FCx<9nt`srKyg;rN z6b6V3`^ttll(%Vc)^K1R?BIpTu;}^&)swb3eUFIVJ@LB9`FclJ04jbA3uz z%AmfR5j5#Rl#+56`5+PVRLBQ&V?S46@BJewjPlqKqD9{`w5Qf}%_fvWp}9j&dUxZC z@`oGC!$q@U_cF8hQQG7kN*h zL7as`YWnFOAzVso+mNs@G@_tbLOe5^%`)>&_wGV=W*u~?+cVP*_QL#ByYM5gz$JyI z@J!>6?k4RAAp4Qu2Wi;eZ^Bvd=yFs^Jv#CnpI7yMj%4rWVy+9wC6ZM*{@_=E7tS`X zuP4^5;wuX0jH3alUnswMXN)tTOHsGK5)YhfxXDU?Lc4#PKw!HJ9L&>yT|$jhC(UXc z6z*C3<{(fZJko`Yna0mYTiBDpHh91&eW${_F*b0W z1d^i0loc;xGfbdkVo0K2$OB0I*A~D|CX%829TE-*L*n^vzhV`yNCR$}$B@+ls zhJ`d2HCs3Bxcw3|%Jf#=~${OE)GKuf4cm1w zXtr;QYv|L%WTRA#&uu+j>ek&{8*SDjSH-K-3D`FIbkkq&h&rDh-&tWfB{T9KsaVd> zpF%2Ik%x^GGmY2aVHu^rn#rjioiYDNeKPJh!)=x$d(TPxbK?<=U_fjHN})fEGegY@ zK3oFhqgqgbqv&I{uhbi2;_3*V?JX952%zi9GU5)iL!kRw4Quq;!VcD_^Brzqx;(x( zTAxjL4E}HGBm#*P-?aPIoQQb&Kfcz8%#P9#lPA7|CEvFhM=QIs3o-I^clw-U43l9m zG!n~lL{zncQXC&a4?dZ0cUkM{YjA`0BT8wPF2`MFKo%cz#?D04+K()14 zKgUozOaJDCj;vhO1ZoIB)c@M{*@2QuRXW9WDs zy^Ky~?FH7^Wix#MI38@CPhxn@kjStzYBUU{p^FaAs(+&Ac1!!nVRtr>=&bbdX!vJf z3<7o8JG??7F8x$oJi;d>hhMi~(ok*Ivot2u?Su zOvHz>9tX0dZr_?Zdw)~4emQdftK0{?+_vd;{g<%yUpjUE<+kvj)4qSXEBvdU?9v;T z`Q7c{-}SRG{|xfqZV3PC$7TNePVf&9|Ksho7aO1o3H?W)Wqx-DNMZBiB4|9p;#>nx0@o&^85stw09;@dxjzE2@a zg5YSPqaKT=74=Sw(eppVXA@6Iuc-}fF|rY{$B3ENb{j@$5*vF%Lza5#n)S&P25n|?(s7lapZZG7)@yn@j6;xRK5YfaxqDP zcAF$|9A7wIvUP#4E!jbsGG4*6+u6@EyzC|v6lMfEYV+sVHV%}(XcF3MnkO_XYmVCd zf1hms{>i=nfJeW(czyB0->ZI6aMe%d_URXoxRH^t!@MCPoLw%e?5oCM@%V6%SJbZK z4hNUR=YYSL{fZGudGF|2my)n^6yr$-WRW?Pbz!L>$z0m=bX?1^2xi2bdxvk)+mMf+ zetZ)7J#bz0ifWMGf8XmO|Kq*H{}B7w@3>Jl1m;Fl`Dt>ETS5UHp)2$gAOO05SU6|T zqfO*cdi?#fo4L9i&8@`)NVKvX>a0ODFCcoCUc2Z}wR;vEl}~8=v+`~^D}2zpvrMcW zl1RLqSf4nfoqDxH_+See&RY%bEBYB*!*;b2X?iQTEatD z!;$ps*z;=K0+cFy2X%q{$8VtnvjWlPEo5^*b55R^(SKgq7=4U(8&#m%7obL|0g7rlpi= zzul@J#C%HmVd8;oWE3fH{tym?Jzf)vv=!+^l-6}dQX`fk|Lv8ToiW>oA^Rf*r6>c6 z*w)qgva~gYcK8n}YQ~23Qu1v-9ugIS;ox+xZ!31!vAuWP?cvdx|ZY@9o`E zr^P!@Q`{k2vo@};$6xXT?MlLI}D`3ycAZ}Nd)Q& z+$yGbJMa}vyjLxW78n4$xp9s+Z=ktvBdCNezI(|k&<7Q59Q7^y{)Sk3JfgKi765n) z{>S*U;{=Rg?0;eXKkoTu@gmWdw34-xv=F1e<7*?P5hVXrb#v|COPd4W0O(4nYQ)ss zdLF9{;Jt9nkQ^+;33RafY;k$wJ@N4>imjGOaAb!=b0&Qm-IfchZMO@W3ZLbhE0gyD zs#wUbG$lQ1rjD?o;QiWjU>BSKkGG%V0e0i++41RG<;eL^VwOHBIe@D0=oOUjT&>uz z_h%^*WHn1xY@Hw|J#WBD+%x3b^XJUe9NH4oy%ewwwgck4D19v}PbO~~Jsl4HNMrb= zzlCjN432mP-74sMo@n2l-?{4`)?6lhon{HaJwR^G)OqF}Z+ATY0vC`a)3n>MlfG>I2=%~u=ngV@D7>Z)z!C*b8F5}pXK&em+38-lOoWeWSHnN(qhnJtg=5s zA<~*m*kwzeE-(T&)W9Gb|)05WKXJ0SR&d$z^*T@*ETVGYh1?*Xi zGtC5|3L+I^F?rYY5?T_t?-E2$9|ggKudUtV5u^ueAMH4wvbdvZ1`bYf%5>szg9t;y z05~z+opY4uxfN7B(JntHq8(8oI5KJQxv>9Ox3|798Fk}2`1GQ#dX#FS8pU4h-w03W z1Bt+)MDmVu>GIXtqq~kk)BV-tbB6$Unk5PD6rI`($x!r!sv+Ib<{kDNazLE4l! z2`|T~Wws6$cGjMsJqFjF`MiCUK0cV?E?MTopoYQ)G4Q)n^WBt9!ng+CUXD$we7)V}s%dh>op&HDhR|$G@xC4Q1A3e)B9zc~P_Y+ae9=g zlLT65hK9x5Xdu4Yu;{B&nB2l@3!Cdb!)$keX>A>5-6goZaZTGn-6a3dq? zVkT#Hq8^%AYVeOde=ASLw}$V&L%4>fhz3aG4Eeq;hFN0;1lXZ09S}KZgoeT6;9kmK z&qCjOP?0l1RN63bT#=u)z+?<{s?+0&9`+L>W3|{-&7RF3U;umJ1R8-14;%9v&|U}i z`;Kr|>$b<_X%+z2<>tn)&JTc!Z4&r&cC*&;*l@6L+6c9f99SgsB+xHRFJe=cRT}Dm zvbEL?#VLs9zF>$1=z_!kHLWTQZz^Pjw4y@QD=z7PCPG;2FT&bkLKsy_7^xn%jsRJ$ zFRC)l=Ko#tx|{-RgM~0jKY(Bn1Pqx?=Qc0j*48+xZ12G~`Gn{YAIkwZ`W~NP z(I-2#rZ+frpdh}85r5buT8IH^>IoaF_3sw+7lTf-xCqdm%s08+E2V}Ypvlq9U5e|g zzosUZ_li9UPvQzwVzwuGgFL((Mt24W2M2OfgQ9h~LM^~K(i$8N1Xc|?tg|;uCdPC< zlvg+`@MPKP^c#Nd#&W=K{1y!G)2^LLI zbWG9#dwuGRiQIL?fIdy@@!rhl^Hb{D@yX{K;&C* z33+DgqLn*xa8#Z#X9(wbAFG)x^a`%vT7k24nYv_N<@STN51OklDxzFw|?`tX+aaj z2a>1!8WXe%FcW8_;X9kn+F^fb~g?J!A$tcG+wZk^yzQbUWLxH5JZk_6MROOLW|FuC`+}JG4B*unH z4jY1hpsxzxRZ-Gjanf>K7Eag~{u-SYXJy#!Vq6~{&DP6FM(OZ!EI@rPO&2e>)*eXP z_A1&Pbrj6RbHZh<+0crOK5n>n7wY~H($@9bJKioop@2|B0O!`G4}{-3 zG=a+lQKHL{9}?Tx%us2&;VX`JW1K|&7`F*I%_#;dk?PyHx_8~DL*@o!0ie3Fu21d|dw7a6_JyqIY=*aN5c9ObDl zT{B^Js-*uf*8BjIdBDW`wEh1G2(TX zN^qkqfSO)3bc1|7QnmXhJ)?Tspk-lkgSzqoEVS$`tNhg=*UEvz6C=o#aaLLkK*&Kl zV78Km1CEL3H*&mk7Wg8vSu7 zGE1BbVkVE}k_sbqEw`}Cw&Fv7u+4W$WJtE#U6Oj27?3}1kl2dp?~btw*q3=MsWiM*5IlY~yMv;%C|s}67}H!5rN zK&}ED#(r>qX>4C)@hxq=H(&`}B+T!w9f=E*FU&@O-s@}T;sAWy(fnIIrZPOYFTE1x z25WdJqahKq)T6gWr(`yAGhUC6-xk!=)Rd(>z)8_lZ|~W0Y1BJ;3`_cKG1P!ieG>h0 zo@8>c7rJz5_9agzcp9uRRHYFUmOSmL$0D6;DEFc6&FC2xqu&(PyvP0`$yIKok92Xk z((6Ypa`^50g^3tvh7dwNe#2_!HRFta5Azsgs1cIg7&MRE#}Xe00A<$wEU$0b zJw>6=F;;c3o3|y=^=bWdt^E3%w3)R`VJTOg|4WwEm|>Kh(`(zsIfHJJ?4qNhI=7^5 zNPYgcQysV8p@SI>U3ue(y*lN!#HQc)jMdG9&q)htx&CQdUA}pb>fI!i$;PiZzhnH< zjEnm))Y_GNId97@Job(+fm{=>jLuHiIv)u+pLSG%wRg~{pV0E{GPE`!bnw)b8zHe$ z$ArKQ`5o{5P{=`3zcM_oK|`g&+)f1+_k!!gadC9r+5sXCL^QgaLDVmwi0U0VZx=6w^Ic%g zK}zrXv#YDQCGZRtvc48I6!A>@(|!S7s4@8q6H$Jki7lhxM#Is5EVh^ipENuHkb9v;60M{rP4<_ylSW=E-Wti(5mcm_;3K33x&ik=;#M&4T71 zX6=@E2R7bxEytCupatjE1(zc%HL*NdozL)#o3i$i8pRgWI?v;XJ2ludtp9x7hF9Fce%?gTmrsC9^nnA#W$x(1uEkE2OHi7e+8 zwWjj;zYm{JEFZY*(6A?Rm4Hj_;uN#wT0h8Y`jjWovtH%?{eEdlQ8 zzCNJ8n~Z|6Qg0P*%HlJ3@Lu@QiQ~_l?Gsm1QqpmfEGNHNH;F%DA#yspN;Uh% zA4W;iK#`HHp$JG`6of#{FinF6r>PFjzvqw2nAsk7UT~AbBd@y8I{#_Y)FQ`u9HVZT zg8wUy^QxB1s+Q~OjMG)Ry~CJAic@wC$ZrWrXZD0twqaJuqoQMiAZ{woL_L8RCM zvx+`^7-U`|cD^|qm9k+_87gFWo~sfJoGNcY?Z-8%UUVl?QmrXZH9TzKoquN?nx8Ol zI*RFVMmVO(RkVE?hz_TaWgbTdw!yOL5}Q>EEhI)?Ol8855|)XIs}9MhJ%;*Nr*VqB zBe}Bd#WBUQYW-uFY$r_B;^;5#&zQ9Zw<^NX#%4;Y&O~Y^24Xx+UR^w7VuM9MVL#5u z`%yfY=J6pzhN8@`MC>6Sj&O}{Vrd+m6M*i%Wv>VMI~FvqX28r*H)=YE03#Sd=y7;X zDUK*wG3&?R1;CrOXDUte9k8s}Mi(agga&_g(sBJ@J9<8q@~mBvNS0)lZbml(4Iu)Q zvYZs^qBWtUj9epwe9Hgu86k(4vLX{@kluuzwWx_NwILVpd691?>8qt%w^aT1EptI^BMROMp*pRq1CqGzX%0MUW`^1~!TV^4HIf||Ql{lwh?gE;cI5LSg^FrKQKriSxu zO!FYxuL(gaWAS4s40NCbX$I5R=@}XT{OjyqHK2te`m9gdferY)v{XUpCR6SPeuLv{ ze-A+0aU<(UBU69?;2x%_BwM-uR>w4;-J&3+2lsAcndb%Z(u7G zWvr0Rrv*A`A(;UqBMvaaK=zv<>M0Xu=bq zH;haXfJT94^XwWKwg-(skF1Z4C9bP5<28Xn0Qa5A)@LKW7`%#VRLy*^I)&9&#+I!g#86u8>Z-3{s%=JrWQc+-Kl6Bi zZ0neq3u`?r-EZvAgawC;NXhr0N?S@ZG+RwB$W85Kfg6=s`LD1xvg zDdc(egyY)JzDn&+!C)^e1uz%DTPXAVcuejB;ElQtj%`bsixmLUW2s=!>)-fI=zeBN zd(ZM+Ev7a7_+n@0p|!Q4yh&>v#q!9x@HL-(0|d^#9g0_^1g+aDl*7>%YQ-x+gA` z^FzG5{G!(D0#joe9x`U&`c>Pkd?buk=_`XJhryHsMP80}a0T1urEPt`PRTXF);7tu za)VQ275kletkFUQh%*wjUx$A`2Cp?psp2nU+Wn#Hs}5zK!$RU;ht+Rj1(8gf z_n-&p;iiAt??y8iA;U}r+PFN~EZE+I4pK!tC?-!5!>dNFz&6+f9au>@1g7DkeL>!2 zx7yac(3=n;NBs&MOFG4hN@90PvW!$QBN~$ZxI_4p91>37(fQTh`4|-QBK@cRwkF>W z9uL)5Dt-noLAc#!!cqoQ(hJXXK!OAo3aAE9UMeD38q1@y!tTgE&sJVq}kH(&%N zTuPkv^E#Gv&riY~n8F?J9n$3Hlmq(}TPWsx9R}xkA{_gxlY{O zMXJ+$4O!f@0wdTeKGB}cAek(!U5)fAren)UPkfZ*>V9X{!Hl9brob{)MprE*8Jf

KbNmrD~ra$tZ_p^ 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�TECDN4!8e|VK2o5Rbu)K!>Pbfg+%VC$zi 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�;p|D2;$p?^@}x8VkK{?!S{j1w<%FBA4?%36 zM!I5*Cm5!^Z4T7;Mh?`Jb?6|=~5*c(VKh;o;$jF_bgL@ zIdAvw>;@ER5+u0`zjyA|R6(K%*s*b?$D^BDf-Tw>(P{-g4~=7HBnE-H_cxeCnPEV> zC3=3Z;2d9gZqPmIE4Myl&cPii@8lsX`Y?$vJnu*;$;MBmNMTU5dF{n)XThvlWwW-m z`-A*U#+upr$c@r+Q-Kc{2Ptrz)=l$u9(JG?XV0O#W~Zh3ibm-Kc-Kns$`fMRnTr0B zMoe-E7FGDQ;HxXgSCN~F`6}`ooB~Tezi=d}5}lh=P?E*>VTq;WK-QWsm>nSOkPgWpJWQBqkpBli^+FC7weh~C0Q#43Zq<~C2(0Lsq{fR z{y0`hp1rybty^%I#p@Pas@@O?rzPkM#be+C+frmKTqkoEkt^Ncg8v_i$FF~$X$_eA z&wy6@$Rs~vNG#p5w!<5DeW|@ZlUbk;W-dE`n7PxD-c+5HJDs&eAj>RnUFX5f{(7Ez z^?#SA{@>VrW?V5E1VV*zJte*-$KE5cQ68{_${POQCc%io1+rnlpn;3U_|dgOvpqC z?4!l+hTSTt#34(Qns8w#uTUFy3wVWkQGpJCxCKk103`C3=xUb08EHT|q0i*)zFnp{ zAx}o<*ckw#R`ysWQcT?Tgw%;z*iq@WLaH2Ej)&EFcsY(m*0|<_ZUr~(gc712gbFMQ z(+b9X2sbLxGK&*k54k&rJNWUOP?4>$^e@lM&!%$dJ%hcw*v7fSiJRWfXx zgg;v4RDHC{h)k21kyzE)O_j!Lv=F%=UC2ngDP1L7jP`_joqd*DuqyxISkP947i}Bz(Rpa`y3+Y4aj1BI(1!FRQ zcJt^h(_=h(%VAI(vkG~wR+*nAt(7xIp2N%Qi$HSQep@uL(A{oJy1Q+Wb**?zUc_~4 zMPuqB+(x+7#XJmEZ|~p{5a5}xyHYkvebTb!|>NZB%IYX5ji#9`|6{^0^o<(9;ma;R;XJ7lS$H~WhERNdA z&DuF@ByZ4M#D+mUQ=~1&^em>XKx@*YAssysZ`R>ltp2y^BGBjy@Q_*67mo~B*Bg%p z)n3`mEMseNw~QHj6n8G*rh8qZb#kD<>M$lM`%L+X*(zaDd!kkthpb6%wgfYvl$dTp zOWZINbh1oVK{3*&@LxuHBO!DdjJwF}zo2K+PsH~;L-N+w-=q6Y&dNS@nc14CY`&mA zYJv%|;%sH+1rvSe8fi3b*Qqb8<_n`QtfqfVmN?k?Dr660#kIf?S`cayLDp zy;_(s17zo9C!PWY13m(ek)R{6-gjy=$jL9E>^{;bpPTwE;8u-}+TDY1(*;FDNuIF| z4<*?i@xsLIOI3Rys3`kJHXc@%2)aQ}UU)DBC(wlT(s57%$`D;ROYY zybN&ZLFw>~;;~e2R$er5(*qlMJpK|#?M97a8lSKi?9Ji^gBQ_2i`p=Sv|iv{S*~QY zPhzj6mfTIcDVu0`E55qbNl2%CH}ebd2$5^3JvF?%exhnP6F0Z+T7b6vl?xzo;5y1c z+p?J+1N3Ql4*1D_OXLmtFGXH;O6n>uV$D=w!6G%W87me^c*QTFj%O01^E>La^YgRS zkL=)EZ8{rKdk8mYhHqdy8{J*6>OVBjT7Djzi_q{Cch^l^@(z-3f;|Hjkvn(=@GSHb z?r^vGrIbyX{6(4R-VD21*{(*pYIOd%3Om)JG2QI)amhG5`;~id;Mw23i^sE5cN6@Y zAA!5a0ovtv3*o8niA7U0`cEsh523EpqY7T+Lqe~Dhr14>T-gny7m3J_l>9rf#&!3%nlO1q0&>MBoT6HXbZrvEBJ8C4H3{W_a7G**%5ZLAu5Y-}PfTCk z@Uw>E&Jv|?6KX6O1rrUGfROP$#lM2S1kJx?JklAe6o#S3P_OaGQ0RE$5jF210HePZ zP5@8SJGbyWqy0KR;BzSFoyFv5;%bAdw&eZCxsxHSLx)Pjr}#ZZH>!{+CcaaLo(Pws z77J=yL7%Z4OmykAr6p5bx?vgg@6ze@jBX^hd~o0zs!)2hd+Ucla7*nTm2FWquSRke zuraK2wV9%8RH$P)o5s?O2y0hpO*AAfP&B(j1=p^3%lRK@7X!^zEflrXG09pO)DEOG zL{ncSUgG;9e0ooK+9Bu<)=B%2NO_5N_Um4hitv?{r734?S>%%6Sz9Gn*WAk-NxcU( zRoBwKZ(pivQccCuS+p=j$*gvZ+^Vt$tkV*jvW8Keo7vGIXJ8W3_^D{L5+I@M2m@D3 zZummr`x~6qR{C$rJ?K9vViPvS5WF?S{rgU0gtzs=opokMf+n>?kfYSe!mrQSx*20tIp|ULc zvYHnOD-*B#>oTR*r|_d`2kFPsl;<{mpr>V1Q$_^pT9O!_%0~@KLr4Rz%#M?Q$j2$A`E+R&k=^VjvIY#n-StMtST8GYZa1 zD;-f9g4N|tb|4V9q?CSdS%vLkJ>RQ_0=bLQF#Cr!->brQ*t>N*f{oVq@RjtIW=+oT zRTaUo_ZS(@t!U);08=LJ=P5 zn1|*c4Wj#l>R!T)!6h$3=}>;d7j$z7(i?-)gr+s<^1rZjPR8J2z@sXEL3K`TmZLs7 z5%Y}hF{W{;#sO7n;bwh;olYpvheW56?g@jRJh+s1@!bh?PA(0Lrh6Iq$jPOD|LD|5 zVX!$S;Dv2U=KN_NeI}n89&9^Jp4`flzg|P4;Y;zoYw(3gI&B(yGzTdAzQ=kkx`qni z=1Z~JBz`3}2Q|m4FUN{YKJgYJX=H_}|mIj>i{Lk?<8=4YFhpinhWiY!@=a#B#qdR&)@ zfA>E31YMVj9CO{ZDEwpgxfrbr7Sgmjxg4;@6qPj|C8waqVkE5KS2H;_E6GD5TVeFO z+|aS|$`TkeOu(3)WiVz0z*9paxazV6#&oTL(XX!Z|L9~=_bP0CT{p67Qr>DQOyXVT zcpL6W-N^{!JX|iHbTI@lwrB8AF?}Uj)ht)H%tuanP+yj5gwC7=7fM&bWxOMIzc9Y- zbE8UK8**lWOn<7-kSOmV6E98;#%*CL#Zit|qOo`Iwl5SgV+y{{hvb#2G5M4m<#79ar zJjYvMTlyK4eo4+@n)4GPcuJ$IGVnsEz{6+^bcBh<7>(b*rPz-wheV@QwBP$*7EP-; z21Dx?rFI{OTc;A2@|la9d^I^*2!7|x76lCeE4U0h+m;M>*TuUK{HbaWa$-uQ6 z;eQMae5qf^n@>=5b(A(&mtGx3$7TU$dKSo6IM!=hbkjPZwvXj6%i<`aEg-c6LMacH zOz4ZL6Kd%g7(&24_;&!=Rum}@vCr3z%n6C~rNHRFhwSqupY@HosQIXTF}0bJ*-xts zX0_!Z){vkcJcFw5$JPwZ;29Om-(|a&bC)Vnl8oiFZ0$#b!{(6@cN~-=a6o{G<gOz-w;hOz8Z zcJ4%b&T(t1dIp&aE-=c-o!sNiJE|Ea&E3KsOD~KwOT*3O)zP|=4{b9Vqq2UuBTi*o zx@qoQN(#>4=Q{zo77Wf1JmH@bf-|VgxlH>OB^_v1DCdIokT05hrct7SX4JlX+0JB2 z`fl?+IyE!E7(8ia@`N`i(fiE+h;3%dr>hyU?{Ei=pg#EJW`Ds~l;~ydDFT9Ir@&f5 z`pIapTVc(Df6LqhW0EW3spNfd)sO)GO>x*BY{6gw1O%#K? zl%ni}gre-vxu1E@uF0Oq-T(V{O=rLS_s)L;(e2kX^slXHZohcGAO!xu(wxR`CS3O0 zPHXV?PHVSG-q0}0Bmn3(_GrK5&jxSr&vqM6HEz)+l>qT=Ox1iKxPFtPT1!5`LVs>j z=8I8zUo~)f-?DGKlcu8iW_4I_!?**W`AfzeJHV(Kmd!mC=Egn$8t;m~|6lU1{x>1` zg*P?_My8PgD+QkV=$mHqsjqu!oO0Xcc_5F+aeCW}+^C%61)lbwBi=N#h!^0z5_i{C zZ>E_Y*8rsF6Rd7s+6CO5JA8ry2#81dgj#x9C@Kv_AoPZDlQ|Rw-loFytic1+In6px z!yZD~R4Mf|Q$^F=$u*Mzb=w9gd8P+8a8CC(DLJ`UN``OX5d%+z_AwQqV?IzrpG@<*ZdtLlEizCBlpfx$GRr~JYU5a2E>Sv2*wDkXQm$awk86S(nG<#=2Q z5Lxnld9$seuQNS9e%E?d^Wn8`ZNAW3f3WJ_)atsAq~jc6Hhnz9^6{o(XZ}6@We@Vn zh>JxJ5~c}d4+>oFev~B-N`{y1SW`(m{y-o_SH6Q$gfZ5a_Z}2M>#m3Bog90sMC8CbWUThSDDr;c=g0IuVE45*r>cn ztvZtQ=j)#wBo7+zMic8&y(u88Sc7WPnZ}l6Qg37BCnJz~tE%~Rd3R-dbu+K5tDteu z`oA<6fh92uo()iyuJdShB#d8q3$f}vKgbGPwcM*LHqfjA%YQXo@;WGsY){U z(<`eIQ;RWj{}?-yC<3K{me&%^wkauw{$HH-ksRF%xOk6Dq6L^;_?5_on zBl6V#s&kw^xMi}QOTo7A6D=n^yfj(|u)?$qB(R|WS7R_5wA8PRJ3E7&Jq(`OZplC2 zzX=~muM5-*vt$>D1V8K9rFv>1Zf?U;IfFC}?+I*Z;L?n3*!r6VL2V7*mPXSM6`UrycKgUTRd&Y zUlWh`TDxZKMS&I>#qPAksYhZBycbq;`HO2=RK`$nS*1|)GlrU^ic_pL}DK;Sa8RWKXSUq}9*{kT0 zLVn8PRbC*v+`BG#TPSX@+@mLZf4cASGP;fbSTLXEJGRQ1tJ5B;)>srs6lNe^uP{!0 zR;Dv-nR~?}2tSjXNeG~__$j0rRkdMyEs7l23VtlVxk8>--D^zBNQCJj zy)1|rjBrLiEDrugKH<)~=OO=6*fo(dhTBgH%YjM7sN_2Y%hpR|mC~s1A_6h+{L(S` ziDLQQQ2T2>z#Jv1*bpE{os>!vGPli@S0O?j>X``@Q-Q3JE)SABGO|dQ2^8sswC9_* zqojb(ZC+U<+d!&#p;H*n1am5sWO_vY!Y$M)uus~O__(dB?kn$}Xv}DJ440Ay1r;`n zGv5Igu_Nj+|19^Ws&+7B*}o=q(rb(Xmw$7&2%_*8J)LaHzuEcV0U^rWK(p=h8Ri*@ zf4Jk-JbR^&WSwhmzI(!Y@z_rO6B`mmneTjl5y301gBt35b{z;k0s5d4<$jUAeZAcU zd}=OIV z8M8}r52t1w^t|6yT`fMTcX!_cwi3cmW@; zWfXMVaw&^ z>8!hsX0JmE16>d@9{5>m0$j;L&*!vDdKzPRMmEhH3q90K`vGJ8q3gvDd9$`yC!l_* zsXci}!jnvk$L1E4Yiy=;Vmu8uA6-q@S82bf7olQ7bSiyBf^8JvV&Zm6KVr5))t)9rlT` zXlmu9-#sBGT-WLq(0{0!DjSTIGj1ZuVcS~nsY5B2_A`>n*-4=Ow`FgwmZ-$!eiD0V zrc@S%yTR-cWU^g(Q-aB|G@wJ^(ObUXL<_u}FYbvZ#twg;EE@6%eq())bL|{XJMC4L zWLCV4Y6g%QI3#HFUsIy#<{2f3!I#>G7}V-QJq@D!xt8b2v|+QOdiE`&TQhut>$1|6 z$YjY7iQz#Q$MsE?2S21NmD~=AHe3q!#C2MQSDXOWMFuTTlYe1Wj46m&Y|p4Zk+4By z>px;WRj!rW4Z{9P30#r|&0_W=1s#(X35ZBcos4h z(8TYm*ra}#8L8(Ja98l$pTpy|X=-v&sx>tA(5l%!x-0&R`hK@BJey}I${?e2`^5)y z9JRU}VPb5alDmgu=XcvW#lBr~>^nQ1?~io-oc^OLyUQQ9jah%gqwFFhxFF(t3<>T< z0i=}Bqn@sTnjqCW-;y?MM`hB)02w-=xX!)yku)79q>5H`t0 z31+dA#ZM{K1495;Rzz1Jc1m7)5XFWCnWslVbq`jOA^VTj*^z=k2#$TosNZs&RSPm@ zn02JlGW>>C3oq@TjFf-EOMK#Jaw@2ui;24p^>mbwD=p2+A)9dT__5%7ssvbUnUb3Z zkX+m-bFi$fixi2D7G<4N!K&Lk(S~85^_=Q4fB(Br+DZZch|Ee%$f;3uSg*dTXYr#$ z28Ng%-<<>2JDF7oNzu)rZJ?C=xz6->R7CE+XQ;PfbSaGCK3fKF{Besv>DF!k_J0n0 zn6OVlY{GG_Sg?PRBmDXkLej|k2X*>j={h;*)D~)hEw>9{kc1CXuI*DlasqwW32bu~ zz+!y2yyWQn4+Ajv8XQM?vZ>RAN;1E$jh|a7-}wz5+y!;jWwceBGs4S+!n)|x%gM54 zoO>2yNo>{v5p0nNq|lXkNARxHVrrLdLV3-`*PYG;Eoa<9`K5Y@DeK3h?`(B=-i zm|LD<+UvBO^xEvWRhn|P@->=#U|QB2nv!g?ifIe0BFzDQ!`75an!Di0rJRYThK(7D zYzl3f~b6MpaYFzT5>YLjeL! zg79EZaV^pBnZu6Ta*wM$O$sgTnFds{x^{! zMk67-A%CxNRM-uj9>{{}-H~Z1U~~lF*Jq!cJokv2_KaOt(JTs28F9b+Nc&MkPJ?;M zdqC<+J4?Ai#b`&`9e~Rr3l{E`aYNox&^IDW#S|K#o-7z*tp8zlD~Xj~rOb`w?TNC~ zr*TsBXCo@d0h-G5-~NfS70=*9>Q2gq$p(DvZ>go?`umFZkCvrP;S(*~3x#Co2xGhBXzJ>*}cN8PjS~^?h-(-`s z3i{kjSes0FEZ!m+0s7wlEyVjmX_0Acl8juzkKikem=Wbn1qcGH#oLQ^s1kss9?{I+ zXavfGEEPz&sa`eZ@+Dy;&o)Ssmj*BwCBHaT{4N?1&B3e(kVsWe@B*%$pq`hHxF79_ z6(HooiEr7kb5?$YER@n#wt)9cD78_gbH1RtkN`kbc_w(#9&C}~MQ^wQrGi2#@}4-* zMI$kYA8&wVTNIJ5zs2ca!04mknp0>tm!Ey&{U4vcMuPmUBb$wX3uyYUHbmQuTOA>% zwFCa8P;wU2&(LtJK^b=Qu)mZ>#J}*04#8cJE1VzLC%Nq^IejVd{q^u7(O=x3l}mZX z&%qM!b)Qfs2`b$Xa8^YrDEPt@Xtpl>aFdULtNIkqtp1x{z*fbgKzOy!{^csYLv(q& z5nJeImQHe_BM>3SWzaMKgHIXggN1l@nV~R7TI^`4r&}G3#Vk?l+|X`F6< z+v(2KUaMld4#V~|fp9k_nW@SeFAfS+Yd_=Num4#mXl|EBJ4eHAR@}BA(u#bbd$F^A%X-B51>&;3equNzR?6zaYSD33&?IV zF4#90rW(iP>(X(D%6FWz4{AVjOGJIodn-9t^an>uE$Ii2YmfhTi=~g%Pl3%xoIO$b zEFu2u`~ehDAR@ZS$dV|Hk>#6GPbe51u7;NO3*L%kr!4|!CqN;o=QmvW}s+$T}1_` zYNcbLqNA>04nUCH*5_r(0xZ-R$1X75^AFpKjr8&1A>pO#NIqm9ofeneInN2vC+Jkd zrUF?+nAc@T0z5-aA%Sm_2zO)v%!2@4Jwl%B-`1Az+&BIruDW5bUHTL)zlpZ90T@LZ zJ9S#cYyB0NGnv(7X+wkw^RtS02ukS#-wZu2|4NW?OSmOzOp^LMzRMS$49S6{e)v?{ zQlPB2Akb@@Gb(<#@MyZy#_RC&byH9 zbB}s&u4}_1`{Ki+QEyXk*FO)dPQ*~v`e3MDcYkoZ9y4{8ZzYh^(c`o*@{J8u#6SgQ zn)Zu)UJCNpZ)xrqKU)5qH&{@m{ET+^BCE5gwNc-b0$rJ#3)vZ>(N^j(TTqKp!_cTb zBO@1!MR@nGZTA59_uZa%FDh+JfvtNBrE#nya+k$-H&ksPCr>g?x{UhjR|INSJ&Lmn zS&<8mz`y63PygjgD0KXi9}0widjJgLy1al)(7P7Le+~)F9X1v{HR^cV6Kqie`?Ae`{sLN)8mH$3PBh z*?K{!2eiS@;Oe35Hw}meiQnuivq{z5+H}Tv{SVuW#UWzW79vJ|Q*l6Tvcq1);)hQ| z9FOgCq5dYIqpNVQ#{vbaM%<57o@sD-=z&g!lV+mgq=SXC5nossLybWnCErlN8zSNw z3UyV@%VTz?k$>q=kYSngCam~d?5#K^CH0+~9YCxIv5AT;m@bnk$X3u2tbQL(eV# zeT6x~O^B_q8Bw1xjFePnQ)GNLbj@vG{U6-a)RfFQA%fqOxirXTW&`fDRnwd@6XqvN zB`qNxl2YRS3+HPn0k!czW|#O8sD|ojhliZE_X0pn8qmx!^fN>NiGp zfBvQ!(}AV%R>lrH&z~}8oq~H7M^%0Wb01MSc>eI%d>VgZXip(A{P}i-bQzvoqQ-39 z3!H^Fm9Msj6x$zcC$dLT!ftuq+I(rRLGG+N?N~|bsJ>wP%a>V?Qx$1l-z5m~{UCIa z9HwctDR_(K(vRRzHzBY^;5i;j=fv&tF%JJy>-I4pvqQcw{+&b^ZSQbYQQq{;d1a4pi4v5M5C@pYjb$X{#OyC0LL zkXijyw&PBtMVSwusWN7a$&C^nzls+tI}#S*3O3}jmlz*It?AZpz|w_LN2$W8~1UcF$2poPpM*bY<1OD7T&#?&ROt3A3B+3Yki zMnQJgXsKyWfsv{1bUyZBtiGvSGX%yz7tiG0BIZ&Jljpv&$xDk1EFf7&C}ulWbhbaw z!&5MgLrDCyZ2RVvLcweN^bO|Ib%e$?jaHtvnAdX@3kO5;?HW4QArU%!b ztVW+>S#6?S5!~)m14=HKne^qGz5@nWOT)HGw9sOUkt}(v@FFyzcQw#j(0a^O{&Ojq zuOH$x+D}dVfCb=<^y`W6hSehv#-^aRwgW(J=URTJ1#hK&ft=`l_71O)7|NAs)e0>m_T{kL2z2rWL($L zu49}qe-F0#Yc3nQgL_+__V$k}qR?u|NUt}5>T)BHJGr(@PE_kj+LSMbX%2Ecszve1N39>l zg-Cpp?{&-c?lpRLTkCSm`u4Tx90q$wM%Qj#joM{nlkLulWL4~;=gpw;g2pYTB`>Mn z@%u*!9#@I%&PP~wnRM-@q;zqPKBftIk=XiYfCBa43plr>6y*xE3sV!9k^D{6RnCWg zYECa#=B#GyobC>C?3xuoO3|cx4+K70E?&D`a7Vz{{CbRT2pKRyto$XvBY)oF69ByJ z9BDv}>tZsoQIAo}L2aQc*({lU;o6_n2WN}I%OfU?GZ zmFTC>KsgdNnkTxpFr(HjlU6WC&VK(P~ZaLsY@{2w=~EAq~8S z)Q;#nw#3oEzoQ1jL04vaT;;3Y1&i0?F8H0!Wm|_+?*M>2b|6o9bpTtvhyY!+gF>#e z_&UezuOKw67!>+ecymI^j(w)Mu4^*43bHEdD(cgZV({k6<2YJOS-zp1SOAp9%@iCU zZFUo1^yco5T^dD<2(cuG#rgzx0A#0NYP~A7u}?&tZTQUz&=wh>D^iFEm+z*5aty1# zuu8yd^k@10O74E+B#lNR(3|!U%a*Vw?OTtujc~})9}Eb3Kb=jW?$D2b*YAy?O=rB8 z#GPrH;}R-u1$-Fi9AG4bVbJwG{NXtyEo3bo566egsmI8yg>K6=4s)rWL?ghwt-H?< zOXCk*;{?S#2na%v{VAz1w=PQn>rgnr4NJwE{MU9LLZTc*g&*~oRO{%!icXAsti)xAozTSE31k{c8qkB#AN1}nN5nwleO!8wk{JBE{=&j1i$=a<$Jj>gJ3PZT$ z4WN5XJoiu#1g=k40hjH6A_O>Ep#AX=;l2nnA3P4pVbuq48Ms<)OG7?BY%(k4S6+4e20vC#?>+!@0l)v=Q<95kUK4^*3o_7$E`mQ%A2}^#+8& zf7}YCpz^gz=UX-QO>dpwFh6k>eQEiOA#dXx@=#n69Bm`%_1?{ES6Sxr7^s~TNU2(0 zUF<6?3*>DM(OO7tNF-@@WkVdRVJLT*QD>bNU!tP4T>XQttuOzyL`4Mp33_A8Y_97W zlPU-`+J#ut%nf)Y;0~hh11SXTGKGAf<6~W_@H_f(;d!(MeL)bU4|#dwweXqxTiLi@ zLL4XWqim5C8j%&9p=WnKjDcc5rV9+Ymjmpx#_PjHa3zsB9< zB8qx{ zu3*@aDQ^?Go}a|O&lG6jK@-g^jcg(Tji;aD4haOWk7~nIFrr^4W=ouI93oUo4du!p zS8LTLq`iq3#U#|R00gd4sYY~En@vORN2m`690 zkn$V9XqJ%*#|H#LfkC351p?JH&+9ARN+tw_LZKmqLTc=M%JIqPt8`kLb*i^yaY1bS7pHY-_km7BRL=u1vS zIOPiAt8OqxDcs8gVtJeVZb5yb3>|9f<8N-_(!;|f?E!N+%Dm3-tg*Zv)L?;igebwD zpBYDU=fYlYKVfZG_`2(wtQbiFkZdohu}LIsNZNTRB;Nb zI$t^(6`8%NOsd;yZR@uk1+|1Z9GQ#NKLbZMojmLK3uCZ~e=w>K%f^GDGQ)M!n|Q@h zkm~j0^e^1&Vtt)d#S2zZ=zOSPD@ZDU)I(|tON{T%3G4}(3v$;kG-Rb$+p6jxlU zkt}0#h7`w`j#qHS$%%Td=4?#B+QKztK(g|f%+sVu2_eTu2u#?;`q0@{tgy2uhPv{R zQES0B@V)8}rO%kh3s>cWslHbm%anLw#=r`G5NRpW^=1!B`Ur>+Odg-T!F!3^f{X&G zA@H;rH!67~ijb6KB2<>Api54kuBmEG&@i^&JbAT*S-%WZXE?e2*Kno>XpHW9j+Jd` z;K6tn57U#jO;Mh`zZG1*?%^Pu>$Q_@(qX@t3lIFCMOu9ggDqzvE2v{>PDTTca4_Kd zIgNQLBSjSxPn9)gpc7SRFM*rNaJ6r#!64x<7b{+bPzpyCdWGQEccN_qa#MtifJ+;a zMlPLbY397gTjAecdNp3r_!dt(sU{LcW)kA7~r#ZjOAiDnt+~AWK84-2_D4_c9*b#A8{kg&-nKKV6t)Qg8*66-5?Z?N1|@FU+0QHa^(`>5r%DX zEYnwF*Eyrbu z7u(kE0M@3nFDie_4cG*G6AJh#Cbzm5oANdosxuGBw)DTd;ZVksy#c#^2vqs8^z8Jl z49bfzpe!-w5Ssk6K>n)JfJg|9y=se*KrDi22=%_Ppn=r*Mt}s+f+A6{i>lHhz5b|5 zRjJ{=pdi%hR2J9ZO@U<)8vLXFzl~-ry-Im$8jQvNUIHgAG72P!hJ(t@7bI!J~8 z7w`@$RE@vWzaxJV77K6=DpZxf5hx!Op~}}RC_EfC=Dw(axR&$6DRjxNFDehHF#b)T z63HM5p(0S7WRQ|T6|#;N?*CIILz^f=RRsUjXjzN}LPf9?Nia##o*q|y#p_q`OmGFu@Ld$0W@ zPc;XI(3wb)?LWj8qVTzBq0N7Yb-e#j{(J7dC0BI|VyQ~mXt5l-t{t%gyXjpKp&UD} z9r6E(b9=r2&@7^Es=3!xxQpP=kB~CY1ip0I{(?pBT~tRZMDC#4{iAF*frIW%9PMzu zX(V!D1m%gAFXj%#^3vREP8x^Yt$^kjEpWXQkGb91D24#mmOmf%eQ zLD8)J7J)oKqT-zZVOF$k;4;$CrXh`})_-SO6?(7pu^pKKUfjmwfzf`oo+E5FQ~0-U zDgid7z#L=A=kQG^`>14djbK=W8`%rt1iBU8DDBK>BbskK)Q6<$lI_Ay0X(n(MA}Tb zqq4wAGr5m(_xz>ju)w{o)u-MjOFH&F7-bebSfEc}o#@VE{C8Z3E-9|%f8cs{ng6L7c<{~RoNJD><# z?kT3g|LuaIL}~W>=FgS0=AMF~Z2A5_+Y+D%&(fZGg;I!;N+D1w3Oc& zV)#Lx$Q@&5fIVEKgVGSjv=SmrubV*+hYEb0q5=pOgdVHc3?M;H|NehY8UGtA?EN4m zi6I0+ims46<2j~~FL^R5XhAXq2!sVD@UQ~C1tv`eA%;pMpppW8ImYjZ9hE8~N+i~> z?-)4-OC;by2~fUQk77pQyqGbBn`oHhpZGCl2=ZW5l6;3>CzR;FOY-wKaRtIkwP8}j zkrdi6=%bM~>OK_+&(VNM3xpSGz#jIPeC-FzOP`B!^^|GAq(%Bl zHDNHs`ph(bkFTnsDJ$QEL45yY>ndJXv8pt%4d?)FdAr4BEbI}oDF8&|dK3ExR9$Yj z{Y~BI8dH@ae68$UGoeEln7|bCz97KHG`pl$CRwQsyz~-S*q7qKuY(qxRK>acALd`2 zR|GRN4UXaTE0t~r0m=R`Q&3VU>KV+Il5l!R?2P8<*CXq_nUZ1Q#oeD~2wUkuSFOQu zuP4)(oIrGiwhLKL>qPyj;Zc; z3$o8dKASf%FBiEs8#i38WlVuiK3emK|iYx+jIs16G zLPXqP7vDGjKBfLwZeQk+Y*!)r_w??ilLzdJ;W=ydLCT|ijg?&H^=VeoyYG=B-OOv5 zhQaCqhI7tjC*+26Nak&-(!cc2(wCIQD_!qA(IWQTVD#k`>Y+8b1pLZ$p(`O|Tm}vK z0+BgRIa(yD(pcZh-FnqQ)MU<)nA=j<9m0_GHi*x}?qvnpUyIzWcQ71=-*%QXh`3Y& zj=`EFDSM@@w|yf}e>Rm~ch?5D@6AGqYOhn@7DRGgQJxu*rUOWZYf92rh&QMG4(-gh z>NpbW?63#@pd)AG;(u}n!wE%dI06QVf~HLlNN61Wv_1MLkAhVoEOXF!&5H&`eJ zZ{(3fW7?Yn?J6uGL)9bTBy^e?(0_1&#zH?=R|F3GIT`MJmMsXhscg?>ZI6hS6#h(0 z12Xx^Y&m9HL>)lLNkk?k*|AdNeNYaL8_0=HaQcLDHoH#+ZXz;)+q7$A(fWxrMiMnn zFPSc0_z~!|;ACP3JzGp-kdb{63B&sh#BJXIem*I9i+y{Y6O=YyZwi%pc z_%!{S)V5R#A@o{}V|tjXlF2@0Wtv#1!noDZX7h7qpL)DKW|5PA4%Nwcs;VHhMYPVE zow~JR+u&&nJQ}J-OLuI56QwM{zylecV%l#5Z9gT%jHi9^Ki+?P=xJ^x!?2XXK`A{O zh7dIML#?+U zcAC$`mBQV3UM|T{y@y-0c`+d>7_VxBd;1H`v;YeTK+I+)%khZ2BDOBfa6U4G$lVVwg-*zR-sJC? z^l3-HnD}-nV@blNndhCcT@ycpPWT989vS-C9Z%OT25(bH`L^%zNUSSE!ncRl_1IBD z^(HZ%fc^ZVIVOinD3sb0rO8tw-1fK~W?K%L;&5iMetxpqN2Xeq-KkFFc0FfeAx)zD zFJ`)9OLOek;mkH?YrJlG?X8zXQM_)k{0s_C)nN+N;+=v4NsnS4t!$3k*b2oWT^ya- zeNV3t{oJO}U&M^n!yNhSReJ_^|1z1j=AXfNi#>^; zeYR%hahpyy{QR`tzpRz&k2MLvu z+jPRaZZ=KDdM+eCn>?KR>oG~6597EJ%1R_XT6v7cJ(^=T3Z)<0R;7n86w3N*AxWR! zLFtX<-SIyef>V-2NuPj0nz29HBtQ9rDn27>_u#1IezFyZ@KlSzXKa*jDJT{j88^!J zVkj0b%h!_Ms6m|CTxIcm{Fn95^+eyKuIayp5gZpNEpdNTgfbQa6&E)-C`B|tqL zFnf{wv?GMQ{d`p+QtVHAwrx{CA2Y1lDX*$hpF;T!l7gG=8YDDWFO55{xbOq45Y^oq*|t?h>|_ zEZNl{jH58XW|Nd>YbGl^`8EnIksGifOxG+&x24X)?iSGO~mVk{Xc2IEJFgJn>L=A?8fFAF-3b znQ~`6KQh_x;K@+1-XxtX2EqFY6rq3(-E7;&+LXCn;UeSM2iiziq0n9qHMl_|=u+_H z{EXjyqy7+va{DghKoAU9OUvKw@qcPMuO1JkU}dN^d*3NONLhA@CAT*kC3%h8v@qH{ zG39>(91Pcm1;B>pJf~N@m)evofgTTZ#j7((d=|tY(LLU0lKY52Yc}8*uvSwaY;fm+ zRN2Eh%;H8}&u?wDWUcPdgSF6&g4APak@;vW&f85}R`XSbez z0hO8#H$}F7uY|(Ycx`M4tsuzwQLw|5&y1ui>_2kz#0O;bfLU)*GvW6asHf4UvV6wY zg8oV2WzUG^CEU$>hJlgy1gz2}#38}~ zO(;`9lL`xTYx1maCTtpcf7|&Xl(oZxEujau0gDV%2E^$OFbn5TXpnd8WwgpjHRk6! zy*Nx96xX^tsSM7hSEN&VmRc*VgFktNdy`T;y7yI|`&Nv>!%E&muf%86$9c==hYAJ) z;n<8*s;p(H5(i8U^H-m>90~mUwUx%}%-(~KPeIk}8Vk0;18rcBI|5aZ2T4gv6c6J@ zc_c9&{8_PYe3{L9-x))z)F1Oz~^6XR(EeUs(E%@KO%bKQ39g zuju*EEsrc&JOZ{>*0sud9N7eE!*~42xtdYn{B-=3<(3eXRInhaSAgjDehI4E zpf>ns+{|cNl;2A^c#Wq=$B<{+DLb6s_t$x3XBZc5EGaFRZeu9)f~l{9hcXOS-6~eE zWR{B!Qx8<*fyBtnbU+j7dwDgzD1ZN5DqbMmc}8!PdwE;leb032TKOjQkA1}Cv=U}* z-(N*?4zQG2oFO~^vNI%dX8Yf}C{kbfAD*^4{FBF66yB^Zus~uPH#~Mk^%%OynFB!e zC{kui7!$fLxdUqy^|{>X(M>sV8;l8{s#wLPX-D%P)&H2ZE!6CJg@Zo7(?%Y=1Jnwc z+;AHnzlDL*YC5;Kgi;-(fV}6HF54g4sbL(uS5YHpv5}eJtH&Xz-0YNxYrxl)2UZ2gHMQ z{`5%eN%OqolHYm=FK}RjOY&_-?$})Oh~`)W;+QM@p^Yy^ss&6 zeg~MXLVZb?_4jEK>uwph#c2%(C{WbmmEp}*W13G#lKThJRK2?bg$_y4x`Z!U*go`F zKs_zo-ej|8V}uo09(>5^k>_@KA6bgY!pS4dDd_Wk(qmimd=N<_#frxPxNn!~dpP>i zhu_x2?F`3$zhSpdki(otKRU7@UCaLnySb){!kk>Ouvy*e-5bO!#4mf!+ck_b|qP^NJiDF_~6L*41 zrhz|6cy%nyXXa0$JNh#<(gs$hz+%4h zyCYbhXU3Nr;#c5@75=Ujko-H2_}PaS0E0c`?vO1kwjl3eN;e7erXE`sSYpKI!zXnTOD0hK)SrbproC* z#l&h+_@pca4k$@C1OebZEXVfA=oa^z)IlsS@aJVfp*Cu&3*-^r{uAbj#zfV--oI5f z{$Vjb&49A>ewm8Evc#_sxg7kkejmK&n6i2}jGdd3p?b$dM^a7nwkB1|WcS!tXfE|! zc7(6gxA63M_%s_^vyLs!mK&xysdC?Qs50Vm#%>TK7Lj=;;^j{Ftwd5mzF`G#d9jlv zd&)FAJmd$xu`^7`lNON>leNaHW43F=)+06DFPwqcfvAa5MU>z30TrN-hKwPuZUt^> z)xzi_?HrnbBu(B@R@6%hkuYEqg$XCFRqrp&AZuq=RuaQ0psAvRYM_3ajy>s4La!&H z&eTh&mcJ7Y5x8&wM)ZGMS3vpm^>U{2--4?fk2wR>P}2$w8>@HQOm?91IVPgwgzh{A zDH#}nEQw}2sPW5k{k2wG29Y-o)5}P+$)H#@d2UGhw8)@XH+gQEl5U!6T!k|6a$|r3 zGpuNMs(ovumT=;ae-;1kyQCkOzihc!6`Zh6#*2=tba$?-`eKD{SYSwAwD%hsUhgc; zYGMU!o`2^j50skg3!=YspjI3wOjV}<6C`Qcq(kuMe~QO@M54O@)~}bHmkRa;tT`hF zzGaM=QYQ-%CxF-i@G0JBTHOXVh(d(;3&3;hCu~%rs_G-qNv0T3*^3ey8>LuyY2?id7t_XW>f;~K8mQU4iDCeycTH@Jfki~ow&3x|ejJvR$(e7p zZlR=*$Cz(l=1X4Th%n2%@7=dgX>D0A3w%y!T0keC zw$|&-F8H4+E-gpN@wGse%mxCK7@=qnaGo7uys*^QZnwj}c@HkfJ@cX{r}0X}wBiXq zx}N=Yz9NBXT0dU!H8joL>VYEml`sE25c_f9mJrBCYj#9B zZ`2HcwcyoR0oPXyb2Bb&O2pH3_Pc+|YNFKh*5#6f6RQJ1YVgFRfPJ2eG4y!hZq#O*&AU+J!OqZ$K1%-&68;ef)V>3 zvGU31;Fr?&g{3k}y~c+i@&8iLB|&c(7LV2GnM-B4wEa;h1kdGMeo3g3*&GGFwGyWO zM8d0kTmuQk)t=534T&a>tha%_zdZ!g1s2WW=2cXEoP&c;*!%Wzuk#zgo4 z0+S(PL@+4ADBBwr8X2e0))L_g1|kTiea`m@(kP-lwkAWdTuonTv@wv`WFRcK85=ML zwr1D$6ZVys{k_J@c zVX!v#%8zs&e~TU;E~XXWLlx??E?yKp7bTNcgj^sTUEK~d7}eXUcE=M4ZsjIW-TH4{ zZQFI>Ai>*!gTA)`$QECk9Qj`^L0%ful|N2Nf?IbPZU(Pm3J z^JomE8Zr~k%jFBG&daz_YrXlfTRmeWZ@>NT&a8f3;LHG<3bAK2Tllkeg1_j2p5)6_ zZ_nMfyU;jQm2%ptGte90yl`;@w+K6)x~u-Fwe{Hg#ydegkvBadG_!#;5YSq^UR-oY zV0vseFNOaLQb4W0OJf;>820ebtf!eB&|+r{=@`k)#mJG(z#3vP*00kCIE4zV?T5qS zRtqcbCuaYCivIWAyLT*;p8>(La1S)q(rO&vk-XMe93EO5Sm>YL!AlQ^s+POUv??0z z;4rKbb>1LO|s4(|3J z=(`PI9NGxo`1%wsIKy6u>^a@f8N+;t%sz#)=8*>tpQ0SS>J*Kf+P-vyP%@G|i@08t zdQ>Fq08uTF4c#H##%${zBEg95gd+!N8Eu!aHAJW=$QLHJ(=Q+AoLraUkV3 zfS^fMm0K+;h=dl^DHY!S?X%G^bb}mNo7clW+3=K{0MQsK~9qbgNW&IT-xXdbjYp$UUVr!f?V9S|#L;B%!8Or_$52CZkac2aeCY*{?0 zN?Y-wD*p|#{Bb$3{%||n_A*XM*xCf5Y$g|5U)@4KCsV{Ow*)3>C~?E9(G4nS<1#(~ zrj}DhDQmKDEGAw&8Uy+b--=Bf6j6fEd2fGQUtRX`C%31$uO+Ve7Z=_2)#x?<7_e=@ zn@@(U{{4z^=jms6|EsR4znm=(hx;H$&XQy0Xh_na!b9W`33cIS{Vb>(?Kq|es%9Q( zo=2XVM*<$A>!e;92Q_dE8sQx{@bDc84!Ap*pI{HF`5klfaq<;v-BQErdQkI^V;iW2 zaX6C}xF2C%*{3@V5;#U&#Yf+CzZoJSn{%jL8{YCQK4$YIK;~rlKTapZaQeLdu+!!= znF`wq+idmcz8XufrPko2Z*va=PdX#WK5QyyKq^yy#@tQJ*TPx&^V^U=oO6_4I!A|E z&KL)|UIX2&G1M#9E`{bFKL6JjBfm3JYmQ1KxhZg%^pFiaHfq;{FnRo| zSvFGFFgkRLsrLypD|sB-LzFX#@7}$2@7t8UW2E-1$&hEsngsdTlfZ_-p6vjfUz;>4 zX(7On3A9moVj|sYGGt7kB@yDbFA&p$T zG&z)M6P0%{U=$s%XrwTl4wz(1L@nXX*N++)*r$W0oEDG0%k6(o^t&M=9zeD0)_YeW zqZy0ovWLy%EwbOPm(Qrhn`f!{rSH_q7SFrDaA(x|`nz|(1|d~TH44@c#Q}sYx=o=H zMah1==+8zI1vm`X&Y<-rVR~9|lOUv~(?T|d=t^D>l{<};WY-YE!pM72#y-6}4AeYD zZ4**s>BMeCqt=k|t)}VL@{G8$T(Q1hbzu;7nNATwe-hP=$G1GWr;;PJ)`GW_+4Ne^)bt`o_ZA z9NrP^@LX=#Fe&a(x`A-F|fV6JOHBc>vQ2@hEz3wyV; zbmd3lQOfq8?Zj_pPBV%N3>)bZSDzu`_|uvm`WoFN+HEuLw_mI@qzYUo(D}9*1z&7y zFmwoPJ5gd|N35(gqzh~(FiLcKJC9bIt)UoNvdx%Mcz>lKP0;Qo6Qh2pGz<{9cA_0` zoAKZ$8#0w&g4d@ADr5?_86!p>_r;_LYz4)L_}~~RO1T}m0!=?)n=yOXC&kMCp-rQM zUkRB;SxU~Snn)KpgjG7DH<}`vDNyCv4&q_lqM;A8w8O3J{ zX{R{Y2Z9vla9Z*lW7W!jix!05Mb5ZB04>PGNzN(Tn}QBZx_D(b03)#i)5)6O_?&UD zV*BU1P9~WN?nmKCGjTaXz(fvFR&7(<8T|JY#I_goYcCLXje16ai5sLqv&X|Yt!|CO zkp&^FGeXP2F1UjK+xYkD2Q1B`|3(@EfmMeQoVC1E^VqtM<`L?2?ds>&HST(@qtWlk zc1oJE=luKBM()t}jk^vwH9EUdQ$F0kkGDlSc_UpyfpJmLBl=3J@xhRN>5M_Oh0(dU zsPYsSyd20#(Yqx}MY_%+Ax(XxI5Ty`I?EZYUTuMLUC|a*zO>)rVf12ZC-{?a`g2k++zBk{ZGS@nZW{0%2RMuC-Kf^Oo5BqekFbQCbB` zZe^X8tVl{*Wa;eGL`w;h@?)Q}r^np7gWwEEEjFLEeA-C`;$)m~y5A-^JzS7k$>hxW z{gCDQ7dekIMDH+9N?2U>Z_0~V8e2{i59|-gjAr!3m`P=?S2@1g3roz0z82?v*)roO zh=DJucJe7{_qfHEzO-F1?>kCjrG9crp_zZdl_h@kiR}Eta^d4NL*_10lyb6v`@rKy z5Vv0zyNxY55KVP-G-&ydxqQf+)?f2C8y;_LY+W)A!^8*X#Z&u9ql~posf!hZ&*>rB zFQi7k)uDat5H=D28h>g6RxZEPTI`UPqh9%`sK^SnLZ#QA1iHtiG9*N!%1Ll9Xhw`P zLS6nhMyi)S+LGrGb0;Xh4%epI{8nxmH`uCgdGEqo8ruEZp|>(a^qborPrg=EMn$2r%63d1X2-W?|@@^!)i%v=Tk!9qd?~W|v;*I-U#|T5!JYN2$ipW=F zY~yppw|_e$`r|23yfB&Dc(hQ;0#_nN{&I|nZNE@{I1Sgtn%lraJJmw`Tm4(NMagOG zjr}BNKk2_8-aQ61d*klU^PgLt=4tg*r#LFv z+9>u61n|{PZEs2A8jw#K>7Pb&4yCd1?tb=0{kD#FU)o9`b%<(#aU`Kzv3u+yqUT>D zN2yM)PCw9;P8!qT?FZB7)(7QvxAnS29&j606{Wziy;1mjz z4c&$SBi`y{x)nF~dOzV7&gmtCcxyI5s2iVho7_>1M$HOmPW)I%3X2P8 z6fQ2TEZkgprN~f}P?S-$wrE??;iBV3H^zpI%^Evt?3}TO?ZXz>b0-uYx4mswRTl0l z{MdG-@DJO^w%-dig;|C773LK+jQy;z!M-aE?P zyV%~l!QT6Vz4xTO_ec8;gZ)N^{l+N!jm7pGKKqRq>^Dx@Z@g{4@umI7FZLUM*!zgR zPi61Z*!v9jzA$@VguO4u-j`tSOS1PR+xyb&eHr$?EPLM&d*6NbzESqRJbPcEy|38b zH^JUF$=)~B-Z#VEH_P5P$KE&3-nYQsx7glSY45AH_j&DoK6~G4d*2Rw-`>)dAHdTZ zpR}q*X^6gA%gSc~YhPDJ*U$o;N-MJz>D~?}q@0Y_kMndp?S^iHnoU|T`IpME3!IZx zwvUxUDZJt+b~#mJClwMbu)>ycB`(IEJGF3eQA7Dm=J?ppiVhbxxE|Eoez!|g#~!y! z^XyW!eUWnttz>1l{h>*V?E=H7=*w~MzYkBB<^28eW%SI)?Tw%2P;Si7v5Y+0?a!hA zC_HY@Eu2(4M_|X(+4=O?!zDS)EW5PWF8PEgiPl~EI);3sMo|C8@kLHu*%Fl_N3br@ zs~_*OYh=0=fhh+iRL~{0oFC!T&=o3w!aCncRhG)I_Ji}2X8Dd!omA;u&DyS@j{m^y zZf~UQ_suJ6DEV-Tue$J~h4!&og8p^xn<19;u+HzrYewQ+Gn}iVKUyf38OgBH$@g!d zzjx6jeBzlMKKcUIbmLNu8f$ted3yR!qL2Qcdam?6DtN)PbKEr_-G%p<4z9b$VZ_G^U1sw1!9g2++{bvEenp_gM}LBp?`rbm7P^)Ls=i@%0*p8;2R5bl{B`J% zxj6@Dzgw$m)HH6sl5%Yw-tiIyHl=xTnm|45iZLEWJt1NI5)ZVtK~C+j?ynuYC2>_Q z-uMKvN*|&o-1Oa=;KI`l$>QlqqS^FJm6tX<(}-s8^@UzK$&p2LQJt?Zv2I9maui>9 z^umK)E)fCiQuzH|I-yiIEMs1^E)+$OoC>+rg%%9=ax!<1I>ZSWih7irq*LQg7UZiwCfAohpvKLE) zFT5Jwkp9zbT6Z_AZhXs+L1AM{jb7akL17c;@2L*|4u$DMXEu4c?-XH!0(-sORTQRA z{F~iN|D#kl=!UCW_m3dEi<2!+n_GHHkRF|Ks3EZj>tWp(==15mR!V95)dC;gU5?qC zy*JDo^_9YT4E=Gy?1GJ)ZovtC2;kjjTU1{ z%ZKGrMEh>?WgquG^3`6P*W;tly1ycCZhfTNJM4^-sijp*y!6{8*iL32U0JPrTgjAs za8>T=|mph@9- z#V@&7yu}-O*maa>xz-df_Yyu`yR~p=3#}CO*u57UroCLx?QQzW8+r)YX``O~!ArmR zpiWy_*YMK|rQC`sZ&q_1rQDj~kNG11rsT0cvFRNzw@;D%26GcBMRr}i?RhV^N8zyb zw{c!>x6-(DDQ3$ZW6LfDxNg{UOMTpPSZu!Oh5ribrS|CQbZ_`h1=#t5|M7A=ALZWV z3cTEo*|c`AZ}qR+k%#u^vPsq4Q>EOysjpOqZVR^KQm$CZJ+`8YkL~u+TalG+>@J^= z-l9;`{eExw6AIJI8xy_U6AIp|?1w&j-BNnV)%Pt=N4Kn3T3f}z#;1MUdVHi}6SdAq zx72Yv-&%dS1ur~uzTmcx+o0r?FBgRv*1l$@OnVv%M+JE=B*j$GqHH6fp0y zewdeA-) z+U|O}dMr8vck&A_R~Ib06-zB=%`LUTqFb}HpO0Hv&uv|5RVriMrZWwfS14-UJE+>n z)nJ7#O8MO2jjL9Q|EdlZQC+4ZwJFWFz1%Y8+HcDadg(`yuOX^F%1bZB7H3F#;myj> zieLuDezD3&FHsmCT@vM^%a!8My}R@qZ|EX~X&Clvh?g#VkTZ<^B6)Mz0;RbYO^-`{ z&s3_k%=&|I)#3Ak_G`_-Xm9Al$|KY3zx8qtD;0I8`iz&GqkvnHKiW&X=Igc|YB=Ij znD|!QZ`qUDGE1q5MWr#xG5jnn-_c`VJ6j#~kkW1s-oMR9&qPYS>3Xb>o`IBR>%dvw zxaqUG(4!HnXHCOL4W+R+syT-OY0cc@m7$Y@b!3fh*u6SZv|`(OA3b>~H+uS`me}+b zr0U*y-@=Y=nW!+{`9g+IH$h>%_k}ud-1ym?j(cwH(Q)RtMjzO@HF+0btcbY!OKY{R z&>2b$zol%i3@-|b*g7uko(NymS+9?_DeT_(vB*c~E9~C=G140@&E`V5#g?-fEt1kB zq>LNuaT_@qK6fa@I?+O&D^`@qJ>Ru8LE_s@96mC@1ln~ z!V$xouZT}K%$#Z?d*A(Ji;vDimFun!nC_!9>geAFG#p7oO)UA1%&9h86!v3_zw+uV zWl^N=`~=aKvH0s}$ zXZiKNu84Z~m(A7TeGmI~ZF+rq<@$e?R_-kQNg*(IJ4=@?_vvmRwQFL1jF0|Vp+f6- zdEy(q48B6^3va+@jaAN9s7@9 zt$TOR%zLK0Xlst;frRx+KRJ5E#atg3>@hFT-{=kh8bO9`-I431FPCtd(7m$;eb4R= znRPY!@@tMbAu|~|DFW!EfRtFDJEa8|x&rmeyyh0QwYvEN7(f5w=6La>` z_m1%s?awlB?-)OG+b%A6ik}sNr}(k(=P7;-qJEZgh#wU^#LxWQ@@W|^T5R7i2;VI) zWx8ndQ_thOc`ZCEQs6i;eZ|8?r$>)JfEIeg362LFk{ zta_~C(6`8GI6F8$SNvg%a_Zk;_CKfonbmt98O(1Kr#!8k`j`FRr~YOCb?RUC|DO6c z|8aHj*uU|$4~nM4<(nOi-Ul1^ZFb@CHvDcW;&ydZZua{(mvqo<@Yp}`m0JEOZRPf} zmcSbt#a-Z^9+`Wci5$R3q_A^0D#|hS!yVbX$~d(;^x9vC`$ddgMCC}6s?x;qb$8C_ z_qm#s^L73OmiaGTsCV-;7$68Y@#*)^Emc3c8@Ruou1?6Ylc;>3^2}kN;Wo zfhfp?#eW`|_y5}g?Vrct{rMrNb3k3+IL1N!#7={jinNkh;%bo_cq`G|nv}66K02#O z6uV3oAyF)kGs~j6DaqoBNvRcwI{1p^DOIA`6+;EjvKeSGpO9~9GfpI$)v@JSDY-F1 zSUl~#?_`$S*+@QoF%QbBfILwyC6=4%6^{-*|FJ3`l;dB_HOVPQ;@nnGa)vv8*i=d| z7rcW8#Fb##VaZD=j~iK~O0mazrn@%n1S>c;uQj!2O`eox4rB@BI{W8=J0c&B6+YnlkAGuhPc`LS(bc~RgA&<1Iv`$%e7wP7srxm$ zpGA&He=k)zf9K;lT(T*``2&ef*RF1Reiq5T+AcrSmfUOHy~mj;0a1K_kJ%1P@HiZ& zNxXH{uWL07jfdoJQyB-k`kqM|&}rqCS36pH6PI(}RG8Hw2b!l@80Ro^*|Vxf|2`?M zc3=9m@c=28F45`+NtNdi|JWL9TwM+(%P2|>5fB?bayf*=NV#&Z)Y)7x^D*1Q--~0) z)-HzgWEBKfy@c$np7O}a1@P#C4+i zV|dQNNo=pOy@a!}hkz0oOU}#2Ya4&VH608 zEfZ}oP;4(Jup)CrD=~{ZtCaQM5;LdQXxaw4xhUGt%&8EB7!qL^<%|Go7k0M?OR%{l zdtTC{YwKkoi(>uzY-R4()Oizo0WuzTMyRj4-qIA6rQHEg9az}7OKlc%H6N(P1OQ&y z;BbmvqMO$kg}t``A`fFfoo7BbRFh-63qXB>)=@s>`c^Z)ac4Kc%y+P>94+dNOiSmK z+W@*5!XWeS=BGP^d})R-_PAh}DU9E@U(lKNCI4LzI%f)I|1n|l9cPEI(LF;LcU&l& zA#6S-SeX9Dg(CBo{)3MT|5GBookwRzFnorFx<5lrS*k|7o%gD8H7+BPDX4Mgy(b)) zDcG+Ki(te-YAPd%U6+}}9+@eub@=C6oZ%-L2bma4?x>TEQTTvaaOQo`$j=b^zchE1 zW76EShv&8+SDKcv&ka8=gbx~xC^X+bLzs8``3Fmc zv(HDvzXYKc8L2X~lpH7#UYZ-mVh$JsC?_Tif9^_QNr~{@^TG^a(&4$rj7)XXu^EE# zmAr)|!iSBk{UySwxgX-=kr{=0$(+zH`IWrN5+Q9CAFiMquO#1JA_V4UP7VpP1{2a3 zH;Q}miVjW9+i*F5M9o^Q*)Qa_RgUxumcw(^^YWU-DibhF;}%t3?s%93-aijEzh7}$=6YMNc%AeH zoy!lzt8>lgzNO}Y2ZR*Idvr16;k8R4+*qiF1$Y%7>3xq~f}hJUVYw$#Jbl%YdsZ_T z3OXgD#7k<>inRx*pbJ2rbY^I^Qdkbpv@$#eDz{jY7#chvqL=N)R%V4(WuK6!PGV@c zMsI_8=35tO<;O1pEaT6xi%?3w@_Vm%`(xmgJzI)R z;2CVF3Le*94NF0Btz7Vtar<%#ly%z1>weSb^yn1pYYgw~WO>#v>XMj*obc0oIK`Ex z45tYRJ&XX^kk=Lv`S;v>NFdCqYyz>em~Rf)04qkH7H#Jp$&OsH@H{WdW{MM- z1*Y&7FMdjz%!xfG$T9P=v%Ff~r}(>}WTs7PqDuqZ0(B8#G~in$u-s%R+SB^_{4G_0ktu&_|6#Oz)wx>1*EDk@YeH1zt1 z3cGl-t`&8ytgOCg2D^VgpYQMY`u*75Vb09X+4JW)&!3s+dEV}s#gz(2A#dU>Y~fo} z#X!kD<)x&w>{8ZsWeJ%~$~n@z z@v8^#<-uln0rnHw0nr`8X1(ot8r8fFMe0TgYP^6pC|0YsZHXW%HugSKiU`KTKut2nDVb z>syR^FdH82WI>iWdNVt3n^8pQ|2F%>&-@)s-+(qBNX{rDJB&e zL*_QI;6*A&+KjDIOgM%3lCjLE5_=F$yo5<3d3;9;7Ljt=rI;1cHAXom*jW+^g1Vp< zx2_*HON1lEB1nEmc*{qLJ|`e5QoIfBX)&vn zo}EfjDE+ciPq%lv#6aK}CGAN6kaw9q=}-f-{H@7YlQHMRfl^(Fw3u}{vZvA-P+1xZ z*W-b3PXn5}@exNrq~z!u2}dBDl=xeTN?bQv&5JxB)dy^bJTc%rMNFYJhr$J2>B;q=+#LL5NCk67Ya~|j~`K91oTk$!jvH*|6 zo1{<954^GbtV%*fGV&38MA6ek@dudAh-y2teLx%B1H15RP|oz*$aYhl&!|)7V2(cz zzltz#bsPXC{e&2WmpQY&MLV{nq;#jK-AJnKYCL0VbWT4|brO&g`h%1lR|1_-x$#=e z!BoG6ss7%a<3it=1mvSp+c*%7^?y-{Mv4Ns^?tjuTn?!UkfTaDZcADRw}aF0o|b(! zdVs0?hgP2hP_z+gE$BiFp7zCHRa~=?EW(3Q1}e%2)kYEbP|)*6zC@jCn2jc;8^5iHU3cM1R4NeyjGcWhL?h~Oskh#coVzUq5X3~%6#SXVS)Zek`~YAlOX15E89 zb81S416gwwt(dc@XR;^E@p+D9s{`sW2k~rSDuZ=hB`71Foj6k>5kp=ToCg^4ZudkBXX4R3-Cd_@J1vHdPMq{}eEz%2D@fxI^*>C}1a7`Zi@+Qo zxeTmv0YDd)F_pV5=gLu1I=VHV6_>$sm4KBfM;K=5q*(&qiG~d3h#nY%_NV8wNAuQz zNh;o8dkCXQgom!pMATmkv+0eGmq`06oq&&@&OX83MVDWM0O1_xvn${s45$f zQ9ugH<7i6GZ_MD;P2u&)tU6JqSOf6SjG`M6Dixk59-qo$FK#n%dDeJu7Lg2GcpVLF zWh&p&xj_{BtHmT78zKZLu{hhbT|ngHRlnZm9 zRcy~>QZnC?0TWjr<&8VB06<4Gh>%@tCEy^c3)@vn^!ZjE#a1fOIW){vzv7wBv)a{I zunj6>17*&=d z*94AqSxYKOUXHu&V=B|5lwmH}A9+1{vlgpU4AzLMr9A#6UKOU?L4aviMA75ONG!0a zE_Oh1g26k8hNHO zRrk6Mpie7DRcLe{s(AnvHH4!VDzl)8EAlU7s|{lxHl2FVg^I=oUzGTbU_9-Co+EfN{3ksmfNl{Q__=H(j_-)zFy-zq~7`y)i|R+-gm zWp=bQsi)`5*+rXSfb~8aZ_8<5eXAAyQVdZ}TvrAmTa?uURKluC13DbQlzFU4ffYEQ zqT>1=mjE!N&}~%J#FaILAh#vdA$#brk}(-!0 zCR0kD+pvyfuO*;0hr5~D4eKINUMo6zbPe0(N8#2r>}UdFtmxh+RgfGpx@%?7DeHXK%-5mF~KbCnZWtYXfcD8 zS=1Jf8d{j@y^iVJg+D6VW!Opd^U-b?i0j{_?8Jfv8xL;w^<4`=9#>(8QW}2b-KPlQ z^;m`@p@rG@{iJXu5|1Onb!sn7%kG8Dz8X znKv+%&zf_&H}=wOmLJ`^t9TWZ0-X_QQAY97-B}aQdi=px?Q({3De9dk(bRPmIl%JE z3CzUFWR$vGgWg$ycM^(y6oygP{cM{(B~)e z+3IX3J9TpQpvYcXE~1gAm>AD`#_`(A;l|?6Qd>e%-?7RmQ ze7S|IwR%zOYuGLkFtg&BRh8>=-6E=Jv3G`|8wOOo=;S}XyY>$POC5?t|FmM!gWlOl zI$YN){F;7D@){`R%57$9KM#%In8mKIQ0kV|?C7)TU`{1FYt3p<%4**uu+3@|(de@Z zO4MVCgG_y_?tT?3<|x$VSiKUM%13jSXi)J}Z2LjP(WDIUf=%pd+W>lLiZt_sQ-D&= zF#*+5LIO8_<$_|o%|7G0o-jB?3KYglvx%wvG$-7EZf0TYPav>RRwLz97ixbGMQ>oQ z`w-)Vvr)VO8C9G^)Mb^!cst!fN@D?f?8SgeWGY8>ir8Yj&fD18 zCp)=KzC|FHy)gy3wkvY+Qq3Mg4wvG4Yh70j!%{1HaN3{3jXs+|`XnV5|6<6a^QT63`azxz5d><-FWLui!PZXoA zzIJ5a4hhE@fUxAyW5pmGFst|P32G^^T|Z17z-DR$h_GHgtZdxG)c*Z2?O`)kpq}-L zA-uN8#jJe=#EL)wl{d2+X2dX6@fKq_TXR^+-$qDb-8-@Ir5a!z%>i~!bDW1gahMza z10iMkPv^?2XR-6|*$z}==Td2 z)Nm5|DRP+A9>F8uiPg3M=k>*nyv5X>)#;rq^CRk=%=I;+GYJ*!;0K6{Qmv7*gkb_h zw$&pD4r;OvsjB9nq|^P>h>x^&9il=+$pJ zxhgA%ul>&FVAq{;h9{F#&=D)O$1QNhRnd+1dGEsrM9 zwfza}x4R(2a?z}NgMJ{`vjgiNZoD=x)H0P0TN7)XV$xp^B7u}LB7`rzYR2}!-VPp} zD2z0bk|CWwfR)WS-?#cZLIz+bn{*W2s$e3EPg8`TVM2!fOp&9StZChb^3{q}a?Atr zY(T<+;?GfdFEj4xa7mPuJE0UI$2F{~*nv6^pm7|paxn%jn#rCPT2Or#7L(ferUNb9 z%xJv!bB}hHT_w5aPUpt8t@7@0T|tGZQG%HYO#+JG$-oX6*5Ah6TA+WKa$xN%l43I` z3LVjgbLAype5?}Kt_$dTf$L*fP8u2ZPZzY1;nJgbY{yM=9wnrkP8E|Wr`kFQL`*n5 zZ07bafJk_Bg4RH(KMJj&l&xmQ_;GNy0Y(3V9o`=lEzlr_r*Z*ihG^wR8VlhY1zhZD zywZQ!6N)m53xqA~X!DZ#P3*l96^OS5QP>m>#~%t;#^#kE-$o`fI*JJ?4iZ;?S)NK6 zA2wIJBHU(_T+qti+M_Q(&8(*Ym1m(7e{NNx{({0Y18|5PzwiVkQDYQpJFRpK@Dfm^ z5k2^u5QQmvD)l5XOhv6nP;oE1@G&8%17tXgEaq}P6Ib+q2S-JrL!iYeG;?n6{}+r%0J5W zyb5#M$WgXuO6g^5+3C`V$y1w|N_AAwQh+iJAYq06Rmf`Fa)pI#G-k`{(Ac(+sKQU?@mcyEID2HIdEkoShdmWSo1i9Ixh zW828;t)ZxeP0j(tfmB3%q1PDzp(o|_alryt!CORcJt3` z*o>L_wmai1jKx2r=IG+zke^1@&)q>mW6zVSC3q8%{wFM{RCM#-rU+*W;`W$R`>f0xC%|$GDjJ>fb_`hIM(LgxYGcCb8UV(+OUCm4(Z^G>T zyjEW_lkL76RqfJO&55HdsI`h^ET}x4nmK3Yd(o`#4b+p)iL=Ptj|_~(b0S)&u?dU( za0Fcl55W|bgegmkW)@%u$~UnGf9>>YQO`}(y#t9a5;CAv+=*jSpv>BS37$pdi_T*2XMj9y^WLYsguYVOo%4WN@i2aXWbN~oHoA?^&YPJ zRqrdbUCHK{plUZkk-7z3k~xQ3*ICT>n_CVE|}?;ZS*TPx~GGF)keSCLBD3BU+bV>x6!Y6(4vhNJLorT z^cx-Yn>PB*4*D${{Z+7WTS^V z=#OmlM;-LXHu~cZ`V$-dNe4Y_qlY`_D>nK{2mPsy{^=MHu`D@ z{dXJv_YV3q8~s@aea%K+>!3fk(VutFU)bm`I_Q7c=znz3*KPFm4*E+Q{bdLJm5u(Y zgZ|n^f89Zk+UU^^`WqYlO$Yt0jsCWS{-=%pX9s=5M&Ib5zq8Tbb%1^icAC!Oq08>|4x%}J_h=a0iMer4}!9fF$&vHt#c(mgo{O^Dt7!0}=&h-5N($-%F!t}M9iSS*+q>o$^%u|2V_%@4ck zU2aOqR-AhVV08$zSi|&f!oIr0vB4#wf|ilf_c5WoRxlP73I-VUXQkRp}$OKWBK!^eZ`6y5vqnqd;_4!bERWQW2u=Cg&mlf)~Rz$wLRg3#b=QX)%* zly(pRJ1Hu71puUbidSY;WQBk&NBAKCG?6R%Q zM{lzpC3B^SU3P%EVq}*+$y}MtE_;!=dVpQ_HuIB`U3M<^E`0nd^W#-^*>53J>%mdD zQ{4OE2%gR*E^dO2Svus~K??uajz>6CRD@3aC0Po3-i(=$OY#5b5D13+$P6Jco@#7^HDwLo?VbkJ;`_49HCN_S7H+$Z> zatG*uO+eiH6(+j0hM?jcqSoc+Vo~$kh+hN9-;qb{gg?3pzr8M@eZj^SpxM;w7!T&} z62x6EEPuYNI1E_*1Re$gxPI16gG3dp1KJj zq38bQ;0F4E@^^&A>+pAk#mb!xZynh-?G5gPMd6q6CW|e)-{B_b42!je) z!Y8=TcPOSG_bA|kozDbn6adbU14~Q4F2CYceL}t}2=yn69y#WH1X$~mjwNdTEQ1Qx zQh15EjE9D?;1k-M%x#20JVSZmQpi4B^05kk*+ORHHOMbop{>)L(bZki^_|sal5gm! zGdllSU2NVN-O@8U(;40FVck{B_A@%>jIQB~4qdf8dPZkGquVFwRE*Umd1HQ*WxX~N zVpX6)U$F;G`~_+8K-HWxuN&@F3qe+Lts zZ9LaJlkMG(Tv^Iez~9G*@U~+r)JCBpflRAmnvT$RIHaP`$2*18IDX4V}n|s6Q(1o76SzDko%M+B1*Y5L39KqYZZ1HrwNl zsSdY>a4QQcK&jt$p;c6WdZg7ZE5jm{`uuXXP+Mzb}kB15)d_?i2^h-g(i`kZodf&|FTeFMwKQSVGp|AQ; zqo6u+@X2yC=VdjYS{2ly`t;#c54+@{fysG63R-fk>0)VgLVscE;MQm;ZtnU*E47IOOs=v>5BeXGJ;#QoG0pT zYfP;d4MhKuVRo@jT4fO0N+4#%%TZPt+qFf3mEmsK%5^^)S4?>nHlJCdf2T{oaf3ib zJbgGyFqhqLV0B(S8hK5F*-^NGQU%o5df(ha>HFdf9#XQFLQ>fH4im&`l2B|#UP9&! zC*_UgF8xA_HHNJ)TK|b#2q$Zd>{pTM@(O%Jjm(ze3L`NS8-cE;j5&c+H$)X2QvFDc zq~=00uCMyV2uFJakzFX7MC6%(j(wnx!kjRMrH=ep+xmsW88MND;p{8nQ9Sp4QaCwr5hP1cyg@Y(aq0ysh;3Z*s%d82h&R4# z2@x0>RlD@Dh0nw#?pa#|J~)N>hJ&i&Fuf|dguh*k{|IfG&}h!D50jt~vTKbhH@ zGzBFX#Bg_}7k+9Zi>5sep$V17Ml`o8I-#G)Y3`*1IVeBf6HRc~3La#inAizNex3kz zg(XW+=W1Aug^a!}m@AG^Rf52Gb~RAi>+T#?N2IR`Qn@4$B9c+s$$|_w{4@a?G8$oE zg+BcSxC#WW4n_+(k4FVzMi@~MvG?(f$tb9605_a-XjByTRy|oWma-K+U5OM-!C1T3`5@ zi;OFt!R<7<;0XIl`Oq-TGl_RxJ~>AYK^f%$skT|e}4+==M; zio#ZI$I_rTC3^P7oF3 z-SDoa%MHM*hWnZ>A88H->f=q9-%Tn0i{cpq3&n=d2cC@m)LnwLQ*5K^u!gGrLLsTB zZGNnRhNF>;pu>z`2PIj^T>Kal`jlo-NzW>j!?AK;fmIjX{$>kl!;1yHlVQNdYmR}xr$7(&j?kb z0N6j$dPS*@*wyA%ZeYDJ!TK?T-+UQ$Sf3sdCek2;Hwj}7WKwQg!~b@#`$u`P66AZ< zI-a1{I_AdU4_V@vi_5(aeU-ZP;Xkzjl@KMllwrL~c3lEeRZ>nEvm0yIQr0WHjHCyc za;hs{x>;)WkWz-<-*J%LO0bf8+x|Nu(EorM4p}Gz1aH9F|80D7*?~8EAullq30yl0 zS1Wn6*$fU$>0Zfw=XScARkDlKR@vuF^7-}3esimUV^Ap8X{5Bj7BN~(bQ($$0dEn; zQu#{vjm$hPRV?|9BDS_maFfK~_SrsYmz^-BRN)oSCuQ$}jq+1<*#ig;;G=rE zsltRX7yjK%V4dtkSplR>U2YCc_k!aAujE8HfV+zAc+#9PhTM%S=pzDMyzHiCmvZf> zf$VW8IdUeCIo&nN{%7Lv*`Hys!#gfi0!WsgWUi8)Wdi2_zc}5%)5R;GfLW+dp$G>i zA)GJHC#4+6_)z*W2w-r)IXsp}hz!rbya2a<@*PgrrHRfCbY}*-EqD>(t%NG! zQIsga`atQ|i(L+4m4s0}#9_I4OxEoGuQ1gTBKvKaYN}S0V5%j&Y-#9Jk~f@q8!`L# zO_4Fg?4a;G`4O+=#^IJzv2DbJutE07yr8u)k$e(?qe-OSj*L!S3qu`; zA6{HC80-Uu|8g*&S>Cd&gc51*k4h6S`Cl4E&jel6?faBba*|nt=z0vTrNWz^Sxws2 z6*+*UBxg`%xztVE(c4~UN~EQf0V%yZ=^(v(K#-hn>pwEGOKJEBa4> z1dde;*RX%1e4zS`i8)ozx+W^aL6qz{`ihkrIcAk^Hi{~0?ftxZGdsJJ)#k}b-&=5X zlK)&oCkH|m-81}(4E%1lWVT!G2z&A+qF3<%FYdiACFv4^iko0o{DQDZ zO=+q^LP;W+(A0iv*S8&8HGnsH+hV|j-XIbHu8nDkN%p%%#f@@X71?kAztgN43w0+K zCcNOn|JEPN0r$ZN1WXQ6bX04Qw5DsnbCr5QJQ%8#?mGnP?Gm;GCS+d1CQ$JjF_;S7 zM}_Wfa-5aZas@Unc>nP_a2y6OS$)~g1g%hO0oD&CARL{ zW6_sJKg&e|YV2l62H{sU;0#!AVS4h&6=G*Q}=?2^#C{9tLmNr$+y#CQSqQ>so#OR$5#}4mI1|p zWcgz;B{`iBK*=Y$9bRLWvy~c8)jv$iA;ac}>&DB5c#!cBRi1p{ux5l@pp%Dg+8r2!TR?J2=;tglF_>PrB z^;`a{4%dmP^WDa{PNqufhMHAxZo%s}jS$W%tm%;oO>o<>qN0>;JqU`1+3*~Gr^RX( zj$14(yVSDtfZc)T|NTeY+)^V@#Anjo5A3{*IZufS7y#K!oIk$l23eO1wnx8O2*n5a z=_hxl0zT3ebP)eN^spBm#6)~>4Ul4gwYzw;M*$DDx?(*L9=!NA@IeqWZ7t8Fsg`~- z+7HTk#$84oeEl`wUPk-JHBSc@XR3#1Z~1eZqCOKypfz_d=4*Z96CNw>AXmN`(g!%Do_5E*0=9&4LRC;_fj&n>os;_;lxs0q=iuiyF9$33A3 zZ@T7#nf?6>Yp?Z-AndghZ7~n!lNaz>%ci(LFC;HvU9xtHU>2CY0@mSp70?7_5X2?0 zuT9_tMxgMRn}J1$!kT%kgun`>3e$i=An`c_uy~vqt6?-H_#V67J*0J$py~ z{IOf*-U!IGtDA#K&~~`(@NXO5ISd{knlLZ@3MtKvENS+q$rxZDvj)C~Ysjdb8Q)%RQKbF09D02WSP6JKsvF$kcu|cJn!5SXj?^A z5MFA*zbE?i1%(-dk2f{*|CzrNmGXp~>=E@(){4?oPRXBkEGPxJv*je7!860ryR)%& ziuz}xf6NRQqJ>Q%8bI+9c!nGcBE&c61#@LG8Vr<^)Uv-A)4c@RVCrF~#*na|tsK`1 zyV>4Iv>{T9LS~hL4Xl5vu`?5Iw2_q|6G9W zB_@RgG!qz1`9M*kX1KrR2Irhf-k^x^P6OH~FotiEc)U62F!(GMd}gLL*{F+FDQ^0h z2L$cZ+`0?A2zT+~uIHD$7x3=m-l4$kEq8%&2^Ep$n@&_hj_222TN|8MhlTO9Jbv0t zXY3rV-3G`+=ae~EASZ{N1k3k{;_iQXN%tf}sab(l8?4wN-mX;DVzN9Q*oy3T#&NTu ziVtGALo*5!4$R46mpE3hc3~4B{%j7|!kThO2kzP3U{mQbWd$h3#=vYB*F8JoM;FCD z?=Xo=r4er{STf7NUMjHg1v}^s1cizhvaNTbp}A5n?I=F8HiIe6sm3ill~esh)crAF z);<9@3@ZwgqJvN?4b+01$5xEhT|G$cw(fi}2EjXa^J4wEqTx3ZtTBq>Etv0EF0oF4$3$TKT<6TU;_Z5DkHN z7r&_qm%LiQs}y?Z;tO2v#N)>gw`mFLmFJo?Q#YJqzyt^y?}(K!kzHFyN!hwm4P$*2 zsM~_6acK>Ee&OvPg%lg_kP(^NsF(+Vgs)s`)L@l_RJRL24S#J^s9`{Ox!HN=^vCR5 zbcYwZbhT>J<`89Ea}2H$!p|81-`IJN?nQ%jv+hdj8Bib4?J+s8$81Q+tVw}uMwNE% z=lR$yai@eGY1s2u!2~9dLSyEtg}7zM%VWdR!@i});WNAbE+besW*+v;Q04I}_M!0$ zPjVX#=dO52=sGY;qP$FKR|!f~ycj6#s?MOcP^w~G!=6X^OfVsWZ#*BnDAC2Uh2uZa z{!+OH48Oj^GW>e!1_(03MoUO_sN#F7VoSrGKmD*H=KLy;8K{aKXTCt=ZLcLtd8YTC zIWFb8o=ie5d&>@jB=>_X%&lFr`+*DQW4#$T=RffAi~Q2WeLbajD#nnc~rFD=^}JrU*Namp-8yC17u0q+&G@%h#hCkAnCh z=byGyCAzRXkL4$9yDQ=QI~_bI0feeVdd8cxw?nW31`AsxBnYt}4j{ar2y6lk5hhNWHQ6AXkD<@>cXN0h}i>|FizG=vvrljP^Oh4qlOZT%$nE>@c3GvxK z{^8}(V0N$&7;cxb{86Xy+qp;m(}o!mxLhEKQx#~6mhGjWh830oJfBkV zuuH}k1ch+9c*<4M{kV`k5wLdnTtERFULlQ~W z>78}sDwNgK%(0@~SvUFXwrXn5SaH6yuCVIMYHHqC(dVq&95J_=Dv)d1=d63+_{D0f zNG=_7);*hAQ%xtCy>2jtQ=r~eOMovx+=a;eVg-?If(QxD3e`X zQSYoD_ZC}CwaZt=IP2Nh_g;KbzA({QKXK(^KAz4%A@)D~xbB~5OP?UYM9ob|h| z%&DfHlfSsnS^oeXcbI!YEOJ6wazkUn< z-s@5+_tT(|d z#Wj_GT&r`=OKop#F)mKTvYv@`K|nErbIxBj{3#4f3Kn)>9+4m?sl1=4yx)S}4+Rr~ zg}OWssZwbWKJxY++Lf-^eL3)AI0JZvNV3I`fy5x#P6EGvhF^bY{#iM*Yr`+c1C(B~ zCwf4B=Dyb=KUyyf+fnyD*#4j>-uFDGYOWOlP_eBGB(x7}E$YfkSX^lp8og??yu9Ro z4bi~%FA4&{BM3+B5^M@64+1j*K|Kmifoos{oCWWIb(nqsFHn@(FI(X-F-&N%ozW@X zT!H}q&%@S6Hz8#nzMW{8$isHWD6~qp2h4aEv?xr7EC+-FA0dVnc6^+IQaayqNO{9R zY91-XL(N}kXRgD!#F>jf%luxx}yp&0z0b?wSqxNvBiUsq@oAlx)^IsK|f8;8Njs zARD$!qd}mKZ&w`;9Qoey#8F!j5%+cYsVn0Te{k}x?H@h$T)zP*zRCOcP|#k2Z`})z zRcTX<;IKe~%)P`@PaQwrK8=DNXaX0orQVEtEFp6afNm(lM$iwVW`jbo0IUQKkczif zkO9*1UJ9_|*Gf=@Ka-^)ZYP7JAZHs0xCgKtN18IA6#+9tldU<^G(%rUXnvwDKUlYC z_Puw(5AnzdJDH?p+&C_YntKck&7({vXzo+ACHy2 z8T<&7UZVtwx#e;;pUyBQQFB&vCUEvh9YKYiqUwmcIx6fEwPFiZr+(j?k9fi#g}5$canjNxdO>2p>a7l8Rb=o%ONe?!kKHUZQBckE1* zz69-A(g)k)vhL^d?m?mVwL{eY5Hj5Z5@poPQ0G$8xs-4gf9qVTaxM*aF4a1hYMeQX zKj|Gq&2)JG3pI1;rEuNik8kZ)wck=HKE?ZA@87TDZmB@fSzI_-IHZ>_GuMr%CXoUN z!Gj}VW};sLkQW zF@%@U9mBn9px5y_K?@{YKuXjJp?s(WtBEfkk1M;4mkHee4VbxDMFR^WdU+E&t`=Kq zo5qI-<9t?h=N1!hW(VE^k>h|?Fyo3$q8YcvB0X-?w z_{W)-+zagK%6O08V~OwYT8@I)zI&C?AXJnB`F#_DLNgX;+iC zVKcq+L-D|ZP=Lph$76{*AL?B=@mV0aXGj2~5|*Z%-(E`mhxfGa_z2!@_gI@#f5*{e zwc8(FuK~#3^TY-N9$fMj?~b0kEA;K*gdibyZkQ{g{ePg>*2VD6``jV!nE!&*oS*<9 z5+>EgNoLVE(NB7;MJG(jtsq53gosRtjtD~+>en8K;Fs4JrhZIlfx8{*@C0<3Qu=|% zisrv>;nR8)LlzlhGwTF&`)*mX`a#98r>Mv5+2Wq;0qAdMqs1`a(Tcwgj!SC?X->F1 zOSGWkJryU}OZ&ovnps1Jj1wT;3w=|)k)8r5B_?Q1viA^+evSdn$z8!|YoQUa5AGMD zS?z8%;=EuIJxA;wh_6cVLfnjWeZ{nlA+RDh6xcmvMlVQdhZSb`tc-qO=M?U|71kJ# zF$mJy;Y%S=fM&(Z=-MUkT(3BoCL!f{VM;q$GY(gjH{|zDY=r59pi7(H4sXn@u=Hrt zyU4*gH?$sW;)wpm3wpNkFUsGMI4f?rAL9%ZTKhnl;EqZfq9nk-bdSRQZTbyqe1uO? zm$9Et9SKUm1#X3=-+=BSMsWkI$r1+l6&;OXdtxMT&a@w(K{TV{^K3qyltsIXhb)=x zpgD3VBxxvSMS+>;uE(Ub!mhCRM)QivG|1`#s5RE$ECRZ=tfP3Ga9!7G6}vAk2TY+ZC&WTqj}cvK%IzcN2!PL zb>xpc1^o^fq z^n$cz$Z_H57AH+lc&q)o#alC&*Q1-#57N5eju8uwe9<1Ah7xEQ8kgdu*o+Z$Ll`?2R1i~%%2-`mZ+yA{S@diP`u z7G`0p@WVCZ07^2o8qu~?GeC`#QKKH+vW|?KcmmH$YX}1?Ae4YT(O)_(fOemnn54Ot zaRVRUCSiNdj4}(TRqq=YzcvQAZDi6diQpOH02C%S!vw>`WWNOSnN|Nf3fEWH%EGcaqor*ry+Gtv|wSqbGQoR(N&DI z_Rj(EHZHQj4HnJ2ANzv2;3@#2e)Vlt$EWY7fYH%(!IhR_TOCz1> zSAs8c)vlbRDi_)O1@+<1p`H6x-U-)m>04a-fZCzT9>J1J`6(`a^2x?Hw;81xx6kW5~_nLO24ml|YhGSaPA_1qv*s!U4tB7KF1^vlSAg zXedCYg{X9<V>T(X}M&u%Yu^ z)WXaN6hIATx~O5A>s?PU5?!dp38R5V@FZFT6Vh5-Nyk$)z`D<+5!k9!mY?rlF!A65 z-n$55p{n%?sLh33iA0z{@{Mk#5_enzq!0DoIq^FnJQ*gUo5dcms9Go7NJjRk%wm_@ z7QYl%cB>%Cm6*6CKMW+bO)ASar3+kKC-Yn3PeA~*dG(jcuPBqCNT&@&{jyKL>UGtHBrL}FIcXn#IV<@KC z)?;s+)fmwmF|l;~ly=ag&pOFzugCuzOL8{2Fyi~FzwA3ymIu&mc-2#f% zr}6WUeInyb5WD36GI^j8nS34cyhmxF<}hn$Q)5G|9G`Q*ABtruLdi zfCW01_*`>z;%5?!GWupKkDSrmv3c>NCB8Mvddr+S1mn}q%`2HZJi%^(3A4|uSmgFV zl7B$xU&v@O=4D#vN%*n(_I9m|ADa|SGs=wFWB9Q(8}Dq(pE#($jelGd!95KtD^*Jux(Yvv#Mg5(1e#KInn zXP1?lTa${oh*U6lLOO+2J_8sEU7?8K?YDqOX{GWL-HazVqj|iwhi0IE2AVQS#y<8% z#q)E4+NxdoiJ<=ElLqY*pS0jlJD;(8mo;N|Cu?dzw-O06ui;&d3qr7F%exE&W>`Ob zPzX>(iz3&nDwqV=;-?4@>6*kpNeE98;v2ay?`6nKRUJj^YMpWz?0rNO0L<)w|{59bs zHmLX@)E>Z0LBzVdNTHs9T1x7KwZ(8glpUCbdRvhDU@%tgu_BK3V9Zh|nfcXxMp z7@Xkl?h@SH3GVI|f(O?G4-!1M2MF%&a3}jab@sP+?Q`!rzwWAWz6CuG#B%6qc5IJUab#WO_Pg^do$7nGZ z7b0_IMNWl4=PMrcSS%1(331656(u1E@*Ux1Di|EhpY8{MG85pt4#*(U4vgzv5C{Mb z#)dt$vXY0VmxnV)tdFO^@COrtS&DdJEHs(jbt7DHObO5!@d~1|Q)bsd*4q36U`0Oz+ya5*Dqz_m# z5&%fw77~EFvYMsL4dA3O$JDDEhDKxf^{wVSxbUO%c@lcl;0qvxoP3~g$(sGE>A>`I z_iK&qqICRVt|P|y3xUNW>BnDK!IVOZ5quXt`n7FPP5QxrOw%Y6A@<$|`b+U@_DD7d zG8BT}p$X|$TOEbRmWQ}Ckmf9(bd2d)p6C!hsjoWYkIQaoSReV||5)W{Eaw~0xh!~U z>jac`<~3U1h@)%uF-~k7%cCWvNwSGA8!{1 zKxu%i$}@UYCI5UZjt0=fUCBoTyB5P`qQ4Lx8qLkloL|ycPM85rR2*6-lr%HIwE6>a zgNu=J^B^~#+oRZfGZ7F6Z*qOxNVyIdSoDk&6Lhhx$XF&a+K+vCS;qIW_0t!%wI(9? zg3Kh3R3RCVfkllcpHGAS$p2aZ>7gids6(EJ`Yxyk@Q;7hnwgKdm}><9n5%c16%Ip_ zz&N$`^`xcW4rBP{=d2=5Q5jZ*1lRcs>b>c*;FPsz7G~jPf#t5PrNI%b825Gtw3K}m z+`_fN&~~{^Ll*B&j4h!^jmLkp8!Mr}&ofIJM4wfZIt`Ys67oD{ClYm5`%CRI%PUlld#g6-kMXcAhAT^r^ z`Sa8jRG;DEt+Bka^KK5RroONdcUF`SmSO9Qim0U z!Uh$Zvna;BOxguOIeg`ca-u@2;-aN4$CXXI9)9FNZ9fF*f%*PYgYib&_&D?xU}5V- z{WTXwbaE#A`R1KzO8i(C>{xS+ZMv(gWb^8fKNe04TW$9t|A*)drwZP?9~(WGe{Fs$ zV^l;*d;V`mK>z>^c#lB#BwG4K0vugA#R`XE$=Wo32i{QyEY4uEuJ9y{Lhky26<sN(?iCWZ|#cixq zf*Nd9pkgG5C?J8uCs@bJ&^h$-;Oxy)n^5?Pco0{K^r0yIkcyt9LeKwLI4E`h4oOQ6 zZ!-oQj$r^n03cXy5CZ^nI!S&kRyi>#MtMSh8c_i_rGluas5~~RkT`}qHl-{-rhu#x zvsj)D08nVI)Wt%xkhjYnHWW(_%QOIuQ!$z#ciAu@7n3&9;8@ne4undEj>Z+oCT`mu zF4iILF7x%&#C{sfsMFQ_8gKqypNlHhM^qROX4~@l&|olHNoA3gNnysGnOn~{_h3Bb z#1d(DKyv4tF)ho%Oy5S}fl9gyEOg!7RqvW7*KMJgvT|XLu8~nM;cl_hvl+o-}i@I z>3SX^c!+%j=cqG`wejT7G`QADHiaL5HU8XD5Wuq!(a^o4Hx06GoKjX{_I$?`y(|yH zp`0}#7M(8~i5uSNl<`7{7HEuuGj?S80)6({LnYJsv$ze%M}mch$;UN`{6lPgu}Yo^ zwtZ~W(Xdr|jQI+7!1aqZ-Q5UgOg9!^COU%EGP12L>H^aiD1U2~|llqyjATXASI#K~TfD~sp#M9|+DowV){Vkmu@g14q8TRH(Jk*gpt+Tyzu#zK`bUD)P zMW)BD4~lma&Ldqc9J_vMWUj=7y6ZLBgEi#D=HU+W$499h7jY;>zr0xZQ{=ae+l9E& zSeGIMAQ*m5T5wWvF(5~1xpt4~U_dTM#LCRJmcn=ayZY`+I1TtkVwZM*Vi8tW9FypjDD7s8PUssRxtM)P^7$@5WQ1Y5)^QF8pl z-cT8nCfZNOM|U+Y-Cyy+Vh-}$@ zSv<0lsGvlUoY2lZC2RL;i^#~Gb3L;;N0x(2>Ks*q)`M`DJ|}!co!kL$w@F3Tdsq{` z^X8)}?ekQm&gz~Z1oH?A+&&^j9^XcNGTEZT5-bxk=?t=3*L5g3MA0JaCU@rV=Ykc8 zIH|M%&GVnsoaPyW>lB=atIg3|O?QRg9!su??9)jW+=rv&9o;7!t?@OoU^H7P6*i1} z%b+HS%VW+?ReAaG&$u=m!CqKBQVq&6aR3!G-xvt#H=|%euzF;>A_`S{0Q~ zjlobq@Ib1Pf_E-O5~*v-i6=lMAVoD6eTasxM1OSDAIWctRNflKZ9$t=I#9l6guumQ zcd=*Zm*C(5ge1*sES@oGE^!x`6^j0KH9Q)vIzFhq=9nzMSyaoeYG~0-G9uDuVDl#O1xj9)>IQ<9M3$K=Qg4Tm}WvAmRGe7YO+o>13h*VDI9l3cT`!)RUHVDQe zY#$h)Y|lbuR@V5;j10y)3Y(LIr2;A{q4J{=0J91=zYmxBx|%cd^A@)QeK^WezJHFh zk~^ce-xi@axvdn@Ga;LDUld*wXTua=P_bzU)ZMf#SKS+QN)GU&12b_{wKdTFvOYwH zkP)JGll45^uY^Y~MJYU&hFGHsA!g83S6xCw(YG1&`qLaLXz})|hFab?K(y!C5yl>? z3xv-`B|_51-VvAefX)I9jCz85mwhCx{M7GHG?Q`j$LYP3?(?2qGAolA^G)tJ!-R~R z3RWs#@}wQim3HqHfH+_Ti%p~Xa@x@!Jy#X(@+k9>h%6^q5Q;62Tllq!07|Xg3$2c} zaYH(K0#Q2ipwOs`lCPh!vJqfj2+h^ETOfjy50wz)sziOnkdQ9b zc!OZiEqJsOuy?|r@S(fFev)}tehPw1M3`1MCPcGRBgvT|UJoJQ1pUK>c<=5c?u(}^ zwxjYW;?5GJSZwoQI+zE)(6q@c(#=ECD3lTcq2W+^Rx@{vL7@Y#s|y`eyMble3~L|opV%s7h!%Zk3Z8xno zpCeEsZob5)*Pu*=;!#YL{J8vvzb@>X>ym9#7ffnAEBudi54OQ~aMl3;{uHMmz&{rf z=&zIc|LVB4mZhJEuf3!{nwhP~s4f8Imn$gW8$=$t1p&TM5al^NQvm@u$8pNg0wC82 zv$gfIR`CAu;>@K?TmS%*>Kh$^Vpx!pP@K|#ABhxLM+a>{1b$tffj4#>V4nV>#;p>A_A;D@sxv~HRnc0*W_$R>IZn%17_R%I}+~ujZ1L{3S z5;_fToRBb*N^&w_LELXwWN!;>_Ll_l9JW|wzpyT0P$-GYMZWB?b6_6eCOXWNw>^}a zYxrk65CIo-pfN3)zh_cQd$mXMn^oF7`1L#LPV-46qAX%rxNMUom+vSuUS|i;L7<#C z|HPK-CL;Qv=gL=&@gbTS^6t$`k7#h z(Z=!uuCT#nC=3gEz22s{DB_7crN=jjFCf;K(d1B=hgDa3<*Am3}ThD5EpQ0~_?s#}>sF68O6W zlQi0Cn}`9&ZfUijGevFfs5b)+AF3*+1&d$48MWT6MnTYD zXCG=_X#_dnVWJFhAwmp(AanjgWCOl~0uu*Ju_-MI31$E;xJnfVSE*!Pw!ir$&CEny z=1mddok~#U;aW!|(_&uz682s9xOrVZhETGC0EEhMnWdccolBY6#mZ?UgYrn+s)n#s zkYpa;N)0?~un1-(-1|rF(Z3>{zO37dk)O*ab^{>5+UzLFMCOjYfcF43xcoo?aZDkz z9Ybz1kBx-`2yt}l;bB?GyRcKZs0m<8AfNn$zZla~U*^OKW3G4eM-};3$!)|YTmeNy zm^|zBg8{95ZiaDF*O`zMm<#DAS3tTSgOQ4mLtik?mY|WDEh97{Aio6Dob=4LMtRL9 zTDd<2;hDWlv=(TWKR-liM2Of`pLNDQ{%K&owXBNyNEkV#AV3#KNQQq<_-Y z#(N|xU$y5M^78zKdrHlLm+%F6|b><63rNS!yYgy0%TA-r*a?553pV2RS%C9he3u7v^cE36QKFr>PTW11?9FTRF4n z^g&7p+BiJ4O5o}Mq9+J|A~?zdPN$4+f=yw{njgXd03Hf;Cor3#L?oSwR14|2%Zf3X zd>le=1;YB(!apfP;Nf>~G~v1BwDf9TJ-vEZ3LKSAf4&#N$1t8(iv=~!D_E90sXl@W z;`nnbdoRg;ncmW^7^1SZ z@tpn3tvD=^W`64;&xX@G!c$TDbDY&E<11|6I_?Vt3FML01A_N!Rsc1od_+3xjs07w9ae7#{V%D`yIYi2X;5p~yG{Nf9A@f!egB*Ibw4tzcjVeMQZtL3FWh>?%?-|m}Y9kmu z^*?yZ_5gUm4{UNqOma=Fd_<-ud{T&Chydy_oH0d(C7_N@EZUM@mVTxlV(OCi8ou62 zmd-o*Sk#;)V!2#`tSxnnq<*o85b%zIQdLF63<98oD?0!wB)FyqVBiRS2FFxLa!hF$ zbZq?|08~9d9{_0~+aJ+`&fEM~Di}~f)gY!}GxGV>icp$W08qvDmcJf*ov(d;>m2hm zs1SvgSLz94&f==~b~_QC$BGOlbo}Kf@^<$&B2#|1(mKY*P;4FoW2|L{!UH?{rgSm* zJt#8?3WBY9wx3m@~6cF+?gzf36MbuIdQ(hR)1soSRD zz)d1ghIU0u;(!5k5&af4k_)U|$YBB;$f74o7_cLENe*l1b_gglWbO*9&E?D&IhL7A zxd$%yqf=@}K@{Utm%>-n6G=fsg93*NM1%)$-vOFrGgaHpVbuOg_k9=pBvO}NpD+LY-`CanlKBknN~0q>zBYbVWMmL zb%-unzBXGpew{aGst{ow+GOImTJYRrnIDQ6J~DP}U`}1uHpzyX-qteNz28F!<5Pf* zGM4)%w}JLJwbVVj0oiZxMoI>&^mjy@Pc%&!M!5}7?HZXsRGV$1>i&jhRgTjjyd`b)SiI+#I`HXTEq>~1L z-=91k=D{}`z$0;ZK!D!M8m2!hVlBOA+esf+2{B%3SH=(A!OE-a`*h@n2 zI@^Z{ePkxos9bihdvN3`gp+A9f|w)8fdr0??XO@LVf}=bm+!4;&<+VD<$3;-QxisL z$tnV&#lu)Nb8$|^&``ZYF)dCu4+_NqfGzi-3(n2uUj4w1^ARp;SyJw$rZs^ z{DIq0YYny9Wrg%n%~+5UKnY;a&Qjx9aJ-Sh(8DIpzA&)HG zQ|QFH)x5gymb0TW2kC)5MXa=H*X1t0u=FKTIuBesFRTzCLAps1vMU9p4ZfNx2&M01 zJ=aQfgRJXUXLn~IAl2-HnqEcq0onVUXiBkt?#j9-?#=P}7rq}&SrzS((mJ)mg>Of* zpU0K-06%hhwYb>=uNFHEFjTi&Bc&cXh%F8>d5bbam&_qnSj1(Cr z2kZFsiSWP^rclw&Ckss=OSq7Htzn^e?3^72ij>;Yvc~O^=Mq91Bn~zIWG9jd3V!6A zw(pm~3Rmp$g0D<|$(PsOOF8ZUEH!ZppG=@qnU;qmA{^On84!M9j59g_GjZ2eR#wbG z_plPELovoRepnVl8n_GtG2Q?lyZf-i*?bugLD1cmDi2!wBddQcjXig>-3w%EC98X zF{{9Y7}R|31;ghvzXDTobg&n;O`AxZJobE}w+#6)9rla{>&y!F?gi_)hI~&6B4yIV zhZLX82dP2geC_$X=FZ4lk;t>>P;qh**6$H>jNx%}UY-#88wK|OUBIg60dh37f13f} z1PcR@hqM%B_plT_0zc#?j78=xHU`OrnR@?_jiV_1Wzw_ZhS!ESc|Mrzv zs!i)0E3}gJv$de5{(9mQ>@@1jAt6}2Tr7Q4cqClYZER;^+qP{^Y}?kvwvCC+iEZ1q zZS(Z|{pYIdsl5wp?ThZ-s9I5g|HJC6Y(DoMbBIGZ+z6rd8=_^;y$}S8^_=Do2xy_0 zar{&9_3#nPXGZd2eB$LK-9qi%W*|wO#d zR*?+0NLHen&q&_XOzWrc5MSgg>yt|qj{9g`!tQMoGfbCZuyiqwuB2=e@MvcrHz97$u#}K$J`)=ViTIghTSs9-A8hR@>q9* zRAkG`s&b_wFLCc3b+vyAAK#zlFRw-ME50niMt*R;M5|I*ZE z=9+Tf^@iI|z>OP}ls93pG%tA$_a!nF(t z600n!B)LGKGX{1T5VS#9V=mWKHiX%<#U)o{BAI%6t9e~s^>6;gjLQGL@pYHmf@Z{U z;-kM@wT^PCC;4=j;(&+;=~Ij-Fof@!&Q27%T%`?GcS}^c(+BZuJ74y1fu<1PNho)8 zMs_2rzys9aUvvW(^S#yfnWqU`>9Pq^OJ6}zw`-^w4+=Z|1|f*_{Q25uVRv%OUr2>& zR1$r5<2!&ZaBvi=i7zOr4RnEr@CaEGjY~D|EO4UYvt>9!{aaqx;dYxPimWIlCBb__ z;S;5QA$q&=Gt+=wnQJC5eI`mAx7J^RjK?AT1!sZXUf;QQB6pcj=%2{kQOKHnxcOf8 zKkK;H#4ociXX&fj@paR`5YucF6u#6Zj5BX18S^^$a!!U&-#F7_DJ!V6da_~>j7JhrIM2Jg7LaE4bLKfWfaCvW2C~^;SK{g^uBagDl@{j zyhE#Meqqo`T&J!v7or~Aa&a${8sNyr{h-$gB{H_Cyqb*UQy2jaT^@<*=>39_swEJ$ zUyEcTpMx8p;b?TR>Zln%A23mx)hTo8vxpwB6sCcwhIW<4`FL7Ai(RMo8c1xK#a)Mp z&+pZN&krB=n){pcXK}f=H!TcU=_#RRvelh)KHh}zD4;2jW}&sLZ`Lps)XM;;6IZ(4 zqegSdCr|D7#naDWog7sfDpBW|6_Ua-|A29kERsScT^k zwsGXw7?$cnYCW#{6tT)`fG4bkgX|^*__nF43VHdfx2RZ1a2leog+FBRELxjV{}l6Y z?MTh^Cju)_tHvCl3e3B@d-)&1N!#%T58Zq>CV&4RukLoobb=s}#zdqD*l?&MY5zBxlSN@qVIz!sqpXM9|ipZOA z9C^=E99f=-KIqLN_z~^p=-v(vgip1V4vimLzt0eZ{utU2XlvIDCcL{)obTjpsXc#y z(QqBKz{<7UMp$~dWcx;1Cyao`+2dN0wI$){bA+itydc9ml0@y_2esM4i@5&LEzE=9 zcwwbzwvLd*I)MZ=ER7?$mT>Ro<0EaMV}Xo3qOD**ZazMDbqtfZv#9!oZOw@&|-w=srw5COsjqfAqmiu0mr~K$iM{^ zRX+2|Am)K{vEas&!7{q$yugg}qTzXHE8OY%*oQI5WPQ(|(JyZ~1y@MC)kt0)-5I;8 z0f)Jys0fovfajD9=UlN?7&zMCHt_9)XE4WLw>v7GsoXSY_`xf_OUKooEm@YVw>v$+ zxAB#t)FZ~fa)3mkaW)B1?delq+>P%PuQrnM6x@n9RR#lE=aV>e%gk~HQ=uIMFWu9f zsi&R%OoOcVn!0gb=4M7?>!4qMA&FX6XFea-xu-e1F+?~4=z8g?E{)FspEmDDQ8wdO z?smJW4Q0G?f?Xdx2bm;;V%V7S?mnR5iuAZiv0m6pBz8W$h0c>9RXR)3uc05tvY*Tq zr0BqCFSBia2Yu)qzFkrKPk3Qc!m4`s86G%^a0@@Cw-0s%!*CiC20m9NRpkZ3Cx*pL zk>lLbDFh6-p8Nvv?1LZsZ1~^il;t^6@!%BjDniX<>GBenWZ@ZF1 zpo|Xf9-n18#R7=VZr9?`3VXVfTg&JEup{meYD!8;OaidYVdIXS-T`>Crlk|qf z{)t}-Kve6(O6x4P)K~SbXA={T=kd~!7D@^ zC~%0yc+Nx}&3m08_5XnM@}7o)E)p33g|2;H0sfaI!^2bKVh5gjy zTc5IFK*iq+?qHdhVRqv67Q3X0oZ#)>pC~9+%TI=QD#W40mYSdC7sR4Av)!l4SS zd?zw8%i*{L!rVx_8=1UL0wm%$7VP6#;bLp|Z3hM_c#;BCA!0p6~&Y(_y zEUpr(+pA=k+RlxdBy7*ug>zmFUDA#0w6B2sPj;;k9Rn?ot?BO`^*IPC*XS$C_s$Qa z*>H9TjvM!dARM~tzej-GO)BoUoU^Mbv{|gaHtL}JGBPrQ1Z*5LgK`e0=wIPw^rk{d^U&v995O2*%MZXl`2(hb8LBir&(DN^T>L8 z^jK>Wn%%#B2tw`OL^^*>4ldyFfm{_hWBEv`{lM!N`G91BoCO_JprYay&+S(z5w|6` zvE^oLvw)&cFs{>y-+zW`d5P`zCQOTA)KG`p1j_zZgp(oZR&z}0&xbyWj@{{pIc%|3 z6u&pxwrY@lEmq;>tnL~9$#1SvYi*{M>~K~7QMWvYnCyd3oSXHcT7`AaOgh>mgrg`? zrgF?cBDIbO%d_xrM0_tDZq4w!n_<*MYZmt~*XZtZH(tE3!~CmLmO5i=CVtNx#T3%A z@gdG}=_Yk(RH2!E1h`ExF{FyEi>U^z12a0?flpI&J8h%!P;+B-O>1y-a?p;sEP-o? z0S=AcnGil5IJM*v4gT}1rHK1vyz5~9iz~4hZZ_RHkx^YJ;a`VrQ?Txe0@$I>VA)w^{%xKt6?)@5;d^J1Ez1(l76PgE zNt4!5P@daHWcDbRF}B8P-u`%v78x2lrwVQDYSb8M!_%yMqS%nYlW@fs?8||silI6` z|2`=nPRI(exSF$Ju^yIMJe!XR5;K^?>u}4i3Wwd0knKCh1AgQYs5wHsbiSS+kg7uY z$3ZqDu!zyBi?GFYj1~$(Qm^AdH1@(d#Fc&h9)!F#wstt)RE{9f(!7#;`s2KVEk~AF zS?VCz4a252BulXnW1zBJd~g+vq>$0i7RN8gngKjAujryiMh?9i&YwDhiB28voJMtt zi1yA8#61EvdZ!L|6!YCB7*l)};ltdEd8|(>1J@qQzV(<@Vt)8^VYK0Bxi`HldiDV_ zoYO)@himM0jYpm85wL%SOnG;=zQ@+grV1;#FS}H6uT2cxUtq_51%eg>MFWuwIBr8P z$pp73hQs3>Wn+@`VX~TucsoR1)6dge9)F8c);&?3ohID1sZ#QymLKkSN2Py8*U;^$op=a-j}lLHQzpwKfs#)b&G`!zvq7LW@ZhPcC*8rON zCpvLIdlvoHWk^}x-ty00DQS?$JKcj1)M2*r6YM=BSO{f`A8b3Og$`6#PC4AFi9qpT z1>QKf^g2J^u85$6DRY2Kb3H0C4)rvpne_{9#&YK@X(tDbQuNJ;)S}R5}O~^DnyT|y#&l{)G45=u;XP` z9Om4f#Kb_Bbp`V$>IJ;hpH?s7#glh%!sH5C3!i0vy7SFr9fEuCbe*)}U(Th>`Csep z{;fp7u4>#@kn?A01iT#bfHziq9tEY$Y)Bq4GLBSr2vBD}4`m4?rr*Dp>IrAQ;9VsI zLmTKwgdF$cDmMP14Ltg4KP$I&>Svqqy0YheR@prHMxREEUhYO6;qjFk zld9dkX{)>ml$+Vjy~j z@Xh2KE<~)+ecJq0^uhjOO6+E&xKKh)#3>{eyO>)%_&%BRmh4t>wKW?`;y$gk((@TO!5 zwK!;+S+LA3h@y_NNguS&L&dBdeCMzUBsvA{5nz|t-mkqXVaMqQ80tEA4W&_+4-@mI zT}L6L6IZqgm{>?3{=w2!$r*E7MX$m@iDIF1qf@A9#KLAY%ZBCL zFqA|t?(JoshFcuYPv?>f%*JgKm{UOxzEPf-2@(Nd3~k5m8$xyjS?VZJP?V0K`?#fb zxU-;z2T`Ak_%0ALkVb`2J_OB`0Y`huHedR5RQxam4rl|MO`5UausF%K*>^6-yfwo% zr2B-iUHUbn2q{4~WFkX`?R-xdhj1uUIfgGDGaTjz*HHz#TXb-roQ7g@;>~2FI-+q*#%#? z$}+HdSvuT8!|YQ7)pEDE5Efm9>X<)Sq)Zv48i!E#yD0lx8VQ8uP z$RfP|3z$^TS=a@&!Y;H6bck(_6Xo!vQg@?BBEJcJLidK?ueT%SR}!ke#E#tj8|=w( zEzf9q4bHT}4nelhwod%p>rg6)Ub~V49fTlqb$M%MK>#d&{wCq?`ByFXtdXxW-9a3l zZA9VTU+sgn6h%mz6nbsN9@gd$T`X|n{H43wBxP79=@)TWv-Od!@M=Oo=bc>-&uUHj zn$|>}dF%Tat_O%~VMP*wy)uHDIM|z@Dn$BHHA~NDsj)<_vtd7X*H4RXIBFMp%!!!N zo*N!DL2k3LV9^FkK~hkBy%o8rUrueihScek5ockgdgn7W;I?6=#Zn`|@AQ44*V~%I zY;;S7CGAI$$fbqOd3L<6I#rB!e}Z0cUK#~|gW)(Pp!Y%gomo>R7}LCeSWi#&G9-54 zT+8c6+AVj!jd9o%r<8FoV1zT8;CXWLbZP4!pfzFPF8z4hIue519saf~OeyWS8d6u# z72&dk*(cjcB2M0}BlSUKO2aLauEghX?U$!^oxdUE?F#^OiEA*-XmPojd31^r-8NC+-3~c-b;}S5>odTzcMA(;1+IVk_feX{ZZ$4D zsPrA|<#j*jV9nB3-@ZAHHboM0UGcImw67~8bd!Li3M=hQs;fZO$=QyB2AY=JV+Cxz z5fzeAz1z%li71vI`*2&}a*Pr!q5qbjzxz&avJ8qfdpWRcHi#TdME0wlvxdSUrBhN} zT%L+kUnd9_&I>ij8cPUq5$|uZmz7tA?JCI_EPb&4a{K#ptofC9{VolRsJ<~!lNZI) zgksFZWL{sX4b2q@3Z%pc1Jh-#Cl&=(W$?N_ABjO5db27a45Ud032{tR?5UVs@~eNa zXzR?N{wu;&pWf<7#vifumrnAwGG*7ny=NL8BDb5pyDAzXhi6RJlqLmFlos=A?4IQx z$5GZ%FHcWswcd|&laG)?_Ui)&Y6vdM*Xp=?q_cyhEXQ#`@4u$i15fsRrBM!)rVZHm z>uVeShM1w?RB0jOQm0%(vRr>*cOb*wh8eA4tH#nJ(p88KkrsRDeHgUu=exsrT78pQ zM*BsP%rA}i!YQL{R*$gMou@}-LdfGb-Ji**3ht1h2SecEx#@avH3%~gX-$WupJ>;3)L1n4Nx2uAwv=p0ykutmt7;DZi*@Gow= z?MYgrW^l`Yrf$U*WC&lZC4l;*z_d*|h`=pUjte%Je*9-zMbi=tcgaCPti64<^!R z-dl)+wBM{_ zvOm>F8V6$_M%HOM?LM5D{7G3s_ziv$(4iJ>?VGOciN>5Tt^8RZtI(`8Zvi_Qdp6~7 zNJow5TQiCHEWnS*JdpfWqzc5N%VM$1gbAFWZPW9;ZJLe4jg{E0v5p+hTI9>9p<#B* zimw)Um8AZSx1_T?{XtW$Vix2^G#m*aM|LNNd2~pU^sbx0Bz~_fWHJaV7gz{Z6OfNk zP_f`0bBPj(nSRH453pPs+kN#bA*4qevfDdf0VVS{&c^EQgBl+hLXcn5oDd;i+OC#7Su9_Cl|f&riT=AM zJS9wwsJVys8e4wxPGk1V2*^D)&LQaKpQocSF-1S#b(Oy3Bp)%RTtZr2)()G0PqmRZ zDo2$sa8pkC?$~z-FAffpKISfBB~!0j$kfeO@ZpQgA@ep&W=;1LS~VSQ)uLYG}S~ai(^@?XHz}j^{&-^ zKB*hB{O1Pg@D4aLl0%V=mgtt5wLt1bKJGnPKIR%ty*^1?oE`dPpXlEB{X~$^?6CA{ zbI45BLnmR6%M|v_vL*^|ppWOq7r7`{*|rcz7;tHE^m%;{>tHDoGjWUy6!D)=BW6m< zYl5G9q3F|{o3U7#M7pE`=>ref=>@6Qf9pQUJC!G#%^m)0=3|47`J`Ck<%k?Phs^vamng$pG|h&F$ZBA6 zMy>p%>k9vR8E*$cnG``?e#x(%ZAQlJ$qj9|jLsNX%3{}fB3m-N(YmDnsJe#JRG8K= z#4kzJ1E&k$^cmYw*HIlZV9cG|hUyeaC_$6Fy)x+S^_2g!d6Tr#sA*FaqaP>EkAXwZ zz*3-Q^?=tDZqT`Ds<}Qsb|{r%dhSYTry%nb1_NhDP(Bsh(uEy(5xjL@9K-<| zv7(BS9&y32I)?qG`cTR?02|H~P^jO2oU@PkOGJv@z^hLFiUN04@_8K#ulm#4QFeOT zLDZ9@;mIj=!A$M0dchgz*H(+V`4HV7)Bbp9WG6bD-uc1olvoojmq4%I%ethzVEK%#cVz}jzD6`sSUGa9oGNT(?a{j%_P7lM z(~Nl8W1rX(Y?%aAZOE(wz6sS5&XJQd!c*#hLPXjEyo4*Ga!{D|?gNsiE;ZBhYRnJ< zSNio7Obp`k)~dvbV&=@N0txE51dv-M0y>hI)qj>8yJIj*u7_awv;%81ug=+X!9-*p zO3Mwx>OF9usyap|MMbC2518J?0wIJwO_5Cyfgs}3p};OYWX1>kt9dwH+LvY3)y-76l&JcTckFp%>zPBOTwo3_(CG){9*ahV9gp0f(c9|&@&)PN=*M= zBfa?onUG!XPZ5$=5aZ^^`8`4w(68B2zRxWRY)QyZn|}=s&-og=h9K8GeRpIr;OkK? z4$AQDZdJE70X2Ke(Hw;OsL` z(}3aeps$0Z{r&ppPu6xyPs-~Y9I+9id^3yBoh8f8wxYklI^p}X-WV8$E3w1-facU2 zg_VqrJG?Aah7*YTuER@gypIf!3;SSuO9A$pNygm6HxL9CDYuK2qgn|j@^~AIqD{;O zycpPdkuy&Ja3K9geSs2gLy(61J7tDtC^-D&peh|2T95*m{vo$V?vXemCsqFmt3nmH ziXZW+s5p;A-gork`66&J7C~i84E|dF48XKGMD;u~0lkbcHs_*JVjAi9%{v{6g z^*AGb64~#%&*I%v=8Ty~&JNXxEsad?+=GYB@tZ=>$=rS>*gI##E=1+N8bV+2oZyI@tIXEN9^6A5`5R!e*Gtw~6gt zA)%q$(LwsPQ-TewP*qjhX4){>@)x4`x5BKzPP_tG!Bbe=vfFl>sj9w-XY5(N6$+`8 zu9_Y=lv`O5bOuh&a!*H?h{`?pZ&;Oaz&CKsLOp|;Gh5HlnnXh-AyTQ!E&RqePyV%f zJbxt%rKlgf$>?I0S+F&p553FB_V#=l_W) zfbXQbRgya%?^Dv)bQddl?AsN5a%N7o7tC3sA0JN1<@*KHUVR;p+7;5r!1e13Y-uf64(OJ3bbME6GLqT0eE;dKs6CLFwZix@IV&t0 zb=@^#rBcT`yr}Lt1S{~>?fYqD9{>(;kM)r2m^4TBU#}{e?}#b?-OAX>A6=TEU`vz` zMDKcq)d)RPuQ)zZ&ByvCf7iLgH<(-1?iFy0n?`y|^zR0}-&_0!mRRjD8*t(OQLD1M z{Nst7uSfd2SGU+31gDIJL$!znhAO)bseS+OaKMS(qe!4#lsKksvj)grCoS$uTJ%|pk z)&cGZxhK&=KaK?hJv#^Xg(%;<9~%W=KSwi%!9Olb`Xu1rI^aNppDl+1Q6&_oh=D^r zp>Urcu0QGEK;p2kwVFUbI=6g$esU161f<{A6Yo2l{<67GhKYMq2I)O%8PzVWN7>y zME?3DEGPl0iusi$6M(4mCrBW zFZpzYr__+R=x#R7I{Q>~VE5v)@7LFN&Og7-hf1}_8}tspGBl!}nI_`Ho~1~^xZiur z52C*hXNF!!?k9}oKk?}6@u-^^5WJ_fFMoyo#q0^#j*fC<2&bDUDXQj(-gsz_R9(4y zhc8$io1gi^kUCMcWYw0^6kHj~$$739zTFE{F&jowz3>%apB$|>RH#O#l4;BmW;O2J4VG_vR$V&{deFV%-5QsT$%<>eZQ?QoP(OYJ^MF>KeA%T zlph%87u*1sj<-uI`rXO)(aILggu=K*d-HiphfCyfQbc*QR#sZ;*Z8SU9QlhE`!o8} zQJ^+d0Io|-4Xy0_m8HaiMBMCRnv&@Wr9gAjN)Mp0>WyPAhI3Z`$t!9KKAXDFrKhdq zw-d)-{&O5H{REP7UM*-$P00L1Y3|d1hoUlEG|ZgHhzrf&&&2<5t}-oJnJ9*s0y)cd zPs`?2l8h`_6ganj;G{Eh2opj_KqXEAdRr%|@ah9312HMbP(z)Adi%PWjr zxU=bV-5>)F3nwi_&%at8Q%?B@wJv2O_`QkqU5`V`XBbmZ_qt=j=BaSJQJL@ghy+*) zDInrgsjTfL>NDLey;vWbYjktEz3%V|caP|HLu1rMP9 zsIY~rawq#fXFgLhV%_GeAHHObd)#KO7&l{Lo04IOOy;I4Mr>r46Z!h6%9=An!&u*J zdhI&00>543O677&+>+X?QEB@jU~byHn2`^37MJ1lw# zoVCT@ojb#Lmq1&|{ZUaRP3^8-=iaPZsnI{||8q4-2QxHain7)?Y$atD=y_R{jmw+| z(-quGWa9gxlkT){?}0yS(nQltpxvC<-Bx-QnY0!F2#- z?^WDqQ*Cc9`>Qk;_dKng_aD?4kx{OP^F^n~9(Z$?8c$X&!e&JzBul3Kl1tl;)^Z-8 zhUv|9+QyG@hp$qIpGwe;?vQ!6FEatl?`5oY2u6e_i%jMY)ENdwcyX-w5C}t62lLmK zt!}H=Dd~r!;uJ{4lTEbcGYE5S+8xJkCXaCuoPfG-5Fb3U;1lbGJRp^P=cz-788-Tj zPhC)zJpJrfK?5Yj0gI)e2%dG02m<1w#p)X12b;Go(fuZ2jEd4%OX7c<89pgTl7lbu zw#-qa62-~`hzwnS3tdQZyoh3jrz^9Z_xB)Q8vk&+cLXP0ldj>Vs9!iuwbY3t?E7I8 z6G7n+jYAS!3~jp@ssh{^#nvtUk=A*??1&ibBj#xs;4QhK>e#%3ylcerxz48%u8kMM z+#FRQh~)~@e{5A;Hb0wlKI&h=?<{}NE`BZ-KmH((Yn~XfyI_~8r-|&M2`uz{8Xu`4 zlkZ{OVe#%b;dtm-e9W$bE&d)>Pi?>~`JC&$==O6R0JPm~Lh7vB z$^HDi()zmBk&xZ!H7G}|BsbEM#&^=*AzsyHa#DE?wR#$Dc%0#^-kZM(;9sRtbPM2r zfscAF!9) zhE5636@hqvoHDU(>*RfG7e<1&_ijrEHIth_N^ETCZRxZtEfp{6$9rLVdSVmHRKn;K zu==2Pq&~G*goWi|rQ>|0fo|M;zNtWJ7?~osU(MsU0sq1-fpTFT8)f1pAWGHIujHn?`ygd#cf69hNa!LQQc3X<6KgY1*J;uN^f-~3nYPebcY4W0JZJ|pT7Lh zvmCVJs`t|}f;OnDLu5UJBDV*G!b5I{A%xT9*3$IFzYwi(SKy%0ZfCd*(Ty_9V>rt8 zvgr`Kie<)(v~U$ewsri4_9N}koJK6jAwu0iC@fLV?w$2J{b}Nn5{Xysd)kR@_v{ao zXdcM}Xay=-iF7%pvx%U)1g8m32i+lI!^*t|J!m@JC8Zs0=o(AkR`KJlCx?WD9FNu*&{`ga@*YzJYWF}YJDhbR+SR*_l z6zIcIgy)JLJ}kN%lTWzDk1VksE4>NDr$WjgJe%Ff#$fg{5t_KWP8??Zz2C=0kH%o) z+G0B6CN{F^CTAWvm|RKG_gRWqGaL9UaTrocE)kKr8B^9Q=4j`Lqw(gfnotG67y ztzYg%;pu8ap<^}Z;Ui9xJwLNmpFCL3JhK%z) zWm2u9s}2es-h-Q%c=^Ap;~wDyjnLi)D*cQVmjTUNHWPXT9&Az@Ye!)bcy6p6{ixC7 zOuSB?<8;p8KasGtwh4GkN+(+1 z@dw2n(|fly9cRRTt*^UYs28(lgf*C!khG{zse$7*iv;PiX5=pWQpUIt&@!smV-V_u z|CZsL_ykv0V%M48n{OJWy19jEcw5%ULqx};XZcM8;(aYSU!hpAwDaJ$Z@Df4~h#rhK+VMRXk<*t87VFPV9C%KhE3Hj1-JcD1=d%BAe( z-(O_p9gKW9m+T`JRU62F$~%a;fz!i zSnUj$4xWFoaUm4hYhH3Wxt?>OSi1oyEtPstRi7LkZGMeaZb_j-Yy6ph9*pn_(j|Z- z#tcxl-}JxJ$DfWz;OUeQqE?h>M3MlrPmhVxlnj0z30|j!OwKvs((xgXk<^$JT)y-+G6Udn9-!bs2`am(1%gNNsV|mHp%H_id*=4f!igZYKoW1sJ@ohsLIw z9RcpF5tH@mgI_$<{Rf#tT6e9s#4o!-NN%|+`Aqt*kB-vZH>otAoMh}(a(fTHDS~f= z)vkMw?S?j|8d)ClV?a^KIh(<2!RjGngZFc=c`%iQwExP-b9L`4X{TA_v5zgL(Pg$e zaw*)eu~3iXid>X0-`1&>#z=HbPtZrb&Ay*DdGMiwSRoP1!H(@qk(m-g+AlGrMs1Mm z_>veGt8*x0GELI>vyM5#Vtl^4`gYb-q7Q82x(0ve89b2~PPwJWB=;*r`Ybx+J;EKQ7!ZBfEeUtV zM@<+im=5$T0oFdkm(>HMo1{U-iJ8h#4U*K@!;`w~7hli%jkWq|=IYynW0)sDaDY%x z{q%<~RDH7ljsRNtS{J3en6-f~;LhPOqA5W^%$!OwBt^%q2@!R$3r#ri=%0L=>tIry z)}ZPPXS>D|dF~qgGn>0nTdsm+=o(iQep^V?$N9q(tTIigyK>z8%?uVHY;{BKJl<7D zmd28&#?&uzm|K`fe2+0M_;}yN9tQ|?TC`W=xK|8jbj6VTp0=CUCj?3l8t3=plb!AH z?9FSi4yumhrOJ@GCZA3*V6Ikpjtt2SYlkBjLBObLd`hf>;&<>1pQ&t#tL z5YBB3V~Mf^V6N4I;LC24P-=ttkVJfqOdg6forDzs?M!{%3sN!e+>{RMq9Uk_DSXee zj8WdiHFObFO;1BpcPj?!y(4=aIwIRDSi zEg0WUK?JYwccPyQcr|pngt@R*4J8eE5@qG12q8BHmr8pAq6@Gn{P-5-dULaqHT|a@ zI7<&FSI+Y$uv%>A&puC84QC|>Vv@I}+35^5-=VKy7QN!S;W7J6mF@7`>LmF?jJx7R zgm<7MZD(K6gqEPZ?qDf1vL7|iJ*q1f;QCGq4Lxpf=-N)x+vMbvT5aaH?2LK%^?53y zM6-{6jmeyg>R|IF#)Fb`_He^N22V~Onr(-v56&ej)uwICi@T3gPn>tVHs+D{L6xrg zQmJ7kWT7if$C*2P<=-lkrsTc;Q0!+GVDwi~J97K3(CMh-wODOhN{JZSPwk8+mm0DC znay1{ax4E_A+~?}p*grc;qMMA5&LZ$d~a-lwHL!pO4|190JkTLc?1Ue{8DZEg_3xP zts{*)WM|hmDbRhaqI&85nLufK3MhsLi<1vlpHuET5v{@ZGm%8)6Cwi*>?JR}=)u#T z*-FHE#FvF-=QE?q>Jom8b+^L%;#aAo0ul%Ifh^r)b(q^ysqmNM8{?n*r_;!(yIS-i zd@VRfghUwbvKiJf(V?Z4=v*kq+27nLokGdIv=$KH;1l&h4hp4?{i)!n^RBx3Y-9R$ zefM%6=X&~Ika1AQ1#fnZY-i4jFwzH*eUv5AEmmkg<_k7eV9LWKPzO%!TrV^!r8eQx zcS+qHMwL6dOd?l&(~;~oV2>8>h;UGEz}q2jQ4lEd>)dX&A$0MK5HhCvXWW4zRtx)X zkI=F~;t@Ps?1SEFfy!ssHNV_cyYON-Bm;0C3I7D`^`#RG8tM}cJqk0)^T&J5E(|C7y%+rXJWGwoq0fyL`|f1>L7az~gf#9kdH!&A zj+YP@Y{-xs{xj8WC_^iHtTkHd_cUsemiyPkL`8tFo<+F>XYoR=ao!~hF^NY*!+|r0 zp3D4bT3c(yG8GywT|Nr^!r*8(nTHf?t_QqAkszIhmWm^`GRKv}%(C$?i!5IuA58z> z!3GucO=I35?TBt-FNNDi^fS$$DVMvH7g4WDBSPm!6e&_g_b9Rwc(rmD-k;+8kwOIe zpra55JyPp4&&y4|jk2Ad8@5Bs_#G$3W+onOkuB6*RIgBG6&d)^CB}Ru0POt_O&YArKXLhO@6F&88L{0KCVcB(Y4;m<` zO88Y)yHjB!1K1ieGFe8Q5Hd2%i0#I-y9RP;34AF@kkb+HQon*b25@0)_s^W=pFaWv zuj)N;{ZKC8s|+lk0ckm%n<`*Vvq)O7eIfCA(exyc9j1a{WhE2xZKi@0*LmsmNnjnO zy%xBFOu8lDZWI2vZ~z_8QECpavlx@E89YD*b^cp6Eh2D>*?@l)pc{q(==d#!m~_#h z0MZ-KlFJ%Z3tTwh6AN~g4wT#R-cL5|iv{iS7c|6UA7i8{qZT7HgeYUU5!xh@Y#=bQ zx8Oe*a!B$%|2G4IA?kFJbTCk2k2oW=Xl%f!aX#!2wFXQ&7*Cs@zY&@&mTX`S?;nYO zFzEkTKn?${3fuxoGU%;}w)$U$!#unpYD_GE4<~;sv}k<5^h2Qk^8jjAMDnZBpj48P zFi?R~txrC|KoG3!|AgN4)=(ofT7Y-poL78+2fF_}%mx{uRsENv&n?0b^(qw#+-M(v zq-vcq>FSsrAWk|IU>3I{IzU1MNbh-wfJn#ysp7xbxBx>{4FEW|NC2W!(f^N<|1}bT z92k&Tv^XFg6$2EwvVNZb5|d&qa)bo9cLMOE0=z`6K?;EF+5I1EAb>CA$2<*i9A|MB$i78;O0%YS|i|KsO> z9G?pRUuy4p0067tfWa!*GPS<+K2prthzkHOn|%PB@@N2bME^qv;6Q`%zX-E{)sg*= z7gfO~m{6c313|Q7#i~F)@c$$PfTZa!1t8h%|JXKAvlIIVqXrGg1J@hC!hdu)%>t5? z#rO}^Vu1$u1O#9SEjIsK*8isQr;7j#-~ke~Y`zA#%>N>E1Eh!lA|S8>7G3v09f3`u z2KWIaz;->{3QZOc!09C_V9@lx@E|Ic2GIa!PJ`G1d2j$wF{1PTe+K`TH!yjh{Ietg z=X@_Ireer{Otu2%r>C3%T!07shd>0NWBQ+u|0FYjg!vyun*akO;0o0`P5^1qA>@Fu z6a$n?lelDmEwszS8HWF24gUnexM35&y`A(Z_i+-964;Ey*@HMKLMF2Lekaa%ywnlS zB+?e;+G1jNP3K^Z`> z>^mD7f7R7_+!Wq57%s;C&Ic{W8!{Q}i3@!?uvuwiWv#{C)R%X@`#Zqtr+G-9Y4+^t z%zG&iX9YcpvKxdTNC$lnCLm`fy3srGbEp3npg6oPijw!5*T5^28ZR#HZM4aX-Izqe zeZqh$IP1>|A)k}2DaS`KA(0dqG-L~7+M#aw5=h2UMblfkY*`p@qN7)h)O86fPWGeM=Dh{4V6z=Lb&V}AcEI) zL`4)>)Rd4m^^d`j5E&|33k>8n8<^#mD|F5pNyG-uQ_TimD0~H;6~Nz6y~ikP$zj!2*{V9zrToo4{-POA>FT6dJ8(DKqRT~;N|aYfi^CoGKlZyZSW=4jsgK0hL~MsxR+*yyNL&$Ar z=66}cS47{Kz3UlCA9VE*oNQlMpV>ZW^mN58pzCsDL=whl7+efasw3!Wx z-Su{;RLDf0oLa5$NB_Q7*vbO4nPCBIJ2~Xqf5SPc)EW;9{}ayXoh7;-v$eS%vkNh@ zmc@>PTZjV!F=x?C8qI3Q5)^}lW9I!4qP&$zB2A#TGCotEhtnPB?ju{((5qq#R7GffN(3v3$V*d9F~!ouYY2*m@pz4u z8=u_jWVa<3lgh2LQd}K0WwSqWS&qqtDA0G*8c%-sMvy(Ti%s3rcZWtU^A7wbR>3^! z{bC)rZBI6>d)BRyoH6`!kI#E|K}BH_rvnWVt~#NgIxz^rPV~9)8$z?mvCnFh&m{kfMObf0 zV+@dk^#J_w#?OD`zo*@vc#4(8RrR*3E)tg9hUEooi~wW~$Jh4cO+j zcvc5hc_}$f4b-{WLMCtM)0d_&Us1-7GoKFUH?2PRDm6|`Nv5McINv-ISqizAn})W; z*2QljHJWw)83j^xYWK`^rI8yA*MdJE_w^xFJMyb3YYja4R!@XkF2MG*3kde%RcvzQ z(PSh#HCM~`@B2%Choy4330$?gfz{?@UjRJZT9)E-z{Eq=(F2ETXvAnlDyzgnBUK1h zRS49hVbC@W)Vhd7;7dDK1}D%#_eyrVO;N6eb7RY{6)*TUpo-pDau5sNoG z0t#&5K10JtgL~7Jx2w{=d5I$#ZgfGnmlH=HXw|7Y}v|kY`&06sa@9M8_C>< znc&)>Xq4MEI@5kJ_HE92C~e~nPO# zp2yAA^vN${jVy2CTi8iYa0ffRh)HJ*i`91V}3cRWxMkFLv{tF&t*OiULV&uX1l18Y>jkN z3j3%#%gvTak>;Zm{u_t7T-z;Vku~HO?~~wLj=*eefSfjcc458#JGjIhVJW*n9GU$c zT%x=|KC>g@z>A%~*(}LOTbL0R*Klqfjdb{7RRTm067TGG_RD?s_7&*YXyn!m_u}Mp zAEWIMhaK4dsG}+2WhvsvboDx%S#N9~;q2ISJ&jivj?I;-#YDObN6c$~&D<>;^o-uQ z{T7Izahmp*gSaOfHD^pwh%^#H`|hW-^k>V9-Y4Y3z3|6&o{vYH(qN$zOGQzcCPfAk+_6sFVPc*_XUejz}W4Rl=hjs40B=|9$tJX^qG;% zf)toBn>B1^?B1@;8U#Atajg4NLvHgmb$KNs^XP3wKNcQ_POIEBw#R-|=@VBLW}lg$ z>wD$=ul>^>ctCeH42zNlL(wt7s4rR9b@@Y5>2V|zYZUziItiQ~B|SwxIO88C z@IlnXYRfUvcEnM$H#sVHUFb1Wh}K=sgZSwiDL}G&%jyYlESXTto5E|Xlni|ta9*rv zmRmXoW%)jO^pwB4vfN%p=IX8?3ltCM4hlFFrF8 ztT*03w6R^SecsX&^~7bA6{iYfmB6rHR;Pc9(6w#ANDx0eauFBE79D%>5x%Tua5!w*5HGLU8@=POz-{+E$!R!3283$ zjO8@A>v9+L7De1`C&j)b3A6}sCZ79u){lD9-IPC74J6=naJE6@{JnIygIFJWdo(NjIhID<5#SYrs8fw zR~~s2QM*27l;|2!qF=6kKw5K~Qg&(Iebhy!g-fC}um2E}Ys^G8eK+2H0jDzd#(b5) z{tSFf0t)0{yS(jHw&ooZ-V#bk<|s{37zgxLBa;Z-I`ug}wG9Z~Fx9>b-%QU{>?^IV zE^)6{j}fh!>TRrp%0&js7r!FQUQ*V@nBj%_#jrK=zOsq5s0`h%@yLWUZyFVs68N*= z3z3k$Q+>VE>G9yKNovSf)9zMHfyk%ghr{JJoCG*XPsW1an7w=30k=$+Ci3Mh^do*( z^ovK4n9cF|>g0~xvBk7IMa%? zzr1`Y_pUwhwrIK?wo`qX2ntf>oWxjF5n9#(1 zB5OEZ^Cm#JCq;cj|41QFr;9RKX-7ByB*@M`}d2{rJPzkH&|n z7?(L<0@PNO9ho$6&;3MnWTH3|C#ra)Zx?p2==jO;z&!xNv`=VrHDzKc=a(Ky{WdWK z!G(g(bes9id*(7LiMBX|XT`J(&D%4%A-zj3RWi3VO*_`oce5EIv8uxEQ3lFqbv~+} zlp=gRRxZXX#+6hUYf>GO)>A7|BuFa>6R+YkT+_cho>i#vtZ^@Y2@i38_$g&c)=2*W z77wIJr^88LHBda7O0p`SgcSZI# zzsHMbvB#kJhI9#ogGp7+bLEDe{Br=;Q4lcwCVXwdG~C0#Qjrkwzy})BqPcq?Yv?Zb zNVnOfy#ikb&~}=SD-h)nOG4$EB)NS?S@1jBk?aM^NOF%qabJf;{cT^n_Uo1L|78Tm zicq4;CkKAw^1%B+f2YEg1>J2l&Mw132l_zMtpd3GSEZQltY)bUrkfuLM(cbysw;tx z2i{%-e@c!C*F4Qwbl%ln&OMxdhT=a~0PjaCi%Q|^ESU#5>9b4AHRi`Ho{bL572)D3 z!>Z&*U)FaRL#odXGFT0Rfk}RdP6#d_su|Ttw2fQzkm)OuEV;vu#UJDoWen%(cYB_w zHQ01KXitS3fTjK4cO-VU>-B&6r}po67;FZ^LBV<+4`0*tiC1-f89q%{ z9Xm3}ZTq4SH1u7#>9?X8KqvAaqoI-YG5#^?xZ1&c$eHi;)G+@s=A`FeKB614nA6Ow zr<7qW6Fk+4(6Qr^en~8N+#2>aBqu`uLxP;HTZ79LM#u_=a*7!mG8#gXH$}e)0E67~ z)AoBwQ&UmrSrbHf$09U&xNkotzeKvxKg--#?mO zVlKpV2v&R4SwGh)qD-Zvi!oEHh1qW*vCBO~*c0)WLbkDax&Xpq@(z&sKo>(vh!A*@KZ`(pMu;lb{!)N*EM_RNd6-1)ZNoQ;PTRYVYRyW8e8`*P zk`mM2O39Jxm03-G`p!f1>PpP-!~H<%=Zu7utC>Z@n!eiOm`AUSKcQm_S2n1(*4)FH zfr?I|@KbM5E$g!ZO$|-|9OT!1UWwQle^AX}v|C(dYo&7QA({Opx-$ZW;bNvs3B8ed ziKDh#9b;Y-&T?~_VF~~SfB;mjx}KV3K#*Xz1`x8J&Izixq8v5A@X}F^B^Ns-o>#vQuzrO63g41)UTP$7)6=lNH~5t z7^n&_2jo{&9l4P=XLp9E0%~D4;$JkH(kvXzzbnKov!|!4ySx1zs<>-n2M@j2rB6F_3B=uWXaY&Z`i;5H zam#JAME4@c*I|_qpIq!m36@2pf@jLF9t@D`JIQ4-Uw4Gc$E+AC&em#g9!<&u$jHym z?mTUIA2%dWF+WmaM9Im@L^O;803i4ffdBnRNRezZmSKXzXLQ|Ha~+2+JJyJj{Yb>w zW~dcPZl@6hRAx_Qv>uu&A6k6>%^d(Hn>4J^~ff&_R0kTn#@9cnYeIUOnP-QL#Lver5{ zI7lZS9JU{1Ta-6Qf!0RIL0D1r=2$5WL`3FTow0(8kVw22|1JJLwI4{vTA|QQMvc_? zbbo(8vo{&9gi6SKbDU*y@+B$8AZ4GBDD=aP{HEC|n9k@WT4v^UMQf}6b~5kvhp_L% z&BKck{&(Wba>u7Z-A4sX69g;-dTXlUEO00~6d9iYLS&=$W60f_kMOO|6m8q+=;+$( z%kArP^(lmd$DEf@yc=4dA){s1;^US2bVXX1!^6Y9$=BzW`%B1QR}(n88xj~%=5jKk zfUdNDB&k)L48(>x^rWbd>iJ*EI<9y<+0>R;2f8=QS_qM|+#hpl4i3(@h9)1YYeqSz zWl*hp!5|QdW;hATUJx6K!MYM>oJ?RhXN;_~Vk`u~qKBW7^6SpslL1PyXAh8)sL3Kd ztLnkKL3$OBk;o-Xdjo`HU5lT>m8x?o@PH&o3e%Hl{P=eg3}A}pd9PYJ_{ElY ziFwI==Zh$q3Lf~;<$ST2iuJPb%0-7?7O487>ZQ3Wx zT^|yO&zH#e7TUBjhjz9fiy4u@?`b)nqB+JQC1p};cA=hU91XfPkm@-1x|Ivr)_&~F zt-U%;zE*iWKAe0_imd5~93N;|lqR27q`f@2`s>qk{}+LxDvDx1U2v!$oaBxx8c~%= zAxf@jEJuP?#I*=`VIoh5e*AtSvUeUp8i!sAiG$PE?>1{Mer}Kqa1<4D?;{P&2MqLn zZInU{T@sY_6b20RSPlWG;5S0FFX@F8DeK0BNc9fUoZzE3%Nhh{fUt6;i>@kPXOfc4 zh2^L4In?(MIL4wh%rjIdOLg|c|7b3%uOh2o*Z)W=U&QoTsp%V<`|-W`^t6_hnNV!( z4uat4%xMN0&eTw7Uk6_!S)>}N?xDO>!OB6VMPx)uN{pYmdZ&FyLr&ojJaiZT9W)g+ z;?|mh-%;fzaCrSPo%5`+TDSOEUF~~g-4EsQ9ndGYKCPaN*j zcvs4NWJ9z>SYyTBA_>et-+dNKOa=s)Ye&FWp1^*P@W?p#Amk1EReo`Dp3n_NYSQBY1yQQ>8CJOpaLhHod3Z!Dtbxn$Z4c zN#W6}>$9Q#tz5ZL5-e*)k9uUC0y-Kz9R$JSPNN3qEWxHSkie89Ci1`qslWs__Prsy z&*|&q0vR<^6h+(pec#YzICSpNoEg`*)gl<{^}J_2fHdgG!&WQquJTd;fKy^3g1I?X z5Om~klrOZv>!~LtiuBc@;`EJvMv18;1aqoF4m4S~rj1=VTzjF%r85c5*GCss4BEGh zw6(Rh_Tqf__H*-S9xhqP+pOSQK)?wp=RMqqVYWSOgX7UN6Jf-P0*@{ z(sN##Lo@25Fmc|~?w~OliDk8(;RGB{d8?_gKkv27v=@$;wnyxb`B4Ia+Qr~pPtkSb z{9R*MUY34b-(bhKz7M0rm{$k@PfOGb`AZn`$ZbegR+r?b<+ezf_)cliu>y(2F))a^ z=GOP=={1{!V!f1ZT0N>*xF_KHn@w0hHD8VjZ5WM-6CeNvf&3kyQsJX8K$Hehw9p)} zHDfB>)6Lz&4wtN}wo~+hsDetnzd2Rq0K~)9raFTYz39tZ9+1iCpG*D~D5B;H$y}p* zlX>o0b`#dWXW!4I7>#)gxu`%m`1#EtPONO&Kh4zB)pD?3*T&Mohq`hl`NyiO7Uz4> zo)|$J-v{k-b9tw*)JDf9(*g8u^jTVS@p-~sg5KUH zR=Ybqs7O8JN`&Qj#B6l6XgkDPan|d#12Gu%TOF6Z=tzUzY>GOEd|Cl0kVss-k}{S| zxpdv5#p%Yps-)PyTxPlsquZfs3b3MPh=PJoF626=j`EP#Lu{!TG^WdR|GKmD`a*d+ zIf;sm?W_|d>vrO}4yCL&41GwK-5tl^=PWMBg7-nudWVx~lymts$}VkBe-aR)`F?me zGNS1Clb@8GPa~x)fdtE}=kK?=0H)@jaJ!D9KV&wc3G>e@9*1iElUIyZD8a+rXjFUq z_`ISeXKlwF%95^}XH@`let;jE6K73JPwfFoM@|%?z)pU(-$!?6y4Sx(nri`nkOP-%AE6HClmdoim_4;E)U5|>W^4Y%u|KD>*lD^`=NhH- za@DfU(55PyLfJ0}?*PV%KfgjEVD-t}%M?*A0iI0$g56Qq_h22yZ96VOC9KJAJkY_v)GrJcFj zX(^BnxLk1rFAZ5^goL1=Bu(Q&pSe1xBJRmRk2|w02ilCDJix&AzGYRQP z0sEajpH9C2>LlF!>}2ex7mDe6&jS<86sKlbl9<&rj^nk11>xZ2R--~3z)YLm_Vi-F zRXmeT8s#743B{dV$)>tyE+R%}q;$&apzmn%hbfxln_kz8Fb;LO%tOJH)YKF$YCl>4 zJkz5>z!OGF&vsj`qlI}q$0SyPJ50#HX|His1m&+oc;;i&D4lo;7FHT5N2>T4*9pv~ zairi3go=mN>KjNTUgww^<9hVUm~yu*ukL%h!45CL8RwP}s zaawjw4LSK#QQflSdQ3B8zvw>6d1$Ae^r2ZjDcP_pQv+TN;)P!5L?;Xh494FNP5lW@ z*-EsRYi^T6&^3>cUPs?{(OkXQ4-xtFJ5Ew)Xm^9)9A8p(Iwe>Ptq_&t@876~{HE2> z2F9a-01z3!gjJ{koH5Hp_Zq2tsHY&nZQ9pSLHJYYm?x#YduqiW?&>T}NkVrB6xVS= z8gieI{{3hmgoFEUrXs(dv<6Yx!w7CfSocwzxA0T7LeX8vS#Eu@d9eSOn4pIZ@OFf< zN#5ChftRInD4X~*gd{_S_T`I)hJm`|dsNe;TR{*pztOqN*FGTBHrV$!KkV>n_EJeK z{uZpxAioo&mCcuy8_{vS=DD=Xa{pV=P}RWHh!WdJb`6Px-KYUe{of5`QS8f7^-YQv zg(HB#Lt^=dz&i@LoL~Mnh!``4%?2KJCC6FT=KLH~9KJ<>JETbV!u=?Uh=#FB1qm5P zf*b-k;{q6L4Gj$^aTaz5%NzKPmJ?Tu%tNbL7lWdztxDTQ>nwLjsFp=hz`@)v{+RlE zY+2r<8MOiN!YD;V^iviV+Z31fQNBNdciP`M%%ALZQ5;p#6#31o5%BFd*sfmnq>$!U z-3`;n8PjtBdu^_oSPU3C1t3D_PK||1spzT0Y1lPJS3nxV1vi#-Di1ql_O}U2{%|Hk z>f`%Me<4M8R7q%2i-6qm1|-XnK6PQ%>)qi`{I|Mr)a3}af}~vi7$FN+m;=^>_~N4m z!J~>WF8W2YlzL%D^~M|3f(XVyuNXrG8IEmc^CVpKjqX51JvT)sxZXNfoK*50N@nT& zjMks$a1yl zp&9yo(oS8>jS~V6sDL z+pW&DIFDQZqhVfdI}gHu?=9ush@>(CY+Q_=o;QIoDItIF zx+h0CWPT<#!QuPP5@Ty5S~(W{90(f5yNrR(bDPe6X?BDSIywbettg=>cVgzGTKW?04CU)o&9EWYoRXN&O?MdkV?4%O=g3!x_>wSXUcn zNpSrD<6^ofie&fxCI!lb+qq%P10eq1O?iutL9UtU-3ltHqUGh?1bUFpOVWtvMACsI z-|E3vDo_A9H7@sFhNfl4RycX0Zd$L(!meClMB{RVli|}u$Kq{Z^-il%7<#4b7KDSj zBG(Nv0ikg<2Y0>qHI1ETaf(|J>xWlPap6Px0NieU){t_v0CY~lT0+hJz7Hc4dzT9} ze(0*H=JiI^OE=zj(^HLj+nnxwE91NPIW+0`2Jy(S-CA16S@`?@ zq%yAWY!#(c>)Tv-U+@g1uWol;sQIIsv6+M!Ldv7fbYI(WQbsf+mAwb$hBA z+tgS9NmKW9O;|Y*t&l02X_VvW8_2*&X~y&6=4K3<`zKnya&Eg$RMfqr7DD7l0DLev z{z96DO^;|LjMqz&lERk{oOem&?no znXTQG&L=^5dN|>4sVIGQ1Mu-PLcNFNzb;<1K70VyO>!RJY{`FY(B4A(NEby5KbOg0 zm(=l9Su*w11ymys({FEyeACXIiryDQO%=vzJ^NxzW6)gw(ttR}U*ofdY>5WpU_NyM zDV_XtbC~XW*0>+r7&KsFSx3X?`^#~bA|X~Nx&Bf(dA3D~KqJ!$F;DCMBaq;=&azt7*hzJJe& zr;QUNGJPoxG?5B|t|H&35K=>1*b?iTN-k!B#W^t9!z%=IlPUyxEp!9$E+GgeC_{xg zdDxo!l2168ZNE&+sNXQtWB<-lxOsamO6cXFvc!ZJzc;_}?4;rSR}wP&b}bi06BUZ+ zu1K;r&3BcyQ$Y+mEQ=;$Aag&)kY5*WgJgoSfgo20vW8qD;|Pu*C-WCDc4Q;kbwChY zelD9ivqAW~14-(8wEh%hdNv4xtx5Gt1Gi_#EAm065ILIiT*F+*YRN)QDP-(8=qJQG z@6E&F0EK{Mtxe3~$O*8@iAsQC{+ho0lT)@XzICE{hL*8QG8+gKN6{R^jjxYdsC~>c zJl7!mGumZ1?f4OU8l95Jj6JtO)iwJCGQ^|lUf#;y{*eUO#WF?BdPqh(9?IT8hT7hA zbDMxJzdG^0%=35}scqD0I!<;S$Jf-YRO|J2|FETwcc`N@URky|ov(VABIksA%mL?c zO@^1~wg;0yF;#~3E6L77ue#+@r)trnpb$0hH4mlq&mfo#kfI_y7RSa(_DcxTCM-*{ zXIr9Ix26!GnPSbA-z6Eq+kDu4H?r&X@&Q*2eDfVT@+k+ zc-mZP9+*}a4t+dEO3$9EiD8K`oKD3Nu~cW^zB$di@g-WALmV|-ECk*P2|MariSn|j zIpP^gxVz>IqN|TV=bhul*;)6W5o@O4JFMeiZa7wN;kA;;_EC&ONM#zmwg~CISVN;| zjSrD*X3*&=_#{J0_%-1018~efMCj6$Jrvzg5e_wvgv8L$*|rF4HH*L&>Yh}%z_HC4 zXB3WuOiFh&iFDoP?<5V}g>X=))-y~Cr#Ipj7DlSBxq60%Qaoxiri0J(`Q4L`kBesE znHVWaZdc3g>-Sd2jblhYSo*L{erCSu$ehK!V&wMlOX5l##}IZsfE1{*LZV$q*|*hHjrNLGAgygh?daoEg_CU~6w6Xyvs=2lbet0kUB2nQ=Q7f+Wcilvu( zlRtdhT@UW>?++>?W=wQpp)&hG`g-c$khXMA)C(JJB&8)t-h*6c%XY}Igop$UiDu9u zK>D@_?ue`5?1vpEmBmxB#10;hD<`+wMvFW>0W6h;*U3d_iDQEASkf%Fn`?1@<(>ua zMSFon3vv1QjRPbJk{}%1DC%eLmwqKmh+w~Qu1bl@yeW^yxW5&2e$wZmo(5ZzC`87T z2}~r%tAr@gs^xjiF5WPM!hX6jTo*0tRF?hB8@>a{s>IZ{qsrallA@xQ)SIce2 z^;yuf=k{y#Be3ANFOIUleDrQ^wl54$bCpQ@BpDx_uviliO$>4t?rLUT?M2m#WqQKl z6{I%sHS{`1B~ESHE21jxobI+ImA3%(lpy%a6Ym!iX)`mj_F+xVORnGmh9fIjVeLP| zbL^dcAVcQq$NFzgOQ)}X9k;JpridnYU7t<-{#JOG;WJC@DqlRjn^Gm;)8UfxCZ{O?v-s=ul zdWBG#8Ao+7V{%I8d+1k!B@|*aY+p~pwviq8d zu%M@>l}%=M40|x!UuMhi_#!xsH7c5wQ?5`xk;iKw3)ObcFo+j^`VvLv#s!biNO{Y! zzyZTih`3W3b7+_OI#Clhj=Af=>G61;yGN7KEW~-ST)rlVE>FGG2eefKu*P$^csSIPG)_N`xLSb2Y{LRmNSUm|oi#nC52z!6Ar z{2-F!8y0HqUru7${scWj9_93##y_35qF%FVFfxdz@Ew@QxccMEv3g*8O@Fzxp3Wu_P5~;wE7sW9w z68icfk7J(f%GwRqFSH>4YG(U$6BIBctYKV;L5^l){Pu2`Dch4FJ}K`~b<3k)r?0O* z5C5uv$J*=53QFna&ja~HxD)8j;rte?7DkhhI<2J$UXhR`CFt&JX+e`wp()Y%pYx&+oS;#Ve3>ZF5MhbPbR>j;jzdsCIk30g ziKIC1pLXt+EfS-2T*reqHeQXI$Dy6pYdU@ichv`N%D6Y5hO+BFN#th=<$Snns8H@l zlqrw-8Q}YN7VaZr6Kw+@(qGu$=_}f^SR|16E^zXrG>nWs_8itV`BzEX z`kHKFWoOml=x!`4(yC=0F3q;@N8!fTl8OitIowX%&j%Ont?j*Q--8j18f`im92{eC zBVRCBr(n?j@!L_@@n$jQTkbDcuvb36uNU$L;mvcaFC-^Is>ZLI<3cWCEoD?Q9eef6 zu*gFLO>-o9)Tt{W{a_#wnw%CV`RR{G(ne@JxJZPYdOcskLU=${HXQgT3zc)n9(Zy< zlRayN=3yWsY-G6EB>W4;s$e;V1UaC=RRL4WQC8G`*De7Av;0uF2EF5In?sY(M7pjo9h#$%9x&T?tib?WOCzJ_-or_Nvx& z4x^x>DN$n;MGoQ`r&WubOM-G0EkBmBC8vh+vzmld=aVPOGXNV3xYOe#O`eR>$Z5bB zGEni2!6hHuJ(*BoYbi}m>cxhQxXBaYyEzj5bRLT+#>###pV&il9Bne3*_o;nIu9Mw zJq-OhKxAw$>2>q6kC4+u{Y4M(-@FZ)VEkkdGG%AL-9Gp?pOjqA3kXHU*fUaxCJ z-Gh#X%S%!bHvjzIh_RtK`~@Mbtt?Z2P3md82ac|Sz<+Wv^W0u8>SDiL@ao9`HD}G^ ze$}o;PpD>2LqoO_`renQo*18apjQM?`8}Hkv;6Ad-EwkN?askg-}I_!4d2byJD476 zj!_7LZi>%{efgc}MkB#r;kr1WFSDg9)TO{+5SYEj$svK4{rkJz{(G9S}*l1>Q zw0t&&Yh$Og#!GhY@6Ybc_+Jz-{pE@1P$#48D7yjBBX6=Rh(9t;64$B;-IrR*qD4B_ zUhg4A%OJk=k9AcvXoRi<>J>)|HskP0b^#KJzZ2&3TF~{})dXUxkpnhynRMHlcxEgx zDrwpQ6eCL$9vmt@u}OgLfOj{O2!~;g)W4L}NizrzEh8&sM>I6dHMC@8TE^?fFi8qa z<~iA*>6pE`2({c)%ryR(>$rPe?j4w?nn#U*w(6WNR1cnmMJz*2)p!j zh~`+OmWseE9<_!2TR$)kcITI8nv~^|7@Dcq*473? zI5?Z91^rGe!LyK@>O^A|9<#BzsL>z>?yFT|ULNX>;e6s08crT*%e?hTz>W(DU=uPN zziw0qB3!yxcYK`ph8lLVrhj@cLM>et>lP~TCzpuZ2$L}swnQ>v;n5T78WP<(&-S7; z>X9k%6B{9*@tU(dx$dV%O?<)Sx*_|V35kRGwQxfjwoknm-)h{Sk56`2%=ry!E)|{K z#1EcMyeBf243qYKmbg+Vco%KJu4aZ4sDdIvX}^Vqf{gpR4X+vG6Vy&4o6ZD4o0mUPxaDn?VxWg8U=>{+9lr6(rHjIcHDVx zPoG_MQvQ_7Oy5)15AR$E=iCA%%u91Grjpq7Dt?iT`i|9;q1%(uz2AoJn5!X+Cxype zvMlMRhGidlZ3$HK%udbO=^hzfVUHx}TgU1umBaf10LiR>>+40iKSpvTR!x#|g5<=7 zsyhd#II|E-MImT^+GY4Wc}%KmShha68a)4`KrEapo$Y`l8SbRg6|)DQ5{#ZES|YJn z*6RF@j$LLSnkWi8a>144$#l3<&LIhXo(Rt6w4#G&CvLf@_;1Qp{yW5>>v^5k4&|pN z-G-J~$2S{iXPOOzV|mrqdTdOfi%!T{SmhL)14dcPQIvAd-fuCB1$@-}ZW%`wnyq|V zx20KUmBT@7|3B{QUx{cd@i@#a(Y$-xAf3`kKsJAZw5g|%)r{%c+6#m0IU>QJ9iIl7{CIZ5ZF(i%+nE?KhcqfpJ+ywPOo z!GlNKR=lh6vXmhi5Ce)cL?*&4k&~M5i}sk+G&2oK%&%5Ba~zH>^0Tf24ckjhk3d^D zNq2ZzZ{v+Eq}SBZG^Xpg#HlipxpfE!m(X$}a6~fQp*Y-bp8D^FUrS$KS?5mkSlrRx zQN_1`of;*I;Z^W(QXO-2_{gp{Vd+BfR*wtgLn=;A08Et65gSPTWZ`n7NYsvK)rMN)>3t2#`$ zP-*4P&XSNTW}Oiz7^sDd6HS5f(endylBzeSl}?z$k%+#x*=N04ih|fZ*TkZ$)pzPa z;2ng{h=#GBUKXKtFtJ|7GYGO?z7PaYW5Y4u(&XnU{SYLeoXm(~m&sqxtz-ca3C0!? z3B?q2cB}o&e6DRmhR?8`(?Y?572NM)Lkl#0 zJ!$Q%BrlkH5*%S-wmer+N{yJZE13FPVY7Qm5PJVvPl6UHZsGaAbl->&1_i!Bof!NphCfX z^inC|-7&eD(=wi_|X89C7DIZ6Hu@tN%`@-GE zSwXfbWG>|Af;V6FwZRBj=!GDdL+5!$sw56yk7#0?0>RVtgc#aaF8TOD2mZjJ`W>t0 z`_x%Pfz=Sbw6x~Ii?6H+MyKNu&6^n>E;Nhq2m|z>76Vl&lMvgp*B;M9$6A8fp7@=2 z?j8*Be;+&_4=n(I0V-yC#}mV{=o7h;zi`_pTPH=^6l9+>>VR68U$P)Mar3(g0+w+} z!Mxv=G?BBZ1Y4KgV8SU+NZ~^IeOGx?zzIsozKPWm+ZF9h`RMuR9J8?YHQ+^1%8^kH z7$qx~h5YDih)R1|eg&zI(Rc4`Kf=E=Rb}X?e1-4j_O@^iqijmeu~BfC8iUpRT)}ne z!k5Oi4t&^tbanD^^6h?mHE;DrFgT&@h~jx`e85YdIdf)}J1BM(8=VTPI@#?0#h_}! z(xvk7@b#tn^v}1kA+Vf^cpqNv@K@E37Z^Z}OMiq4ESU8R7R8`691r4BQtUq`O09i| z%ucC_o{FGF?_r(A?+}r%UaqdtBY0Y?jHC{d0>Wq5^@$U@wYcl?*LkY z0bI4lA7$X{aHzbN^t9`SJstsN?TRLI=(Mq7f?3U5pic0Qm?hF!?w;Y{$iWF%m-5h#6{)WI zW#GW`5f+Tez;RBR{|n?Syfmbq{`TPXY&(_|ZA773Wxw-87>J5Kd=$l%rPS$uG4zyC(#<9e;b2a*V@icm+CU`- zsI4d^{PUEE9mQ#IPH5_K@!l-9=T$_gW(@B=`3rl(@JC>#dYkW-rvNSE=7j|}Uh8Kw zo(M4=3Jr>;pMe-9hSSnIF~Wg1{^Zg99(7Wvw(Trr;4$>7?Q@HHLxIQVC4@739>NwS z7&&Q^nHev{$HQ%c9OQfNipfAA0N4k&t@A}Bpy<#b)b?sm!-*T!yn<${$EEi%P7iGyN%vIB{t~Ku#n2Eo>>N?m3_7p3 zD~Q{U4W$P1T-5h1@ zUA#)UArm%Tn!N3Uc;SW3yra_EGwlaLUpO!MNXLLof4;m$_4>PS_3FRyE|H)Eyh(=y zYinPPf`$3N`{42r3%dM8Jry4SH}TR_;l2j~SqX`gbJ0_JvuS={wteU4^JT^IU^$P<1{D%I4}k)|CL>G zQ5aiCn%mwhPjZKFa0KENR(P`dcEH{^-kk`j;wEd@fl900nv_dEO7x~@HIj!~m({aSO5YRFpt$bWT{#+nwP*dyo3Jl4A2db>4w%ArP%u9DR7pg8PdHCWUYYHJ~hhR?wrT0Zl{Ntkc z$fQ&@pGgnn9EAUUu$z4i(QcNPrbR7q$lr+aoH3pjVG`$Z2VbfUWrlk$HWX)YQ6(F) zu$j8WoD^_={k_DmN+=t(Gwy>+%ddw}7w`w_e!YYz?}ry1K~WivY-uM7g8__PSKBzA z0|pzuXOC2VxBFBoS}x$&FXI9o5}RBim-syUdga5n(X$ig-WEnW4HSlWYHsPrT2EnB z@SK#U$Ia9SwcgEIVQCqbw1DZ#qrBBgB!>l_A7FRRyYvCH{Reu^3u+eI*^&BhnfCbF zy)S7w7pi=j6?XACfY^p+F{hTS9rhaa)!MdW7{|YHz7httvU*0whgtc7bq<{3av8&e zHrMLWmc$?6cm3rR)k>VtT6UAzg~r~+8Z#>WX)$4}c@PCF*KZ1^!j+O%=AZ!pnk=#B zJhr57c$y?Y*LM$l5{drl_shl%K%-Hb8$dNhF)H|q?G^{nnJQkZLqVbh;IC2K0w}W{ zZSr~@Y;9>2 zFVAe+O2Fc?!=T824o*YG%niz<_`YJ1i1j(($y?%-fH`myTp-ajBGd37&l%!FtbUB5 zG#22zAYah8MIzI3fgot!8lMx73H1oOqWW9%acWlPYo>a1z<`htv3a7H0#FdpE$b&< zCm@n@=;+N9>4!G#ASPEqP+7#hEUCkvAS185h)gU~o1U;lNDy%Q=giPK8Rmv9>{%?&j_&MfWRA?(PJe+~BEUGfE_kPnf=XZ<`3G7~ z8+U<9SP~U>fm-G|^xXD!3H?x~`}>l3S72o1-pL)Kz{CNPPCN5D=` zwi|c0Nd%`pHDGMKZ8MgiFc&u;>++y=V3F0kbEcH6=~8hpW9}1p4+knip8b~6`s8w; z)ZCoD-|1^Q=5N6$QRMU7bR?)}PGlDg8T7mqy3J#$Jpw;EL*ud--fp4>qI&@i+bqD8-E!7*k3D?O%?70zXXt6l!(KVgGt&}Zw!T%_S)GH zTA05+{8uO~*2eM4z90Sd(TZi)cSJiM?}Yy|;7L6t?+|4h?Yut7amQ!Y+W|239S|J?}#$f~l5i^}EB*B2l-AI{aU+ zRDHgnfWU8=555xj8-fj8o2RBd2dG)wsK;AKnJ?nBSmxD9LsC)(#EpY2Xo+BB)}l6^ z5yoXtmGnN0D*Qj<9xYB10^e70$JC)>fc7-B#wY!!Mwc!3okT**ZgO(3!BEEIRvO-I^1GhjeK~ zW|Dv2x!t;tI5W zH*h8GOtW&}QktbTvE#A+{UP`932)WVd$hleXS3 z=ml~-L>ozBny@A3JXJS+~|q<^zK3jq{D zmPTaE+C5^g0tAFQ{^0p^<27k&#u`Jht>Ee^X=douC^R&t(da{})+U&ERfwS`GaNNo@H$&;{x z=as)xwY2bc)GC=G{I*k5NVL;7;)j})f z@2vxcL5MT+rt=-oieA)+sWnt|9J8)#*V*xrwyVZh^3gHPaZ2^z-Sv$bXHDP=_LTAl zVqoW(QVt5lLc+Tp(|+K-21}VY#u0yBIoEK%saYv4{snwlUfY&e`j*>=)?6O)x?tFf z-f*_o)j0LF5F%}rK|3>9sc{Uv;>I~Qk;U5=Y6rK~hcP}IF81#_9+Rdal?XVK zu5&PM*WR7OefZa&Gy*6Z^yQAm)7PG)?rCQL(RU%J)8*GgDu1O^zQwAbIEaY-uDAyJ zjVE{~=%y&hBnvdlE3M}HuW5g}o)WN3?TL>AQZn+sVz@vfDmussRnA47#|^4Zsww1g zc%ynA*N6s(9UCHL6ZzkG?DWWm>saU3)|}VqQB`~taiL0?HRKjW<(3p7`CeK14 z>E%u(l1*M*HSL5G`&i!+#N=x>Jkafbg)2LmK5%s9#dJ`$wXUgWw4~sU2QkT(bMO*Ec_+r>Upw4r6B?Gp* z=aW2jDYw$28DACGzP9>54hL?#fS19?A{+822%+N=gDLyiUW9j~X1pv;*#oAeBd>|# zUBhx9w$LtQDPW>?NOe@>;pkV17)(VX#S*s$-{8XfHK0TX6!inlPozSRlr3z3{hSb2 zVNPqJ;Gk(cs^P8e+AY#Awdg!B$tqvl(Z8-o%xB&fo4O5v%J)S*>%C zBhs_NMHWXJ9?W*GBBTH%i^sSoxg_OY##d&=$P@SwT3;UKX4WfgcD@)4Xu}_+oYF~> zOao6-)r;{tpfM#qVp2yEBxIVm#u>&GJKBI#l%DZMa6GD)E4?4^zok(wmbR5^K-#O{ zVHb9|p)vxXojkyhj-CZUd=N~=b_t;poa~gwrk60y;~8XA8yyN7ixVTsBuJT4ZE(yb{)Njv-GQ9HK_*GVwTUH z%2%jL#a1(yUBNnB3$1FpA!x#04L!K>e49QqIFWTq!1@PmC+QR%DiIkfWr{qkVFKhX zdG^BYB4IH5^v{~7J6tR$&N}Yl>X#b?oU$KU%JqFFH`4Q)Vl_S@_TKM{BXQgT%RJ<3 zDrcmA=-V0I7M4v*6`Yc#xeo-W>8Ous2-#cy*&2LDC>!1jO+k!xc{vOxhTbIiuH3w} z8=9=!L8+K?btvB~AAheFB#BMHIPjQFc7kAtT4H#Rjf1e_ zuF3e^ln*W&pJCOvyH>Vh8?|GI{H~3pmwwo|%MNw!Xm`*PXXaN$sY(ht)ZUL+PBC$J zS$kMI_TuRzuK8^^X&5cIKDZZ!5Y5qMbWZTIRg}0}&pBY$9&~v$=~Y!9dx@LhaUwM# zLVGF79yCmX|ZO6d>t8(^6W%Ds}GRYkKvAIdk81*~F+35}y zdVXrBbazV(dByrL87|E+hV>sxjFwhby17nvu7-CInrf0|TY{Z4W}Q#CArr?0~Crm*`D0qs8;(>X0DWSbjkH9Y4Qv_f?ID#G;eB?dA6Gsnkv!IX+|E(_Ssc)1%zMf zC|tjC$QHcZ{)5U)US2ynrEn$mnk>_;5HK7QjlbYcWQ`wQLL)vhInV46EpfX31xA#o zIr>&9=2XaguqDthUG;Z6XC3hl5yGAR48~zAgga@;1?VE&B-yl#Vey4$wZB~dhW*mI z1>2B=KdpwzcbqKyE~V3@^SpZ=@wPA4vg5lwJeQ>oH7dUt_|_Z0-9&+L<;J{Y|QDR zTU3~iIrX^mS;!F7B{ju=6srhw%G=No&{*>8SIPm-?sGm(E|?WNu2d|mjc94qhlZPI zX&kAU)XC)%d}UC?dhAm?oH+Y>zW?RanisoDAsFes-aNwjv>)bFcA+10y|n)=*%~WdudO)Tuxm$barG19 z=I~$AcKuE#dF;zvs0{Fix*PO6yX13)Emb6f-IPxIv{8guk1ChVqth((&&$MO2MsYv z!DuW@1@=x6WTk;dXRX%aW;)lV2`GH$sTbk@MVuY{U<640vD$Ne1xPD(p z2}?08MjCDo6;Vdmr0JRmCA*^eO&Kh9bHB(I-*H&`4Md(Ea2x;DB zQ8(Nh1IhZY%T>R3YCQMd&O~pKp8Gg*<>{drf8@|RnETff`AOJMh2q=VTs^MWZvXq? zTIw;r`GdR5;h)D>My8moMG?$}mO^WOqfw$yy4Cg{k)BzkY+~YOtHx>Xr1{_b;x|JO zyqglq?V45#MXLK%SZA$lY zbE4OEkcHAr>bsI!Vr#WkQBUP$4%%|M+aP~XdPNkP?(pOwb$13s?zg0D%wtR2bFls? zv2J_t+vB|hSD3)-`nr15zi)1cf})Xc(NRP7?)QX3zmZD7b?t`ijTX<3pOST zB{dEm$IV-%>3x0?dof$t3z1o2nnR#-Gbd@@j4}Pzy9u+jy4z< zHB06W>eN|!b|$FV=>;5qL>^7fIc?0Uu1x(tRGd1S?sI`6?J8cXd`le5TKdEQ&t9v& zK};UozurkRqUQhhKD}@AH4S>iya~*(e0Gn8*A|JdGg)!Szijmh`+yU$DsDabO(*_+-tkUhe9+?v%aLUWB^SA>Jg7Doh9> zf;QPoX8Itk6d_1*zgQy=rMr$hxwPhXFt?gm`1#k8%~AVnJRdgXB4YSmg0poiKvHxr zHm8+U^se5Ws)r`0jW%>uB_4n1=#ipQJJR%GnKY-8sds_CqLT8oQH_ z>dUaclmGR|aoM7BO>QR!`sQovq$I~eu1+l6$h5qU+*RroLlveR>e`O3fWN)DwAsI$ z1Na9ZcED35tsrFL(^EgoHT=15OY1phu~azq5u}=0>r=Mh%cocls4k>@cN%PhQ~G-^ z2xb=k`dy_3)nmi=&6FhE=~hNx{8b;-gX8WHDKEV ziJ_X6$?~SV{Myn~&@6e=N3X5WenPeGuZgh3aT!Bb^e7J{dQW;xSB`5q?qdk{FDoGj z^I!`Ks3OL8zc3S6E+qz5t(`p6WNKfEG3QV`197u7bqD)zUmJ1+hK;A~-|w~PCs%C8 ze>YYhV+Gi$SMmm20NdV?#|6}Kb=96*3`VCW<2lXNQ6E0MRRI~HA4PcEFN}3N4SyNP zyK9WBcsvhm?dw(hs<>#r&(y{9pdNBh#D}3M`b;M9Awy}kp<$N{BP<2BS@TA0ZXEeY zl=MgMM@!>D%2kZJ6vXWWf+-yPg&j&zmd#OX?$+{Op_gp9Lq%QCb>y4*BgaTn(Ztj4 zIrF-9oRt~q%A)ykR{iIEj`dM_JbZy*bZtwZeM%zg2a3cj=3pSyM z#GNk#HoF_~9)mItSESmraS%_R5~m|j7dt7#9cj=~go`f&(x=q-I~41XQto>I(|8~W zJJ3VlcfgP&Y{>MIstVE=G!H5mij^UL! zG9H&J2s0ufK;oa=ObADiG7SR+2H5n=bB`8jJP}vw2Vc-@c<>F+ll)u2WnY;(kpvS# zz7{}xKS2E__X>q`O-Gk!fklB`@xhofv)UA+lvL#HaO(Eh_ldomh*W1FdE=;j;dCO z#Z{mz4QTS(MJRjL0RloP%ke^OcqGX0v&HQ3wNRgK0hBeMq`HVqaOLxObHE_60LGd? zNA_Obbn&ERt}sXTU3OG?ZSXT-aNB=S;{Qb}mi!kS4x*-A1OnVv$q>lKkxUoSQ%xdi znOdR^&yevENCyT;=k+(JytXJYa221WNYb*@fAK+1Z2w0LRZaVVx_=48Yc_9nlP_qB>5&Mr($K3z&NsmDX zCQtTX9=CAv+5-@K*1f1ea;89XD8iVT&3{;da4w)g;$T3ucBb(EQxAd_7$&6weyR8e z2!;d%^Na&h`cGI0Lf~I-z#S)tIoPaXAb_y%`RM;A3C#b44bLZ**CvMn?)bFJnAr?9 zzZ9?{2IS}!Qe^}MI6;bR{zK5e6yRY6+-eNCRdhcNaMgeLD*aDXAPlh_F!9d_U~P%= zWo%x7eCx^h#eix8i=6-e1V0U?0W!b=GB_4t{~rv9O92s3ULbOB1~8R9U~lwN^8t$> z)B#jbADB4=39z{MO8+a^XfW;n2~Xzv=YPrVet~8-OTYpp$?!x5%7qAIw6+RN+$ai2 z1Y!$F7wvyq;sHT0fFM1*Mbb7TdO$6SGn{p(RjbF#=kYxM6V4D=6yV}s7hqEi5CYL)j)8?U1(tafT-7QD9|%?r{U0nP@aYk> zvU!-(c`vI9)SWsSkg)tZ2*>1?u&fE}%3f-psxM;87zOMbfI{=|$;4F893DK8!GC4` z+L^`3tAhm4)bu@OEWdha`~k>Y=GFR^D((tc3eDs3EE-homEHYp>+&G20VOKboa}E3 ze#+k?raQHq%HME{SOh4J0q;_W5$nPm7^>GBe!HRf>XzRW@|wYKv~Vw#S#Xtpw$wGU z$@h_k83oxCFjk9yJonUPruO!5ey`#T_glZNe2$0nCJBkJP5alJ zxadS<=(TVJXHrxo6R+P}F;<7ahI+4u3E_1hlNtyEQLb=}?S68BnCKCn}d}x0FL|ZZ}5xI2* zSl%z2^qzW|TJikRho>~M8RE$L{LzBPCnd^g3hGaWJT+f*aM64gCCKv0r?Wch3TY;XntZ`+}Vr;d1*R(|RRU zNN>3n#~tn7ygeMFKNY$Q0ei9;VP(G~$ay2Klb5bn6AZ;z3mPQhxl28oVR`3oa06S& zm$UgZPxONn%`HlEnnqWs_;4u_VLWVoEo?gDi*lq123nqM2+s%!DeVN87lZ~}>JDr_ zd`$b(sK{QFyI}}c6@&pPYwu&N0JJ#Mf4X>4Z8sk*e-9d{ZtYjKa*8Gv%b_&Bgov9j z9=rVX%w|6|OAOu3eO}U^jyAP}$<_XhL-&_7nq+0+A~u;oeLHt={24wk{`FVcCQOp3 z{@UZ@=T^!=O^H#bT49&O$vNc;+3A0H(HhXbrJD$n~P!B5(LmPKQp zLJ~|zAMQsNP@#uoCz{Iec*`n%2Bef|=8w0?-|!ubs)RpAeZ#CG)yoq*m5M%4zJ`fM z2D!AW+(C5rBiNzZ62tAYr>SRpV~dxg7RP2*hfZ0Zr!b-?YhLCkwx z$J_W5pQ$@XUakF-K18oO7w^4~aveZ=T@$>2nbfk^xAp)3^h5)8?fZf{bzrWq@nEje zf_Nc3!+hOmnr3ocx*b~2YrJnNY0?GL+e<&rzuh<&R^-FT$e?P`MY4%3wapY(cdd&* z-NMmFzNA%$<)qSMcq_Wi8b>Uf<-$z1GeEn9)Gf&fQOz!;^i%aE{`x&PmJW--q~#@? zMv%R-o`!u6FU&WQJoWS{n!hc!+$%tC3#Pf6o?m%;k)w#AP49Sz+G(gyS`DvO|mRpx$mC2*H!i5vN?FSB&zCvpYwtao5l$~a!RN%0?^6pdutjAsr;yc;2tC%J&pI8#o=`h~C>`cyY>NS?|TqrCp&XV!nNw(i0 z(ARR7wY|Bjr40bUSS)$l4Ma49$2wwvbUfqH9Vl2z}w)ipri% z3VF#5b0oUT%;%QGuS4g!UkFD>$G6f$@$LkC^72AI5gLBb7+9GdR6`YN8o(*mHAfT} zi~@bKGs8{ohaf6!h;5d=ju6I0&fWIbW#s*ziq|kqj!raBrVQ3}<6HK`XzYX|!9`2M zZ}U1aJYM&mchskUhYaK0xzx3Q(goIxF-kBO=qo5)H9J|uMGj+cjxA*7zFp*oIRG4dl zSeBRN79YjF2wIn$^7c?F*VZ3T*5s<(GIf-Eh7&Q@i1#Df)D-#oEPJjJW>WNnbx3{q zM(;N%wd1yY^Nz89jM+#uY+9&b*Ddl`FQ6CR-vl%2?P+KJo)}CKxrv6-A3FeU85|it z(6V3(mH=6Osi)B$j->W*arq46spnbKC}nNfEQp}!OF#qKruBo-dc7xBy(#gua=uUg zP_t!s3l6R=6<`YS^arBgoNot5r&On$3#W)apa&%O8mkjMKNAbAw=LDI7PLWyLlDPN z8+j-!-VkRCUb^?)$6&W5BTT!PsbnAdp(L*I?ihYriLA8v1>s4Rkp4P(ax7f+xa|$L zG$GFj^W#$}cu=}Q0HqHCK^#D_L6P0*z{otiym(c0Ha`D?e+01i zKmPPuv5VU4D8gRdj|3ESzdG=q=kbW}$kR6k)4-6f5t3y<9HvuX>U;xTsyPr@rrb}s z?>&e{buX9OS;%Me9I*7m>-+2L95rndaB<&q-fV~OS{Myj4WrdCd+9enO1LSp>=Nit z({3qwhV++RIWAt_ZBL0-#m8rh=_^_Yj}e#(oGtU=2u$F;-%;H)Zv0jA-9Irza|;9* zywfWrG^b_CWqNv&Lv}D;3YVn z#v~F};TaMYX>`Bd^NPrs)W6^KhQ*ImnjY3=j&+LN_r4!XwuWQhfy;Kz(Lrne+6w^# z{?8F70z~#Ffx3P1J0#{8NnV~Jq+cj`K_Dl^gzCrH3&NU)i=e>_sBSl=;>J(+uqx|V z;`bA+yZI?CE2nyC+rz4Mx^9_=Jp+F;91{aZ8C;as3g^&tv;7oW`|xIKqIiM$0bwCX zJ!qXuq4#@J0&<)ij_!SGPBDQoB|75I5)iP{(BNp39Lh3ri0N~FlNKa6!sDBGEV&Up zu%bLwT^4n#2QCP>g0?$ZL&Wz^mcK=;<+qVGJpQlJIlp`&hy)NAo&qHv=`Pdw~u>$|xu`Utf7ndD2^@bTJzZHjd zW2aR*#23-%Xfn^Qjwn0>0LPAFImEY1j07t07eO-wtA-p7gOVGl>h86P!wzSN!y(f%j> zTtPPB;iG>)w8|yin(9)`6nX!~XR5_dAam;fwcF6)@V3>+NkiCkxV$wbl}fl6h?WFhdLW2tii!{j~8ZUU9+8 zUX|pGLhOj>P{$r(MrmTB92z&3E*a+R@K)~YLvOO{G&tj?&c2*uV&5PImulyCsfw(n zp8BNf@;G0SwUxun15!529IOPUR%)JE`SDgo$iEy8=Lc#k^N>Kz6%VQc7VWp?gfecr z(||()F<%CZ)98+Vtx=o}Zv}9ch&()lHSSz5>!r{?eZpO_Vfnbe(fS717;JI!-IOpW zjZ1|FS*Gk~U0(5U72SkQqbjYzr5t)&Qyp`Y!Y@`zhJqR@WFG|P;!RI^bJAL6uSo4f zr6Mtkhl!%YHc~rzYU0~swdzY#{p*dnxby{i>_3I82N;aNZ-(mn|0ocdj<@8yr2RH$ z!)iV?d;8HXoMxM);@Vsj;M1I}I~g5YCzFCI;!W*_bc`}>Lm(`wAcOIX^_Jr6@ah4P zE74ziG5rJBHDhNaUudUPsND)L?Evbj@6%|&+)3~# z;OgMQ7X@ZAq6&}>SqhLEfdZKYc#QG``l0}>cRPZlSVsum%+TE=_aD2Q&kkfGfai;E zvrS234stm91jS22Q(qs1F*_A#=nz(s@Pxw|=6B;oApbJuY;VD*3zuSVq7^JF zBUeS`pM@{-$}fb2@)G{gg=I~SJzCL`3wom#V17ILM99MEPQcY@Q@3N=eIfbq#SPH_ zLuHuGRzL~SymH;V?Y6t_s^{s({P)&$+Uh+M*K=NwcWCWsBY=gpevW@yTvtckT{>iG zwzr7;^JqB6H@lo1G;n*wJf?tX8=D&A6|HYkjCWg&2j&;8W7w`!#e{re{?Vh?K2jIckF9>9+1tH})jbh)vhU^X03*thE(p))e4 z+<)J~Kw57{(IPtEC>OJStn&X%*dV29weh?qChT#x^+x5j`-pR$1UphKB=v&$r6wu` zr-(K)O$J_PjnL)g6!$#`y@(Xjl!mA?*8|4MAszGk?9C^F_mohQ zAY?RJk1cx{TdlO2w29)ORp_t}M9HXAGQ8p`z2;V)u7;U<-5L7VOBxu$DGljCiN^R% zqRLA}ME7&>!6w8xWt}lmsh7nc))Zyyg~7x{Mrpp^BmSAg+y5Jh`(Sh5IWQ$vv6-nE z{)^sY6mgL2OOJ7|T5$g~cu!v)>R_n}`PT-F!y^vEu;?v^T7FE_+&QsB#`+)b zIWl#(e>t(KXA4iQP}7k(Czo$aK2r>|n>)W`o;87E&)?5Zj79$p^)c;rWdSLi-Z}Em zR<9@jaaa=MZ~OHgRPdQiLQ5?sj3RyiAw?_Q59w1??HKojv>9g(eZEn@1Kw-WjI?&CXf(>V!5?5Ow-GxVLF1gGj%c;hOx`@EnM z2PA*ZI-Z9|8hDJe1zn4xiKf?_v%5;K>{t`mq!k_5>=feg#BO2HvL}n7V#&-Gd!W;N z5H0*pW1J=f5iyhi6RNAjtmO561R#c>0*avk!ZHxLWI*5zx+Z!goZ#+)iLs*kUFyQq zZsQ$``{EqhhxkBH;2m;lWn>W2r!>MNFEcgBD?VPT5X~)Yxd3gcA2LWa(d~DA{1x&A zs1UfKT0A>U1y{5WLpSNXIA#7xG^@977c2DWNd~V}23$kK>2>+r5DC$@QdNak{u1m6gXK<4Z14DF!huHZU*@2}><>cbcA zTN9)cE@(}5SRP2GGr_CKklZV5T{mNcMFI#P7~7hwzu~H{K|3s(6vJ%J8J!N$RWgO>NBc+3mCyT$?AVm2ojCP-sG z3pq(#a-=#2Pjmimz@<^L*Z9lkzWTab6$qg^1Z0>JYRv7Eu)}-RsM+!hi9uds)9d`+ z#d6k;5WX#mFeand<;AG=6RpHCNyb`Dg;t8L zoxo8K;;=f`VIw6;%@idV%dK!v%kyJL=OXAuNBq>TM@Y9*q?3|3m(-tU z(?|NO!NRvvI{wukXr#M-C1qvZ!$Tt^d`_fYW{Il{to|ebt^nNS#Gncris* zNfPfKd3kqwH=eQkKaA3P%xCTQfuH*ZXLzwy&{a_Tt&c|bo^$o!3XmTHq_Ys_tox*DY z78da9&PFjBsg*LcocdJBn@#YdyCIFk`+_*+3$1AALHXT$yu7^Tm(v6Si;1*8BQ{MN zaofjwdBh+FefJVCc6zup>Lx_H z6h;TyuBuQou23piS&p8#lwP1u=nq;^c;;pdgpCHQ9A_Cm_-cB_SPKtFN5?L=2UsQK z@`HQYXdQ$S+eQk6k%X6B)1G%Meh{Pi$i+kmTj9F0tWQ6UWO3zLN*z%7-_k|) z%?li%9ibc#q8nOyea<>QsUX*V*n^4Hr+t7Ah8>IHst-j;@1m-vgC@za?!$yCq~jRE z(HX~)D|d!K#r_}z4(LK$X5vhLVHegU@TrNwti^i9i)=n)56B}XMvZJN?f0lf=w8{%GIxqfMwiJB3fBjl z7v(^jSYjdLUyYNuN_{CqXlJ^Z_&^Mbg`PBW|A=H)UNGN9&GN2mclK6-nCuZ1TJxXP z^CxBP2c63OQyC+piE%js;$M%=c6RTJsL^(S?$pl@#}Q4rC$d#Q%8}*u$o&mR&vlZCTUqYq59e*p zHxGvUw6JpW!|j>gDKo ze9xr+H`F#)YYa7cdVNd)u^P=z)C}&43*&7(ns78hl-8%{B4Ufs(w)gf{R-VA+g}(S z>*~M+<+DA<*Uy9gLUBo)FS;27h}@QA_0a$UP8n`M!5veLV{(0$=}T+2nf*RV=+|2C za)izLDqe8xYJ*z9^awfSoxrz)xDdq8n0#RbqJ(){#-~mb#%R&ubb_CO5+V$p3lB%| zQFx8xQk?@6)3(L5hH9m=S}(9+xZ%8Z+mNYPI7iHE%!-$?XNdNm6;*^b(YN7lr@8X@ zw8j1EB0|qn7P0WqB}KCH+@qbRv(bfv3WX!PM|D!`L63fYEa^doHSdubfA3>=Pr{PY z&4r^t5PtOc-{1%PJ|Ue)oD<=Y)pFK5vwiK1)s>QS)6|%iQhZ6m!BE^y92xCd>j(+W z4#(i+m*hpjaJ`FEO#fPsW!0+^N#`${>QR#9oZ&2H zl4)2SMZw%AWF&q>a5KJqkPSx#qSxh|!PK23i?~Lnpd%0c2mvW#i5R&etwH{WFL2km zr2t>Fm`oCaYR3vMM=I8$iW4Da2>&peLaFZ%E{*{hehft=rN=3y_ot&)j`O0t;k7|z zRVeXd&^ZQIn*|J047@{1F^)BpeC+pMMz-X>itL_$JZ%fP3k9=he~AN!1lW$A2RgBn zwPvC8*xs=`7adr7qmMPhjD|2h9fZ6uyl)A?sghj zws#tM{7?`g#afFonQ$Ffh*?ZgndY+z#-Py z0lSEhbomzIb6)slW7CsF!gI|=g3S1Xv(rPdcXcCrA$J^~jdcd``PaWPLzeDfp>~VX zpGoHvK5`f$vd1idY(lzg6FmpMu;G-V&Pv9>GVU&T`Y|>pTY8j}NIm1ZkU3ICwtsju z>6+g4Ck<>^=UPiuDQ<@E-YD?yKHf@#NDeCK@dsrc8&qUb_w+_bgH&0_F#lE}!t-IQ z?5MVoe*LV#U(t4_2dTuV8wp#_vC>6t$-)ktUQ{KNhrh3VHL8#Q{uW1kD}`nH%Vp#~ z2}YGm;ImI8>5lA2eyIn>gHNwdwo1xU`aAFt=u-vXoju{lcv9qPp@=J$N~qDxVy(A6 zZYxw}yVmu=FfkD1O7{T4uz)xVwPQwEE%+|0oAC1IdF^;Y11eJ>X&pqiW!w$X!Dz+c zDmsT-N|ChWTxkwXP`QX@H*jyuc9GgczY#ksv4gs3;hPUh8kN?hk8F7?#q?T`8b@z@ z7xlzBM&I>dR@o`C$ZEB_PM=da!N|jUHr;ZXW4`V*F9>X@qj(%ty-463h5ULpDgpA+Gl%WHmE-_-4kt8(^wGhXu`==%5>$fKX;mC$(N-v zjgiJfHP*DdeS?}TXaR#=9~7lGq>rCwu%f9Kb@bB*f1B>*&KS`GSY`2j*;4x4Vj?bP zU&EZ^e$H=Uyf(_ynyO;|SnRbVD58%;MwT8U*#I5XgJi6PVldHWlLw2I^zg78YQ~Rg z*kn)K{)*olHnpHr`FHWIi-5XoM=`FQn+!#B-k-3UKp_gT#XqcerIci)1zT+>AWbwD z^tXp5k$w4ey)1c-Wmb)?Wax`+3GFP?)3nEKPyJrLV_5eVTFYsV=El z0F+wj;K|msZakAo6k7FzWw@*|!#i@0SD86&2kK+%-gxysrHJT;lm^~P^QXuX{|8rP z;9N5O31e;fH{np&IDn&_4OV>sOj3`5ywnU%+`yLN{UCY@+5Fvw>VtZ@QWL`}X+H|D z%rB@}&TTVP7(+hlC-59<6XR7pYXf;>z40~WDXzG058A2{R#w3;!TKNe(gCpBimn1i;>JHMyq=sm!U_seQp?Rz+ zr^H%%;k{x1JKo}+5CxiL|w38*!cnqH;h`d86^48NxRbL^2 z^!K6e>7|1-{s-i1S2J|lnljt7aY62qld|C(wxlzOa^b}Bn(Wf!HcVYE#}Gkr@mY6< zGD+=hjX3Y?3~n6U7yoJojKSq(amm8uc~Ea6NyVy)r9{lx%Ztbqgp7N30c81^e>=~<&57qBaI3$IOk=Zb zCVllZh)wTOkDdD#98BO=dDZAn&gb*-Of-_#Bl}ud+13&Qy#7G~3G9rql;$LRdOJ#xF|9PL1|;e=Qfmlb4a=I@w1`+XtGVNraBC zxXH56_8%a%61-xjBOl*Z57L)SmLtD@V(y|mb$l`Q2CEDM5z6+Q-f9o`wcjRJ!R>DjfBB9sE&YGz4PT_vtFe>`2W%LjnS1oPuH={iEZ1S*tTukb~14$ zwmGqF+qN^Y^WOPA|My$1K3&y&@2YjqUFY2HatooQi*lc0Ap1zB+O1aIJzp$e%l)>$edt<=pmv=kzi#i>W)CdpcTX)!+Msq=nDySn19@) zkVAcMmK}Fn;~Vg9n?ZX*^v{V%#2II{q9b)uVP?IFLUTHF#?M2L=5GF#3b)}yjS}gc zp9RLp=lXM10-5tpAM8&tJ{Tl(l|`l@)tHIG8bw&5(W=H4xSZGrW-5Ett;~R?fO?1@ zCX8s@e&EXQg&t-B)AXD+k#VOSY93vkR0W>AU0`5fKZsOoL4Lo$*yMy`-P>9Ba~LJ( z>v!s)RGm7+->qC`=3FC~ArtBeb_t5~ zhBrY2eMC=&g7b}!`9PeaL|7^VHh8o;-nQ>O1&5}r4QL57*mjp1kGjTs@-heRFtWxf z_1|D*bE~M}_N+jTY;0^$*bc;Ejo{xJ?6fx)D`=Ex5fH@{7x2-ldHP7*$MlU#I4&0V z@;|wv0cApKEEj;F*UZ(KcJ(oC8HuE6qbY3_{xJF&06CWLOSL+g&DH@q_Cg9IFG9P7 z50eBIVyUySqcbg#2Zx-ORXTn0jjb z62u9}i%Rh*45qd@gJx^&I3E=Xii=od+CU(_(Z>4rnc<9sk@^Bd2T!Y1b0voMnht45 zhwAsrD@hYi;!@bsVk+$*A*B;=2{_$j!A1e47YNE8O4(wCKJMx(QtcrRcJpC5`Kg^v zHZWx?>VT&Ncp5>;Mo}$WbhT!N7UW5@WzsF8D$}qa_W}A|>Ieqf>~`2`uB2&IfApU4 z6+O_6Uv}YZ*iy>emP8+2(vYt4s6E%&@-9pS(^K71w|!6^*UV~&wu4G_a*6jCwGt(m zk!97U>!*TjheRMr(@jJV-Vb^DOY-!?qXm-i@$fJ%19{&5vF$aplAsPxMGnlCI0)G2 z{PDCFSjZKloJmSZoKMKO%2_yV8)ULa-rlJ^69689U7GjFbPB}N>py@_ShN3~lo9&U zu&N046gY;UOqt4|K5eHzW*LV}gp7<#U~F~VntuRvy>6Q&Bdmq^yrko1vsCG4i)=-xL(qW2G0J1nwls1j=byd)NtFd1)DRX z%PGf&(5mFKW!sM=*!qb=N(Z{wYs(%yeC|7OCq=mFg}cn$Zu2Eg`bm{S+h?c>xm*s$ zMdgx0u}P=LA<2VauVsOy-w;$plh-K>grvopQsNSspvW<)+MEs z0#xTvjcaxyc+s+9tyy_X?V@id@7-0?yA@*<`!DfbNOzRZR+ReVQS)!i(KU<*Zwoj2 z+nZzY@dayI{@-6+ZXCbSiczH`*-%HS%343sxYfs6;E}OW>H;2E;_IM^O;*VGa_rFAFeczn6ZT8PQ{xLi3=Hmi37%x)J=m<}3eu@b zon*Zz=;@Ybjxk<4AI*sb`)_eMmDs8_@n@*-)9~s8pybrl)o;>xq!IFJM7Fmz5Yncd z9r@JnlNB`bt_o{pntZ`$23jsyb;Ii|UI#zO^PqiGSyW7j#e_))mo~-0;TPop*6#a+ z0ayIM`t{m$wPBrD455X;ASJOCL?2#>k8=g<9YJqWNI<(0gfb0xWE^thRp3Il-o3fs zCFWXY4qE8g+nSf3KLqv!5(`(c_^pjl<`^hv7&m6Q$!Mv`?RxxqY;90_aW(ewab263 z>}v9AW9}g{v=!nVCO*_35t)zbi6iTSi!1=D_CxJVUoAC#IlpAJW`PwYZ=;k@D64sV zyU&%QZX}gW(X4tcLS^izRC9O~*ahJjGU6=3X7i?=5q3#OW<^d?(j%I^r7No$oW-vL zlw1{j#a0!b9D-V}5G_mk(`sJuuI32*J&QWG zt(?)w5#UUFGcvg>OwiCTEsN`VO|CC*(!jocf8X>-)>NxjIoKzpNcG$IzG9X(e>*8F z<0&-#jNezbm~9L3j9{U=qW8r1z)eXn_<-t|ipbHP1Z(I7jqa177FwNSCR=pzcbYy|w3mDvmmD@C|?x zZqVe1Ny*o3jPW+yZ|bwLM^!(d>M=JUHWxVyzv`#nD;Vii45zm|W2McIlfz$sJ4F#a zkZJ|o;Sf^4UtU^Y$t_s&mFMXVUdHfjRSpAyEP|~Idr4Dc0%9nR?4L1%m6Wz|iwGqZ zl?253+v6jit)v{yWe*9)rC0sPfl5cCfM#0gETE4~^1@h&Twl9fi59YbL}AJ|_2PAk zY8#23RWgi_%31d(GW0UgQgX>W6R$N(EUNnDmg}7cWSpph z?@4@bLKJXd0&`tcll3|v0#n>&nl6AGlh3~cxa+4{fKP$GZ!%()&4d!h?GFmwod7n9!2KV_$2X!X1$@) zLXi5kj=#kDf{Tw>i%(G0F;1FA3tfcU7c$OgS&?s>-&|2xiduarURNfR?DHeE21|AJ z&m?@%+L43sof?Z%RTPQzPt7>ChJJ}8@mvPMmLRX)7SC26uhoL^13zS>=X7n1!>vyF zKXRmSM6%-#y#759P|yxcKVe~!B)5piO5o*kRl!iK;5GYkd=sTYqf4$gzEls0D#4n$*%m zLSWxea77zX)?JMpjO^5!6>V0RxneL;X9zM}CXHqsiYcfUqSHkeAZ(zDJ9H3$aUHnJ zmH(wwyx-%v#j(H{%b!0_GlU=d#?OYy!*j~*EZ8B?kix_aiz{GaX}Mp-vZ3I@PQfos zoeMA}tC$Kx#WUBYR@S7u;jQ|+ zt#*5lybsxYUcJmg$hH$^ADC2K^qH_BD#+ehWEJW&S=^$jTG6htepl>or z55=d$VqtG|DP7xGI!S@YYq~#v5la zOZ9{69lqJ%7M<07MLh;n?WueZI_x>MW_1o3MP=&JCVU7qO{)ELbx*17FmEpqd6p`v zlrplI;2aJ{*2Fr+gGBO=vq+HfYNgDu!90nQS4&c}<#zz8M}wOICuVp#tJvkU-vKw!O<+n+!W+p-IqbJ=|oZ zvCX=rGJ*HKW3%)jL4oacKhC24N^A>f298-Q4p$UJE{a!=Zupqjs#+E>Ps#XjKyOXW zq|%zMizO!M(JNoY6{2Om3hJcy6nGCUTH5V~4@r$qgS%-45v$U^bwy7J}pXUDK8T1C;2tzTR zf?@shgY*pzYIl|+j{asnMe9dh>mB9DhoOY|?<1DIfi@{jThqJ0g7HAz)Q}%t4enN| zC}g}i`y+Vl2L1&ijaTnR+qg}^QxuA?O%N~?JcQwTWhv(J<__>g-lT;SKM<>-P}5Ud zj({7uVs}ONY!`?%k$y3bmSaIg6(ivGy~t=C1%j*I>wofUWTSNI&Rqrr8F*Ask7CpQ zNJln0u!$RU2nxrV?sly*f62`uk3R;p#`QKxpXS3Y!N1X8zAicB_%mEe+J)tShNi$+y}&9FJ%eCHe`T5gk(B zIHq4E@8Gs{@oJ&+5$*76RF;#$62^JYPeOW{reZo?kCN#oQDD(YHnP%}r^IoOwTQv{ zjJSkphOZ5;5F4wMX)S|K?1o0t@x`08=0M*kXJ>N(HrMrizoN{8L2<6dVYXaH5)$&n z*Yy-{4C6NogA1>Fhlji6>yzhv%@4psImj<~>*scdf&S1cn!3j#D9fDluaB|TVF@2b za~_m>NdA4P5~+TC3_G^SBkL(+7_*{1@K;y81|Onzv+uaR6M~Y?3R0%ckFRsR@=Pg) zFFq2{>U#HcY7uSUBbdUJ0PlWtN(QM#qU>8&*bYRq*Eq0xln(fr+#n1iv2d7aN1a^5wlWkk6sXRR)1DgquE!ES>9u{qt zt-fbATdV1~;^lj{DtWpb7%LBt&KIl11q1%J7vNH4@lP<^EzUinW=wK1h$ciozlYfj z!ovv;Z4huoGK2=?#-#lijbp0A1wum9kz0PNOh;Dpxtkn>xr2vx3BOYhG0Sd@Xw$*hHrmU!-~URlYyGw+&bCD& zmB@B2xbBxF&PHli_qEC^mX$Yam5u8>Y&hb0Z8}G@$nCWWQ#m(>-&5sewDJLIw_xj+ z74e-A+P5NqE{+gH<~7dGkB}j5Oxw-xBO6+13tws1VZCba%ILd`zxC`$O3CTc8{<-w z(m?D(f1jPXbZHi)ym-?*((_I2vCvG1S+7$4aX!~|zyDj7UIgqQ>H{dNw-s%1b9TCNm<{&f;Z`KcdT^c*(I$e^X?$N9c%iK_Q+|TVYK{UH zCiaAWE*H}5mL9Rk_w&(L2!Dt95;IWdW4labS&-k17HEu)tC-b}30BwQ*HU`uzve_i`(4 zkC)X<&?GPh=sZXKP(Xy`&ub*5&?0~3rQ4hvW6B>vqV$*k<2@aBhSxqIeQpHZ*w-u0 z9?&>=f%AzH!7;*tfgwT@GxWB-C<@peqUZJ-qOdhbMED3I3O9XNe?;wMY7btaq8X8! zbs~|pjm!l^$~m(jLg3s)857Gh)H$68wac$ z?Y=%|h6qM~DGuH#c$-(Lfl3!=; zg`pKPfBj^L$RpztJ=R}Geib#mgFw#o$shoBFx!0^%X@`auj{yI&NrEa%v2Y2`iq2= zhpZspYFShQ-?Yz)vL9nsM^CDr8-=AqCMQO1YEfE#fRx>p!V@YR>PDE zrN4NPTUvNJEnY`CYO9I_iPL^=`(DTz9=%mq4k7j-P3SoEuw*E*+s2dHrp|?(Q5UW3 zA@DM<4edFH@NMg_Ce{T+Q!3T0To;btVR+XNU0`utbj9?YoN(8$c zr_lV?CaeC%#%B|cD8HI)yBQwl>k2*OXs|tRoSg33^y#UNMr@si=Z(C+m6CLI=>dwO-C>kv-o;GF_+=ZTySMsBvC|Mx6{H)8l4T z%`AgK6Z-8VI6j`IWMHdQI)zXxAKP`OaQEe_h2-)oX9CTOaN=t%2tzlMKt`WGXVeW$ zWeuU}t@PG=T;Mxw%LQ50!yjOr{LL|A)8zznj81gTxOj~QIoS@gVLuRHL5V$b%t$sp zE9vaWDeO(>hl3`$3jL*z-^EUyYdkeX!87=UFv#r!v(DN@794)@u?wgb8KBJ1iS zna72qrz8O>F9(fXhWN3ytR`KUy~p11ryx7lU&zIQUn_&tXoXqKkoLHJ6_=d#^Kwx7 z-c6Be{Y0!(;KRXnJZlxVym>$N{jOO)!dU#lkuf9>)3;l-koD^tkI+N$$A_%Ir9YX41KO zN|~$|_gMAkDow>NT6V@lq&FumJesvM@K(H;77zAuHk||k|N3p5;F3lc z1FCg7shxd$PV{7ed?D5osm{dcSF2;!GU98))GrS;TE)~&B`A@Nz+Z@ollNPPWN5(i zI(rq!(W*azuGPgI7s&nXyvPmIuE%)Q$n;|-g4q0yaH}Rb$BYpU*xgV_Gh>38ayD^Q zkI0*hZgY(2xP-u{0>U>z2~HjT_)upC3@w~18mc&i4bgWn;#MTfiv-~@sCp-nE(8_~Y0!l&?#Bi(MTzHj$K`Mi%S z#zfr>h(xAIShS%*=Gry(nUFNWed*-Z;vG3e;6?*#4XKolbR-x4ggbD!QLx^vsBOr) zMVB(L5s0N(=Z-dg#w2*%heO`7{l%HszA`aIy1mbNcWq9hAkH^D@cse);M!Ok?Y0aj zYffnE{`-`n6{qrKIM|`Lo7G&L`0jymAb-KZC&HdCdz9{%RzUCHRjIO~Ey|EDHxbo$NF9qgI^pT2OsfnpC6n}>DdpalA{o-JX4_K!*K3WSt5j3mh2Z+7lg$pG< z%nBMqrhYm@`~n@S#>)LAi0^8#J7eI$F`5lBq(1u#a42>8CC^A(?Vc?y^)IQ^?I|lZLVk^Da4X@+a*BIBs3GmBI$o^m3`dIv;E72rIVZ z5?w9#$}ZMeh_KL{6SN&NiZ%m7oa&a9Jm|tN_C161`4V1yDA2Yklg8B78pt@cpb zR1x(7jRvmepCD2(F4F<65(uM?M-bj{qryfYE%N!7`PQ=r_I`-1`2#PzW*jr(yatrCGH=N0Gj;%)PCX}JCAq-UbMM8VLlLz$c8RS+Uqr|-~GUyY$Ex*sJj_9i%$=3$jVFi0o za5WLwSD@%E(r~U1={vJgHJ)};-+g8HFEA3(v{2QH0b#E|CKCsaVdzV^7P<&G6fDc? z45bg_wF{E_H?+;F0LNrNnMPY*-nV6SOdw{AXv`0G9I(5dry-4dq~7oDxZ)kix0cYV zT${%I!8#5F1%LV<4*LUrU#6v}gD`~nMRHZXgV-=*E@0hZ6IF2Gx3%v)=9+MzS+0zP zy|k?O4FU!WQ9OO7a1iflqRC4PKnl=CoDNV(d0YOZWn~AkjzJI!AdC|C3Wnc*@ct$x z2@BVOhKdlt0o|Xpg9^t#sNI)vo)K>rQ-Rf7>#76Q8a*;CYn`cTt!5D$Mx-&hzE{;=cf#*1_iEZFxoyOOWaD`DI`Y-~6TiuUP0 zb^`V(kTwJTrhn*6-r6_W%@_I(ERg^`Y7a$u0R_}yay;tgzrnpZF5!(-veMltQKT%u z87hsXp&8H$;k z*q_k%)ppKauKT%2HvcmIruG7Ttgsj;?eCI;Jkby-9(Pc$tDed5D6=GS$u?rLaa$`L zwc{Ry`FCFsLa~EMy(XXdj3KsEUG2+Zc=^!{v`x^{FHeq!kA^4uE+6EE z$1MAD9`Eb+U6a#6#p#ZpR9Q?@<+{O1LSh_Cq#ru%TYMuK1Q5sF%QT+bCsv?8S0}H9 zn%C_M|62ci@%u*z@j{9QK%tA(CtfmHs(0Y*d9+!*Z&m;_+0rc-in99SZA|7lyh0M3AcL zf7ypQfft7Ry|0JI7n~#O8({6fktYJO@A9>bgiIyc*-Q{2@ z2OOQu61(gZQGHkS+nhC~>LhxeMP3OT47Z08gpIafJb!D>klkaLC}HinRkyXly5UGW z#yJ(@s0VR;fvebj98`oDXpKWO64lllENY;mL$}o zno9YxZ`=2;J~=0^yfbVyC+}T;J=Pi4axBi%Z706l&+pwcT>g_2$FF5YxyR!1Mu#zT zm+{(H5bkbDa6a$FPjB+C?L6mcrN@6h&}ML!r(r=VHq88Y{NL{L8r1rajzc#Z#TQka zRx0nto41}(rYXD>(XyOXrnIj#_>{Y*Ca~DYH5PjUISy|<`@B(V-3o%fOp*&Pe6G(n z;+MQzWQ)7J7S{Xlq46woe0wfxhWl2(m{&fZZ*H9Q1)$g^?m_6SS2!x(aOe%a8C>;o zd?mKZI%PNBqQ=szvis+#4k}2?(b}g zUl#)+j@w1yYi0DK5@PauXPd<@ycuu&m1p=cIIPc5EO0CqpR=VMHgmU)iUg?F-GZ>&_&nZp(=3V(gHs{beze5CZPcIe zQ>-(E9aivr?KXHu{ZQu5O+hf}#~b&A1N1hw-IeFaSx*CXV*c4Hu9g!VIePEYuY1#) z&F@CI?h>tWJDaIOpo`-TkJo`2GsOcXbdx?ttsmxoSJYdV=w>vwTQyMhVpBI8CMucj zdR*fr$Hp0N^owip#_?C)B$ggNztapB(CG>@lnJV=CgI}bYJIa8Bx5<;V3eskCU>^- z+)R^V3sl3#^4Y)n19bO|4P6Ti#|5m`wVFW_>rWn};G6u(oQU&rrN8T+2_OJ>{c ztk$^r9>1T)5Rr9=Gg-*7GAa#tzTM1A?ajKU=W&I!&4iH464yxlo_rT}R~}}Z=^4$q z_D^8@_$IV&RnK~pH|g2f{Th0aw7-g??z&Swc_Sxt=;u$A*Tu104YN8EDR}S9-~CH) zftY)|6q5v~vc|$ItzrjfZ1!$uiOp22FwH9aho^)s73<%(o56*`2-S_{3ey#`RcD=N zW+d4G8{e3k2XB;;{@Hf%CJ+sK*U9EH>i62huvlV-bTz=V2k4Ut)Wd?K3Gksw3y8K^ z=U-m1xUW7AzH>2jDnIyQN8ecunCtP`W| z0*i(Jn62+cGz<5!bA6ELrWH%Nd(I~9_SikRwC}9fdRK9iulX)2_1xL*zHLV6#xs-q z*650D&@Ook?cwnIVZ9z9lrbOw`K9bqX~T0F<~2;sQ6=f_!|>({zh zT64L%4!@;0K7|+r{+gP_d|$}Jn}Pn_lt++Ww(s5`Ia|f{3MtwO+?g@qAKmCMTs1`^ zd%=2KD!zm)rvE^{#p$E1R(~{EZL&1gU*)+elG)xmtGitT&YhTBqsS0pFPr55<9E{j zXF2@o!sIZTn3ddqy>8WH2)GTf(YdEF?kQ%dG7Yh!3m=|(yOFy7@m2YEyDo)1Wzk&W z&H9GG)|&h2RsXq?`E;Am@R_*TXI87v`Cn~0`m|7%!}0guVgmOUR+u`s(KORMXbt6~ zK_0YQy`JNf*|OY-?&TPmi#61M$K?Y=P1F?9iyrO13^zeuX@8sg+={&S2^-4#(Hr5Y zH`@fAN69lp*Jnkk<>mo|=gWqcrkx#MA9{li!Aa6%u1lwbm&r<7zTs8s>?~UKWmm%_ zwX|Ev#_Zf6(T|Pq%iEdCT&AH6N&Y}f*cnt4E0RADom#;iW&%EZtrn&ZVDx%B`pggO zFLKs9H2VHujfS5udyE`B)-PKd{FaFmxA4A^9^a+M&Cp}`>X7#r#n3+G-LF+l5VhH^0Oy158&q4;9C6;cAb*=WVrJdE9Xyg?F;1=RgQtPYs2R_y{ZSv;)=wlxfljadwmz0j-R%w6VVJ$TVJAnkgf_dKDKwP9`L85Zn$VKtRGo~7`=+ucpd zg+7xk8vR)dYkge+)qX&IEV`nMUzJwP-N^Oar@JEtJCU{wI(NZ9bJb*!t@>i7*tI}3 zyH46U=Xvg+^pvy1SF^3)Zo2VOG;SJHr)ehZw;`4}I-}0K-0iKt@8c`KHYCxMzvZNQ z{}DuoU*?MBN=ybuC%#`|n<~KkN7>P@aBNCnK5TRPYyTmhK*y*HbE)q(4$&(k>ym?l zotJzWsX;iGosoJYNG-hh@3#9HOq3ngG;Ww zZKp5)-pco>;wpY;M*>$3Us-da4u7Xx+EDUNFVaM*e!L)1J(8+vm#JJ?KJj+G z+NLMoBxf<}OwJ@S1J+$h0ZahJY$m~KHPLuA%eDIK<(X76IyQ8isGNh#8S|_H!ak+e zs3H)h7@VJ^Qj(}O)3|VaVZB0L?GwRMVxvXL>WqYnn$OZ*OyWI^{boy91Xim#g)6ow zxf!1!R9ucn;wtZT_%dmNyXRXWZJF=&nq=)x8uUfE^0@LtE2F^AtaIK5>l|F@mrKV?=Y48k~fW) zZjAJGJtqMx%^fVlbD)e=X$vq1>7eb_SxDE6ne154S|_P;alE^-(EFeiMN`0WtVb66 zy^C!hl)qU+RH1&x;b#i9q^6w+{H6_mUzF5g3W7*psD+9 zi-TQL_MkC~j(CQj{`3K2Ql%GZS@st!1PV4))ZJ0(fv~rIcU9)%WO|SDZhf|htNiRT z!2to6el`z{{F7BqmZP&jn&YRO-gUcbf>#2YTuBWJ3$y9EKkgS}q^E}Eno>#@HtU`n zm@YTp(PmDsD~~tS63-=bI|Bk`^2F=5nlII-j&!%1)k4B2+oQF->UQ&vQtSOT4us$N zUAUWDOl|o`-zJ@+_~!WC%F)db&)k!kBdmG%xA4_fj{8~kPE^ROWqo~6yS6*?yFB*F zNB2A~fw^n+$g70!5!$+=)7-;NTF}9PFatlP+WyIfXpZvDqeEhEeQfu<=at+TwX|OL zq~(0FWEJ6?`n7XUVk2kvq5Iz)Bf_m?WBCv{_iop{p`G0JXnTK3=R76n{wP>EcMkD+ z>q8X|vFo>&J;C2AeMdNUTRNh0-(Q}r)Q_Jkt{Yxy+N6V#_&~h3V=e7Gai2_y~h{==4XvA9;roW zDm&+W6iI5uC!JcKho|C&e*+3CE7=cY7$m&0_Dr9P>mFUVGU6e|;lknD^%LiLMCdO* z*U9}I>?Vt}!^(-oG8ZEY(*({X=ZFy?vogncH%z@9&l)=@ArWN>ewbL7@S?m3SWqw0 zZ(R{wy1kj)Z*$5nfQ^t(dl#>fo05o!TRs<-RmRq>X;-*q{pLS+cg&7!NQ>qOKiy98 zd@6}@SqrT;kWAH$vONw>(SlWuqfMUDa9uY327H4xWY4+Z`h+VY#yv)xX3bpT9)#<@ zQ`YQrNhHvTKS+1Y=eAfkzU{4K9XO))y?Bwv!&zkgH5~K#WJAYvohjVa zedaz$R_Gh~T!GUFxUDT`nz)QL`s!U`Uo!gEUma!Ii|pW4!)Xv#Mh^G0;EY7YNw~jO z5B|1ohL}1RB2B%4ACeUyV7_>$@;0|u%~)H0E%%qW;K@I38yTxMmiGgk%Bkry-g>tUmhUyH)N>KH-C4TCBpt_qK;~1v& z;vp87`4ZA0W=~WWE;135Il;l=c6zq#rHv<@`OQ3ouWMsI7gux`ee25Uwhd$dXZs+{ zsn%bIQDK(J*+Rc+@OL3-roQNQMeujOP&u~|#b?U6>fLHSw>jG|K2Pr%??Sc(bnicR zA^v%XN0*u!&u1rVn`m$Mli`qT8}p@dch+j2TgF_Eo_m2Q>hG9nyv>iTuV*JirNMYT zxIsM!vniUfc!okHbgO~=D_1A;q_Gdbf%#pIZ9ZY>pF;n-x0ddTUvYmnRzHsjk#%@< zCkl#ku&~hebC{8S$+wQwtWKO-bV!{$Om+0^=46gdAJ%#;kj}vF<$OFI8_WU5KK<3b zF|w6??&pZ4%bxNUyILAsd)p!QTC75?n|yjo4r1>qCeaDN|Q99{nAOi^|V-_BLt)&hi@A%!zs@ogUG}wu@!p3Qu z5OO(PS)L>J_iy>d0lo4|d*_i$0|F}ne07`RpQmS_qoTedB!cN4fwStXjV&OHz`GqoC6G9vwtkFN+2Fi;Ej`9Q&t0bS=jgrmp(e zCtajGemj#HcMJ0iu%!kXHJJAiFQWF`rJVX>Gl$C*@Qy+hHpG+{b4l!QZVvETS^h|Z@I^)sseyIgwL29hX_f$!0D-V7y*_}mq~V=UXaPKX=s-{TqH$qW>7 zJ~%Si{F${8cIh6cjABXb;@m^OD?i&!4f$8yG?;gxI+aTsXC5ubr#0z4g>1s77FQjz z=|buk+E@fi=@;6)W@&7i-4;(sYiZIjyVlQJX{%OFq*ljGsv-Gh!$dw|TjaJRhR@%2 zLZAP5=_Ql5+5r9WcN(p!W!21h%FHIgucFJko2d~R;Z1I$+q#e6&i7}@B7Wy@&*-62 z@*3Id5o5ESglVDl6mO>}QO7nRkefZ2K%9b&9br81M|DsTVLMlBdRHp3?L6c3JGF8$p6z3m&0h2LA)i~|X?>6Vl4%}KO|CYjId~4k zz_qitUiT~C9g7MK6D1js* zXq-E(RV`2cgLUb66QdkMWXT|@x0uxm2$?|vIq!juQ8w+IDa{D`o1=vs>0RJ!$3F1h_!3%Ib56uN! zM2H}_QvjO+SpEMl2E79;!1}W>4`MRoQ(%Me842A{l5M{OT7|l1=>hA5{98T~uqbo{ zPI9msAgUm%W3ZC~0NZiVKWusO|8q z^GNwOmif<$B_%&17Xr+imeB>kP>cQtEgr!Bb z7{D|ApKM_I00C){|CQ7_VC?6A@>T<){Q*Gg=LTqMOa=h50=chbw+I-rV2z8EY$J*! z2UG(q<^QGrF{m{;6KrlU_V!vAAVV7ft|%e>(QyXAP~CS2@Jj&5fYt{IuuzdWEX2G3 zS`Lc>bUPQ+`KLncZ8sqEvNeGDkNv)YS&;wqz#J^z1o~Ib|0c2h3tuA(sE;$SLD|cF zum6ih3Ayw?=3oo}BD;VLmtkT9tRjFcvl>WgP6PkA>3NUqwzsV}$GR#K>ebhb_~fUiD~BxvvDdKNLYsj1(vreVU!1LZ$ln zn9=;=Cek1*YNcTC>trcmx{lE}NhK5B3~HRxDoRC2TKS5BYKm_$anPx2`qL>1(d6L= z#kF66X^Qonv6&DUr7C3K9LXDZ0;MiR85*;3>rT+h#OF^w=@l1fET7d71}Q@jk1si+ zyMVIUD2tq!L+{Kr?rx^8k}1hqeK2y?Rw9RyMN3w)mbT7p@gwGP-5`Q~$mBwRsX1|@m^Fc` z*Ik4mGD-0|^t%Wn3uOMzUGJ1dFwK^{@fH|cRozlR1Ec-uKi*M@Aw2ygm+t>^7qL{Pa3WKYjz$xi zKutNGcz(wxPs%l8elh5Pz~zGaT1=KsivRq6l1_%t2#g;M4orx(2n0L|e3S<#O5a=7 zx?}8N15ZebqJ;7pHMPG}vN&G4NU?mpZ9DFpT9BIQ^q11A53v~SYD9bjMj) zT<8i~TUzAiK#;_$31UFHz!B&TTz*441*!sPB>`{Ucpp@KKrp{QOpwchPrRWb^pU>04&Zd*byN=Q>=dN$-ewnrCuY(LzE zh}-grtP#i{FD}(R?JGV9hBHZ!`?F;{GNNNQyFX zy7R7c(Cq7xxEK5K4A-bX6f&q)0gHC746^QpoeJVyh1cWq-!=d_@@jfTC}G+A1KNP| zvC6vjzor-LKL0%j1^0_@zv>XOTSrkA@S%;;k1COa=!8>tN7RGg5{<>LK4wI)#2jT+ zm_|})HEB<1&jzYBFD1>7>Mq26G^M>=sMyOc4D=Ef%pmu)1&ZQ_ew5)-i-RGK?tssm zn*X69ilID|^K;S?(of|Vn%;D*i3$~S0hOB!F3-=kB>pNiz{mB1XPPxvV;e|Q0(-GG zYV`)6!5RXZH{cUxg^G`Ui9Odz(J0dZ?~O&#iVw}d4BEQgf41ldf7j2dF(3LR#6tFI z(|tHAwuB%+E{Vfd#QP@LT9)~du7Y{GCs|BRLt)UYWx5&QhJ^(+5s+9op`UZ`Yp&WK zy;CF+rMuUmX*5}**EX_V4JVRx1^3tg@^l-k4Cuxy%PT!QPiO>2GDzG@yllB6I`)YX zJ4-7qR|srzwMNobzKMN4umdYA$!?(1+LOcgzKj4Y8fgNlttJ93Ytb4J zHZ8Y2sH#3n-n-@?-FROaubN$Qhb1mXV|R!mwS0?mfj1?DbN^TyW@>s zoR?V7Qyn}#27D{FU~Yb*+BTNeIIi*0ZOMc2vfEF3vMlAQA!a`=a43zxQta&+Xx;~$ zF-w-A$0+SXD)cG2O4sHeKqAn2io8_P7FMLa-KIx&Vh{lk3)N;n+>QG8P)t)g78lU) zm}g1DN~RG3yL@Ry_=lO=V{iL^Q)1AVhp?OyJw)9Sdew{YB$XRlm1jvSlLBLhiWg~8 zfLXH zth#KwfMW8v#Zk#Y#)p0KLrgR$$T33|4e6SRj~$HSvZ9eyM%d(l2yLSQPOy?dL5ik% zT7dfeC5A;lD+4lDt{X3EWO1H0KS6i81<~$NDoCR@3fO=H53%Do(20_o;B;*?0_d^u zH38Ns(VopSVaFY>#cSQoBo&J*`MZQStbR;I{(!01z!Km5hjxk_mfHB=pZ6iqLd|5e z9J4&w(RGN^KQawRByuw@zd@(g9)Q*PgG~e}W@rzNGd7K`ihvjI(J-m7CqTip!ZjdE zG;l6los5JGMmLEUyh0hHO&W8e3d=16a8ccURr7VJfEQC^Wv{wg{m{WNLrxnrQtY=~ zGkGN|W`1x&_i6><^Bi_N(}0MS+hIXRJY6_r%VTvwiDt;v-qZYP6PAcT)ra=}^1RiqyN?bmR`lW8h<6HbaY8UfqA z{x3Kw4KBH1V@`V|&T!kyGJ8GV@W|ne+;$Rd`DoY)A@5z`8l_F>CpuU8Xs^lS{E2Ch z<~A`R=Q&46y(^@p@=?gCt!JjTobC!e8KXrq2Z zqYJvE06*Sb3(M`tTkXRUCTCZgu8U#dvl;S|P zI6SK)te(k8Cqbq|2o_qZN~3hB7~g6C7!?dpp0r9cR8FDT83qCB8fXmFJ5(Gp@GkJ2 z0m-0{hM2fBirS|rJPSCbY8Y(9oh>JSU~=~QL*2!jXje3TnVzypFcD`YOD?H(2k#*! z>P}7}t?4pxSV48RcLw1@Ch0QFAyUfZk~;GWN~D_|C`X98l}ir1 zaLX@G5aMa)5Cre`76lzwW;ckpk=gAREcQZK2#I^L;BYH}1$RIArzXUFXxc!pF77R; zx&z?`Oc5VYz&BQ~Z!TvZ`hJq+FW^e1I=Jq<{z@d?b~&QW>!E}9Kc9qneAGmn;o_N$ z27lnn272W{c!75jQ8v|Q0&AH@Lq;4d=0FYb1-}u2G~fadyh4}Zjq1R@9*NakpD2Dt zyFj<%Hj6ZRz!-1`kbrq0AzI(wHleK}+ip>RbfW}dhyra>^b%vfKq12F7Trh`%w!Pq zf`37k!9sc>DQ`yx+vhP-LRjHmb>O;vFL|&B8l z9&Pob*$HOWQ}Gu|xZooia?3#JLn=7yh;P~BNEjZ%fjxsR#NE=$zj`o<`@cA#8i4%( zgn?5HzTj7_0?-HNsc7+mfIj<)fnRTY(K~&x`;7u9cKhSyH1w?U0uA!uz7vS;@C6E> zhJzLg-~*7o+D-)>kGbF;00R(?)KaBS7E)m)2A<#Z19_LZAorU-qwb=g;nkA4VAw@t zmowqQ1w~eE?p&A)T|09Wr62ZiB$J-viPcYB{tl%wO})VJvf++ zhqt9*uR44<7beNT#}K}CSHHN`U@T7oJlx}mANZiO7j{44G7CGovADWJ`U7BJa7A7t@0@q|$4muKIujPQp*#5^h%c_=fZf&DW$^iuA1q?Q zyV1l%2ruE_f#(=ZiGgPT+)ES|Gb+7qAT03=C-_MfwgV!%i;Tm=pUSWR53k|z@dVha zj{kkb3EXG^@H7Et} z=abS0GJVu`)={UAW;pK$?{aY92fF9MKpp^J%3Q!XpndW>-ZcKK3rHBm1HRWFp?1_C zB=k|qg`*@~*Tp5OeV0_hC?x;xaPb%L|A)0Vfs3jAAHUD%%$%92rc5<67120TQ)VI&no2uapETe9zpMkS#XA}K9OvX@E`dOp+r{eGYS@Av;b z%jngvOCG!$wYsX#$tYVXYfcK z`vP!o#E&6)oZJLmrieU;;!%)afE1B_lInb)eg${*SskCp_PO?14;hbq7eB^m!{^D+ zc1{458ZOj*rJ$e;pfAM6`$Ja_m)&rA26=$w?!WCuHsgjdJ-+SQXM z{Gq$BXZ2nO`H8%{RX5-j6UvXV2k+Q99*%s_u`Vu}rFV{@_d{j4HOG`&amfvuiu z1c2i}C$jlVf3uU@yvReXY{O6aW1(n!05|V6A7b=v4&0qco}kDQV@6$*$fzrAoV2Wb zB14LzB1h^y+$FHdsFYJ*uKAl5zal`Wf4bWQuASF`*XO(-_Pmb4g&*Evg<~A^$sa$h z|23BoJbr8dmQQf%8g#;r%%px%q%S*LLH7FB ze8Y7=6&F7aQcIaI3>@Lu>mb;ARDc6M0;KHtc70asbuYL}z#Rf=OWmRVF%u4#y7M+3 zmp@M%Sm?;mgQhcML6fNmTQbMO-?-e0+pln0hV4bT-+JWlaCs1yame3hjE&h$=$#3Q z>*^0XGsaqtU^kx&deqf_aB7OT(Z(!)gY<1QOoLn77_j%UH>?12ICxA4jwLaW)@w-E zTRg6Zc5dN9#oMt+tIv?|>7cTQK5b?~!8sD?ooo`yuX***mp@o=;x-9WA>%ymiyE;U z`apcLPAB>1&_aQ7%vm>&}emKKFc{ZW~p0LIm3ak4^_~GekQAitFvh*1z8WqQ<)D8 z;ly2cD&;N{HXj*7bsg4)2lvKPS@#TK?->;pkH_U!jiD}9>B6_n@l-*kVb3{t){cSr zP9|i1BH25BkYq2&Zdbyo^(5;}D}`GvmptKWF3C!3VZiAVp49#mEV$6&P3`Q!e!;uqlHfYPVHNnT@O?rvSUd|ySS-{(Mc>Nx5`s=>d`Q&lzwzSc6JwbcWDCa^fIuUP+T`BCZy z4~{9}`Xd733Ynb38Vd4$jHS|l=;4{qC%8ez?XkS90t4tsa_{vv3HxH+D`q+z{xqi7 zzdt}rKu!jlq#tGr6g>6 z??t_Tr-Rpdf7%nWYus7!TlAprlY)Bu2~Y9Pi)w7r=^4Y=DmU2pkbo<#9_+YS9lVdR zRDG)+oK(9}`_v5hx!s-mxSa_P52~oFgB&Pq8B2X{*85NI8V-+zYoTyGo`jumJfP?< zTc`3B8%{qNOQk*0gA3cds3Y5S;KLqIs&Wqt3T}>}I&S=*H+Scp66&AJq4A{>?wr?y zn0JKE_W}ky+CPpux8FdkC^248kjr9~=a6t~gEw_%0~cPL^`UN@)yLNL-^Rl377puC zECU|2dr&vqDTrzGpuWDLp#Ghb%72Hd0Fsf%9^=wb*DRZd?yo*c8{ZWbz@vS z=S@93r`1nQmI89_`>^U_d6XZ{zSK;z7i+ugf3-K*^TH2)<**?869c-=xk3CkSBT97 z$g5PqnUgH;>(5$Kc#dZGy*^SIyP*)sGy!-AbSLsTQv?k&jaM%0`|*K zdeENbK{aMk@a~HT_27#?kMs12ADru!v+^Dr(y=^34mV$pgPI*&xR&b4e*KyQ2Vae$ zw!hMal+*6icT9D9!O>2<%>p-8@olZjynU;LrcDf19R{^yDdVXug@6|h2Qj9 zp9&ecwK;bzoY>4_ymSFOLD;xhm>QE(hASDs>vRvf940P!^3hF*8;-fci)b=-cI}v98O8jO$sZ~Kn8xyYXV8ZVj1?S>T z^yTlzP>%*4c6q`#jXUd1 znJ(oE`;U*O5|0}~!5tNK?G6VXb*?+re1{3ou8pUzUeosa^F3 zk*p6G?i(u<)V&I=s_cI22H&2^S)a0*H~{f2V;AO>d%+9h6ukY^AGZ8tK?nLO6nuWq z>*X`~zt;A!$=c0I__l)$@AC+_!GN1RuXDw6?P4<bK5TS_ z7bLnxe@Jw*_|ZH7>~FiUTb?Yxf71@GH~E95$<|I+I0~>4U%43aa@=9xb0(Zv16c=k z;ZQ3DdlCRD_m77Uhjd|m3*I&f-A@6Wpq79qSgY-Kg;D}iC^)Nt1_BzHuuTau3@8P7 z4bUuyDtE|tg+dOvXm>0m;4A<-#IGbg!A3d6l7KaTGd2O_%V7_|O9DqkyNQ)f96%MJ z{lxY63W#CiX)rmdb%h5cTy=vNpv~4E5a6sm<~5=1Lm8n3&k3mRxgMVGv$p*@XdBPF z!cJ1V(%DmMeATvK0CUlP;Ngt~B=z(IZyWR9YFGFyhufgN)iPJ8BDF=uKWBc~vr>dF zfRS+0ReQU&Jtt`DIa5{7>v>O)@b21rdhrsVNUnW-18tLr0GW1F8hSd4H{gV)a?oCE z7hso;cth$l0_JP)=o*%bZwW|z3XGh$VPFAk;WP)nU}paaJC^Vapb?k1-U94@>k1#* z0PeTB!VMhVy|D@?-$lZqZRij(NvJukfKpuEy{>@cXzLqt(5F2l;R?E+BhN_qU8X=6 zMM68e?F+9-tlJc@{s{%uk3HaG8YakTo=~`j4ac@9q4p&kZeeJ)>aCIEKe%}jn-uuF4bdqn+`a#lO zfKPi|VG9mw(?eHid`CjwJIurPqcQAvgO>*xaP6QQ6c#h!Sg{*iDP_P;%tN+*W5D}% zH`xB20UtZv;A0m9?svJtD>V~ts@*LO#>%~alzRewuWuP79D&gr34xGQCg4BCF z=qT`m-8q;S-d4fhce>ElGzKb54B&dnI4IkT`PyDjIPqQ=V&9K}+fTUg^1e6x(C9IYb+LCRH4H~3)-KKxz#}rxRF7@_FNAX|G#IK z|E!@U-UPS>aL^S*Jwybf|Cc@g*ZC&_r3P^R0-o)H2VBjjApe{`JWKO|jx>Gv@W~st ze&)hcT(*7U!hsLoux-C59IIi$rVYJR4}NKTM#A%VdgRUBvrr0r_?)3fE`fbHI`BMc zJ|yq3g{R4r_@lRy6-fc?(f@Te8U5eMf1e%l34+NUJ>$eAh}|WC)zAx#m8|~hPmUJp zF$sd?jD{b8FV59iEFWSP2@{!~^S0V|1`K%IZ0+b^gg%xVa$ZeYig>@LuYX|yG~>*qs82_I@vD7$iX;NE_= z-p{w;umRa?WMA&+z$;|;kySn7Lj$sh$Xb!@L3RaMBeE07Hl?xk>Knsh8?q*38;~7B zb{^T=Vm`b_R-@5@E69Gm2?q_bkI1r+Jw)~Z**;{Sk?loRhioshuSI-lM%Ic0-+`>5 zAsike`--dt+13MWy$i_Fk+mT^jqGn^zw5){*F!#hLl%$h2C|39o+Il-R)1RuN|2=> zJBRECvK(Y@kiB^w4hhJ9BHNFw3)w|vbr1OP8(GIK9oTV@t=C-_4mXjhvzhP|*$HGt z$aW!%L3R$=EoA$UeZ0?ySY%s}Jw?`78xD7o#UXo(dD%N;myjJqmVhh|SvN8@vW`MN zY({nn+3rJZz2cg1C`FcttSd_gP9sZ2b_&@xWaY^29Ad-K8}s2gYFF_sCY-vd18sk^ zAsegox>o_HZ@Ynvz3C4zcu*1^bO{eCKg1?4SBFF8JuJhKZAbPA*?MG`ktHMhfG65; zm`y%<6%JdG?Ll@A**;|Zku?_ZAqCmr$j%{astSi3WU0uyZ|J~XWLK)fAI>E>S+Njz zO)zi-c{e*2j<%XXCAL>$dkh}aa+ePW@tAAKT9B1ghQkA7hmq|<7Jr0IrXl+q*->O) zuIs=7Wba;v!_Ry^q$7KX>=Lr8$etlPj_d@o`^YvRJB#cjvJJ>;kd;=1Lp-t!WHr}x zpdHx(WVLyG$V8TfY|BwL`Tj*X+(32~*;ST>$l{TGNA}@)IDEUqhwI4dujs(`zuDw@*^_7CupZfMWF41v;4!j8$X;srpwTKTvbV@SmW9J5WVu>pMfMBX z4P=SP^0mr}Y*#v)j6?P&hYtl>Wxb>Wr;t5;8V60gSq`$p$o3+8pjB36&yan3 z5)RF``B0=)){9t3BD;y~KC(wzWkt6B7@Leob`)8uRu_@&MOOAW9J+4t;fYokk)1(y z1X&rfGOaFN(1AQ;O{L**0@-t|E+VTyb`IH(Y(Biu>LRi)$l6NKc_4eK)y4BVu<o-TIm!w_KRd&LjTsd^mKLn8N9sI%8W7Ve+T*jTl`T4_T>pm~cta zzN8Feumb^Zwe);9hFPrzR{GdLUNnMp8#31Yqe~Db%~>AlAMm*L$@8X z%-lztAN6O@2kx4SFV};a#!O@BUn%)`7;H8DIP{)t+Xh(;*jH09#hn+z7jjskL2BE~ z`ykRbnqOo1rQCweOxi4AfyQ}2?QBti(;kuT_3%NsATNiD=Gkr+g2+O$o!%xHwr4?6 zvWOU~$2MW=h%5})XKM~bM&!4M2p@g6z7}-N&5RsSWYz-=MHXB(ImPi3Y!>%jw`eGr zO}9mg2u0Cs+Rt31|6sPqCCP>GMMKTSBEqwlCALA>$a5$kSFWR(8-h2>TddQ zqtQoVpa(`H-AQ`6YVoNi&G18nT3`N08j;v9O2_#lY;;zONGSu);7zb%_c>@w93#1ee7+)qDW8@vpAqZ6&)vN# z-D7Hq$J7Spmwc6LtZEfgwOS%>l#d>LzMVq|dJ(P}auw4eJ>8o4ldEy(4HMBkg3uLf z46p=|X?Vs29M|NDO(DZUs=kpp31Lr%C7~= zR+h5WQ`s7)Y%Nf>v6O9|%C^4t#|vJK~g`$CX{4 z%AXSDFP8FGqw;rwvirD-h*LqBiaf3&3shvIiosGbBr1ldiV>z_#Hkp^Rm?aQ6{cc& zs@M`0ho#~)s&ooeI*lq_mP%Km()Cp7hN*PpRJzAi`UNVZFqN^ViZ4+K3REV?Rc3Lj zK4Gf9o+=B8sy|CbH>xZPRFdN=n>dwim`duYa*(KGEY+Y!)sO=)ES0=br6^Fj#i`sqRURyrM}f*SPNnozsaPsifyygRHO5mlmZch7pz@AW`FN_v zu~g# zYMg4Cr)oM&HN8MJBThBbQ#FUBn$xHXDNuzTSB1r?=7y=}d8)!Cs`)I{{6^J+0#(Fu z)xtQ{qA=BBPgSHuwW?7S9cF23IrBo32W$YoT9v%4|A|tfmMNzqnZb-;l3@8!1WUte zX3NQ1Ho=lHWCU^ee`+QOIWw4*gd2Wn7|dWo2gZ`M1i@g)&QI6cihRh!L2~WNP(7+t zyJUD@;`g{)pa=Zpcavh|>8y;Tqu*Q){XHOnwEANBpw8k*$^E=luZ~|R;uDM()zz>*eORjJs!HPV0B$`W+r`Q9Z2-y5cmV=NWW22Y{foh0mP*ejUKS0HBXn77X z9LIy<7Zx@*7J%?~=kxhIeq45Qt*RT5Crug!{>-Ca1V<|6&z3Z3(VW+E(Q8loVcq|UhQ+3~s&m*Ea>X_D~yCSoY zS!ATYFYVXLuqjXz{Y$6XGhB}a0!a{lOXT7Yz4h72!At-JMOvKg{t`v+R2l3{4boJ3#J%V9qokDtXqf!7*GM zhEu09)MaM-_SF$`xiKAZO!P!RQB11;wK7Jpv41SqhJX#KiN|_k06KoAR?C7}JT~eY z%79?jqUP0-rT>-+TaFT_Wkq6(2KP#0`LRX1Vzq&o(1woWo}*E2&DyJ2OB%aeHg0ZiZm6L_epmf(a-J_LilE8&I);*Q3kHI@m4KjA@)!_SFC zEF9jxqyHVl{vX%z+AeFyHI~P_>uAh^rTW3{LwGD!#vD(B{YBQ|yDK<;)0y2k{X7@G zlvy)A8XWk<`l&=B_)QJOG0L5u&U!ZeZrOB#J~{acF_9;at4bP1mkbS-=^o+H6(zo> zKM@~)zdlqn{pLP5s}Kk&u!|_ zbJ&q5X{Ba*ykNEh|^ql86VU0zLBL$KEJW4PPg)0M@LpQwaa+_h1 zWH;;^5q~(K*MQ`KOc}OufIq{KJo&u8&+oAQNq2|vnedgN4xVO633ylxID^VTNS^p> zS+CY1Z3Hwkwl~l1H4mI4M%x=ud*o|nt);`bRH%GFa zq9mq0lSl$Cp&@FCe4-RHmLyznAkWcJ_5@3{Y7D-^RI4y1ZMF#5Y)y!n>ZG<=bXh-Q zft;Z#yL)V26?x>0$(B+WTww4HRvrEoP0D5Pk5{ z?QgUQuROE?2%W)ron7HP!Xu8*Bz?1FCAemv#Fw~x?9jMT-{v)p(uV}13Q`~eQivBA zUo^3!2+r#FELAj1wc1k^ZEL~36hTZTi>3tk^8#&SrZo18-kBq&w%eWdh%S zaHHR6Gz?l5+wndy7KV40SkI5`>>sepZ$+#=OT>so|0iN$G{WdZ1jdph6XI9jT^ZXM za*!L?UzfHBoVWnJl02#NiAXPqWhP<;u?8oE!oL1r2mBR!^Ne#?=yzNC&7B|-Z!+tl zv);1M?<@R8z5H2>LihM$(I(s$cjnoa-eJZ+aE~vUL0C;6{hbcEA|m}+%tp-Wt9(u9 z1az}M(pie#gzJ4vr#=*qPa0YHzIBUcF}gxnik<3@EP^-JvZS~65u2p0be0=OE!QFB zI&!&=T8+MWA0VhQ=^n=AAkAJ zqcw>{6RvB2Q(XG53Z@7$d&vLQ12g|VGPCCh4WT9q(T8Y=Dr{-)(eTSX_0M%^_#e-G zUi+8~UiW&>{?pJ)atMDBiLM9=Lxjwto`b6V2_~Vni882?5M129=e#DaL?|%_L*Z z26t?gF%IK8CJ5+5dXiFP=aD4xfR)6SPvdhi?qgQK;;}SjvH@XqUb`ckAPI&@D>Me? z4r~omh6k5orhpEKox~U%0W1wun_0-n+G%#7Gm2>7 zx}yVgC$yQkAC9I69_5P$?TOpon06=#zlAVvbJ+BxkYYl@lbfqigK;cPQM=9L2B^6f z1fRe_sxc$_qVD%4wBI+N&ZDLqs5v;aedT=#fA$P!Z;d}Qng_jcbMouHMBm8*c^_hr z0b(vend4zxwbl^yH5@!8Pt!-!M{d5TzMmWigRO^>>w{O;Q{!j|G$>Z}v_7O6VMdtG z?9`ZRX6X0T_!FRq-RhR$=ORKBRyi;RfI zfm@3D7eXw&Ru`lwo<(>*hX_4#GD=Pn(T5R&*IPF`?_x^u+-*Lx*Fo?kDFgxVVlm6pwd5j-IiO^AnvMazYv3Nzt! zM>F9xn$-`^+kY4Iv3wzL>J%_1<9&M*-lEEv0wccTOF<-y{%B5D^(7YlaglgK5|p~ zr@6h0)Ud(MOGpiIm$K1BN|{<$DH2th35^_0g>;(*I~0dy7z)WFNnB;;^j^S|)8ef0)6xiau!;pw)|oTGd1ECfuHqZ0qMsem>XSE1T<61F~{CxXof(LiAx2vrIhX~ zb(%L%^rp>@;-M_eG<=PvXejHSXDp40-ZWoo{nIX>%gCk8j@je?BPqJgjw_=u5}@C& zMQ@+PtQ7|Y*3#38MR!2a*YSmbV7Q^;g`-l1qq@w+jxWWv5No{hV4=#- zMJB}5+fZ&KH%4w9_#;;KDIsaWPR=Y4aFyvyi?jm4QFOVnPV?B+%B`QokjlVkZ+vgCNv1 z=~(ECnoDy`^aUCWnHV_Hcc`_VL?U;i7x9ez?LJGHaxs`B(S~jmeOU?w#!|XOiuz3R zOel1qJRCfYc&b|xCAXH^i%Pvr%pFxGx<15mH0B7jw>iWDaaxc~bP&Cpr*a8)(=(O} zFlZYS#u}c+NJFRF+oT5tMu>_>m;^bFG*N+NT970QG{-osLi`CEfTMne#@DF$QI0 z^hkzszP0y8zi?6UF}vN4>2`YDo)kly5Nn_Ql>{$lYM<|HfNXK$7Dh1of@HMMt<0WB zi(!C^xm3>$)lgdwyP|s>M@UK+(@TUwV)H4aKM_bw6sN~g{@CJ+ZD_aBWLdIQOl+sv z1Y1U_DVe3;HeIaCv7X21TZ*67r9zwHjn3ktjec`!=Qu7V*eES03=z)gg@#6uqM}7o zRq3#g8=Y?|goJd)6r-q7Wztdi6>71KiFMQzQL)t&Q%k}`)-TSTpa-Najrc{MPotvH z2p6O1M)!*|B=Jlm7P(PcrT z58mEHu}nyMqvQ7po=0;Ih@Q<7#>#?)mZ~&Kr@~>0aEXi5UecuS3$slTii*O8%He@& zEcE#pl-1~CIu-ukZFfc*F-OUS6lRXiI0swXxQW`o3nq%Gi?c&IMBE=3FX)#2JW=&` zL8#+LDeB*}4%<3GUzbFw%?pL7N-A|4ktP!#zCmJ6#1zrNi`kf%G}+J~+Y~nkmCzp7Rf}!sxdqOrdG{rm zaiZd3QrdBtbh6kzjunFA^%vgvpJI77{ij<5v2x%hp_j|eG=WAO5ywD_6li#~*?o=W zbvH03gmS;dqKaqIaP&Vz#hFqvLHl)|n8~xP6ZUhd6Z(kLq@)6eZ$j__QNd( zS*DeUirS=uOBahBo|qG~+S~YFIF;pT~NYVmr0|jKy7YR0l1rRNIy!E2zAREO1nSdUlFqaB8 zUUrcSwEBTbK(pjhD%H#omDetEs+ug}w1EnZ*)plox?%F*c>>Evld;osfsTpBh`^wt z5ujK^#SN1Oy>pd|d4;3~^H836M{1$OPhfTTlevUxCuwS>Yx(rNRPe*}k`5Nox@~B{ z6g_s)IAW&gX=kfb>;=hGft;nbEc&6tQloWhSaM3nP7*7tab4nL$Fz>UFfvcz2O@El z9oHK~csH`1ugttr)4Z#vF|60vfv70d&TCNYg@Hqa0;0Fov@T9>bZC7rVdQK2i8HJH z8Ir3PjFLs{6d}l&YKs1Nfh%LG@zym=In|71SCY898n*_BOhiS7_xm{RmimbEf0KWr z8bye?aS|I7zLTEy3Wdbfgm%9`H?`3(ThN9wdll8J9 zsm(kShv3CleJ=vN|NdpTEH;lDz_l0d)bl0iBoha}#S-U>bi#eme#tF*oWId=#zkhS zQ9l7&X4$WnRVoQIp>?d8*3*I{^Gx`M^(1M?*YN++ec6wCpP-|_x=u8`abFs19 z$WvghvAM30bPA)pZ9Z<4G%M&MLc)?4DN7FmOp|!xcWIHdX(UisSxWRB7~*sy=p*l0Sfv3@Dk@Wp*E@vWJ)EFP9o z#^}4HycieL}ns-9C?4Z zO$T1ZCO>F+THMe=A;wqQ{4Y_9Jd!lV(%DQLT?3f3YV1pe)`>MDs#HiHb~mb`>Brw9 zMU{7il93uA(-(`tP-2nzNaS4WkSVt3g`^5YWR$U=JsFD8(o0fRGw?ljmp*2%7AHko z%ROvg2$@Eh!3qeTc$0@Audz^n&@8PB((dujLmlY9F7v@j9MoYhkvfPCJxz@@223vIL44qeitl(R2PIy%)_4p} zGU0nD`WQbkFf4P}=^yVbD*CIh1GvEO0d)@#XwXnbr>%5kOrAdG+t>CVZFjc z)C)J~nb7?b2xIFI2T}1Lk7Xkf$xKLZ46EmP&^(d{=2kWh_Vg3sM8Y3zKH$QO$7~)c zD&{S91P{vSbzl;U|I^aCQ)u~n6myva3TDt!m2sgyzu3~;PPJ6@BsPAq#@%{~kgqmA ztk2K3wEt*tBReShWZx{daR)53D1Xu@P@liXGIGH5sm&|qii%Z2tB5+;mZcMjSz=Qm zKiN_eHI-INMr>KiSMzw}G)vpVOGS@E>(-2XCs2u}*PWM|+uI4I_P1=1+Bnyd~;E8 zn%y7szR`9H9xKWI{(*&qlkMp5uHNG0cz)yvQO%13gVN*e=LzV{T-(nzhOx5qu5<#1 z$##;*Ov19|)sp+BvbI2e#g56wUa=A4h+NwC!@sbjC#BOu8se^i178 z=wzXdG*0Npr6VnEPZgRvG}ua#4mh~i2svC)t&PBPP?Nx6yt2}$Qdo5O{+(bcxuwxY*}<)e}Wtn{A0;gAhgcGnkLi`s39Y>kGV zkgS(a7SEHD?wEf~wsXHkzpsNp zEVUH%=RFHO?!F>McCuBxVgXBShKatJ#&D=Z{s5XAKo<`{C0l^$S}@i^k<@+5J7YP< z%>rIYU>1**ZO1fe7O~Q}X&7THx`mYl{n%xtc-VP&N#s|fRE|(?lrW58ghh~0Zkgo5 z5Mn80C>Irbxp+jz8^x|*2KM}kh9VxjUp^R0s%<6_MhV;Kw29MzbR$%R!q}ys2O+xq z-l&0R#G|RGXul zGJHZkyG4BQ6!(Q*CSWgHo)%4GH3Uf$4|A8Jp?NjjXiW>LQizqt%WXhX)Ev zf7&_Es!1CXGiKH2JzJ=)nwix&z5X&Q52p=R&zxSGxy7i`P0Gou5*|xBYP-cMw9oRF zr{y7kgj-o|^gDVf<%Y2Q?TnKbeUsXckDGaH=S{b%XHRF?}bwTox0&Znwbq&U0lNd z&)&i_L$0Q+?q9nuH1qU`%x{r6)nTvhb^Wn=tjE!onM1N0-@6SRxA4cf&8~yS4Diz* zlxiqj9oy?$MP|X0!_$_#^In?<BvB8mZf6~W1+iE)}5}m5qYtpp?w3~ zR^;;z3`q=+;SiQZDQUx8N)2-LH8Y=!&6nL9envj5k*K9I04;y~f_^?||Z%V%zo6){qBO?{3(T(fcgojdjSO2%!|PAF^~Lhj@$Ls@k% zRrVG04*fjd*O5M{Z@tGTj$#jr=3Fn}JW(wicEVEq{Fkb33o~LiQidpPua8 zC5Z|Ad$ji;mR0D0L~e$;Qg?h-_lVvaLcTd;-X^v4@B`&;wMMC9!lPm`H`h3R?w@<{ zCY8I(g4h|iUGBTtanRhH!|{Hu4DO5(k00gbcspL6(b{n#;q8Mj8_gi>fmfd}JA z-gy?VY-sU{a&J%H8}@wtN$(|In15=4y4;<3$7ddF}HV=yOsn@;h7?KeFi5SnNT| zk(CrSj+cy^|+Pg>~b&k24?FoP6}lZd{?QviQLBwnbhmCWOg1T9^)uax3ll z^(^4eeVMi0!H=a_^k3lRr!9&9%|XZ zJ(EHQ+J71rPmI|8~QzGbxQ&h=eBF2WILUiSqZN9$BCHd}4-ygs9 z{b9k4z^r4v8G8;DjU83dBB1-U5=UQ6O1MX$JKZkS=g-{ z{l;wEoUIoUXQ3Vx4hY$~ot=>4+0k_L=boRP&w?g+Pr6YEZovt8t<1$2Q(l%IHT_%C zI)3wqg|-74raigKXNB;o&oTAWGwd3gdS&HSX12Bo*4EZbXD&|HsD}zKRU|(8 zb}ozln9ScX`_i_cox}Q0_UOOtXyS}b>dWmr=lI81AF$r+cCn%M)wdt{xw<~R`31cz zm;LH|WPZwcszuuU0e?r$5mg+yKWOuSx%Ls?W)9n$HFd#dMzH4q!Jmr`zoxaEXBK5kwaP`)f6AY#mQ2Zo#% zGvfRAu8uD?=%=EWE{%?kUi7N#n}u4$(HQ-mC{r8>Ha%anM3}* z{$rrigAMOIM!ebmqd4&Q#Ha$(G7d4qXGxDO98AjODRk!OZ?LG^8>co{wtl=$c+|z4 zBSvPM8L8ZPy6ry3%RdPwkDKzYWa0ZSmESaD*`dXogJL!XZS2o`XRdT6sizG>EpTBMrvD(J6)#2=3R zm80dFgcn;zPD*vXVnOze@Bd;pCHBc$&}$~zLY0e)^NOb>-Lr=MnUj-~vVDK!snbR& z^_Cf78xo&QDd>N_v$OKc?UflHz8t(AePeC($$ZT5>u|V`@L? z#M=`mw!C@&`gQw^OOyLo@@{a&CJP^pD_Q=E)pbu%`2OoY!E9BsZ=Un@!<$V{Zo5`A z?#Z~yh_E@>gJ1X8RP=u_zR`;iuKn5FQS*B!qx4(xKL05vfB6KY2$Gf+W-5H@6Q`X! z@$2^^Vai+S)O6x=W9!w7jEx7YpO)Od=~Vx=#yQ*Taee)UTerS_n<|}T-^ahvW{Z*b ze~kf7W|Z&tlA7+dw*ty*y4Rhrt5Vv2+-`92)`-F5>+16IwPO(RWAW{q8ECX$4*t5Q z9&)J_z4)2QdRKnrEqe7V!28(da8H+%=@H|$mDF{~@(uq?uDYyuDritY`$@@jOzguF zM(;Oz)&Annm%=~Z{<%__{ymVTO1M!o_fXjB3uotjxY>FMo!Yi>+pcdV%JsKRFK}97 zw4#0KUx{*2-w#>U_fQXN57ZwXdFs%ukwd-i)%?s}^7P*J>RZlEQRojpe)#5NXKp`i z&&|J<6?82!(L40JeQL*-L*pM0{MGjM?he24E_d#{{;gzM-T3-z3ikS3_wAeI-K$RI z$_$qMdOPjyQ89NlpQAduo4Y6=Vm-}eI6V^HNZWi$k@DF(@!;@RljoSDSN=F@nDL(; zA)i`8!(c z%SKfEl(}}@uTuxj)R-p+|GF1zp%C8ul&UPLzBN*74L8FvFjZ$e$^N>QbGpy+=gW(? z%qr=2+~Oh}>y^4=j&y#;;qGJ~)^YUFwO?XrK%}l>jn;|gD;i5liKBl@B zC!6uuc4W(n$MrS0GCO|%8j7OmzKOo5*NNhZY z9iv~NCU$jX2MBKz^l9)ve)70|#Jl~9w_bUGh84Jf;Op0O1rg!+LBiYAZ1e7as z&PE+qul)G2sN&-4WvS%mg~PH)4bROoaG&Ty{rK}n`og#u_leCxb1c^t?UTKZ6gg}% zI^KC9&8cqv1Y_r;j`KH3eU|Jt3t0BXZ|K55#@CnpMk#bjpO*Yy>xAhH7ALKDe|}1x zH1=l3iER6YghK~|lfa~fH}g%e{d)KA-NW*8{hXt3EPe9 z`0++N_Z>L1e`#sDWdF6Kzr9V72 zQ2uqW{v{lP%3-%xep73(+^ru#5Q#BEr z&)&~$*)0fg`xN~paYVMW^Wc#CPfK!cn_7H%yKw6APrJrFUgY~n*~JCsdPz%4nWj}k zPRzB&KCjqYll`!~#%1L{p*L=Vfq`$3&p2Dxz^6ltd+Ns5?@#yZJ0l{hVqwbwf68!q z>nVY8ZzqdbwT%_`)McYIpN)h|?+?cwe*L)LQ)9!k?!AJ!b))F)YO_hpb}#YgZx97; z7@pX^B|OO5{m}xWSNx2HR!M&k+jgV)czxR9`570)yU&W|O5P;yPh9zO?bW{bj~*5Z zmd)(7uX?~kqchlp+Nk>IYTF?L+s~lkBs9b zhi+%i?rp8o*iBcMu5ziGFIhU~2+3VTe0afr@sK?ECTQRA-<31Mum^RHpJ|DVubOSd z9k74y!i9-2acHD?ZScrdJFNIA2G2d-g^JH^p--g-X-kFFA6Mf{a}ys%noX^~`84f8 z?Xnp;>s)-$jm-FcYh+k)<=gFt*4$X|<=&vSwWZue``3++J`?7(M5A0&CmCt@AetT% zwr}Z*1p`Cr1E13#-sYNX{Q=AL_0TCp7Vc&cW!2}_l>gOUGd1`8?;|5!JHoS@rTkE0$iE%k`a=E0fQ zdVRBQ?fH9lw`1!fo}ZnNkMYFs~)}=M2EXB!0pUYV_sGF zpZ!+*qo>r0{7=G_mOew?jqpwyv#%~|`P${H+COx6XVv_i)BRigwx)Z%*K2LX`9ycD zr&-?fYW1HrSBqV=<#UnI?DjVmCEquvnPh&Q6c`(pF8-4BdJOc+lZ^|1<9*?b@zR$} zb*AGOy6M!}&GZgCd11oo>B3O=d%vW|%zo8)J&|3qcPF-K<6Sy_X53 zZYJiPdxupnI(MKrX+c9>!2`v{L8%y3-`tq}I=ACQR&Qz2Rm*i#XRrdV_Hno|?chv{ z(atxPzI*z%Cg*}jM~!pqjB_jF_?wq3nkCWwQ8<4px3P6)_VdZhT8;~b)comZ;?`8P zF*4jUI8;}$sx>UJ!s2Iq_l=RxPBYG}yH?Y^th}T2hxGhh-h%F-0n~@3GepdyhYo<9Bq} z)$0unufIp_Is3l;;KJ~e$@^~3ar!+fYth|@<=ZXR-WnNI(fYP0kC>79dR)V$9pS#~ z2~(@jW9U<-H@>c3{z=cJ^t#!~(5utq7FmxSb&6wvWAKz$=r0}h#KW{B?`iLxi$Nv7 z-D-XwdNiW^Ty=Dpqj%T7*Z`i$f3uy(if0X7hL1OWdQvMD6`U+JBeoP0L(DSoAnAX zbMJlk&3l>o%_N!ZerL~j_UyNt-y{NU0TRG!Y`_b#He#YeWN`E2z`(%Xqe|`uE=~7G zIVK9Aa(mZvtLxgg!^6Gf!UeOj`|sT?>2>qfFX0*{`Y@|+C=m6srJbs)P*(;bgDvFDNcJ@l;NcD?qgSw@t zIp+13CxW-ZUBb8%(=l%jV?PbIC|+PXnEzR+)VS09Vk?51?QAaXh(f4mT&+Hb!$@js zxEcg^({JVpS#~YzNCe4MDg;bebl!h#n^$sk!z_FB%|Tst%Sn~fdQD9KZ}X!W@pmHBCmA!?n*uPH zrsf<9ZP0$Xsa&`-r^VCB#^ZCh%u#^&-R&$G&cT{97!;sA;jU`sCzORUm}M4E!^qCg z2r^1d{XM}9rzFGW#+hV1ri5EcRK}&t5(()50LaN5PAmaeAmfOd(9+sY$0)0?v~zWI zNN|dsR#taIwyvN6AOKGrtj9Xb95(9(uNlwQyM5qt+<5Mmcr&im@_*j4_+KAYz9%a; zDgn!Ire-}pa3L3&7^T}~kP@Zs>O?E$hP8=b0R&nFN22oa)H?f-L$?Q&xx zSQ1>xu*4M3o_Jm_{at?7)S_n|!x;=ag;L-gjOdc|rgg6Pjupp)G>@;Onm*L=D%*R3 za`iXQ2^R@P&MkYkwzeLg0!6+*KLx*S>kt!Te{QdauP>Up&dS_t4N?eDGG`a7j8_W) zHbG8&Va)KU1c(y2?M0qf{(WrXCIi%1@Ev2xsJD;Y?xZfei%_sWFROt3bx(fkoda){46~4 zJ;!%1=(*|nnGe42u|4W|fK}3l-Logaee2IYl3(_*xqQ(sldfKVu~xJBy2p%f;6s1+`=*c`!f>QDS@2O7%fUSHX?e z155hOX;m{m8^PkjK2F#0ZCH@??&#bfcvVV-S>{eIqg){|6iy`c>1P`$HAEqy3$BCZ z^gX{4uQ#%5p+C+G^++@=G!ZR&0T_aoJ)PVJ3&iY%@LexO`$Rq!m87`G(CFxH`?Yxl zZ4<`;!3~ckfOWlG;)+$BDDF2vmRsg7dCKRjHX19zR*nNj-_A}!$Km%C-|>$ef+pr|#FX0mV&h9R}WPomAL%eQc8Ze{9YmJaQt+}4|)EMOLx zw1>T>*H0YAuVBpb^-9l)JST1x5XyI2cTNZ<8uJ^lxWP=#Vjf3%J#t?OlVvCHnn{7% zL#(4o%k{@adMa}XeuS&b5Ce=t!ZS)GSnV9iPyrH&>}NrO-?>*DKdmZaVCYr6Bjlj6W-zF?=niPo z-z^KrmiG^~9 zm-`*yGvJy5CJ=ckN~=f{nWJ16Je2wme@#%Ps+loQJ4)TDNBF)*n!ipWXR{<5+C zsI86NDLHcuiBAOqT4#y>lM@(?R%hB5j*7JpL-Fjyt3zq!&a!&_r$^hm0X`eI_Dzx$ zN#IqRO=*ldx$kUFdR#Arf1K{ZJw4_W!!%9Nu$K&#w$r@cAZIcR?~`M;Z0ayc^WzZc zB7$0$+;^N3vimV;IUw^*>D>^I6Q^2H3R04bKuo2h5LuL&w*T8$^y}%cy!d`o|N7TJ z$=}Ro-|3XNXcYz3;h{kG!cCK%5C|Z`$iCVYU<~_=icI(LHX$JbaucoBg0oSCVwH^K!J9l5F^c9k;+}vI&$5j@AEWUp7xQGyYHm>zf zPn&abnWyAqzhB>Jv-cNyTLhmA52gaOksHsX95)Wk%sKH9hK#Sa8Ma))!>BwJz=yNA|kTmSo_#%_>aLpJyUXOkU<|ch(O~4lc zMYVSow+1T$hZ%9reR}aR2$YpywZ15Ep!>T`{ixvRU)}ZJ#=8=4$WY$NT5sN*f7s;Oi9|kltX! z(XC}T9;E;$?jAF=l~maSj3_o-*fB!Q3}1$)gVKpI;|oGe~3R%1yl%>NM@y+=KZs10TpnJZ|#5| zvZ|32aq-}GWE~y*gkK}w=p)!ur&;iEy}sPn2Yb-&)16VxqRoiF_nFftl>CHGGsR$8 zejj>U;KzIp{Y15TJ-j%dPb{OnwK-M_!pm5DS9;VyD-MCmfDdp46H{NiI_xm2$u=B^Z>hhK=uuAem)^-8SWVTRe$xPy2>nz?uFwV>8{2WWk5U~c;SLI=X3=4Ev;3+myLJ z+1!|=@eu9mP-fcweNO{fP~ssw^8`xnRmv1D(D@;P^6OolC&U(tXd6o6N0KN%#?YD) zg&V`WM$bP%-#B4s#%OxVXI~lkt@9ofuk@CuzQW@@x$jk0bR}sHfWeg(KYjs_4F72k;>w1dSNaQh_zpJz0?}04oH%6#Hk1>x5 zs`sjpI&kp)D1hqZAn>VKs+>V%$Sp>u!Gv1$hm!3bS+yiooWf6!3C5@qu+>)k3Y3?R+U>1R~9jSpEqc2#0n2zs+sx+p90 zb-N;lBF+=tl*%=7#$Y8b0ClQ4&xCxJkyOveOv$ia;MufJiFVaDK7JHT*sZQzZRR`9 zra|#^Q@{X6FtU;@73#3{lXD&oP3f%x^F9UB>{MAvUA%VblDne$s~tOv_OA2K6(<;< z#u`6yeAr3s1uC6$P)yzuTQYJ-c37jy7HX4n;wg2-OZG}nhwn1lEOxc7Xv>;n?rIav z#@%|auaw|UQTwfomz}k5U?+(_hI-;UCV#3@>*|VLfg{*~4zgZ*AA5-cjg9ujym~ntm&nkKc1G!Rrz6RcgNNaC zlwLje(}GoD(!ZEpP53+y|R4|7gCz#Jx=#z znf*Xns94^3@3ToqjKj)ylw6}o6X3=pfs}4HT$$pf$VBfKZr-9f~o$kMlfAAv0@ zH%=9KCUM1HM%Pl`uqQ$P?l#}(Jt9!6m|xQ_KgL7B-`6=&yZT$@PZRsR=H@&L`!5Num2qFOtyZ65=8G_sVw#lXx85N{LQ2UH~7 zT#wDctF$E>3cqTfn7IVHi&rr*$6e?x?XGsM-*5~alY#z0p{9?@&OZ?B#*@p!niF{~ zSl8r4=DV1a57FZFcev{1n6u#BZip+>N z%lY$cO2c%vrE;P~9{hQn9KBdwzt7CXg17IBOg)@~iwJfvjXJIeXz4}BuXn?%?u#^9 z*?lqu9vCdY%05pF%TT78U8&tQc<*O@fA(CCKDU6isHUbMY=x`XQlQb6$}_WJSQkbN z3MJI08r1L=n`KdNs@>Kni{bYYp#&s^F*q0}gQOv)#&BjX7 z6yx#;N3i67m>1LJ61E|rbVHVJsg(?TRYLGK9&cE_Jd$BvI7rSG0It4Af66!8re23Dag{b13`vo6b*-*;fqeR`-!T-pc_~wY zhihCU%Du~o;sp;Z=#&lM;h({tiG#l95%I{D;5E z+r)A$l`tZ%QFMjeD-p)^9hO% z7bQ#~X%7n$g9|Ti)rbh>d4+_ijm9Px5&O*P8M!cKe;G!ePPeZ{A5AyC z6nR?21#$=^Rh8=DLZo9~1bt^wE?X$$%Z6uRQ9PKdpz#h>&zbM5hx(^^uTvnxp~j#&jMZssZuc?RH4dg zX|DQW^sjcbnI2u+Pa7i8jr@GrZ1b{va!OrwTwws0pV9ly%zWeSBjVxms3s2GC6RDf zUYg$WopQ-r#4&&#o9XLi=^Hd%kbVXUD+!U9d6u^(7@pimr*-?$3o6pff@B&n#sm+8 z0dJ*}_JB+*>6j>qVLX4ojlT)$Ddei|IQ3^h(b+;JSzy2327crg8`_|uMhB)e4ihVt zxyJE_fDopjj92{uy7@~GKS2(L-oIzRy#g)H9Z#+F4_zIBA9e}y3>362wNfyZW>?;YzOUz#5LhC;Y1&hrW03!no->8y-yk`Zj#7=X8C{*4L=Ziivvk zx@}*5?S=f9PN}pAL6#z-^F-x1-^J`n`(0lEXz+2_JfsGPv7Cgciwl}JZ@<*sS#RE6 z#h-|c`+^`#;&g$BOPZdF8_j;iB?iyJ>W|3i30JF6`o8ceYuakDA$^hIjwJcg3~bU# zR^iN)JtW+ym}XhypW|c9x*?xe6g5)ua$SP^j3-e@YFO?};sxs73h4&MGYX{XsVRhg z@4_eUXtXtu9tL2@(2Fvf_hez@!f4-7}g4;yDU^6+Hu_22%bq36Kcb=Fd^nt z?(50t_Yn{$_z{?kUXnR|KO|Pf#R$w)I~fJzeFPBCmXhi#uxdn9Rt(j)Medu0cq4tE zkx)KpuB&c`*9N8DLfqZM0B$yEr5`_J4S9NR@>JHkW2iNBeGlob$+22)Z%?iYx+q=< zRfGF5C}`v6bs8cWbj?`FCWQXpakW;6L5daS>Hmlm&FUbb15xB zT-*KZ3NxT~ABe|IckvST~^ z7Jp=bSqjGKBV;x9>pJ@_ZO|`ldLf!}LnpC^z!d5-FKDcFTSD0Ve%sUNCNfKoViQI% z|F2&Mfj2IMbr5xzr)fMWfJjW2|7XoO@~KuJCGXw@GEjz91(=IE^D<-X@axJOodS*8 zWjzP(Rs^LOW-Ctx?PF@OZa9L=GSMAhuDigTC5SQ0{kjq6(f1Y#g(yldnwV)(4I;gz zKShNXglQvt{rxfI?mfXWvms>Cc<~Pi$e$Vi^FyTLDA+DNY z@hvddKnx3;x-f&Mk^QsWMCuTfmVr=TsY7h+$EK|N`2>6X;BhE<%S8nDc@VkHl7pWK zSFRF`4g;Q`xw16KL1_yW!~Dzs+aEvMS~3ELcs?zG2EQ_~@r0`M5s$ z$|a!W*@!&U(?Zi?Q0kkF5}bom00sggi|@&Mt)!@eB>IjQLAMO5rUM`>H+g9&L4W+X zJN~m}c>Y+PjI^{cCQ!LC83EONn7f(Vh9nG#u8f_VjLs1JO`*)Lrb*wlSYPPzs>NjP zS>FH^^b%W80*5UhaB(8u+a{+N z&X&VcAII_Dn=a}t~>~*6c6Fz3PYPWCoK6Mo1#iL=2t9B#*{MZe=R5>lhJS zDybhnr}OV|cS8YzXW!Nui``!R8kk!ak>VJ+y}e_R4}WXx)(2N&UuUgPF~`pDbqZ5| z2bMt~XwT^=h1>=+>eAGFous99IC7vN0R~cb2%(-7APR>#isG&u2fFT;JHC!7^-ip0 z*cx;!>YuOSUW0B@qJ@_q&0~}72qMQlutDoo0P*Xb5`!R`4A4J8oHHfEbIEq|x9k*CYb$G!m`exgwfjBk` zQT}F4*Y2(-HIg8X!C$2F3K)0q7dU1S-8+V4)ZYI~lfE&6HORPDzj|(OMtkCzCfTey z5By0#Pjig>Y_<|VHg$Qz*^I~zgM+Ox(@C-}^UJu>8-}rAID#=HGahOK^wabBtALH^ zG`#`Sv5vLQ*rgfrq0dt$t-$zA3g446nUTC__tVL{Oe|d8KdRUS0|>8DiJ;QjTKS5~ zSE?#BJOas)FIgQBaK>!cTB<-(mK#U4&YxmZYXz!(mS^5cBVx!{jwi>Y4iM_=L@O%4 z<(3|%=)0_G1H!YgwNm!$-hzXXn(0aCq^JvcUx+8eUKb1HroEolv(tkpN;ia7u`>)^aV2-ovB{3wcQ60$ouRpS2xhZkwE`94M*8Yu z4!pnZ7@{;_2vAl#*_KM|BxTdc3u{N!Lu5L&UDAx7CL+V{n!e_Ym(95R^zQ|L-c(i> z4@EYc`Ixaayrh$j4zMaR;PPmOVw_m9v#VGdX0uFv7)dh6bD=xNvI^JGK`zcDfyd^dW zE@EjTOgi<|faPx&(3K#nR5F&H5S;cfEQBXk@?T^AJwMn;?ByO~Z(cssBh(8)Uh%>m z+6a>5e>JapFf9~%9~Qp@-QXJNQnHEMfLROU=QTOn4QPE9pk)Fh#y|*=at(L5t=2IN zcQyOOaY_i{c1A=V2ZQJb=ni7oeth1dCx~EoHVe4?=5RMFWKe6`w#}tIaf=ZGEd9Cg zMsB_31{#9B16(%!V(}r`JfWS znknFLSp#JY$J_ucP&@V zo;B{XgzI2h7sg{MvejxY=M!E_v7Y+eq!9g^KkQB%<~{nu-*{2-lQk3o=+V&z>*2Md zDT70i(V0-0h{}_X6iC=R_V}=r+psh&+lSKELuT69t5Hs@Q$bxq!tN(225 z#usC71WzoA{X)PZ7SS4kw18S0YuXzmlCoR`x(e6^+tSt*R7` zeg+0^Zqa^8kAQw{HzLk_=V%6%@_j~dYi7i$=YBQ0C)UM%asLgO`$|k&2YsQaKp0qX zPBq>KzP+<=bm?(o@))K9aM_dv&4!oH{#UxG9bbdrwg5 zeNo~Kua)T_vN$chX4w_r5)~3l&=FLls&>-IQNTx0`xV)|WbKX3le#E(s~t|tI-qDt z2RH}U!?1mRG2fo2%dcEx+-W`SYmDm*=&XoBA7R9(SX_2?&)9QcZ1E$(QNfhMW_JPI zuN>(a3_sLuEnf4=YA1o!KLUh8haC_{(_g%MI9kT86cH#+}Fyi9vD;7#neiy@haEMBJwl11U9 z8Ea@t)G6df;}vymz@0D5?Bb=mc(!TG^<%DFy&twy!4rrChZA(CzbNHuFm64vaV{u0 zT+8fgJZX}~&C4nVIZ&AK{@AQlm*t`K$clm%Xr%L951AR!>4EV#4RgqU z5rAJUrJLOe@}c8KEB#rgcVH;o9C1gXV<3Ve=Lc-aQB=jhr(>Ld$#CCQo3Ep36*6>G zqMe77=Q;EDrXDys3PfUN zM!rO9x;$z`3fIBvve8PcDT(3oqS2CCKDi0OKl(xeAcP_Qqc0hci07zGNlh32TL+%&3zF^dk5U7q|Kj_X2Lt>axF0O8tY-bUhI-Nt z6&bL<4FLdze~ZilfC5NX@-hEQBkiOs8&YX$000UDApKi3bN~!MnwgLJpW)yLdj6+z zFu)tI0dLC;zYzZ|B1aG4e;WVSs4`#MXH;R*@OPj9ko3PcB$AQ-N5gR}kj7L}0!U3G zP6HcL1FWers-+zd!qnCpkAtsFV{y1~ni|>~vHv$R{7(AIQ{dwQ!C(N;zXkyC_dx%j z5&ot7|B4^3gAw96O-VRdJbCH=`1y76Fu?zRfR)AUEW%nFw< z61uEl*e_dnpI~?j{_t`2(O~2vfR@Ni;bSFV&Hrb@eyd|yx<;NpOaB!pydeyLeay$) z4-lP2{>_KEnq|7OW||3y{WrzDH3*n$fy0y;aI94D3mY1x{t5w2LjJE>;J&a(z!hjR{#IVR)_C4kf`AhzW%P za4h+g5v0OtFbYu({(hD0t_>j{7DV{#58eeRb~zp@WRoz!Yrvj1^8iGf29*L!i#(MK zKr}`?mW7R#MGBh0C0`kbz0A%1rXGi>q8>-MY?4L3wmO=$LSmk6l4Xj3Wx6_=xI$`Z z8k7*j{HqDAD7F}6iTEg!!6E=vY>-bkMn0E-vIav93h;fms zFnNWfQ_c??;0SJz7$icpfvwR}(GTNyMzlqNa&X$mgn@59qnq~vk+9ze#a~VzR~yBRPAhUw zr%*PKPJo5%0_U1Ik0tzrrsGhHN!$^;aQ?`_VfJq==Ocv!!u?zdb8pFAzJng<0*z5mFn*hoq92`4wU z!AJeA!bo7oofEl8Rcb5~8+YVDU6n&cwQ=gAuFgt|Oq`4Q4`WycV#vp)lk!t21fB#3 zOeNG`e8&HKEn?sxVsa-00Bq?Y=_`d}$S>%=`1R%>|0?0dCQHw?%xD0~B}pp|D&7SX zE2Y}U6sy9e+)o6WIQ)dG@iZFlqA?CaY4Bydb6=hVnoWe z`kgynoVUdr)0U$#`!`I(r5SNVav^_*5U@2Q@hACYth7OE%3>$s$gAdaob{$vLWBAJ zIe_Wo4*n>9WAC@I(R@To*VmM?-hWb$l@vbCKomqZ;Rv?>NZy6B`VJSnw0n$vs;OP! zm=3?FDJ+>)<6^%#nz(b3;A#X`*x<&}$#;J8#Vj;`)~XqDbf6b8JNV3Kv2D;X^-80l zRE;ug-lj)-xc|X;ew&wN;awYTFMeaVu!f2S+BgCr%6#2~J%1mdSS#LK>CTAN$_Ca* zbf2TEEP@mNW6#Pf6?P*=;&6xOaQEFGFrB)o@y6dAiMpKc%aP6iv)N~V%u6DH%P(0u zwfR)Hp&#rpZssM1#`X20b@oW5s4g`A&Ix-=_n_k2zdwKe&(%HG-ai`P=EW~tIE=#c zRqu!C{aAQjXm%c4UJprz>7MwszkYfw?5O2+y4&oW{rNDzNWQ!9JxMN5Tbkm*AuDpO z&qWQ5CP@2>9dB!&J~LM3Z$l7SlhezTy;k*R2<5w%A5u!Ogo|Gb-|)ul9t`70>g&GG z(fkEON6e-tE2y-v`6($4_o6XYB-Ic6&uY?i09s^=fq&Ew{%in(ad6@UwpIdYR1>6u zHL3v~1IKE`O(tP#C1K-&w6qe{v9Ljyi;Uu60DztzqQBBGjQj$zEoRP0afPW4S*56C z_z@6_M;Bgr@#^xc>v5!0uoEHTYh%i+yhia>3s)Ak{)0~Eh7)vDRL3*Uj?ZlleDGvX zS^v`gDoh=mStsd)5_6{md2z~wFFu%pu})+LMihF=wCT z^Lznph>PY!^J)g!_xuH1fFn4)Ti6|t4ZtirH!0Q|FEc?R_?ilWtL$%C6?ggfmsu^- z002XF+ba_|rL@F7rp_TWKjzau()ob*4`>(SOi&{tM!5;!K4!?5d?`shN`7CH^>NQf zWpCx|@P`GB+(nB+O-*GeJ4H(i{eCQ*)K$GTMskFpt477aZ+a=8`M(jIzdR$lizV~r zHL_u&Z;Y&I2fFg8_F}N^Em7hXM*uj}324cr*|lts`u*10C=?WEhquj#*+=g$kQ@$3 z+6Z;R-S8qUE62uf?J)>m^|3fk1{&H{8nArsN2;_-wX1$XDdhV`W7`pN_p(v(2OPm= z{$5JV*Q99EFDP=Ma=(<%Oz0X1ofyQwqed%FR;M)9Og-@U3bNN+4^z?Kr+KeMT9q3W zCXG#+#UPCpR#sH$8@y)C7DQd#>nXoGJZ-tga{iI=mfKa`;5I z!7y^T^1YRT0XUT4MH>xf8|wcq6Z!t7oD|d7U-^9!-W{{ql|!tCZYrB3yD(k|apXGs z8{ytu7RZkr`}#mFip@Z>ec}*<2-1PelWfq}R5)rs{Bi8|iW+oK7&|(s;SeW$$V)yW zu$lt6TeY>td7-ZQ)BXxyczTe7C7jvVvE)^s&>lq#63s4(o|9F7J$OLD@|W+0MITz* z5Yto&a=`ev;>QW_Kvfchp;R`y4iMwk?XPs%({%6YW)xLBVFxOP2`C2`HX_43PK>5q z8$;fG(D~bUuqS7u^;b(>j!QS5?e(S6BCs!S6?bJa>j_lzo$H?x>Rp*LBwxfos2$#C zQMk_I`(a$o8^o4gKOA2l2-U{0amKi-c!fU*9Syn`ss)~~X7|u%D=DnoWcH|lS>Xt- zP{X2`xaT5+nWZx3=9{^k)x@ME?kt?OvTj7DCp3(Qka1iM>4d6lT)E6TR8I;v{Vnhb zK*gcPygkzQ%lW9Jw2GRA1~yv_L2ZcV#d3&Vh%BMe`dbm$2#%j(3?Z1mNU|v6kV$nA zcSZiRJp0l#NnumkWV+~5JdloV4`dMN|K`s8{y^2v{Xn7FJuP|7; z!8e`!^tD})J3t(3XqxkP8u5r>sga*NlL~K9hew}_j_-Ou=GMo|Bh<$!k^F98gzI4O zR5bm$qZ_eL zIe<&xN$gS`LR%=y$2n`-*fJ#14-H=D0-5hJvb~d+7UYUVKe&N(p)G{CG!fCylnB?B zKZ1o>tBV|ezX)ceV0Ip_U%{wN9CL%uw(AKu_k3_iMTyR^ z7TiE*3Nk0?0pVSo0IiUOKq0|l+B{?BH!58u2xH*p_Tp};^UN6x&s>N`@JRyMFR@HmWw@?4nW-S#QxB(7F=;XS9FP#Ei>rP(R z$>(dub5Hc?hMQP*H|xoybv_H}tY3^k$ZK``1>ywq$13x! zC>gW(mT=ixG$SV*8uQ|Q!k3G+!eoC`_PMHG$0epi0$#xy-+pXyubZkkS z7K_G@k)fIINLx%rwU+(X&QR(7^P+zr4X?m^c`acQj1S89u%`TMGwy$`=w$~Fi~?e#UUTV6r~Lu!M0FI z>U{^Nyqm82VyXE)%AkdK=#Rz|ysv=iE|N9OWlkU@&&1KrR;F#OFNCso&>b*5JR=z! z@m&gsh;3^3XNG1>k{H_x(=aSr5H#v+VYqAV^uary%gr;Zx1DR4o0IN24yqvKKBxwc@#epJn>RcFfHvX71^|5*sW!ePZVibu(HGWh ziq09O)wF6`d2_)aO!0M28J~u)X_!xy@7`TsLOicq4dd4w2aY=?LaI5Ocj2?Kw=?hU z+eBLrGt=nLcOevQtqU2t)zzbwC0hZb`&MrI)Om8V*QQ=H|+mnEd zRi!YlUX+BsT`Oieop|oH3{Zhy^;WY}EDT_?ri$laJ z;>Ehw3qEH|iNGg5?!$iz#-WsXp&4A=`mAV+^ETGDk4f$QZs1Vo&2mfpj&*AJXFm=!B&uzS z^CVfj`=sqCn?aWZZx?jF*9wP?HR=@ORI~JtC z=a*~|<{2cIJORY|@yXbO=N`pG@Qjb2hgO9HNh-zG-HEKPkgHbjFCZI0n;ZDuZU4$1z%OH{sa6f1lT3+J_)kI zKfS?UPU%@lDGj;&csbMAlip<`(e&iVX>xpd28%tR&e|M`CA`={<42sOU*E>GtW{Z3 zUn{PQu(Ak?=j0`Sw-toAI!KFoaTWUZrkaaO%-g?^%i@tyxbKw^v1A2IP3s-v*t zfKzK&FY0t6CW2?bTT<|1rk)XDuEECNEf|*nSC*$8d&CsVtlxt|YrrSGz~%>jq<7DM zVQqD$=qB#**y?(<*CrPYp`W7FY@5I8j<=q64&Xm2HW-4;%Yq96`wx>|9zk18B$p=< zG0QW-AU_Z925)~|en9-Pq!iiSll;;ah5_BZ8C~C(f_D_(XCWr#<)EK;>K<4@|0?`I z&8Shk{n&4Z3McbZlISMUV}i&$h3tXF8#3;*9H)P0JjS0N3Lwrns1PF;j!<&w(*~C? zQcP?^pP8jl=WtiOvejXbdb8r0ds{aWqEPAYI7~ZphqmvA^?iHvs>K`VT5SVWz%FMX zM0BDSS1?o_-o707_b>qi%QI&1JR7nF(K$md?&poHH@bTDg%Egw`iW&0KEleI;6Qjk zPzC|*55ej0S6zoJV?OFFOU!H)I+lu2$w@5(^U04rRlnTKk23G@HpI%ApYdL2fWZx3 z5`<|+*~qE|Ym|ztSJCH8#@z}4)HQko@hAR{{$_odB@*k~q$s1il!=k)R7N<7wiFV>r8H4V9Kx zRXZS#ny>WZO+K9<1$k-mcIMEoxY?n~>dwMlfI;2B0r3=TbKW8a@Q(?T^Q-9Q{M<+q%hK zx(G*n6V+>%Qp|7vq`D5vGC*KHw2Pdz?B-7JUnx(PlTA1={7kPNL4eM_c|8s-TLvm1 zfgV;X=}UpUp-|=U1yp7VX;oF{rM<+lN*9na z{mw;MOq`*a6kNGNm6~gr4RC6W*{QaOZIu_z`C0kMK>y0oT_yq5mWE_(Fo;I~kw%#w zjOU2Wm$85in?HZT@~Y$tB7gr0xUpTR{k-vP&cV_Suf-tHN=b}L8d;ZiJ;@r9k*?s; z{Aqna26J`MNyYBCiP7A3gea6b{u8Z1f={CGJ zo4&bY@f{2sou2Hy&U9jsMDvSLg;%j7p9j6|(FRnTpW|43f%VJ_`1meH^@nX!z`+{6 z($N~^9@d(MwwmZGZ-<6MeQh{yAerh9lV5}fyd+%%ByA~vG*oM%kBl*W<+eeZ%j`N@ z#@Z49kywEDq5(GbG~;51`!cTz><6HY38frDcCqiFdqtiHOsteFj0YTLsF!Cb3~=CM z%=e=qsjSC#PPc2x(`;R+8i?ydAo5HuxRDLR$3IZ!?9QvBywU+9C`nOdH1NGRE|S5HeXL z6hHMfbhK($dHLl`Yk@~ZLfQqgi2|@dBKM2D^`556$+bjf3E1WEK5z7OQ^TeakDiGS zhFr>aw!$5R6p7PH)h;8ncm8Crs-`IW!q-K+!sWmfYih73dx*#m5aX&#-Aip|kpt}o z5>a)d7I$sG#V0?vOoEmJOS?TvTPPt8C}t@gaJD{b&N;u*PL!9f>3Exk?O_bpZ(I$5 z(Yd`fpcma$H-cztz8TsIUxWd$YhVLOaPh&meQ+rFbOL6_EE0@!7 z_mgN@xhz&etAH!pYd>wd_g~bB%iv5)7}yo|Imv|GX_^QXWUTr8V64K?%0q!P?By9t z?}u9Ex2xfkWMk8JKifvXB3DKDJC?!p>xX^Fv*f+Z<&p!5#@45FHBoLvh zU(4eNCLr4Cbx%Ewu6?Dj25tUZcW?`mDd_?e;I>cil5zg<-{qWgJ(2!=6tN^etD$(k zDh5S8QL=cv$QtF?U*TpJVc{sFDHSq-W+G2wPR5@X$}P!>uD4vz8P=21885~Mo(Ha( z51*SX#uL+eFmgT)j|Ml9Qz5S`4SniQ(ZRhe|dP+2RiY=B$?muO%`9zFgYlf0HmWdD( zm}lEV4^V$+qIUG)8d&@a=&2jCapG%$+KJ!Lrs{`7o3uY}79lR~hBR#sRm6gXaN(xI zD#)Q@P!Z5@3u?<;g4C`eEH3G?< z=kCg3d0J%AIG;@Wz2lknJrKQ*)uz7@Rpuu~{`5_0Yi{Pq2?Q=TpGQHxl>LPZwp6Ed zN&*jSR4_mF0Jn~EmwM#%=YUy+@g;mPGY6(3#hzbFrXLJz^!} z%T2_+xS2>C2z;_i7oFQfeDro^w>ek=pHjylZNFN6q!d~_^n92lwe)~h4@!UCcREe3 z9!U>5vl2<3N`6^u+OS>U#zz_5gMATyFaWn+r%xCviWU`AOkZKWX=FI4P-%KQtx`W8 zEJ8Q)G&R1T&>reUlTjsV_dosYZ_F(9cK}s(8$fv1tCAUcB3!yVX@fh%?Vez|MqZlh z5zY@GQ4mb5&ez5*k+!}$KgaOaH0|R+T>HB@*2ZojN6vLsaAChU`%=h=;Hr7G5gT`j zCLf_4Yaw6JnX*<}RzSYH9>qjUbv`U1`RrL9p(4R_8j?2A4W=FUv(W=QwtHjOwE4@8RC zO;q&EEewqqj=mY*xrWC!-*fV5Gl6oQMmcB5QUUA5cK)dF*mb9h-$_^4l!lDbvKL9P zJwAoF<<(|uDXN<+1zQ%!a~_v&Fwr*TqQV>;uhw$A&o+;WlQEkmLxB-8q|Qz!o%JeI zOuDwr2~KVnRW95|u7aRvx8Ef>6On|#w6WKvFK&g5c%Sx}kThm?dhM=pWA%oN1pH?L zI@+{hd6^5!8YN$cYCGVZbwxtfhOVgTRl_EO|K{NIVu^Zk3oh`pwVOu8gSeQ2;KNo_lvb2}7MJVv^R9dNeTOYxkkxY6 zJS3CxfYBDF)esXi$&b03pj+!|XsnkB(NGxI7G_YCun1XmQR|*XBrJ-2)NvNMC)+$k zK4AOt*svLG?UX#^C(Op7sA_E#=}DJLxbdI4s#7#oqLL$`<6MK#m{S>OG|wm(GL18> z!X#XDnsC?4rYskV6=m_(oEWt+L^=4cTG*uKY~0lMT-cyA>*A%o?cR+m&T&diezt&0 z954QDxgu{AMCZxd;<}ss2~1eZN!6-@1ph( z{^2M9r@!w+k^f-LY={=l+Hf$aVL1yIqOWo*&ieT_E4GY`>E~-dm-BF9pL3)mwOM_< z|DGrj9!Oui)}N_F8rxde+2`^8M>U%!i}_*a0T9b6o~w_MgW-$MhdGTc(O&%F@MUSm zG{$EKq?F&bM6W@qQ&eySLBrR5-};D=&Z)|%vtD-_I`O)K7(T5x689-1N&l+mUoarP z32=-q67Ap8KlCNwWQbZ~&*rcJif(WiY9uq@gZi?C-Z-$7<$pXA@;K}U{~`Am7F$f} zJSyG&!|-BHV&aK5kj~Q?MmZM@bgT7D6=_9M1Vnjoo#Iw~#4vkRKsPc05J=2;7CMi;bF1L1-XujJ3 z(m(ona7;c%u9BkY0pEnN__SJJnEj0^IYk3MMvsw;6S#mkKoW)*!<^$Y!Z~~l7F{&) z;fqcBloDD|U3}q;#m8X2Zpt+?9InIJ3yWRVq)uArN&FT`-a<`)^W`J4Fv$mXr%EmO z9Iaa{!cZgDYstNT8NAO(Rq#f>?Op$q)M|8f)C!!rG2fsdbH zC|tciS9QiT)Z@V9DQlNfNd{=BU+4oPJjJK3jRL-%!!XGW33i0XcLe)0W0eX zbCQNo!a?Dcs@fT##F>X^askt6_gy#f8)ZMU36m!g$GV5>f`A;t zwcoT(+GR%)VeYtIa==kOp5AdAwzrL{iN{h~H9>~(;$lRr^sK2+tY5e@ z+}&T~X0y|im{fT^*TM(3g#V^Xh^y2^xDSuTzEvl?j#y7_WLbM2%bTH|o0$~fETdRt z&ojV*2c&VDgTvuGPLa1(COMNI1nUop-jippb+2j9+H~F4qojz%CH`GOyh8%bg|Ui9 zL@3g_{CMam4lNkO7M>TjPx?bDs)C;|U!h}-4E0kx`(benUPG)%Jm>F~pT6alKlzz{ z0fQk0G`|IwkPHQ(%6gew=n|nH(BT940?zK|^~3gR=Q|7jw09{3d%O3Y_oq?gdPMD4 z2hZ;r1yjQ9)yi8cP}D85ukx#l3nW)oR%ZX7l%wrGPxXtCgQZYx8661y2!x=3>E9j* z`v|1yG`)y(hrqpttB$^L)s$K55Bo^0s<6pz67KuYZrFi6#`qT@*zvT1YHa&ItjJ2P zasa{$ctd=-!R|Xe&nE68KXGCXL{uwpm|n)9AvMUayQ}4F*A3esxEF8)zV06Q-`K(c z?!WX0zxYAoZf>A|Eja3E{jWX$gI9vXbb@BJ><)bK!%~pgifQ!zF0JhD@inJ{X73B% z*HDe2LG$Y&4Jz&ij_?}JVOFiBngaG0IT^fN(wPqVzihYTfQkbe{#cp zYH^Uyok_j{ap&MT?&^BH8i~AwcuxoaQP;p+?GnE8gEW+pT@&9TeC5G~=oDgRhs2(O zd(RqdJ6x`W`8=v

d{h$CcxLq%Vqc+WrA{y*&@f-?Gy;n6?*Fw|e)FPHsQ_YNaD` zyXy}5=4jj)rUR~X&WA{H2>O<_a(;x>LSu9zhTw}8=-BU98l9|J#X0NcJr>zqYpd*3YtzkhKRU&-eNydt})N z>XwA=h76*#@qNO{oRfu&N`}^nt3p7wl^ycFm0x@Q?_jPrMew2gHj7o(+Mu>k1aTK>04H!u+$q+W&o& zIYcmJNY^3}pZrXhF_I^W_pFA@^ME#qXYlL{=?9h$&z^+518eFP6EjJq4;{}qO+uakze;e^Pk>QKLu z-4<1&B;|9^3>O%Csalce2Y}ZxeJf3)%b%VY|6e6S(%aU6NxvyhU>iW)2+M!Yz_~$H zWe3cDHFS7)XjkC>`E_&Y?ps9o4fHn}(h9Ku#n*0CW>5F)ZM3h#;>fV>7b=I_*l5~s zh9k&{{97jf8);l1jyG*P{;yG(pN>rp@Gp+wRL5Ce7WLOvI}Q9r-1aX_&-b>F)Gd+q zKQq0!KE*epUr7zg6blx)&m8CXY-*^=;spP+VS9Z!~8CJ2w)KFzQ-8L4?CQMV-@cA zpU>YMdi^Gf4i)EOk#-I0zulH{6?C8A{1;AM9Quspe|hr$%?|Rf8GK*t=A7>qSI&s7 zkKyn7oq(?QwA)<8--}#2r&7~Bb@Dx|v3*T-Zrh2d-8Yj5Pr6eFx(bLrvAFM#uuJYdTrGM42rz>+aJ6C&uM@Pp z3m+DT1Yqhx9$Y`qhb2XR<-Y_Gy7q^`1E0H7awoC%QWrOr-L*K5o%bg-!JnsBpGDWZ zJ?@+pveX7ywr~4rBm8!>Zk!6Tf9G_d^iObUNOR-UYi1ul{TJhvAwZ|5??xL# z3=uElePaHFAz{Fo5gIz^Yr{s_)oR**o;hKvsYjy>z~E=SWD)+%6+PsQE!B;cGvaz= zxH!gvRdMFR3GY>mcjH3ov^hj>pJr8mok+ugg&L0Xf}NITn9NR8bE^i*y4awN@4bDy zjHsX*y?_7-ndBQzK<7=4eZdJ|#yGY(>~W#hWu=_J zu7%f%wl|-wx8jJPIF}Mw!qM;Kcd1a>pWhcmN4Glc_r_!bA#I2KEKz7b2EB`x#?+%7GKDI8j`6B^UG;qD) zr5@SQ5n=qm78s{(NXK!-HKIP*t|!07caB{1`3>`%dGdhjWuy9z^Q*aqM+i1j6E%(z zkvwgTRb(5rZiT?XeS8`K1(>lL3#FmE!ZVg$-bN^v9Jw|WwIdht6`P$($xA__S32yM zT&BX~NTv|+FyI(n?cNp={-{mukFi)qBYi-YFmzR+?-n{2xvvA*v zLi{N@5s!7u%f|otHW3^q=xwe5mAvaeL~DTUQT-l!My4|@C(Z@-6{f&LK6y&yr>N;d(ohI zmJ8-7^tRD^Nfy*n*hlp)FjSR9O%BoOG`&J7$8u_rroxjw9o+lycNXCXoE!UqxB$YE zrr56-51K5rLfXDDbi|OLkJ}PXc-9X`O=%|#66&F#cVT>7HkDs+G?!C>ntR8!w?$Vz zsdtK|VREx`g~Xw1we;J?2tZnCW7|`|1_ePq_ciZnkmUImu?P{T@OG5Yw`LXbC53=j80J*mrDOGrucg9;P3~Ju5756p*2{B zUlt-84-{xb$Bs@%F{i3|(I**T6@6tIrM?ZD}_oB3+GKlG4(gpmaScB=NwS%ViMLh;S0<{g8pRJ^#Kj9xdyAuv{=5t|pR zRINgaA0{}tOvtW>4-_m)JY-*3BG^N`Govciyh>vSkKNajpGSpr9geyu$ZiY75((w3 za}h#);HUd>Cm>IhdwUK^N{e%mhy81vSy%!;hTN7sGrJoi*P;rDOrq&ZQ+?TRjHCR@ zG_c>Qg9x&eo7&LV{yO^3(OoXwcivlwRvI-(mqpRCQOJ5<$QgVUpMHW~ITAlqLnYLr zFGpo^<>^+`D*cYfO=c}iSWUgET%98r(4G0gsX3IQJSmuKhN@sVraYs9#^8Y5e-AVE z3VU7$>nvp5;&_SKAf0;nOF(MP`a}=xr}$xRP@w2`hPV9yt9FqRXQ|7jgBf=U-w5R2 zBp5u*h=bN=R8UcU$p3dtmbUjsu(~;IZ{;NQ#6Iumn`>J4d9DXJ^s(GAa|5Y1U>=i5 zVa_fJ)7~wFe!m=c$FT~d-dFtnd4D|sVe)`JmNBdHC`UrRe%*1w>(qnRu5+LR?7`5~ zaZn$e?0c$EMbp$@^q>pFsRT9v^w&z|pP!J$W4aeGe3QhrvN>;=YH$w2zK5c_+CX z{_fZBue)`&Mqp4`0Tgzoy-vD8mz){Y4l<2uWcqO~-|D}}U|~=j;~}g`E#`J9c6vCM zyTLwsb9bQS#Mbs6xCmXI83?sLY^uEVANdW;C(iCo4Pr@CxpNJ1}%>OxLGXdQm5ahNyNN(QIUoy}FDHxlLXbD|ObE}NfZ zAtA8Y#Te+3#;&f58rGoLe@MpaouCDFx7g&WKd7;>9XL1q)cRh4XW(&qKI{8NI*!hm zcT*ZF6mj94p@@9SkEc854;r5SlruU)7(n9CoaLynucSH+L7#V^^B3RG!K0=Gs zen{~V@azhOMAKkO7TJ|B6;*kngoZ7? zCb|=&)&;~gX3i?KZI@(s%fSpVCv)2PwMg^Kk6z?%k9q>Z>{B5tEXck<=qo5}fCUBP zBY+Me?x*Wp9jCi;xS}#JUgSw;=cL=zq8=Bo2jjYf(vUL+nPT`lv6^!Oti^iqNDMst zAWa8|rWQ$@&!rqd=q!D)Cv@dTw$b2aimB-T1nQ#eux&JU=cpA#)R09n#(?Fyg8--AX;Q`n5zu<(Y>s*g3sMQ4+hG^is+GS zONDK>@8!}>YZ_jYzrmxaLH5Wg-xVTT7}$b>xWWI6oB{8OrD6@oZ zC)|JenCs2)5e;*4T<#Ib`r19PIvo@j>vvhc!dG!sWkCiJ3-M6SjJv|~K2(rPG>Ydr z(2f_&yUT@34mvWckBqD}d}&Ep85O$EBql|9(+wqJo*~lzdwIZr^05{6C0NamhKb7S z7^aXm|Ed5LU4*X(TbC|=>wT~z_Id2<>gkBw%2a#(47qAYW4dS=Vtzc!XOO1|Ia$7z zalW9Lj#jyduh?HY1F_2V;y9~u6~dN{y`iebNr1{ z$rvlc$)^7j@@BYZ9I#Fxbes|Ya6CYW(&MuNk?7`)W)xfkaSXZdt@M z*guEJxuX8-1CjSI#;_0Dklk~k0b}{N{t3IB`haa?+s@U^rcop92K{YoK?D?zywmu; zj1}hg#@nS5I~g9^X2Pek@h$94Mme$NSokuo zP=ytvx!=Mk4ru^>&~Jd#7#Iljx(2C*z70lx)t94I+NoiRvp8n4?}n8L1Ti zkl&b1irFFr=%c-D-xIxmg)X2(%MiYFVtWq-(f+Jxe;*zew*&vP z0{7>Z*EPV`?-kd!rfU^IS?sh2=xfi_)z2umM5sI@Z*DSlJjL{8>T~!Che9K-kgofm z;(^F56dvX9Ai%LOcQdFf%X)#3qI$nP7Z3+X(5E=^3`1e4RaYOE8mJZ^Fm!9i*G?^* zwxfg3jyt+2AmLXdECJt3CI+7;~Z&b(YTB;Gb?S@|ZTi#^alSN{dyQ$PyyhL5lA zk458S2dWpt8Z<{&7JlZFzVHV5WmPnJ= z9U9Xfp6PP;lwwMVy4d9TIVpn0t|KgBr~%v=vy7T-+gqb0rI0s8B90}>HX_+fbK6AB z3Gfgox_jyJ`~XecfdCo|>EC?5$=;ldeMFlP^qg@F89km+z_PPLy3yn7aMQCpcSED2 z+j;v^u8XYol-TC=HbnUS)=;~Z1xS!3O;bKuF|2?0N*5=(Sp5YHo~m8Dvoqln99G!r z>QogezRLdRjtH1x6ib5Rw@S}Q=E{A2`bZ6g(IBR4pykwhbVQc7JM0su71l$TdGy5h z+ByE`PG{dY-22jXvlIi!v7qdesco1z-!Ens{T*@_e2bSVtKnps#DR?a`+IFjNjl|t z`4W&wLmk$68871mwM()_*{O7%8!Bd;l&M?Yy(J4p$81Yolis!2Cg$zjD!Znd(nO0oM+*7Jq@e-&{Jo)1CL^tVWJ>Ep1~bCbbt#{TW|OJiGZ>+{Mg*(ov$xAvaDwsm2O-GY1z=@-XyCk89rao-!y zIs}jxd?TP7UqZ?<^bCrC%VINP9kr87b-QCoF0fSO49J;p38*YJx(fK6m^00>_z_jLQRrx4xZ29HKX|m zzJB67_uccQBrp3eQ*B2>UGkC@k96j9^)3+`6&kZ-oJ8wFoxOv%T(Pl>pxXr9ws>M; z9}I*FZ0Hz~gshr2f#6EiXGCzVgZFuK`oyyWt4Go)1k_Yx62n!CCNfC63^}(HS6p-y z!O;|UzkltBr9fOW0e9GZ`?Q$Fpu%By7egJr(FdE6Cs7Srku1VSJBMmYGszC@kG%TQ zY@UvUjEeGGx4Wgw^%vI3o{K3bFJaa0q zFo2s6wvkNM+07ONrG67h9ESTxKw(T#?}wfq{1lv6v#K~ifbD=E`tM6NKti;Sp4xBR zmrn+_c(cfiF%9vIusO+BjWBbNF<<2^t&5lWV*oaQc7k#Wdghku4GUm5S}aB)@IUrI zS5yI0G_qWzJleu_OAL@Pmv&~8g|r2lj`~ekF8qpn4PK5W_gs7^Q0vLXg`!i7e_7x= zbv>VN0+4p^9_873ZM3*Kd9*9A*l{H$=Lw0yt=x$wYVRR9ZDB;Y~{n5L-#zk%tlA`A-wo$x?{f} zRdqaYs#*_bOa#>|Q1Q2dk4~kp&ukuCJ&)|!`KSwYC-_nDVEe$=?fx12Ym%8;ya4=j z*ZB~Zu2vRDpGbSyR>yj>axuC`CNYyK7A^fiYph>6LR=&i5s+T{JXN9x;;0-t;PZ6v zIRguP6Ze*#-8I41(v5jqx4C^z*9GdR0KyRjjl?aY0j&|Gd@Kqfq>&g;RruR3l~0SI zDYEmd?4W z*furP(a_L%xPS~eqEn8^hI3gI#xJR2m+K^+P}>X21q~wQ8qa`4Yuj!Ar7w_aB9Lj2 z<+W=*ZKkhl;uq`LTN)Qs2GR#n3PNkv@)Q-gzml0~>({O^<32-*1DBc_+tS=zoPRri z#R^*481V{`AlEfd&#mparN0PU?A^H#LDgu>gBwVI>MRw8{U{H(p@-T40&y0I2aS&X z4{i$U4c+MMtAg8ZG6~hmW4`_U@@j8;Z7ux{16|Pgq9UTzkJ{3{IGj(3ztD?{k2| zEP>ePe2oZv1H+N*Zio6R_heipFpy@}yH^4`>}-su`hD&WgA)SQ}# z3Tai|GsE=Q*zn|u49Fr}HVeUDJeYPl46m8SNJ{Gzl_}0t*PV!Qh zk+e6?`qXQE5bbnj3Cczwg+v>F?wqQbScWdcQ{e`;j|#*y`tsiK)g-B_vQ0d^V}bGC z6IZtGExBzF8BxJZGbxpA3m|VoaG3X;`o=v6 zf%oSY?4eI$zUWkLcdVph{9iZ+@LQL~lXN!la`;4>Yo#P zrS>4J==u5TJGs4Sdf3kneSIvnwY7OAmg2`A2^#(-we#xDkdetG=vn$;jmQo5D=4de zRg)Zm0&e7rjt~0!r*J2Vjt9cNEwB%Kt!2p@5pT!-S*YPLvTiqoCde}P?a5!NxPR-r zGpSlQ7=j97Q{7R1oFo5q1;XD3kV?G0f9(Lo;I-7Aw)W6|1=&8Z=V#{95-#@WK2~R_ zmZ>X+6OUkxP(@maOY%ya4O)hdhl=vY8>xg0zrSK2YL^(Dp#)MWdqtL{#)W_Z1VPBW z*_v9vm4HuXv<=;RER!>2ICLv>4ft(MIdOFf=!1xXD?bYR+E67g96j0W6y~Nd%LmBb zA*=|ykwL=_G>efM$Ib#GgPD-9i0CgRvsCFaz5wu;P2<5>ddp!YM_t~N;3K4PIu1Hj zWEZScWl<%}(Y0tr&s6WucZe#fsm`S_tI6)n#)8JNqF%jVDs_pBus||`7tR`HzgU)cjsEz{g*@NjT2!|_4rT>)` zeOWucEE-)B92NkVaG<7Ghs#oqHU3L0y}XIG!(K!ZSjWrKdBLT3N6waW!Jgq91#(pR z;v6CjB)T8#h%N_bcL6sYOZS6bvEn_{E*1wKWBc}@KIWnm3SAzR@t2kPX?D^e(Dv|6 zlbxcQ*=q&6pP31ii4VhccD^0WBpMW6FR;i%*nWhA-tzF`Rf z8eo|JgMK7~n{8;ro@ry|D{HA_^497MQTE2H){YE)*d>F=i_+X9G+zDbUWk{tZgvh8hGiM_0~SB5KBM5H)HPUmO_U}LR|hOuNliRy4Q9Pzw>@HB{=d0(%+ zu+JJ$BK=^#Oe&?vs%TWyl9ej4CyS>a;AJq983+TH)ub(-ruE|QNUZ8*>z1(vDuC*R zsc8OeH~^H5(Vw$Rld6NdJ-zQn1Ph+E9q%W2+L3eeI;`JLXA@nAfu+7(tD=Nn}kDWcFn^^@`vP;2zyNe$z6V#X7I(Ln=3#kbPuS)$Vj*z%bhy^p7dOx$p!QblIbcT>PcUcRZj1A) zfT1gaqQ2lYkjrp>?=knObI`I8=U&%?2S)qfDPMd}<`L?-al9enG1TdE9(m5o03vj) zeKbr%s4UkN*hB?!?&fDUOzn>Mld1aNjwAz{iQ;IvQm>`fZ({i2JZoj_U48j5pa?V~ zpZ1AnJYc2ylva7`J({z+&>U0y1bm(hTZb-HNf-fsB%+MY6xB7~85wHZl+Q$5;gnM0 zYdNQo4iB}MTj*F=SfkP~VavyV=z&kfEbZ9f)tFCfV{)j{(H5TMaP*Tl_fHPhwYBZy ze7sU|>}yBw7d5-8H7?>jZ-WIQ_*J zJ(#LSJQ*`*WXmi^ND~jvNHWMdR0!2iQMCG+xJ=I&oX4{6=e?gs1(03YJz+V>b21>ZCO68>wLGj}Mj<8UnIPel z16Mg1y(MlaPG6l=9~A4*+q>(Dwf)XWyU$M&ItM;lcpO{I0g(p56Flb+JBV{#?#|8) z4AvuzEXGjAM*~oxI7eBr=dcO~QF9_Ob=ZJ6DTq~lv%j^ zA|xl3$k#R-y8HseZ*r8Q6(bFpfvEh1WxNxDM@|!5LW#Ln;*Ukg#bZ7n5nsl(zQGYo z#at#Cl!+Xj_>!<#M*u*@6!0C`+%nYUXU#4dW5}?zHIAn8%tq|ZV-S66fPm2YaH7^i z*9=Fi*Dw;gbHn!(LkUNvF#2%_tkAz88qbi4QVT0x%TITo@-W@Rr%NqQ zDoDJVRz)%xUbUPb3iB;%<2mA?lc=7$O3^D2ZA3+Ob$UH!EItKSzzwGkO=2&G>VM{8 zJ}h4yRB9M;eeOHbJ6s@R5H|jyLozMg3&cCwH$tG|_6fvQ+HqflAkETUx?rdGQx(ME-vhY*!9^?m?RSTb!xYc%!Abv5L!fk8GR245G2GdGz=cO?(_?lwcs*0?Bj~r!--2t8zl6{3a~sK zK32j$KEbfk!e197pGvUauS{h#c2YclX#JF+>nNSe+`@6mQQ$B(T&^KU# zwJ@G9SXWaO4tDK+-clJGGy~BgG0DA5ge)RQ=lp$xK@CT5(PnAo94I@K9ol>ETVY-B z#BQdhr%f*+hj`ky_68CviEdgH0Qbs@)DYlnYr$JfyOgmT&0ZH`@w=rPc>zB{!(u^; zaEXyhJtIzR?9TCTJyvqzX0Q01qV3I^z4;<1JGA4w6}?gqJU3#OLynO{Eo!@y*)y>$ zsT&3ry;30p(%&uXvJnDoOR|^zYw1(;zyEfSmpeybQx7SADnp&@TjwtXsU2Re&-%rp z7zH8laeMTcA2RGkYC_$i84ei}rqGyjDP_X$rA7#F!2yhypQvhV*O-O7XL(eNYcpGj z=ibb}oT@(GGaJK?Li-h}Id)R1s(#1*ILOpEqn<#w%hxA1*N?vlGXtMLv}9Yfez{;z znw?5uie4^}*ATOK51Ufi;B?Ap@J&3)E?78Bc`DtIbF!BJHChZOOge#t_|vqk%#hvV z>w2H%>ca*bIfC!Wg@{NYKcv9TH|QTG;yM@meuN_5MR;*`=x^5zRmm=PrtRzE!om!m zlP|Em@-GB0N8ERfwik+?$XB0W9FD2Z7>m}a-&>>!-t%5 z^uF>?kI(0%nG#Eu;XwOn8xBy(=_Og%g9pwB!buS6Qg1QiB^Pil%zI9;^p=FePNirayYgRCT$peGrQ)d~92YrO*fWjLHgHJ6 zOtpez>+DWQD^$2(=-DDx$+|5YOM-$++>te$kvE@Y5%6+OpOsn%Px5z)%xAy?R9G?I zb^*+!RU|Gi{5i?)q(&vbsp3zFFZ)Uwt6UG46R)Husv=^rRRbUqJN7G9gS4@Tw{_j@ zO;HGLIs71J7C|=^SuxcLQz0MyWD@6;boI>0 zfMbzB@TKU*=C!*_i+OJ^Uh?RS8-g=XHVSTsO3&&i-BuWxM{F^Mi`0s@zC-p}OHLX~ zPCD84tr9Iwn2eJ4qt$?KR0QTTIdS7mlMq`8;|8UE1{ z-YEG#wYyg@ws+FQq{5`FS8tpZFnAnNB7r71Kqu$4O!QhaERA(WD;ecXpq|h{QzWZc z<_sBg=~W_+fpzsBuB2{N{u{%>B(G#oq`*9ndZ2%Qx{r^9Nd@%h!%k#7cE67)77m>b z+1Q8J0Pfu_$kGi-((on?!0Cy`lY4ZBzQ%_c*d%8Cq}UOHE&w42r{g4PKkOe$q7SqV zK&QQD@jlZI;6#M8lYYIb*sdzL^-1hmbwN+bOS0@onSGWYO-=n zN>w#(*0^N%qCbMvs4kZbU)RI&4hs1we)36q)22jX643-Cj3m0DxDd3KhRSr(vYhgg zj;^E5S9N*yPGPhH+XC0LF9#HA(5_Pu1qLo+vv;J`iB^-^9?Tvie>|~2Ad-rms~4DU z&-Q9Q?Sr{7-1}wzA_oeep#tSDd+Ss6WqVA4ERC@ zWZsZ|K5&UR6FTqgoP5CEp6P34&pK(qw? zzhVBB7^1nSnvf6IaVE;&XLVMf;LTps_UFxhxD)kZi#9ciTK0U)ig5X~4~!!Fm?4{~ z%uL7Ud(J{Uj(V)B?Q`5S;vk`c*hxw)oBT7GV-EWyF$PGT7xrEPVWIco!0HES>ZTYR zEf7Y?`hCfyoIA-b){VA7eFJ4Z9AczEy=aJ}+3<_}9(S*oDM(bOYEhQ)3F`vYcRX}Tn0)Q%Z z^5AjpKbcr+Ij1sTx9WrI>Z7_=DI&J%&|ek%H~ICrK09F+CyY^J;tL9C9jrvv=lgop z7wcb3B_mA_=IxuMbvJttfpdaqeZEheczgs?DU_zqKoK-bG074N527!wF#2!~`O%c? zovfh?)Tg8NXh`G7s<{7lm$nJoi|LGmwUNSrLJ3efqR^MO(sP$S3uz+mIa6PVv5?{8 zRoCz^yS^^BUDy_5;B%<j{O`iK$mJc)m9^mhz8i1 z;7{>x@9vjj?3a;(ff5n{_-WiwGCfYWhi)wJS_&v)=ijSz(a|5+PD+#fAlTXQ`EU6E zNYNVuhrwj`U3sHYizv$EjPgskqb~^0Hkk?E-ltjUKQKe=21e%R)ehZP|RI)d? zM^hYNBv5?$Ba^YQk} zhUp7|VNxhBc_DGB^NITuPkAuf;GT%S(&F%sRiN~&e{fQ^F9wbV+dWCgQ1fu`br1ym z|Ize~;gvQ`x8cOLZQJI=nP`%UZF|SIZCexDlVoDsw#~EW`Of>ds%x#P)!o;1@7|45 zjqRVaH0r9T9byR{MfETlKTBcgPMU$zl#7q zsF%Iym+qHwlw76w%QZj6ShlR#xQEaz#+)Soo}C&y4-V9gG-Na4?k$XhPrJJr-zPd| z@n_$a*ST}bcrA;_ad@8T_Kl;1ap1C*fvl&tD;Ixz{u5TSUBlLz-zi$)c7?KkU}9w= zNXe79w)Xa}>cf`awmADci(zVoMM_rhTDQCa@N?mG zCqk5BO8i~xhYBP4Uo71uz@rrPRLe)ieK`Ie7*-!UUOj`MF}>9VjjC2xj=!|c_dAT? ztIAVgG!q~+Q%c^Igtg&S*}$q8m(Dcw@v1yrep5+PeuEnBk+fQ|M|W8Ut7>51mWksR z^7Z+~QOy`YS38y2Wt9gt?1F4wD{iED*|Z^6@q5#Ac`gU=hP;3uGDBVclG>-6+i7UWKU z$cAa4mAmiLe($>gJb16)g{o^=oHpq=r$&FR^(zTEIc~sjl&n^hDIXRa9tG{QX$s9> zhd-YR&Dg2*ld2i114MDj4>Y1eI*Us|z1svinFn!DQ9`tvW>(BM_sRlW-_XG852>)1}Qb~L-AmoeHIp{@b?h9&BqOcjM_M))AjxRGu^i;qfiygxiMO6r% zq=*jOZ%Z6@^s$+@r9E~QO6XvQcc>Z(Yro5>IG8|!!Yx#mUhHMIGTUqEcCWqXKjg_M ze6x}=5B^PABt6Vp;A&p*n|Az4kQx7l#w&(`p#YUjbSNb}nshNugUzt5%f*ht2J{FD zjYMQ+CYMs^DB29Xr*QK4C#noC(}OdaWk>MOXTl$ig!)eh3TJ+ckmrb!AaO0%VEIni zIe&x7O}e_5=-RX)Cqm(+r7xkQIYeJ!1!raZXf$9F?3n>Osc&+0<1Do`>otm)5%$D}h|ii%>_YGfLk4Jm4ma zaTsBy%o&{4@i_G}hS^NJeW|M&=&;>}_%hU<*< zg|1CTVTOLo{wrsW1v;#PbF_VUT0aL1Xz)wz?u)@c;j%Typ{Gf3zcq-8>Z&_gCcV}@ zp7Y)F&ii}8PJ8R@NNPPVg*NmWS%WzX_`S2<5{vq2i^>?D(}nj#pXAZLUWv!IFO75H zl~6mLy$!gAni3K(6evR_bw?z^>d&1PBI?s{2|KB6e_2Ssyz(f2>;q5o+&OV5l2r6q z_0Y6GcuQ#50>5wAWT$1}8Exa9-s9kp;{1zz039bQ6KndUbBT_DwsxYG2;y1!GQK&b_+)5;soUMtN&&-|vnZfK#dLwQt*%aQ0c}R&v zpJW;8$UKW_(-ep0x8j4}B?gg(g4L*JlOrGKA=G-Xr#O>Ceoo-Kx_seovhtiGPys|_ z%$M;RH=gg_4sLEsJ3rr zf3GwRIE&^Xhbq8R!O)-w^pIs{bJ+9t<(73dH%qQ7PYH$b`5_Ra4X7v=ILXKTYz02* zWrG#Lxd5%Q{+-*DB5`nJ&{UHZ%-^F<7*j&pDau8fhl+=F&D*qgMDBf;_Wm^Gq;vTX_zmEVLybm31W)7_`tju}VxG z@WL81?z|h*eSesffaitlNO_bh7Kbik?U!9t4%OB1Z)kT~NxE@rbcDW->eLu*!;i{* z*OqW*4k}%GlFjf^-b#X{A!82M^##R6XF&z^+9&cE4Y0qxLQ}LiCTFS3*BYX{^clg@ zJ=Z~m{x#&u56f)NPqR>#uc*)T;NQjkG4oxf6P1q6VSCi6zEN(Lm@Sy=N^JTETM#dD zqkH9ZiBYs`e{isZp4MgKMr6jDQ#Mc1n2ztQmn;`mg}1E3`6#tRr;_@_JyO!k&28Ny za|a_9qCs z(tt4ZTUS1V{cW-Ux7hM;|PK6ug(a3fins(Ra;|jH>2S!p2 zB6*^8%3}_`_NS-X1~0J~j8LII9{8{Jpw^Uuf}OwX5T;r&L?R_^gf)$le$Nay0kJU8 zc7=DO77AmH!6cY*+3Zx3^e@N}IK)mmcIuI=@J@p?F$`=%m^XEJZY$T@S^EJt)5ZCe zm{fG54AfG}I@9KxFN1secNwr#Kby<}F{^3N3NA`jQx6V3MPyGngC4i<$K`68{eB0L zkOl8e6&KUskxPHEAbCE*h}I)Rp#I|4i}zet;81?BjX zh3joW^`_^);P41aE;uY0;QPbl;3HkK>Xl~i+tFKXgj3f+?8L&d3{`k3x?-C-+?nD? z>2V81gPyX$kF8Mn-x9i8+e{3#T&63nD~gi;B5DoK>{5WG?uVB0kZrbr#C>CW-C@&x**09j7;;`-L5nWhl4E6VDp1%8u%6sSoClLAQc$5K=$9_wq7kvl=Ey{voCS;t8j{#KD+Bm%$DJf@wra z^fB1;g;@vYf4r>SMiMI`_<2@r$n&0rS%UHM!O)4_k7uf0`ODqB_E!pIbx%GH#QJ57nTUU!vVK6=7G*WPDE%EIw^ z8Vu1F{4^M|of;%fG7y6Fx8vD>>_x!nC$cVaUHD6UE?;aKu*(ILsSqDG1lt6m?1pVOg?-aBr9hA>2@B5#f;x1~_eUYjnG9*)x=R?q?5i z8L~t2OYs~P87MsRI*QjSo6=*9@xr5M#fjdHPH)U69U`)J^{+Ca;P4To#$J2$RBS&j z9u;Ff|CHYVQ@!n64L^mIGwHw!C)so|?PGza@#+O9c|-N; z#Kj8Xy4=Lwk%G%MNvE^2`PrT#Z=IjVC(#^+Xw4EINGuiXAJ8*NWuw2_L))7y&Wt+1 z@YPgek0nC@%zQoZ|X)L${2!cMr~CU*qP8i6%K^F_`|r!!ai|l7`|1nyYk4D zXVSf9%rm+9cU*bbYh|RU?IdA!?%S8o$pKur73pIe^&YdlWYR-#oh24 z8k(F(eu<0?nyio+Q?75xo zd=oPv8qdu#_9xDLYp1MB+d4Isg!1^bm$zim1h^OpK)$fIjyJZuz-~rU@#x&f4Hw6A z)e345rp4Fns!j1X`_P`GamfKPtx*SlqTv7&|*V_h_J$BWlOo zP==jIRt||k=f6_0*s}TCFf(&N%l^#ww8-~>wWKwK)Gx)_F?%M%6 zYz%iN00)v#==)1^VQ$`{=^!C={=@*_lJB3H&N)vRv>F^Q#~wIZ#UsXjOX+OTLpIs4|CABBjCbDwjf6n+(ZA``zT3Y zND%AshRT#mEF!5=IgcW$s?sqY#pKt<=J+?de%?Mml49GiWCGY?C9r+VEp%a2M&S#U zSkN;Fc{UsZDEm=>HXFuyaQzsj+LB;jOax{@yjcU}bHpgTP~9;Ls}##v zGN!1gWzJt5b?CPE(^Zz6x4!l{#|=CWK4)GJcP!4lZUk(EN(hmX$+7#K>&Q{#8H_n8 z4*NN4YRt=+a3~Zj3KG7q3$rx=KNL8ACwnM>Ls4q}{JQ7y?nA%&!I0CN<5xfmkjQYb zx#N+3infVPJ{A0XIb!05QYkHJ9knbb?hgYwE!VL-v?dnQe?07`L}zl*7l5=~l6zxESzoMgWd>xZO4j8J@t2K@8p0Q5vx#ahOwEeSI8# zC9GSsT8lQdIzFM6tx`A%YTr*k;Cr9~u(XV)|ZE$Uw;u!ZzESA-YM@JD3Vmp9U(Ib;rrw|pCJe^Z>61s9NK%=rK_+< zGJcai9Wh1$(LC^Bc)G3FZH(YRL!%^hDxj0|&HPA&5a2X9TpVK}{uW9b3-+Cd_~8nL zZ8~JSug#I8rP~@5+Eb2fGdfOX%7$_vRj_!vN-VV;xzPO&_wG^J-Gf%AB4loW5Ihu9 z*`+R?#7DskN|73Y&^1Qw7NpR^D5uIe@Ak5#Pw)wNQcETZG61~XNcZM$ zZ=dg;;Q^9{Ba1&WQtpp6GD_PDOt35q{1_1NAO*c&SKPcwJ<5l~-A^_mCUFg)z>6@} zWbG-i&X@(>d{~Eup)eA1YKkD1TXAb?PkxMgd)N(mk9ag$!~uV)BZ<^+b2+9^@4UGr z73F{USZ9^3pBHtr1$L`zz00AQfXvL=vj%09iCiP?bw2UEJS(0&DvGVCk>HrZ;L`Hfa)|~$=3@&fkSlO zK&8d0b!l^0>&_u}yZd{Z9l8c6{Z+jtoC0gc%0w2t_D@SKy#oliIbM4jJGVwO2FgLwCxA0}R=}d!<5AtDIkj35qr^5+1TjvgqJk zF~xd9$PwL#*eDsB;S0Cd_IoKTy7d&XheWFxGS<6loO%$X1)x}8#NfY#J>|iz`Nng|4DliY~c=Ub4DLiQSOd|STzQ3@Kpgx%m z`u9czHdkw|oZn=%qM4i1N}6-B zm1s@2*F@&lquvKCDI3V}$R*?HUb534r5%66j@mKNciQzn zL~c`X+^d#DtV~&&QT&ril-$&nKGe+=I!Z*QA4A};p|-*;&Cy9W36GNx-Zdons*wfZSqr3aVjJ925mGXucaB~Y*@|!8tH`d%tCBqRGIXQ zd~Zg(VA!1VjP|PCu=_o7oM1#R=L^+>&@_U+a7yb``jhW#n1~^KGe%@vJPEP3?3A|d3q?f zgu4-J-e5Eo_F(4xX3)Q*Glechv551-esl12r_y^*?vqegLuh>BvcouN!yK~TvIqvU zh6Y$U(p{_K7>BSkcMYvR_22+|NiU>S_6R|h7{xHwk2_R!@nSA5Y6*+O88MJ;h?sU{ zbT3C4mJbzah-}d$+xBQtvkL?oIVQHnY-7dlOh3w+B+=-1z-HYheE&4b72&2??+Azo z18;_2Mrw3o3+$>RtOB2%Z@_1(=08t@x|dQ6*_%BWmHa4RsodU5wUG|v@i_XH-Or&G zAHtaRc}*YNv)U@Qytl%>OUV)R?0QICX`ay_60wO}ta6hXx*xb-M?>imGLhL40}k9Y z))JNNzJMyl!O9!_7wHZ;JA*z;gI`pqC`f}qQvCxdQY;j>aLM!0NPgzq)Wpe{V*yG) zq>_6{A6fOX+^zB&SOQLAqVFYIC?W1|H+}5kz~^Zo7b)3MO ztvA!D7Yh1*omXSFbLA`oUad4nj@Q?~>>eXjcydCSfUt(Ezq|O2IKlJJ_$J*V0n8|W zBRS!v)oyk(zR8%N-1m*&Yq-c|$71Qmb&A|v4dM}7@EQI#_SJvBhWeLc?41>4spHKn zO;%FAls9*Ix=+CYTQBxU5#zypDn^zk$8-wv2`+l(AiM!M+`TEusVUDdou=)bKat+m zTy0R9v3=y=-x?4|D`%&~!mcM^S12_GAvtYH+dCO<*ywz3R;H}Y>D9*OWBGoFMk7#n zUMMb0WM_8(^dZK&aeEO&`y&I;?97)9#xq!nK~uUrq0Vg;n+Xkpe;0X}pUsh(N3dfSea%$FQBjE??Z?}6(x{@cpeu^IG7yfpEVkT}?v4AqiQF*|b~boYl( zfUkznvkmgw$AkKBBwte0=bm=cV4o>)kji7<-w{G+Fz99bzt2D52p`#t0*5LQG7G@?1&_Ny6ov(b6YrW!6B`;8qu?e_12JPWr?w`Qs+r<^`B*TxK|t_e#Z)JH znqI%;6k0JzWrh@48HU5Ug7Ev@B_JcApFcf5*XVf7Y&7To9z{;c#gkj_DZ0mem$Ma8 z^QM8xcC0l#m(IP#fsRF7;LV>Ost*UKBdXDF~i9)XPE0+8^XL^%je_jj5AN>o$6o2puN^=OQpb4 z^JvlpHRV0C8qv$5hmvM>lzT>Ol2Vd-q=cntKzP?n!$2?@pORHs3?Tfhp|<_Wp4E}` zyS>XSO_Yz)G2$kYjF{>>Q*1bk&rR{_ZLTz`Cd+m`4*Vl!AdAx>`<&p!!*<-d)i_bvB_N2pV zdh%|H=_b|^6TYMVZPRzM(Iu!MhuGX66Yt~CdjA|LIJ2xvZgr(p%t@m8H?8w#2JI%# zCVeNVrg?>q*JOckjX4!x&rK>~MN3VG-NuCA3yEZ}FBLjEhQ}uYHg&tNg4i(X)`J+u z(^#@eLB}$#!)(tyfvQZ)(`}^O5S33A)VtK&-$Yy`+XJ0w0$I(A$>P_W?my*oANyTj zM-dF@Ud0zDtZ{*For?uvtmODgC@c*bT^;Nm=$wu{Xm9j=(-0%%2LN<9>T7QjOQ*Uu zx^hvqE>j*Bml;Kp+-OYC+eH5|xBMOK#{gX+S=3yqmgV1b0bk2(liYL{a^1RjQG}gT z+ZfR#(06cO+05X1x)gBtxp$Q7OSvFf(ix_(Fv*go=dK@{EHBS`w6!hF_|%zkyP6d8 z^)S@?-pLoreST_2w6ZkysU-BA%K7ILxl?d%z<#3?RFywJpCsWali^^${YSnM{Udfs zI^VbUTw$)*6bBE6kQ;&9^>qzEL~ss+!0qmCa3%WB3z^wn+9&OFh@6??O>khYC4(JFbU^9UKp(i;PQjt%YhS_!-Vm8$%pw-iT3i zSsnLQu;lhHdxpu)1DK!PJdt)FV(8LP|wW**V){JVlGQprgxo(eF-^lP7m*M z+&V;*r5iY1-h*L=yOUhDRsh|v2$6OwETNZc=H0^Oi{+?5GE(iB&c&wZYueL9|Iz+R zI|kPmLh94v=2w|l!8s)5aR0VZD+bmqDsL+~L3W*`LH-l_SxXR>+O@UZ$2CWXj}swn zvsGPly{`6#x$5gSn~wD`?LTd$bC*G4Kc~amUpq@LmY$G>8UQD6!|4N-rz%h#DX_GU z2)eW<%1OL4``TxilJm@eGsnU!TXJM%s-EP`zuuBl?k+#gxBc>Uxc)9Wtx5ZnW)etW zmj(ZZ)qwQF3C(cX1_Vt~UN9=AVVY!lSnV^;@pM*LCcZiBxuks6WNms3C#)BfQO+ye z2y#3x9O@)Hg>;r)YOF&~HjZQWY>ny{6YtxM-8l#>kd>-al#aJ({(y~Ptne}8TlU#H z%*R?tIc}r4k|D6^L;FU!4x z9JH$gTSwwwW{c67=id2NHhf>|T_-t)wh|hlM^9tV;-!E38>UzT2%i@DSYLm*s%=nM z-M84mT2&QagqNg~XEEnJlI?P96!T0*FDP&_CQi~;$-GA6KGd}fzs!zWfy-)DDd=2r z@5OGmm<0`H-=w8FdTQjyyxla@B8A5IS>$9cG3B@il5uGUwXnQM(RB+*KqPw z*h-I7wHBavY=Xi`U97P71YeXyU=T{sfj5oq2p+um1(fIc3yoh5!$po8UpUVkdrEHM;n;P7rH#q4{7fo4=PydYQNZ zB#agbs3M#R$-1Yvo5+WnykGm;R+)WXy)v;C>Q-#Xo^{;}R?hz`6}ttU+h^6Wyze*G zZNG#_he+^(ZlCu!koC!BD0|xysh8SaQ-!UrHvKdw9+sGwv1Mr11FgkF=lNKY*wZzV zVbEo%+kKES#?ahGk9~jz@PMwJtLkRqqPK?CU^rQ}^PNP9%j0%29*<9Il9eR-%uA^6 zx-*aTf>J4tj`0fYUwc~fesx{Ea#%@yEaANb6i_YeVtNs@i2WHE^hkRc0(p}?nd9aF zWN|m}q|DHr=h80`i^bI56J+D%Fa2d!l(&PR8oAsqe{-Us^0_ZrZ-`ANn$73&-3Px&72(NsE#iSe%k|ljT<+=`1RUwe|6?zO$;*|Y4se^KgWJMO z)JBtaw-cbKuKVFP62%DU8Nc%7Zu^cUTk_BjU0u0)iu1Wj zYbe%9JHW2%qlyhX=y*BdgzS3{SSh5$rIGKdrqZFnR@7vIZq3*hBBr(vz9r@0%bi8h z5^D)ktH{{61{fu=Te+XKEm?&;@Gj20c&Vzb7h(r8=Z=RBmkOF}O=JI_2-^~3cf6c= zpSG>xd*`>d)mcg5=L8tNBWy;v4G*g$IiL3Qo_SpVjS0cX#3x2P#TwFOzg9YsUJM@3 z>GU|oPfetxmS66Dx4BZxZ{bs8Nz4s)@+z7T}hvG?>HXD3D(jp7QwdAZ4-Vzsg%pY$qRrVZ8=CNT!9g!n*%{Wxwb-;+zJQCUW-E27cL z&GE6VBaCxpz2zV7caBR7R)#6IxUN!W0Uw67&z#`zfLE<9Y;U(6AEvo+1vDzYR;IZx z`<bJs2>&znWKC{(z3)21# z9ol#)p9>T$3(ee%H}$U;X0-=ete zfbBPhxv6x_dD%a_N3ylA!-z|%m93B3-gZ7jsV(_vEiKT#m%fz%Gp1ttCG2{&hlsqJ z(D}u#Lp#j_<)2p+*AAog=1%T6vFo?99D1%k2&sct&xDL=Zp_vinT0Qliw{i+K@PDx zu?WBHC#PYNPjtm=Bc)Q$we3mW^Y_{#yM~)@SKe*zQv6{Y&{|vwTyBP==okwoXu#eE zce4!u#j+&_T`Ttkn>`PkOod{OR=GzMZcSZWyj~dxFnwtUBIRssyjZnSa$7pg`AgYF zEX7>qkT`aSzFCVU(ZyFO;k9IZ>$#RZ=WRMeW5IUsLLqK%{4CAnNZ*mS(KWP~U!pY3 zJvLASvo~a1sjB(nP1Wv>X4djY=Q^d3PMLJi>zc&%PVVPpf-h-p z^VekV_;OZw>u;yNSFdHKzX85lJl7$mII+BN7B9uI2HtvBHXGVcIHemDYfGDP)N=`7 z6{;_s2aLN~#dV6me6}8kN9mcM@;UcT8K)>#EV~M7!(o>&H}Q?m>#8)=q-@6sc^-=c zG(5%Hi+g_kvSDt_U^9p^zAH~7dhPQ7_5VAWo~w=$$$&)}m2ld1`mzY1G`T7;m?tCt`^mN7Qjm9Zx)WO> zjBo5|i=n+)$3EERRh#oz=(JSR7)f7?*JR@D9Bi+yV65I*I)z-bINaRrx>~FIw7F8e z+RZ)d>Cu?E2h{Sp6m z#&S0;V9{Yq1D!fu_lvEzjFJP5O{sNiQ0bdk*D;l+VjRqTbrBLNMTK`jBY1(;XdZyn@j3v`k^BDX+zdIPG9WR5Vo%9jD9^VmP1oVX=v?o3EyAIA=$zz`3%1^V9$5slB&mZ?~O}b%*#&e zel}G5(ua31IACp!h`8T=jN$KP82m-E`VngUD~sv4K-HK3T3^%NR$h^Ia8$roeJW;Y zPE{RoDSa)bjL&4%F)U%y@xrdpzk!p`$pv@X(P80^(IBv~GU3N5WqaQ}kNBU=xWj9V%fjW z-e9@dNKiGx8jlF`HRrpGIG7yZg}OiIj479$af{Sl+wr@!y05k)Jx)nY>Q!z=wgeS~;Vi8Ua>)Z8)PgI7Wtt!5gC;`_QdOn~C1BET=zQp37fmj3k6(lE6lsBN*c zA+&KBAm069IUWrWd5{T(;Dz0gCGMMC6k3aWb3eHp!a&!AdFG>`;Nd|36tYn6BQ;k_ zk29TF*ozt_++++eEv zsyGnQm@IDAPAr5g`FjN2j8xse>tQfHGPgq@Z^U)k!S=B2ZKG@QUSIK&;j>w=*y$w8 z#1w|EjaTzjaR1S^KVeH$$kFH~kOsV;!?pd2;PM*!`*r`O32l4)kT;gVWsCEBBp~wM zQ!Tkl+ZIK?Ug)BJHS`0te7*A`^KFF}^G~;IlUC!ShvnAy|ykb=^2Jyq1j&SJ2OBG3}WZd*<37p<>x^7mcN0 z2OO_%Xpk!c1%YV4U!(bd-k(Ohe4}9@NXX>@43ynnQRdIW0cJov7gHdfgHkV$L>Ne- zALs}S`GGTYEka&DG`JK4ggHg}hs^f>k)NP|v~hkMl!B)0Uc{hQa$dSXFk-A*V52)@ zAXt3b04ACq^uJcbkwC78e{Mt|zmX&`b6{@&YV|DoN4~;ZuoI~5K8A^wn+7CW-X{4a z=QVEr-1}_>=rv&mdab>NG0})(fnIl#SO!YLU;im#2XwO(?tsHMt{Cp_0a3uk4Wq+r zseq(){z*Vmg8y==0DAwiw%KO`ZPh>tJ(5KBOH;Qn=8o6;0e9pwMi$pkhu0X8g?GK>tjBLmt-B!MKW|D=Wi z;@$ll0RI$Q`q!I-A`JhRoRW)aWcZXH&?Mc9i>3z;jO!hw11ci%U!X217F25=Q#RvPk-7;Fb;0znAOfa&T|8$^a*asR6?F9BHJzd_PR_CKy% zAbrEX5m%N49M(i^z>0@Nfli432|WLwmN`Jy;eTkT>n4%mu_Oq&=061guXvE;F(5|f z#D7Xh0ST~x0_q3S0zrNNV@de+fl`wGlQNhdXwwGT@&)68y-)mKJ5-=;9cU9F*9D4b z#|ms1Ccc>V?Dd%WIKHNKBAn*$_DgzfH-B-|aMP91&1~p^ljfdayrcj) zfPB8c&$yrAFuZcHvD1A`@nhEG*??PK_dMgCFr__by!Bh{Rg*nwu=zo>O?YWMU;$I{ z25r7sWV+Kkp1F4UIWm-+{`^@GCGLRBFzmZ`qc?k<|NYo*&X6fB+{bkH4Ev7h@C5^n z$cFU~QwQhFA9l21%v-QRi_e_!+BUmz&dpbQ3g1Gcs`O9O8q>h`6AclJ($l(gJ@Ei* z!mvQnd&pTmn#KE${zu7Og{Km3aYtN7h!~}32K3fYTxL>A;2iYg+Z<;&<6lZ1N`ALxCP68#uy^} zilrS0=^{gMH$h>lWN6!(oau5UiEGlE%!ZUKfyXkf1BFB=(%5K$;l%Ek3PHU$`n!xY zEITIQ9!q~Z&&zOhHNw1ph&7fpivH0Zotv2pGGH5F$7an@b@)RR<@YAszr&eNHI1QU zUn_MD@r|@K6+4f}D`=}hF1VCd38MnH@>-Rg7InehL=PihCcOgW5^^0knbkRJZ49p{ zDv)N@Ai($s?ANptd-khz91}8SW)y`);wn|dy*{nyj}CJ@j#QjDzQd*Q&@nuv2De z2G_a}_~{Dpp>F1-a-n1@+fF03B0)}_!g~7DvnkjStH>dwI-m)7UAy7b{`o;rQupMZ zs9sFled!~~UW|$qx(h#(mCF4Api7dFJTRB>Xlgd9LF>ef&=Fu~j2;Q|pbmQ@o#UmNt$9id-nxOiW$|gueVa(j&p&&`2?T|5HU<(3{*?vbfz+jd8p%O108%UkN z#EtNx@=n&BP&gWR)U(m_gG~BM`TGlxWtPJJE=G;rm4k$VkDwkPixB75DnT7O5aI8) z(&AC`5FaYk(8lxds=#%^auWGoqz)D{1yL_Vy%)nKOFKr-h%ZvB9I+mJ^kWuVXe_YM z^fAw#xC{>>9uMScL`Ap$KL2i#5U)4Zp7e0Qh&u}dj1rm@|Jsc7nkChJ=-ZBLR4;@* z=Cg)r48-AKTtKRcsS@S(jATl?sEL0>*e8VNADy9fdN41<2)O&OO^G~J5m!@NToTTH zV|;>q*eeOYd?kpPT#+M03|7u0M1N)(Jz}9qrrF`EV`*y97Ep9}ig(zdLlwyB;eXcIce}ner!JZF2c71Q{*{f!o%&PbQntE!#KQQP3Ue;ua{7ODOAAN~oiKQa)47&qrbd~c2HLWzn0vP>{2*~Zm9okd%#V;@G~+t$n~=xEp4cso9^Y2FFP7Fc9%lW^{qwu1N zS;I##TaWMb;EVMR*9tF32V%n$7td(p%u7;&Q8)BuLysy1cLuw8jKHt+@FOcmBp0q_ z=Unp>c(ub|@zOl9RW~vU226^bs>k8Rz>2KrTQKu=2Tz>l>ePH z0|TQM{6K^M^6EGv;vISF!Ae1uRwD#!XlyAK*KU7d z-Op%d_d+mz@@X&-7GiklYH01>sy0f3?Bu-qc;eo;LqhkfSW-Rku*CS5+ft*+pgr{V zyF1BA9oeB0Q-MTU80b4?CoyD512@+1T3Ap){9M`&NY3?|adnP^>QdO>*Rmc*XS7DIZp?QsjG_8pfUj`JR zIZGm`!lLKJy%{Val=!jp97Tzfm5qtP&GQ4mrura)YQ(XiT2tDTFkT2`gu$Ih_WXGw zYEt${eh5>;xmt+r=tm@c8yN5bcgH~A zg{Fe3in=BO?3wFmevAl@a-0sKY&{9CWDF<>K#dl{mnwI6SjWzsYw z)|>@D3_PsFqSfq^KC1++J;)9Z`aUu*sylebRg@D0@qz;BC1&9V*tZD!t;Isk&2mqc zW~cNGR1NzvPl-g|${x;4jLUQVP>4qu>&TgZUVNVl=23&p*~PgJb~=)SscKnUNq+Mn z#&4K;{U(poHm0gPbER(CDdZ_muXL|7G-MkS(Wr{MU+20;kh+G>(i*Z65}gym_8Aaj z0FOCqWm^O7Rz%8Z`MUchfn3WxxRc?hCJQ{tf!v7=o*d&L&;I67%?po}v9e4Jhh1yD zA<3TDLyf5facp>XmM7`&7vd*;(UTwKFeDYGlnG@(6q^YGb6F5~Vs1y42M6xN?u3a2 zj%|x00eqwxtPKkHjA_)$<1CHX>STsgSS17;rpH|m5dee0QS^W;jozbY3(aj6uCyX% z4@DzP1vLm2fqk#FDMpew?a&YPekd|TrhPaAiKtrTUv`}g*^`Ule#>b4sLW=E_=E%d zfJfk#x?ug9R?Y{_26eSSJQXuk{e`YMV|aQ*vdUejoLA_{sJDqHy&9%eqOuH-o7|Dg zV}49dCJQ=t=A#w|U~Bt#5_6PY`Y$pf8CP%z?6Ul9f>;OT@>E?TSj$x(MVpr}oSWvr z)3>Jd5zMZ85^Yj1iX43N1B1r=#r)j~L4qntQjKi-sPuLaVkF`si+jwcSsIulpUMc#%9jBqOBs!*Uh4H1^T5l2 zI>}}Xygh6t{e=)}a&D{%>D2$mG3Ow5|Y&` z;i{#5ZwbjbXDV=sWm($;A;f_K5340a6o1q_JeU^l&hXq5OL$P)k5{_=el{-vG+lqw z@-7>CMD6%{Mh$VBk~L_?m{QFc^AAP81?gcAD~xZ33aOBVSeR;v3}s+1W1|IL6V$5Q zzq-?4zs9J{(8OGz%kW7(W#cA)c+w$5ws10Ljre+wFP!-;D5Ja=5uP$eJBa2bYzOiO zbW&Ix6QVG4Z0K0f!(W(-OMDb+I~UEH!*kqX7#a~cN<4>afQgHhLhm-m6N@L;zT>u} z?03*azvaGLNt^$K$#Vh0OtY}(ZQJcl90=2H%VA}g$WbNoXK8SNGw0knXGma>qL6C= zGfE9xMtV7<&su(*UPnnaY3 z8PX;ye&5!R)7eo;-PV=U3Dy&INmtYf)MH8hQ(8Yb@A7=0!u71$oHiOlWk?&Uco0^u z4K#UN)0N!5B&o__T$g*bVySTLP~^7Ll-S;s|1vy{No!{)xx6i3^EyS$ZKo@NeNoL% zYacGX3@?B4I_*yL>@6h>D<>6HBQJ?~QT?4pyQ6}%qbnz{uTl(zCA=w@GCXC;^`tKu zeO66R^XxCp2`hILd`MDEjw~-VJjKbaKv%)I7MD}IEr%6UgX}S^$WT;^EI;x(ZAV+z z6W!lZBKfrloH!EsHDNWCG*+!}yE+LuL9XSZXM9OEF*Ab%q(&!Hm~T zPZnf)l@wWUH_UfBQWgtOlK)dIpne5!;7HKOD3(zyY=M!JM~#(5nZn4fJmw=e z+dLS9+zVlJ(J(t%4l0c9i2j2Fy0pr}k|2zrx0U5%8iQ=-;L|aVGJGsou=0PnFpKc< z3XGSS>Ohb8R3Yx2(0GuEB3c5}pz`nt6dsRWW*A@{JHR+OFwVKNUb1l%GgBzR4Jv_r ziI$-9|Fwf`hL@!hJUHptx$|qDVhQNf%8lrQvy_d2&gBi6!*lfq;cuP|?F@xLAMS2jQve*vTR`(`g2 zRl$#pFF%`0jMOKZWL?=DfY z`4p_{F8ygfKty^L0%Zo8jkZD4wGXOqXs?v%qRvb*P+bdTkj@(pxvQraVUETTcJ9=LYDj z-Wf)oZ!SZUN<}2`BpS~|8y`)5+0387j4$F4sil7Q zl04Xg^Xj}eX+q{6*CE%e^d?i_P0<@~Qo2n?dEL%7Jf`*PPvjw$?H z;c#NPaEcixp#_;kkkQJV%_QefO-^jSfKyIz%sCsC;I4|~q>%9Vn&ccINfUSm@4X>7 zX&l*;z3APq9Jt%A%9+f0$bq{DBxgIx`KZiU!{uaiIpyl`K{&e*&6h^P-C>e*O__7p zk#m#FIpnBuNezzO;&8T-SfDZ`P9TS98?D57%0WVz!Qk-O$(#z=;JZl9y9xnkYc&$n ze7Y)OYR);W#IfL{PSMaaoLgMA zgC+UuSEj40m70*B|Bt zY-tM?m7dbp{)#p#3Mwi-P*ha#QBhH`zVICt-=L`Y){5_U#g=MbYAZz@ zl2Qh00shcyyeJcXD}h=gp#tgkYAR5=UxlfDIccL7)o}E>3I{x-q3%7{aD;=eBk8&c zkxXNQ1SWhJEgk2n{p}W!?fcCN`vE2bq{IB9ec`u5ECj(C4u9@4h&?6n+qJ%U76jw2 zv9LPcefSn`RlVV;3ijE+d8se3aL|fBEZha3O&2-1bix690Ul7)kB2zVd8;^T4}tT0 z6Jhy!2P}IMq&vJWF?dr&KWK~&7#qc`U8^=6TGo$RM#WuTs`fl`%PKE8OH22kiEg&+ z4rzZlW`k^LMZa2D`W&d;y9qtPWu>OaQHvzhI15!m(<}5;ZSR|K;IfrE;YH1pQS+jx zEmG>F2UXmHnkJzx{e>!PMV$odmV_#$shu9w?dH^xepG=Mb%LU9bZfruf0>^xXW__% zNV;&ZCYQ>uaOhWEb~q)6rv*KLyxI@m{b8<>zO-3e0(XuftuN-J6K6!il1f^&zurOB z`A}6lYJq~9JC22ukx+ci0e2<`1srwthaH>fW`~YCs76BFjSM_JPYD}U0n1m|GafEt zVM8pn>NKI8Olnc z?dQ~bj&jP9{K(7Cr;BK+-jk~Kr&ji*mU~j?tFeU@@@aEzP<@sQns=x#^%J3%bfO*; zYN;3Xl)QFnxp5NQSlu6{UZr6j1!E)Ov8_|dov3-9lNa^zA9I-N`gmc~M7X(B0>2Qr zPhdH~50%ld0$R`8LR-dv9SxJdqanZdcg&&317OlU&U@8kg`|Gn5Wjoh_`ze!`}w8l z0oD1Dl6mEJDtDmI%o8g8R^&-YO4a1`YSMQ5EDb1O{V@rAC|NsIMeSOX2sf>8c%cJk z`9Px=Tm*Ooa2?>sD;(U9gw=-}aKixyd%+c(3R>OP_7_NVe}&BrdY!Hpi!I1tv`U=OXk zdy@T4GIe)9s&2I(tm-)%Zr6IqAJEjSXi7PQMt)N)rGJi=C@H0E9mu!jcBho`J$arq zPp!r7u~83!;wiiF+p3Px>wu@b6te3Z-k}yyiupUEsGEB@a4n~yk%GlFNpNWyCmxn9cfj+5?!yB=Q4gqn zQ#=zd(Qsy&tljh(eW3K7M_^6$5U;fouV3O-Q+D|&&aIDv+t%hcS0_S;H^Qifhp+jU zP3=Z4`a!08P}KvfrzI-(uHs;-z*Sd-82c*-0lG<)=+TcTrA9)@j-Cy3aL6 zUT}ML4{()x!Q}EDumty0@ca_)>+pItrW=F!9o#R({RG5st?ZGIOT1POobdEDn6a{l zp_8m(?ZBf?Uu!q7D1jZn&Ed0jssPEbW2yw^Y)F8S5C998dBCy)38L3r6wImV@I|XMpcXOlXf04rSofP~9R#sqIq=?U;1?0~1 zctYJ+^o}_{7#`l@;OH4E>|0E0tHvgQzV*R^*N~XS@9nh-FOFV)4Nul6UL0Tg`rllA z`PI#D1Hq4STTl@-uQvRvq$S=VbdN;TKq@?tCq(y^Os9u-A@V3jGwSvu<%GX z7&A6bI;KVm2P@;4xs@`pv@o{T2KOf0VDE3Sva#pAVE(su=IJHzd6ODrp!Ot4=atZ~ z=S~ds%^e1Ie-p!u{f23(C;WDy58ORZ!}rVOuzq@!e9m1N?0pc;Y@`INd*!xQlX6Y|pm~%y56s+9YL%D6g5ByXR-RxEYmL;Is*g;V8 zpnJ39_dQ?r$Gox8aOQa=+zy5*4=E^|94Q-fPzpL|Nj;0i;ocsH+s=$1)dYOJV=k?#xeHey`l_wQ+Fmv=wfi zkAvM6UNH6!@%VYa1dh({#jKt0BNEEkZm@rkRC;C?1v|ziFssKY;Ov^7%$7CYcy-L< z9#Hs5EFk63QVC>Bp=KC8AT)Pv;RNX;RflDo6;-hZTsV6;P@{I1xv+162 zdO~kz^8{p2u;N^III~bLU4pAZB^1>4fW13Fx?r{^p3Q$81LuB;mDV*VVAG6f=Ia?W zEPmdLnfV;&#kC2{skI_~y0+P1*P))$D>+KWj^EzQV5*sPTIAo3H<*3a4!`b_!uAIe zc)B(Ua;HW@PC3Bd3pQ9?CRJShP8;PP|@ zY@Qb@yLwfQ5=VDt+9gjYS{2Rwj7yznu=oj9bAObyW~WFpw{FG3?THfU6`a(T74>0e z7pdU%_HN99?H;grS2yOG!y{EorsUm>gNys4q56>&#?6b7U##;4=W`pJT`gg54~LnD zY)s=paj0M0)dvnf_Le?4D8aKydwRg~Nm6OmW(LaF+L_|DIFR!&*Ie=0J2pl`(M2N7 zJtu*g)pq9k5v9A<)Asj-X-8~uIY2hOu^F7)8^!G1D}m>G;+cngo{8BA=5forpIexw6E>b%jIhO#dA4{aq#rB`xotcUxcrvFuQkjKD zP|}9$au|CxmihjQ6duj!!Cal;1y>*RX7)Z1bK8F^0ZNX`rFl6tJlh)2JlHB12@{TO zjDgu}W2F19d%~l0eV8lfRIqz$0<(CkNX)Zuc8ArcVx`NrsbJ+bJ2Uwj_5f^X=nWIM z(9-M-+dDgHFx8rQx=H#%&Cipsg(2{PWLy@*_Z?8L{cfd6$Ot^S)~uQ)7SvHk9rK- zb*3AfB`e_8gV$j4Gb#Lpyb3$M%Kdl#l=a2YY#CKQDGnY_m%-h=1hznEWQz{Sk7|9tItbdd`BL`i#An-P2gAxL2k3pL zJc)$G0ORp*4^DZzqG9f78kUcOZ3{hN(GLvF&I7nGzYpA7Is}c zS#5qK)DkFSV2ur~6Szsk)HoO`fm(p801Z~S7!6gCa8M2rV#0$2)&L+w{GNgnc+m9wHE)mwQ(Oru30M%CU z?=gs%Tm&p)t6X;%6e|#hS-mbkY$jllN)uq-DFQ>q8f`{#@fLynlOWl3>jP*FqhXaC z9^%UWC>AX56u?c~@3;jp|5ha2YXmsd7ztajb?4;R;LJ=47EMKlP)@<+RW_)_{k}>Y ze2rs$+%Dv4M=02c?5Fe;1;5qVkVR4OBeLyvS1FX+Y%t~o1K%Exfp3a&fm|F52Pey5 z+2lB=KQDtFIJF(x4e<4DY^?3xaAbQ=e2xc{ly`$Ixky2|$b9eO{Bkz|o_^~MXTR+U zXDWSQ+@@Y|^=>oRb+l|Qe~f}@KTF{LlPI|VR04;dM!_W~4O^YjP$%-Z z)yR5rrvGtjG%Q<*<7iJDoZKRZiY@Ul?|>41+HZ%#UAQjX84q*rctYdt?r`Cl4^$rO z1$A?9y*4Knmf!V+oV(p&=LrRzKa>E!xV+(vt0$bzmBGf`I4IxZjclYRO!?IZ?mp`U z8y`1=8IOBI)h>Y2T`2IE;fjB`4W1sL;p~BE$f@&&t0#NH)^Zw(%A;Z7HX6p@6p@2m z<0=XZXD=ed#St`rDXy&+#=w@93{2Y-gWdn~8}aH0N8(n19RLd>fp;T3bp1ohKYpJP zsP%!0b(q__7}&I(fvUCMaH_Z`{8a1>_Z}p`lE))OD z#PA$sxs>cFcs1@eQ;&8Hg_XxRsK-v3xyJ(z%$IpRyOj>(5W9-l!`&Wm39&1>=|P75qpZ*H;7$1%)xJn{j|darZ1FvJ-?C;TM=_^r{N@G%Mq(aY$jr35nGGc z4#egncK;9uIfzY0>?C40>(gN$ViOR%h3m3Ah^^B!#1tCdvq(m5_%T#1Z2 zdMO>IAT}GZ1BlHCnB6j;?I_yGh9%9e8c)&iyHeO8k{gTMH<-ml^ znm0O8Roio5@elrR0k2=c>tperNBcNfi1%zp>=9zeE~LX@#7YpGiCAu_j4DQK31W*8 zdsyiK3lO_=J{_J_aj+DzBZ#d>Y!hOq5c?Xj<%k_ZY#d^15GzA$9AcLdt38(vxrnVq z?DA$0_z|%Mh}G}qpd7Jnh)rHBqwbzfhb@S$L2M3UrHE}tYzAT#i2bn112!X;gV?=2 z9DIY=F~n*RJANh|su0_N*eb-XA+`{)1&D1zEEln#5xaLf9UkxIpc1ib8$Dp!5*byA z*fGSmBDM>$Wr&SOtPHX3h|NcA8)7F;rNbD+b|UuE1`jxn*doNvyEt%(#ERH0#O~Ln z!+ON_h{TH6uZV3yEFZBdkysI%xl~3?Ks zu{nqx7Ks(HQ;0n{kq!+zIj9zi^&1o<5!;H`A;gY~#ERIMWil!kvBikhinNH>9K`C5 zr^C}79Gnno5wX>Xl_FM$Se;0V>pWmDVz+D4VL4)_MOsAc9Aaw``(--^XGK~>>>*-} z$B=m-c3z~#3J)0nHP#ogV#F>Yb^)>ZU(5WSccFgGA1d2R{uv90C&&C?)mD!l*PhBC zLUECV*XF{udBM2e3c=wOB2hyyXz=WjTQ!D@+SVxO;{{4Bu9sdwlJ=4S2)HjN6t0v0 zYajkUO7LI(Jl*hj{)z}u5wg%wIRD!qL1r_1+<~)Vr)A`>X>kwOD6*6ZFjmz}qbA^D#4vDZ}Ux04IHSl-& zyY!9=#``58TBe2Bo2Rxl1kJs?|LtgHDyNl8-yi5SmmdQ0#Rwr_v&3Gs118aef8Ix~ z@Sys4`NXirx-5i*zO~m%{4fR9HKcJuYoP zYmj5hvwE#ia9Yv=FYhL!Qjmu39|s6ZrLl{8b2_dbMy_pt-{ECU3_8x;6 zlHF_|#U}@g&GOom$o7Lm%nsaIvUNcLDj1blQ$LUeeHdb>MG?3I^&_R_=O|BaUU zTSpS9!VMf`xDE4{9{cIWRz&{~HOwE`Lg!L@zK&`#%$FWgKY+^<`?wABvl~eXEY5fQ zONRNYi_`%J>a7104D*%6OUSEF;Xg9bi_iH_o92JItegbTZ&?3_nC1_ZM^l>>e_H1M zw9NlsX_<$$cs^rg57UJ|jq-mQ<^MFw|7n!}|BF#x%;67KdG~Yw+l}%&JzkLb|8Tp! z5XuoA{K^ftgOO_1t`6}+M1HW0@uGJ6nCD%_5j>@Xv&)5PCltlKAolU zXsoaiZyRI5Czar%N)SrzU*f=B^I&_(bk-M-u$YPzmZGq}(o~ijBiwE&napPSj7c#_ zN=#d2*7_8+_?#@<;d8>Lt6NW3E61vb$}?EN8qr^})88KZxgmaaWOg?(;VjIQ4Ynst zX9K6RTng)jh4-}P*0#NgnQvr1XZyT8_A5Om&+HCZ?G35!@+TLvZ)CABxg^Ukjin@5 z8bykM8jGcoX0TNB^emroBMpG%iOlLjMGumc)TOD#T4dnvHBDK^FV&Ok0#emL#SHbq zl48MRSUzm%api`Q-6=iZ(TLS!UmsJOo#t+;uDGKo)$wy#g%0BKugw!$8z zS%qSu^091;rYx?I)fcjCA?tzXk;mW8nQpL+>oG`DnpX&zU-3v5u-AKIIVmi^DMdZ7 zhD%jbW07z?C#$o3#%CF!4D-$I0aXo4qi$4BKL)vQFSKYJvmyRqH+jP4_MR8c5!AUAgq%TXdib6^q>L>Q~;*HpkV(}(? zrHfx3RnmQAA?1n1tHwejF@5M@#RrMxLdOhkj=LOTqc`rX)8C%(x!$xo>XYtV|I!?H zl`dwwt2DyFQl8RDbz#_4@|d9kY3|bb%w==G5^wl29&gB+C6??ywyg)=@j32kY=m&^ zL~#hUn#SI4*=!s(Lhd-@R#{Ybci^xIvI_@=Jxk#z25XJn`gU=H6_!OtWL!m;9y#^y;#>x z%_R;wgS}Fmfh=`M2dvAG79-VwEjwjopg2}zGkW*=bV+5g4s(3>GPYJ$=5%$KUHyLV zfMx2bneH@k8+w0PJSn)39`9_gDZ6D?4|y-kp%#{LohPU_wyaQ3GOmuR=v6sic9D)4 zGmXbF^Y9ZK>?4!eft|v|pH?`~v3S!m3}PF{jYvrCza(WoW$G(-X^xuGV9kGWu!F*~ z3)zT5wsopV^Yf;q7#!@#9)P@L$?*B@`YOH(rlM`5;tO&R&k5!C zi!|Jc96w9(ycy0dp6w>t!#_9rm$m*xonNO+HYgZ~9V)jTYj|{%%3qR5Pcp6?JHdD= z5*bzK(2`l$pyu}Wge*5N2ps9=&Kx$jBzC1|suA`qNo2~{{2r2;$P_ALp-wqe2gtNwn4wA>|KhwWA8UL&XRHyqX%Fs$((E}xw2>&K zUB^tbG%t&jw00dR@^iSxPy-Qch9IO;~1%nuZLiG;_Yd=&DP(4@~EDhJ)tZZ#5mxOIw%3;G!-eAH<;y@OQm$BNuxs*#TXY`c&j zlwAr)XvYmSCxi!eCc0P^jduV zRmc`GmPwJ@kGB|DKpjbrk=bh^E4x_xfaU1(6?!{uNF3y8-Y@DPs2N<4}O zRd4bx8A_Vs0Eq=k!nObJ(Sk(hm9_%62N^%78Xw!rD*D7}NtCHBTFDg94UCf*d)o$;jDlvvyG(If)h3D)hm#Iy0cKW;bQGEz&Rk}3zt9GfK zN-O8oS~c#yuU;v30nNKz(b^?W36Z%NA`|`eT4gC80(Ocu={<$iA}PT`r5HX5FO8xr zQfXt_^%kX#0d@39YqL861BH<+jznK(f>5jBe>yEonFDrO61Eemu`%ep1 zpX?=JGHE-_C%2Gb+gfG(AiZq3UY0q4Q1#N+hvQF%pM*}NMfbQf6k<>b(eJ8@h#{L2 zGNc7_2<;n5Vz6}wySu#~N-Kl0!(%dlZimQV(l0|+Fk6~jU==%D>9kKJoWIqFC`fC< zx&0XVla_8$5MOTocPqcW&oOsw}1bGvX=IA#MetTiT}HkrA0i!b`1;C0WM2bnu$|fUq3W zM>f)m9ukl=vvG?@vb5q^Hnx}&kpxJVlMp+m2!}BEYowb?vNBj{li&6sBx9M+N2vD*?CWGmn-SFO zoeyO%Wk-pkkR%xmZ;fagu|?h2M*KU&9Nh zW@Fq=yd8Ml%b7!%xLPaHlgk&`32WtC9PxE=PL(wo2&c5-hjR;=HGYwwV;JGjI z0yW;Dvij;rZR3TI<{)waenTHFCbPhp-BPe~Bd5t-*i@W5mIG_CaLw#kmflDp{cv2x zAZv9HexC=YADLs8a{}F5I4FP^$Vpe#0_dJJ2zIsknmQgh9pU5(Y|l_Pd!+e&->74h zy3~N+3bigdKpr4^`x5bHQ>RR-Yt>W~&JW#m;U;;1tYrd8Bt1zCzhB9<4KNv%oTp2Sn!}`s^8iBx zt|Lh6=}$Yq#aTeFOX27w_YC0BWpctI6HW{Kfe2Hq-IB-YBTTLqLbgdlG@{!yeZEQR zYI3lrYP3{v#w-(Mp^+sD#U_SHp&MuyW7nPK^o=GYX*-@-`F)@Xz{yA>=!2+Fu=zhV zd>-@}>Bg&2P)iP?Tv$sY1O!PqJW@J^(?J?1zi)`ZcrHpaM2le+XLLc!ZYQWq*3SwWm(X&=gg z1-A41KMk5?$?FnW*oPJdry%naz8^?i1m{4B+mrM#%RzO}vOXY$1W~EjCk|bMTB-mC zQeF~pSWYgsEs4-&1u-w@UZG-um&(=TTTdZ+j$CTtIpc^RoQ;k4cRi7=#KJ#tJL@sEyb6#;ojO>$&+%A>GDJ@AHLpUTpj&Q<;KEY|6T!rJ0wW=_4 z6~Dh*#1PAMlaPZ{02a5a>+QPAx8(ug4oXL=p`hK6h`xrj4~Q%Q8SX%&#Y7xwgGn5Y zzHZ2l-z3re{yW@KUUr-F%yh@Mu}UmbEB!I=)xa?USW!JFi9omDt13PS`stgDb#;Ji!SXqK&WB) zhzba>6m&73<*1%mp?(I_hXfLkf%L>m^~CB$<8cBRq=(m(hKw&kbXv%78uexB$Z6)x z4^20MY6ULS1J{Ihw8XWH}VtGz?bx$~X05U+)k6#NbC&)D)P^zl1XF)om(S@bSag^Z%Qj61uMHiAih&rCN z&k&LgV%$G|Q+RgU0JEU&mr3-j<`W`33lc^~IB4kzci3L!I-N#F=u8?R)GS^qiV*U% zgEG_jgF`ffMizvIW*alz*9Mzi;BT>O%&FNX9FrktVUXF*9}d&B<-6*O(u|k`XBL9G zlEAXGws^I?uW-A-WYq`?vta3($XIomUHSc23Sv6c7l7K@()mV9b55t`8YYE5qcC?2 zp5Bvu7IZ&I=%o38XEH`%5{)xRVb)EWu5$9nGe&iMt*ccRJ__lr7{}WhQ?$8l&M0Gy z*{(|%1p|?~5HyFH`F$lHb{4uKhszoTvI1$Qu5ekco?Rn#MTi;Xj!K09-O^=Z%Bt78 z#&wuAO4{T_x0TgjC|D(Pd%4ePquOr&TEE?a9Ipa|QB|`{mUPRbt^IW8 zW<>D^SIh|Q)U7Kc6dj`6F7w+}XPc??1Q3d5P~t-Vv(L6f5`DoIBk9U-T)Z{5wnNH{ zppvaJF{ZE|R<4E1s7&uv$pzot+CU2{I9@ox(G8}~>C8F3PX`+GNm~tJUHMHxU0Y?& zGN0vy`#~Y;+ibeb8A94NA*HL3l1}$T%E=(z+SYP!j@^d*+B!qPgwAb3L06$5JviTN z_`Ziyrqdjw4T?m5(=$ig${Biaxs`?Jg!e%ptIC= zHC{9mStL%+Q6wHmS6>`uHe?|-+&f6`ps=Ar{S2Jz>^S1ucT@^Lt;e;kF&m#VEV0VM zYvsHcYXGGJt29&ZNTg&bv`Z?iJY%O#iNT{R#fipvD=kN69RS(7xI_+;bThSKzy&W& zn51rEu{CU;VLml>S+3v!cH~Q;Wh=0qARInK)!}?f?k0f=WLU!bWO^@CIY|!YE>F zxGCs%^&&ALwI7N1UVkf7+a~FjAx|4v(|Q^DOjnFNsKY#RoNT=X|lZ_{Sd!dt_T z*|)p+tFbCX@QBhIibI6!AwuvlWcYl|z^FLAb#ie0UAa?qi7GnEZEh8gox(l{>>Q=G zatov_x|}&>rwa^&LNbFaQP6;pLc(+Y_>_==9qKi#LyC;P4jFxA;5nOL*g8#=u4I_-=x(o|JR4t= zZrjkIF_=B;N4vyGC(`=BOpPhU)|M2RiZn*cJzQgCgRwwkJ~)i8t_tp`EYcSYlZZaj zTR4qBCULr@!JSn_79nkzZs5IobE$^mPmB*1Iy5Hf2b|6#Lv$Xt0cr@y2+rGM+8+E? znv6#l{ATNl=9(1e_*3;ZeL_O;#Sq^RU*peOB^w#+5@Of-IR(e~ z&iMn)BOe%EKgTo(ld2etkg-;nG><9Z&rBJ}^WGo%CX(Um>NkUueA_;$GG=D#$#-p& zd?{S&Iayu7cl_OWU;U2*73#sEwUDFRH!zva36)@V98jsg6>5bFwLY{{W~N6Jj{Uwk z@*{EaAZ%!(7=T9!_#KRRFI?{)J#Qz1_k~{k(J@hu4t8I5a<>K*|-ktHPK{*CM#0keMC%wu6C}{ zt7oK2$eX7PkJR~(@a3!9g!Jjq1G`|mE_}RkBBu>|%N9*~8}8@ur+BX8(gDWTxO#R& zvXB!jWCwR%I>2P%s4#qZs4hHM2npuv>m%QYP>@G8!UOl+KuFpitA}1 zV*swu>QPc~@io7WQ%6*C`t}22!bZ+BRdD>t@#8*?SjE|)M3a*&nC7{|dKn*aJTLiy zbC7uTj-mZ@LGu#SRYUnxk(x$JYLF@Zp~0>JF^nfCd@OYeL-$Fofh(*NEgOQ&$rYxV z8awdnx7#Fu_Q~f;;G+1NgPIQ26?)f0rH6|)>=A4vs)#jrA(F2IQFAkxYe`!6r>!l% z_G#{ND2VspDQ%kKwY}2X__X~ywGHJ~+oXE@t=47$@pAgL8A0JMwoZa-R+CEYk1Cs{ z>9iK7QQjSF5u3kB&ca{3PJc|p-|KBqWOnaEQDTuJI|;|@A&{NHkj{SY%L=^wS(EZ6 z@AgXNeOjP2qxT##esoC3_DVqWX{y~Q;e8LhL zFVwSAnOnb(!&>j5w!E377E06^N)UCn$+fZC4W&d{a2Xo7rnSsuja{4oUeowmc#UV1=B#g1a43UXV<#E9UIDRo zi$w!Y70Q8j4eeCo(nd`Tyhe)6D=I0}PQIp_=6yZa%FLPd_glKPVDU{+^j;^_jS*$34tjZ+D=579p}=48b?@?h7u#*r36K426eV-+%u`LKPVLV zx*$z-xJko^UiAH)s?dnr9MyobQ3_vE%5h;OoJ5Qm_5m^GaqYGT1?F)y3OX*8)0aQ} zG1t?Q$?5YVWKDs$i?C?IkO)oKtRUgdh~6YtR~Eq^w?uSQa!n=`DbF)_oZvQ9$oX^O zLE%bH;49OhOr|lMRkwl*<7>8biFqsEWcXhk%5+5>v~a3&!plv@B2JWlcXRc8&2G+* zm$^9OV^eGa?^((5rzUnu=e;U8XSt){^=WBBNtzTJ(jtm7v{2noC`x0jv=SxV0){`k zx?jr<$9y&%2qhSB?_-k-Xr%G#3iH1LQBY2P{Nn&bZtiW<k!>(XXow`T)?DnGI9SuSXHP)j28 zof+T^oF$%z5oSw3-{KF>Ibre%0W(A(#~UOU&HO~^o!Lu9#WCWNaOjVZ6mTQibP#~g+#RL zFqwj+0-2>y?Z8DFLDv4hB`ktS{$R?1S5k%{*I@-5xlNr^xD>F7QYDV%Y4 z7p=wB#gc?Wt*nbd-_o4Z_YFH2c-_=Cr*CLH$JgCAb-Z3{v~mpRmUmSSo_dqRDOyN4 z&R@P?s}JpK6dB2rbMQW{89Igb4KyLg;Y5|8aD0XpCHxt0VVW9Kg3kJ(TTR#{w6E!+ zi9e(Iu+ehSq+5A|$<$TXO2w5h)<9+vtmhe&A8`dGD+t=Re4?dQP(0|*-ALBa$9+T@ zB^ld=#@0y?Re?IwO@SWGpDz2bXi;BfjF0I2?q*cJD!G&)CgbReSwDB(I5>@b&dz0@2CIZs)K zq*K9;HWeI*Rt{nAO{c(j!(2$}&dN*I-E(ik}Lx%W?9k9wju6Vlz~f z0}DJ@y%8y_W}lh;c)CofuoL4Jmi->%Qd8C(#hOfMJzc0Tu?iojE0vyk zM*X{1Y_g2e#*koKEWR*(>MD0K91@Ejxjlb0xz4avH2Zt&SrEe^2{Xi>i=!o?pwZmP zIo^4vANj+0L!u zQd%{v6gxYacF;OyA%D#Ek-^`$TB!)_B7_W3~**sGnqUi=3c%P*q{7K6&gXvyKt;Uia zVjOS^1tUYN@(h9)<|wob!Cuyy9U+0UPN^MQeO5VttWC(LJd>g|%8ShY_jr9u6fa5A z8tp}b=e-_8NYV;tQTDfM_0Pt&v1{K<4Kb!@DF&rHDI4}NTmFvW*|?CTsIcr1Q>Ip$ zfN~s%M5r*Ot~SaFP(ag-?-Zu2Rtz;{YJgR;<0-6|Wdb=f<>2z~bO8I-{}*BDyB8i!VZ^4O_D3zxUex=VJsH6{mWm0OV7xmP0A;SB?dQHJs<}wYN;Y)GI z!^dRpVdKA|#L%u$y235*>FgTQ!CuN!C0}(68!>&ZN_{_%MIo_4H+imA%4F?k{hX8-=vJZos8>GJsT;!R7cUbjPiH#c${SI% zScnec0w-jW5$Z(~Q%RhDq^$$dvI)L`!k9H##>S5k^y6isl*-{~R1yA~T-%X8SF}W+ z&#~Y7x}Z~8mC>SA!u>-2T9UT2<6Pjy)119;mF7#d`;0jgFeX;5Udb&-o;34O##I%x(RD% zf#GT-sbYnNAQ- zdA&ZV$sWL1xQ2y>fbra~v+YJ=%l_3EJzhxLCrqnQg50-Zl|D6TkR(8Ne4ipvKb}jT zBRKc7U51A_Gx?Jx!z~h<(&ewD9CPRw*4Ds^`TG7!Ry%sf;&f+B!C9L9_`8 zX*Tv*6#c^NYJ8TInSqSice~8ie;N5#zGkFv+psA87rquYd=q!NxwKw8M9Q!q z{RKtqHe-C}8Y`nP52r8XwmNGPTZH-6O4%iU(Su!^--6$k=i6+^OC5|`FC!{PRD`Uz zms2FIY)EA8wjq%{whxK?$ch`DU$JzuEq*I{G->Wu!o=C#+OfY;qqsHxqE+yBD{nGQ zpT1A?4>d1tteiO4x|J`S?3MC`%<>^@xjWH6RltyTf2)DXcli|3*;#76AHpx2}i1{I{%5aWMUrTg+-yzC}z?trT; zNy`BmoFQks)wz-;ZEo@<&%aUT4!`zK-oK;Vn%u!pTmi0kykEV5_uPoT!~IlQnX^3p zsK!l7lN08JLWLn2kl&b;$}}l%X_P*Qhxm%-OBHUD0{4Z=1+2p$Y+~wXSqF&mzpAYj ztN#&kG-+#7FUnqNYq9=_D=4?RHsd_~LRqWp#$^t#|H3^`{(+)a;#Sm>K`%A6AZlu# z8{I0}cx6g~<-CS-C1nxnmC{30%)U^1w0We7*41jl8Z?5R7DSbYX;R|i7epKs#H~Oo8rVaM)dq(kcXmNR(D@WTt#gU2w-rjlj2;i0g|05N?Mub;!8tkP~*@ zqKVYi11zQ1EhRGMTn%32lM4l#>1=#TEht zNiop0w54dFp$$@&g263Nq-fOYQVd#`qD6r%TGyheL2)e_w7QiAm&Lk^`#~3X>xx=; z(SGkui=yl9>v_JP&-33CNGCIy%#VBTIrp6Rd7m@Y@T02WZ8N1+no)?B~RYBDFnzQX9( znYQRL#n@x}jtV6NO60~8^q|(3<<1>TNH*Wop-@Mn+)?7hwnln%$;^ys8zlxxq{fn^ z!xQmMpw>j>Es-20_6l*TpNce|+~(U%ak2?0L2CBYQ8~T0p)ed{@f`$bO0p>c%O3(Iv>y@)AAsRLkt>boh?bFP{l!Y zXw;VPrckOD{rO-YC3YI-_Lq#1>I92{4s+_<)kw1+zE@^wvbYVREg%i$B&|2B&oU=U zmvih@@p}z0w8k)RmNTI8jf5Yt9vRAUd>wzEhZQ5APEQM9127znFv+>_i?8)d1m)A^ z6<@)~f8a?0efF>xUi?~LIrEAc4?x#f@gM3ZXSJB+b2;#W*_@Uhun6tP=`aY7+_mcO zLHKD+=DBGBbnnv)6^WW&7VNdCIzWeUci}`VJm)kR(*l;%lK8#3Nj5_w{%os_ug-Pe zCRk1z5AT3yW|+~;8Rlg|-VRk5gu}O8FIZ2Y`rI0@Y1%GBVb=2jeNd>`p&*c4P>Uv< z4vIaw6bB4edo4Wwo_P({IH|&6GaUv?1V$VGpn(QQ4$nVp?w-+Y zMro%hRUhL)MekBr69LoJ62Ws$cJ42PUXsa%WYTi{$##Xvc#C;;2xi~0Xxagoz(FbU%p%1$!hKXd> zdG_L3!5KiiYCQ?A5>xDUlvNTPl(t`t7Jk#jgN+PljTUSHR9)+0;Q2+hWivbV=!=Wp zf;E5=OM=pxTFQhckUbYmO~1HU3Kk2nb|X^^N(DI}e)@E&DJ=lcbUSCRuVv8U|1+qT z0~b-^_Dac`BL$rCPCXrFd&tRpsu8}k=jnp!a!#B@kJ58u&HC-#Synw68CYiyO3&<5 z4l3a92G*rrSSD$%QZ_8eqW{mPOUsh0_2OI0@I_no5z#>w;Q1rWIfrL1Et`HhTfBCS zCJ{BQaNoXO$*woP_GzrdBuJM(M*}>n-bWFBIdbdKn5$TVmFVVm3qUFS?a=3GO~<5L z^;VTn4E-ZQJ`#+&^|9K>p|? zd##lDG-^Ig72`P+zH@5(%#}|wee4vy+9FOFQ1wa9XcS>$Os*2CI+|}ED>fyf!JKcD zsiw{^(42u(6PYE30<)g4<*aOhJ~k-#9WDp^`)sX2^qCgk~c{V=6aRLk|*^iH7ap)$(pYu zOEi4Pb9$Ei6+Vl6s$^DRM{2JDPp2q$BmB(jp~D;jq45KXPy`bD45pS3pt8?^+Vj{8 z2)*;A2mbz~LCOdkn9-oR@R(<{sbYD2mw~ns#Feur(v^66ER-&MFzpk3x#(b`Pw;z8 z*8KQ$28P9EsUB#BUHLlgpL?UGH{|o}>C9*tTqy1iBv8>JR=Eh~OZ|y#b-GuHn+DBG z%EzXSv3s70xfS;P-M}(4yF3i`&#)gjfHJ;Pd8BKJYt|W=%_Y%GxJ~0~ObyX+JYKDiMpK#rXR1ho zXQtcMWL1%%z$UKbu+1aCHqIGU&UV& zO+yCp+d0gJB-}C6>ug+a6n{pHO|aF$cbj%52lGtJ4ZM$QkK#{=iB}S3%OldKiGzZi zN3K-qpjl@WzeV)Kt+;itVKqEsGZ-IJ-X^U0u*)2qn4rIPs(8sPXC|V^X2SD3R<~G)`mo4&)g0ej2hW>toq2A5 zqHIXgPUtF%6Uehd`S}xeua}FV~qFG=% z;F$sa^r8K7>GCDOD-7vn`&XiKeadCMXkM;}#`d-zAUp^9;s^8%6~z44vX&^(`juSM zjINYKGlJBSfUr9LJf{>aG4_0Eb~PhD7M=+t%&z_tCFE#T{>0P!*Cw|nps%xwgw~zB zCmnupZvXU-or%?YboiC{zkZ-=vOJw_SE7mp$*qT99Qj}wSJ+e|)VvaZHJ)1xLxI&Kw!h5E;Z>?9Ex0uLUC;83+&-dj2k;Q z9_487slKV4Lqjfh8`ACL!}2E^A6YfUkYR zUedC8ud>glV0))X7W(g0Td?bb9X!UU5w2`St#`7EQf%<;BU^Lj2Tj6vKdHoS7x*u_RE-C@6(;BtM$kJkOmqYM7>%;Ue$^f)PCbCqYmXD!d(jo&weRoOS= z^@c-J#V4MbxE!PsW)z;Q{x3ng3N;;u=&tjl`0x2q9pgaEe+8i%Io379e;`VUp&Ic< zh;IA{L`RSR9-_l?7$)!3RnS1aDI7e@y$;C{aU|Rw-q%Qjq>&E%&nd0{33l7cbkU9* z(pp{Y4^cP3-T=G(yWG})3%hAl>fh=+V^R! z6)$|xgM2&;tbxe?NQC@%0NW1|S$~MH<=NfaBW_InwmSg)LHgNu7=7^jbnqV}p;?uu znVQF8Z!h~pY@%#imE6k$)elh#LMPN&b-oyWLx&b=w3JHASWu@~}pWbRiy# z1hyj?_r>^|CBSX3c?S8pG2wt<7>U7y&w=&)WH5qSX<_eW?!JdTs3JD(W5s>Ktze9o z$te^BPG!PCDq&>V!bp!bE}h>drt{gtW*vzR#&A)qaCg;wA5RCcw~P1hMeRH~&BqF- zVoA25L+avds4?MahnB=S7%hXa`8UWbu`Vf+-WN z+!!*-Be5rgtwG8m1HswiKQaomrhjG-CeODfpce-+gtXb{4q0c7x6X!t+92o48XiUFp$&4X;KD6Cs`c@0iExlMYXD z-Eo_BKAjcq)9I`(MinkaL1Jdcy*lx8ozBOK6%ssEShg*rT8D?ZpF*dq#}K2z8jd=( zP_4$xI>bmcnF~#s$8`CEmPJElngw8lZkr48jcF{ZkPs}7hb(*z%#N$pUyt0NReCjG zgp(O6^oKQml;LESO8DE+P>s>8cTr+zhKdiT%`%h)zP716Uu?`p9vd?nUNv^yMiD~t zv?G#Nvg?)CL#8I(Y$X~hPr4!*!EE^2841qBc6?ukcy)v5*3;|oIKM+^S%BQjG#=bY zBN)3atwEpAa);2MXE+}rb?edBdLMd0kH?+xcfBqM&lpX+GJ3G7xREAkXRonKujs)& ze2zkUu?XljL2PD?@Uo4Wy?WHNktR6jV&Q@b;nfc|E(Es-F_|uf%8pwo%+rQvq8eCZ z-c2YkA>sFWrALK)TT%U;9!87OwrWUL?MOUDiCP-yU^v0uwT>jXKbU4SkVj(uL}*1= zYOWB(O*CP1TZAGrL!w=2)E$ijXlx~(P~l6*DhlNyv*ofuqYs9u{b3fK^)7XgSSDc_ zp3q-PLKt8YAX$Qs`B>9obBZ&1Jhq(t;ds*Eby^+@ELM!r@{GS*>}P`L$t--8%w`qd zZKPI;@SC6YQRqT0?Ix8{gp)!D_3ohw)Rb-V+>K(kqQ=|Nxvl70oQlNV8$hljhn1Ka3&7>4%WoGuS(vBZ#IaBtjs?Kt^&!a}f6@Cv9y zfWJ+Am@!o>h`)s5;!3ln78IX{&^PsVc-H(dMRJ2t;?xOfdb=;~94FyTgq?%7LdIk4 zE{11!aWSGT9<8WfCbZAG0oZ-#z*?cA9(C?O!5!$?`T|K;syChz7y|7^2ersrO0p6; zD_UD`NLW{|?O*#VrSQoSwbeAZlCmlQGrjZH$dSyXk<|JiRV2*W8x)pK?M?2y73J+k zy|>cgoO)sKR#d#VSh!k-BiDz^A88BZ9I*@%uBl~6cr6fY-ZeTPn#`i0}$2T^FRu``*rjL-|; zGu|ZISh;4tAlRs%XADMp#r(I)IdIh028 zD<;EebrX7%3fv`j?1#jxlNrlYhN#RFUABiOlCUgkKs8 zGfta@1ya-!vibHW7XXLw!aLa@2fiD8XZ=6aQsaElT0-NCWd_i~_f>W!I((ki5)@CO zwigNhCb8Gq@D)Sy5w#RA3_2NzwVjpX;h9FGG2`9XAWFKKvx;^no}rh2GsP-gns3z1 z67y^ALi;lDnh4KE%!(A#we^DeBZ|bnP~S|nU(69ttyA#9aDkHQnZh-}=&Ud{EQh~d zvwV(RB#cePT3>_b!4vql4pV4z`d(_h^c5<`8oq~R7UH?@W>6~J^-ckRis{QQ87<36 z%Ayussdf&TR(u$TT92bGt$dv341C+%YWiTcZ-N#1LL#^mIa3u=ta>mJ-1-&PF4E+i z82QfC*g8f-TU!}qNoBC9Xk~oNqHA{e+KkqTo-a{Nfo1PO{H1>@y$M^j)vLa(1O=XN zQ2&R?{(~sC6LR`{c{0wkwBKBN0Nbgoe`f_WoV0X|XBSLx$e^_S`5@kDQ zn#5BvSXtR}W<#$FaBu2UjUJABLafbo-%fl3-o>bK4bQ{NgI%;yGuc+{pINF+4ga5{p4KM+dMF*txWP zlvaX{|7McZh!EZ*GRyGR96az-ZD^@&o-nD=fz7)73pWeCMo5pdu@2)n8{=pDvW01D z2C(^a>Kr?Bw%WoC=1>D_D-)Moi&yT;39{Q~s~j4xf3|{|k%rY2I{w#8!TAbWm1?I% zL6ZtkxtC8jpHGsP$DP(zNd3@gUp_5j`CuH-!Bgiq#meWkxq{}e=w=C0LOWX5H7qw^)a(7y+r`;^iKwRl#04V_D2XY$y92;GA^ZbL)M+5SxU znsd39c4f-^8+<>fXu+Dej}j-QYALiP)gT?yo)LcA=X&>Yn9C9QHZ*!6E) zWJL{0Y-%K}wqrwsO)u55fk>1!g;^t+vsgAihGH*H7b%pNh5SkQqk}@dNwl35(&G9f zQD`TmH$~*`{RO47PWEw&CI(qEc^d0P!1iQQ7VNOGb8oRL-RRG6DeYPXAHnry(^_nU z`Pj}|*}65Yl+-$mdR`NE&5S}_zenC^LqJK9I%9XfnA2xPtp>C-O)q#23NEPiu|B9c z6tQXVK0FIvqFAw-?k3p=amKAy&T$(`H(I$X)#%D!kZ&z2G@8)iH0STpp?M|xoeK*= zZrtIm3VWEDf!s!Rjy+#E@fTFR7QORa>1xGdutX0l;F-{4`pyzIm}%~PPD_2bD!=O~ z)bSYlhb@glp6BdO!FS>Mxb-rRVqJ8Yynr^#F+Lsp)f#L{P4~!bbEblj7qB(FNoLr< zLWPy_V674Fk+qlhQ!I+n@ve>7Z5`ozE)lw9KCqGBl$j@qF7~QP5oUA-QJJjODqA+f zkbEJ|_-Tz<@kFvi+JrxRI4UHZ2i8G3DT9)+4}c2Ll_m^e*fVo;GRO7Q0FJ zP`Y$KS41J|TaDm4DA_JxQ>Q3T{=*wOVc;9|SbS`J=Ag6-kGc2$W<`VX#u-gk_}eB| zT=TQik-rsl19zglH;h_N3KmI@ztQ2WOZa~3-{Rsv$P~JJk*1af9D2VMyUXHil=gv? zRvcZjsz9(8vDfZEhfT;?3q##fd<5q~cmF~aME>cHHcl4QST<~ zrq+Tx;`jnovs%0Cg}bMNWNv7ewyfuF)0Ml>UCUX3?(gA!?74FGtRlvTwj7!mZ|B6n z-o;qaZ*F6J!sS}DM{=`oDHzB;Bs0Fa2@5|I`Fqf%J#-JA+0P|>n%}H-Mn7^2^m2~< z+A{tTlWie-c7{y=#}_?N#XYMi=hiN)*0(B<^|<^QH_x=qW95Fn3cFBf+|PAB_BRUr z>7zp|C&^f~^d6V*$%$?fi^^DcAvK^HRHOde4THNWs|u>M%lJnrtpd{8O8!xklSl8& zg+l6?>){+hem?23h-h(-DNhKvZ>`7yw{RcsULp*5*-IN;3hA+hE2Ybuy{B+g$hbTUbHtCRjgt=HnLYYvJE#$ zJzhv3&Cl1GbdsA;sm=voa9hJ zhK*f@UY`%uZWz(}I=XC9Gk8KDGk|U5J{0>>G#-W`+|5s62NxaovGbl8R0Tz58{7VrmR?)vMvgZW;WA|w6kN<- zeu^g5T{Xf$32M9*4fU`!g?Rf)Du!~X+3kgqTuiCB-cup|Vrn_I(sSq5fO;*m97gtX zCJ(#Rp%?4hiN%2B!^ud<~p!yyNeA=wTFDWKv-V7(mFAM?B2Cw>h^B3qK(D}bU~y`tCW|VV15jEjI&pw);H0M0D}I|Jcs~^rx0P@g zUPi7CdI7d~O2kx%LW_~%wwNFrJBIblfyH|{?VQM$_16kG=4Fn5InKkeSG&=MNp^93 zmD`z$k{@+cq^L;28QQg@;zMq?X^ zj**NB7Xa68%$gvf36c;>a;*p$I>o9BLoeYdg>OQTj2{vkn*`XA!W0bracK&&WXN0# z3H&kwlq$mrD*kL8tyVz>*b}8jf7{*L0%02QQxId;J>*fP7n^# zI>I5eO`zDf5k%CGgcTCACDjA|rAVoln2sb^g;g5v5K<#@w8j7+nU4luOCq{hJV>N9 z_+O9chP&fCB}lsHyU4BYCnC46k5gGy4lbhWhSE5$*htS0E91B{%Ik%39Dt?=uoF=+ z<>>eURjIj;S-RH;q<^i8L;9iX1|Qz=Z|dOydW0)YscgY1aK%K&3vs3EQDC#f%t)MJ}WvxdMWHmM4M{#R9Ro}&Mg*M$PVXsbVV8;+&VRSwK#nt7^sG@=P zGH%}9&B<=g?pw3ghppu_j*1CRv^sB9O!7?zx=TVjr%bhQ)F75aWaq-FATD&m)QtX zZ8ka>h5>x76h#WPAep0BJn-Rxui0&T@0>ZrI=5?jaC4l(lGsFb8JjtZFq+YY7(7&_ zX3w>A$ir!f{$7O5kHk_3NUSq>yEL}fTxj7{vWfBUUadU>BvA_eHxQS4?iE{|svsW8c zrh-1Gx*{nFVT5Ech*uSEL)nc_M1m=36TW}S!_h=Ci-iT!JnW}%@Bqk| z>yVI+>qFHUG}ae=DztMhz8R>%n>S^o;xWUF6gRdDP7eMOWfb(y(Qpb9J(^@)M#Tmv z3w*YMV7dn)TZ%cozsuC&P`AqgKvtX=abTpLWhKI=azyc z@WA7e?ow8VB-%LCo~|TjGgLwqvM*u$#PMXdK&n*|-5lykSEYrc%Gkja9_Abr?#3o* zZeKcXi?Nfeq$tk>d}EWb-pS}or>$6a`ov4c4AU1552BxOb|rkxApx3XyN^_99!Yy5 z^>HDM+w9{~4t2WK;ZUkJNUGv?tl`#VRde5Q`ma^u@rwmRUpxs?HZJPMO1PwY3A%)@ zYJ*gf6~_h9Lq#gPQ086%sgGHUu(pVYPZYZIGY;1yn_JAs#^Y2sfC@Ujj}e;PXl^~8 z4A9kj)Pq}7oet(!=JAR)aH*dWzXBzD))*wXf~X!=?o%699~%zD6y zCFxdpAUl11)@61~YIru~!*Ty!!7PoYAPA89CtC~_3caPO>p|{P)LTm9tH-`?kwk~- zJFuftYRXFEBKyc>#(2WD-R)|8t+S+5DpUB%7(&&L1y6!_wq~ z-Ymk`qrpS|Sb8Kp=&he?-6>Xc;^BQ*&Eh%5Dm<|-ILT*h+=p9CndIFkT6a!sH_{4|lE3&RiqVUVT zREIF#9RsP5q!^){pi>fjLUv~*?NfSCcM+xPQUa7$ufRIS&a8n{9On}5EizM9VSIfW z#lr&*X)a%{(c>u<>yIFbInwS4Ry5}51Rta&aunMR1=B@xUWEv^UA%mRV%*BM2aoZU zhgx93a%7IpJ!V~)Rdx3JyIpbN#w@3y#1^Z;X3+R>Miau7bZ=VXk3 zo2Bz8+Vbl=ghfXyw^gw(;p+Q=~SWwN4)W(Mos#g8itm zb0=1@*aFBX6wV!?O0j8x)|4%fdpHFPCgZz?`;T+F_B$>8C$X!dz(W;#F~-}RZ{tPw-GQ!V7FnY@57*1&m*Wy?O;KLI*TiUn9Iw0PES{p=>Ui9^mNr}1dMfx}- zH{+YMvW|>u4x0-o{-{NXR(i1xU(dOPy&P)G7(ll7>=i=gD|VTe6%b!|69xC{Wg(-7 z6Wwp1`Q`Nh{p!M6P$1;XUSW>BI!?zIW;DNtisVT0aE@>!Hk>5E30>us9_RtuH(M7> z=zXu_b=s$PtF-WuXXOo2uf=lp6$zbbW#8oMoE#6DeJ<6Lx$u1;~TE@ls%hOO^(C zl{@Ug_(+F!^66u`@_=}VFA$WUG{lwh^Th6jGw+b~R#e98gl|7K0C;=?UjnHZUTj~5 z0s93(3V$Aq(v`iT}K(fV`-c0gAbrgoi}YSR#qg7R(N{0MU7fsrQKLo zD>G_j^wujH3b|*aiceId<=UwVDR`5H5Zo%Tty~B0fDig+`?pxcS2ZNrohQL{-{klh zPOLsVBZkxTDcx9fwS?%D5W(GtZOPWFj31kwz0^6_8udwxf2+kknY0)H7x zcA>CoqeX9&V__O9&&2Dbz8LB%M`_wtFLmg8h9I8*4}?TSduVbH)t!DixuFkn(-G zLeYMj6xS)9*05^2lMlQCAKtV|mo}Kud2fPymFqLneN18=N&P&-il?B!Cy9d@!r?VY z_bo4*?Sa$qVY59wcz4?_opxM-QFj%)NP2Ycm^M1r7Jd_cXNggV{-wDO;Lnv7(?OE6b}qAaK4+@A#tPJ&c*q5XF7K? zqqWt9p>I*f?pz?B!7lWF2!$Zb}r*`dPEL~Vng&D^s_h?CCNa zGKv;zu5bGq2sOnG(jX!p{*wC(qSunb;yeH9O3eE8xsU z{7@QdeT@#YD$!pb(fZKU4O%8X9q??8kw`T5<$bKNh!?u<7W+7q^{64Q<(OJY$kh1q z)fQNM_7NIrvto+~+}Dh4)5o?^@tvGFbS#|z1%>9j#|FaGKm(}~umm^~Ivx=Rjxi$- z7_sToSk!k89?pM6m(qET8(0!9kj7X9OF0!(*_Fb|*VO*hxN@tIaL!5o*n7ql+K)G=M;VdWYcOOMq1p|8rB&|T1rL09OrH$P zd)Fox8RI=HeCdccKgDb`dD!@uyt)dqwVI9Z@Zy^~#b>%%)Z}GIQS%y* zpVIwsoRdWrUi9ZzIbh24nwoRr!&hFNV`n9I+Fbm1a27mdXER?EmD74>LF$BPIW+6G zz!Pkvh9=ce%8jv)!+^asC1$5-4a-kEb+aTpjPmai({{!^#wsme+&pMH>^0fb;G-ow zr}($WJ9o;dM$7QcOTeb;dr(CByp+hIc*t2|i>RQ%%CV=Lf^q9P1|D$#ZcaVtqB^+l zyXV$(%RnJ_t_i+W$3YdlTid60qw1X$cI~Wj{dGpyC#n5);lj13VJA&ewj1LP*TF-e zG%fT>e1}n5_ld4G`IHfTG#{Y7@5Q_JNyVQiVdvLuZ1NDx7yTmMvCk62=`U*&*QEK_ zwEIxZk$CSui>1`GRKnNNnT9>IBNgXG$4RL296vje9WJnr?{QE7{Momplw1jb~D+N&O$YD-xS`zyn)O&QD1-v4xKS zsqtjm@v|)I{FXHtv6o{SI6J%VC~7R4^QW^|uOLT&9waOri#GrdXnv=S^tQ>2EUkUT z#`SHdYjHZTnf-I;?-EG$*0Wy_kFU z@lrt^M%RkjPIitw3_G^zMM(Md35Oq!V0 z1hHq$SK!#s&RQiry^kL}i@JDa%!QmJ5KWR^3{jo z$sS(IMm{W6mm_flyZU4+<&XZ1o1ENJp47>Ut_|#?C-Xs`CG#&5uqB%VsRb8smW$45hVQps3OSU_ehn_%7Y(5RX?i8 zOn%uk4n$nfQ}`aVB0K-6JhSF|)GFy)K&mrqbQRa3L~9KIqW}Bq%w+l`$OM7C37CTI zk+KogO7r8o%rzA7;wh0Zf5L{OC5*7}RMmA<)E;(tEC1USK5D@a04+R6e}|p_G$?)w zH^qMe4X@EK_2JWOtQalGTtUFxB)qpPMq}%{0TySjmt?**5?nV^v_azNI~xEs=|`|Q zHjTYB&|t&(-+=UOE?dW4(Jd7>mvP zuy5$SPWTPuXkqODifS03t_1V_KM9DJ{vQ8b%8(W_eCH4l1j0%@g3+?iL6WG-jj9z6 zR4J{7)==Peko4crdio(oZr=*V{3ne3y>TipM-hO0*(J-3=}pme7#&~sH;dY`GKxUs z6oJOQVPt$=470)S*W7@M@7{x_|IP;igaiY{eL}JiMjy*TO&LMQbAEu2fA`!mJXFSv z7_hc*uE|3DDUUq03xs1{{+4$;-oh&6KW07&=eZcc#=$zBzJIP(uN-xZt-@5j$1%8? zwliCx!lq|p!tStLSfr1I&-?WL?P=Tex`ah~JZZ-=1bHD7#3p@SSS{Q1WAOx`4HwSB z69f~4&#c!^#8Z`CRS=GdG=O9it)HhQmap{kyfdk*Y&5ndBKLFeh|jOE(x;n=u7}YK)t`5UEUwZ zuRY!Z1N-Apn#|MTfKPQZGaBwmd@ydhX$^L4t9i6#mR4}`%xFkwT1A|*GO?4VNX;8$ zo(ThU;`XO?@^mEOWmexCX%A-?UZP^cPxkB+=EMb3KIY>xE|ZgB>rgnyM-uFepnwEX za{!01CvIL=yk2K5JslI&!hL^^W5r}yFKCk0BX%P3F-sm)BBzDYs{KrInSM{QTMx$G zSV}iCT%d_$kc9~~R0TYFzuu-b`jRc?c#B`3GC5v^<9hU&k@48}(@)6wlOEf{f@nkb zxw0z0pf8+@3)ZBp&&mTvdRT^xn&7F zaFW-ho#d55`|=0^D2+bVU`0kQkNsd_O|?b1TuqY)7F4u$s~ln4O%14r3pQ0lDEX?@ zh5m5ZUJoXrTRD6$P;o^z7cAj$W8SI?M_ox=6=|xI_g2Rp&l;42S&5HT-`Dz_${r@9 zcTw28xwRT=cxZH2GqEFXP0!BwZPj)ma(%dP!Sul_%5KFzjAwNMs8)l~$Fl{a1$c+~ zmsy59qZ|Ifbtzv>11MFmX10vFE_YJ#&8x+$i!Fs&slv;iR;mm2aP)}R(y&_UUo3wz zrxZwobFOCrpk}Y?yXVUyX)}mHk9mWr=w~!}NQ4C)+@wSyJR6W8juN_lMbNkbq2@Lk zDzOfi+bbwMhL@sXI;!2IrEJ32>Aa9>q)CjVNU&x|&I)DG=#yrJQ=7*8;6by(nN9UV z$40_Gh^hWarN?qU1<%`DFj1U=CO4^+I&4#sbb}>-v@lk5;tmGS#{~32%kF?oyYS#0 zR`J@@4i#m^^6vu3g+Nqrq%<;Z*Tju4c&TpX?0K_qQD@8*#ih0Yjlgc7Vt6B%3LeHsIY|RBj9(r~ zjTNgRI(#B8MJd4pno4V^#+`BYj<3OY< zrd0+19`*N#8W3B!PwAFnH zzs3N-Yu_rq|H+Q2s%(G71pH^lM7y>y*;*c@Y^}!asqlUCeAb^Lro6QIaOGf?#2m z`l=qEaJLn&S3OSMWqtCt+nyvZbgVbqoR!)ohg&cDGpnZS)3N)0{f!;s)rN%EDf+FB z3I(7QTl2;|{y6!?A^O?N7slrtdpqb>0d}n7v-tx*i#{^XeQnI|4tVB_d42Aa*?0Bl zFMN8+1OLE>uvjCX?1)qy`PnQ*-&6HNRjWX{wW1+1^0~RqT6{4o4IXO1?Q5Vlcfn>> zX=7L9C>AxZ-s=RBR3-R!c<#%6`k2Y_0A!m6p%zOS!{G4QVL0f1X6g=Q-S=oX5; ze;dBVT6&^-0JrgKa2K#FZ$9*8?%%gY8h#nS#eeP5cgNA2`J{Ot);$KN@I$AoK2JEO z+jesJTbiaRpB6+~Km@fG9Kw#llO1hWKnV0xG5GH#N()X=4Cuy|^aXGZThiV5Z!hS> z|GM$FJl-b+y7BTH6$u7v#sV~ee|QND;MG3rDup#)0Z0WiK*~r(O{}F7@!y$PPvzoI zIe1$tNG19GGr%nTMIuPYvwSk%JsHvywq(H6;O0WP{!N=im;Gd_erb<)iPkj>odFtK5d?9}78`(Ya**)`f*L^a^IyYYU z1U-rFMsMVL#^lz%p}PCf2RXnIk^EpoyQOL10zLKhTiSpAi+RWH4>i2xy#@YQ!v3dU zzvcg}WP{n`R%L6j;(8G8fES?7`hjH}*|{BzY=Br^6fQg>6abKs)gA$GE8~%Y*Og?u z8sI@SJZ#0=zQId!;EOGkN`;p}{8qc7s0;u!b~PRcAi@;|=rn-+C@e(=0LJ2_8|&mq zR|JJuqg)Ey(_oxyELn_qQ4x9ow0NHZtekXspNRmlE*&);0M12GGq9$>hc^MB$G^w{ zz<_u0VxetosxI!_hF;VHm8u=Q&Mpv?P{0cB>MFiidR9f-zzs4H_ zX)DyRu1Qoi0F&{t@nNRel~g?d|8&izrU38{7v*C1fSX*?T#H-s*QzHq>YbXJDAHC_ zU21AF0BFTnZi^Z&ngtrs$QOc(@TP%?7x+eut^^9-xa5i<0%yWM!flwhVs6BqO1klO z*QEVGc8v!VZj(6DiVFdVCmoOw?kUny*E^0LUE*c{*BTYhaf(H_DS*du5qAzg5wPGU z0hbyT%Ta%}J?fS}0#Gt#(~3Wa@V=5lT}B$;>!2p!x5q1H;N}2Y#{%5-_zpqhis+^-iYd+lx(=@mH7e+v@bV9fB5Ic1f=|-0R0wbv z9@t<4jSoaDEWfRwuCj88r)*Va%UGz60W`!r_XNiV^cA;<9`N4WGKq0iuJzQEdExlO zlyd?-6@P!9o!$d}X}7n0bYYgawq=sSR<^F9rV?tejB&=$2=CF~60=e-v(k?sQj+Fd_oV32Ng<73PjmA|*9{PH(HDSzw@@<(pRiboQWF>(P| z1jDkX!9yy82$?b>X+*|+Sk}h6#zq*z^IllgqDDk*+=!@+9}zX}h^P^bKtzol5jAc^ z)c6rm(~pRnVMNrTM?@`VMARniQA`{WwMj0HS^z*S-uVVea*ZdFbQ4~~k_7Qj@rkDH zNkJ|pHHnCcg2<1EFP|e~l8bde7850r9TQ&QE0eKg;v0&?yWro(yVQUPPa+smL`kFp z)c;mae$ukLZoxb^@8UCTac}MmyC1(vv3yHJn(?L;{cm1-=!^W>T-2^HvA;i>4ENdp zYHgVL4O^J}EB&W zH!pefG&?25`$*)~_xd00?vF%xF^g{)=F%Q*`J8zh_y1M_X`SbghRp0Ty_y525 z|G)SDzxV&Y_y7O={w-rEpc-GE{Ww#e{TKWmJAUMS-?X_ew{jn?9(!9^U4;)%(wgvm zv>xP^P*rw{Ox?Swkr{mlUhcy0W-=*mYgAEp;}1@SR{_C8JWw8fucFMmrlP^MajD0* zgzQt}YoSZ1rQ3kQt|03>Pj1~DqGrM5`yhrKqJC91J_KrsLpta) zny2DZL@o(iMgN$(RN10%QY*1>CPv1upxwsE1Q$&a`wksOE9oY@8E;@7!W$w#8{-@= zxDxEN3)}v#SQjms%`0f_8C}dCU40O^G=Rxol~-QssNS%)d|la^n$jh!sw>x)0f!PO z^XfA)9Cejt-pY#XdTbq5uJY!UdCL-;fTE~!b=j&-iFPoya9u@ZLuG}%uGUjo=S}j0 z$PxQ5+v}}cQ@+7l*)k5&CyYtWptck@jBC2fnsiNxGO?WyD0LOM3X@}jD?*B#?ybDa zEL}mHTBkc!yVNeQlpk-Wo9ab#vO{TCHd3y!UOHfKwRAHMap`n*i&ll(vcA3^_skRJ zg?XTRjjOCfHN8c3Smj;4Tv4CluB6J!Ybr|=<&KSsQ&k|TQJIxV8rM^IM}65Hf@?{-_mlV6;fx)PZ;iiS-%?ik!AU`B`URJvQyw7>e z7}B|*3%I%hAE25U&cr~fOC4YWDfFG#E-Lo{&1SsZWnVBaYRp9E2Xs`SEpPEXZ{Ml0 zFQR7s>dIBr$&axYIr68<7TmwRy}b^7Dz+4(QUIs|pbcP891LU68Kk6ulq!(Y22w&G zW!SDBTa^N;sz6m6s0x9qVb_?kZ7HCw3beI>wh(9=c8&w%LMb3r1ww5gggyFUd>k;G z0*0%=a2ps7f#G4h!D&$Awl;O6N;ZVvjJ|C!B zX{oAm#8LQah8>n$CRSCsSiF)lyd)JL+zyzws;W>GzKdD-_*HnNt*xppRMj@Te0C_s zt_BgIwyIF5Dl}X*jPDg+2;R4?YB*FiJlwW&K}y>#^V-^0%pG;x#Fu z9bQs~Z*zGn-kLbPvZ5_znFSx9#4x4 z8n*(zRD58(7Q)T!slL-OwZiMFcdxMuYmE)e)t^X1as+s>EXKx-4)f+vI-#atR zU@*qmw{d3%W8e2>Fq9%oW6M}#6d6S!Q@bKK`Vj~CsQk^XY#rWxa<*sX>I-$bld zLpsKW0H7zfW@iInQgNV12nOxtv5tP$Eh^U-W%FCQBW@hrGx|iQdOX7#R%IiK#_I#mgNHx8JF*ctD1}(T$L-VT4m&9@`Aj542 zx;-ie#=w?K)sOtVflmxmogN%f9;Z!I6#^le|EnkeFE16WNFF!Ae(sJWylF6`{!5{S zh{FL86B7Y&qZuHfQB^TXl?f7M_5LUV>Pk3&g*zs$g-RhHP6|+0Y*S;R;n#`*>Kjlv z5L6GsQBg7kbs0ZJGpy)8AI|}GF%Gr`_S--?1(Xb+H+)lqYYHF*EuV+e@LC(5h#6Kt zxacgoYF{~jc3LG~hP#Uk0<>9|H*bH{jc3_{mtJ~v^L>-vje#2<4Jw+Nz?!HZh1b(y ziRFO1`66eEtD_(^XhIF+z<60peRW&_Mxe<6x5A#L;-qnc$gRcCYnCE>@RQDbL_FAr zkFwp20OE2pz!M*QqH(xH zt@Fs~giU)v$f_K2n zU{6qxs#I7r`ElXzIo1d(W~jb2zW~`^T%keTX62!#zeZZ^c$za{3eaxV0{Rlb#1thn z;Y>QReD>YAd^TZrVe)vUhn^)?1kXrK?=k2pyJxFi67Ld?%Y~J(K)KtYga`LGP}AmAAIK}u6jePofuWQ+)wALaX<$dz^yrUo(zU~4`WVLW z>m6Wi4axwc3?>yQ#R28pHwOgo!~?5Pnp#>B;OZo>VP-dftnTg>nYihDz=!Ku%HsXo zt@d`4FwcPYxJ%&bizRK+G>JHQ+T%LZ2=F83rK;r4F>ecdf;0KcCy&N$YnrqKhclT?kNRzju%ADD zq|^SCifY-8qe^ip$6t*SjR1ftwhPGU!-k5tS=jy2;SPKd-|r7BrP4WX$t+zq#+%3RO zYwmzVRJ|fihQd+=JX`DtLEU}IKrk6Mq%N)Ia@?X-ZMsI|2f$T_ zvHSo$bq5-xgfiUJT*In6(oe+>h;!AL1K4~|;FJW{S-?JQt6!#Ovt+~dWAQe_6;8Xd7HyOXG{(tn!iwn;Rc8Qlos5@I0}uzv{}vXBmM9I2mID9V z;HV!IK2%q)leQX_MydZ>-%!q?4%*mB|@4c$>@)M1^*und-D z6}EDQ>{p3>cESCFZ!qNFlAM3Rhz#Yl95LH^ zDJvXH9>asvY(ddU(xb6vE$^Hy4@glh8U8FIroBy-L_QHYi6G(@C5VO$@Wcsi^5!Ej znKDA}c(Ll8w7oZP902A0mjN;DrLmX)Zxav!2VdMp*gn=z_2BnekEGh0z_Pw7*UN3wwSbEmk{lc z-1py#Fpv=t*r>c@9Ba;p^Nb>h>I$H8U6_}JF#=RhiMN%;2U?B-j+Xc)FDJ`+z@QPw z_HNA&x9$ND1ELT7MnW-uW6)+moGFJ?_!n6hu?S#UVm3G+NDANwfrR$_mj2o`=upuL zl|HZ%_7Ip#DW`M>6cAjPf|FYznDCeRa<$SrDXO(dYb|)h+87U$sC*n0tlS8e*Fn@e zB$xDFsS`9HD4_}M;QyT8UMD42i;Pm>6Br*Mlm?%I)WE`hZ{*8U->VSXN#pAMU|W^E z3X=m#D>v$QDZr?JSQ155SSO*8f&90$y;HwMfhEbj*F>;mNJ1IvP`7#;sRP%=I%05F z9nMbX<6Bu8e5CQDTGKW`9i&ZOk`q9>M3`>W6nRmFOlVTM+eU$pG!i0EqWDw+*j`1T zL?Q>kMkb1!q7@ZPa?}>(B#;?uRZ>(wl6{(-p+;>{6^CCEVMaoMy3z{&y24{4MZ2)^ z!Pa0S7(>xQJt3>fbPQukGE%Cn()Nf%)`AVBdCl-FF3E{JL21VuD@f21cT85vYL_9w zTGF%<)sTdQEA|7spcG=AB()R?l6#b(F6AYrU*gWrIw=lRs@=%!2EkgGqXo<%xC6ms z@W8Z)L1bMSt=4@(I5=ILYgMGPQ{ zI_(6zs$^hlS`w%vHVz?*9vrTd@(7RZBqk{YjlJ;_m> z%(jM7l*Yns$xNe`VmPlOOaj{~2@%y4R2ogHw6SD$=PD_9GBe50Kob8gdeYTUiDx1q zluO{2QPO}mQMyMA=?zZ864u%c^AM?B)sUe|9?;U&Aj2(^YDvbI)lgs|)b3nmVMjK^ zwI6{DEm#;M1z9q)q9fG@&coM$+FhxJ4hUGw`GJr+Zk`Hy!_o!uRZ1T!gd=$@)Id`3 z{XVdzPB#_K?@1B@&>*>x?1(3gS|Qv2?OOx!9T?&e&k16v@5}h z4vHK!YR5!INl?ggkhp3;s5_>bn2`WgsrHjvOdz@(lLoQLY!#BHTn}jbP)84HSMRP0 zq>$CA3J#-eeer*%Jiy&LnIUB)E4>=zL5o^-@hWiRkkD()gvr>fS8B{*oQG)wEt*1P zJTwoZ?*wgj?*n0$SLY65+pwCNF zga(yHL^9TpoT0DVt*?@SBzNf#xIuyX{T+qcOeBepW9u6Z=s=@-R3r0^3k7qcAB;I)jHiX-g8ywE>*LlRXH<1c8H%s~ z8|u8Z85^J3Zhxo=2 z&jwnimV@LJJTntABtVV&tPgy#aAY}2TA|N~B5lbOc6%pgAd#XN?{>TXyOhDZpBVsL+LF+EMT5`@`6!S1v$qvUVLaIGsar9mSoIcChjABaF^Z`({$w>+ z4xu*b7%3z&mPCdg0CjDI9DN}aKCrBh)E(CeH5yV{oFKyuWOX+~mJ`Ac)&cz;6c4D~ zoiwNc1~v&u(-dYe6M!romXE?}%~Dmjz(m6lqFa&(%8ac8#t=o1uNS+<2qt(73#y{D zk$6;Q?I0FI;z#N(Xu)GeGNc+Y#7T754pUe?F`Z3nO&|>$fnEm=PGoFgqDD2L%+;fM z9y$szfu|D(BoLxQqWko0Otmp!Bp$ZKSU!eTtFfffXx(l_D#Q!dJs=lKBr)X}YXjBWC|&AMhBw4CfXFzgQI1(>oGmd7Ht5yMYdew_ z=zSyx#Oxljr-7BwfMZ>+h#$$mP>-GJvz`OM=n^28Bj+sVM>hZ zmFk5;!c`D#X$UEdH!1m0?Pi7>G!V{|BF`8DegLJB452KTpYpXR3}f=BJCq^E5ciYP ziKU{*hVE5i@Jvohwd#aewnmn+Fw=~Jd@5NVroJ9S-l#IeJHz5?XlOZY2X!#o+H*+rjBsT8rqhie32PeXQR@NCE8V$7$wtB+2uT=X z+=vW6+17oNDw?i*p$ub4m|{*4R?%>e84YY9Rpym$(IBTfw=iV%r}IdT-Xw3MDt;`) z)YP-IV<4D~(6lQwAn%N|gPN%AdJ2$_-eNk$qCkyW&L|KXRbdR~8^@EUL!qslP7orj zMR0*?fJ-7|Gj$+GU1(Gv;`>0}Mi7rQKNsW-PdcgQv9Nv;5_QRX5Jjh-bqneWhREK5 zLw!)K_4GcdTW(lSLyiJ7EFp(95Nwnp4cnRxAeEpAYKMT8Br5{n%*W0avQ+4%=0xo3 zgat?s^2z8Y2{oA>rYZhVX-GA+WDi2qo)BNvAS0ih4z(!hW-6OOqXDp^35}XU-b@zS zXa=zwGIZ1P(KOTNSuB_)F1yXqOP?LUPhqFIC z-rj1EV+Q11#;j+iK|RK>#bw-R3O!Wn>=wx#v%t6($Vkw$jLtx|Y-0^F!=T#2#eGm| zfKV^f5SCLN@4_fcop!mDo4Q7k@yuF?0Cy%Ke7ce}=)<>rSInK3hper6pl%98M07;} z>U{tK_I^RJedRetRp+}$bDkWn%z0RKzN+*|Re4U+ld8+GM+=0A{92J^UqjXK2!$$n zuuiKaGN+j)5ZM?auO~AKcvz!FG*O4bpc<25Zq}m+{d6AUVT%Z=RGaZ(kjRCt%OZnb zf_KCye6`3@GBjXD!E(yKMAYLslD!>t$Baa}y2l!pNqeCbg}1%Z)vjkdQ356^&lpNE zu7oWNsM3gu8t^ePGzP5*F!xq%;gaY!kl_JyhB2hB0Zl{sN_JFUybikvgag z8_VVcx<+(K9hOeMx~nlu3bH)RxJqFijI*u$YV=Oo4q_M)k)_JsBzDG$Iu&n-p3g@` zDf8-$?kEK^2P}J(>Tm6A#pEJ4PTu+AYv-un6St`XUy z{de$?dSI&K8I=>@07MT=ch`sHcS(dzA%G*( z6~w>}QDqzGMF1yA11b#>@g2AsihXu@#TVFf(nt&w#(wg2rP&PZ&Ly7lx1Pj6>IzKD z$lpS+Aw?BX1eB30i#Q+-6e|_0Dh+Hk%YRpOPrAF~X7`ni^*aJ-v{ggzVILXjr z16&yjQMT=(pi0ZE_|(plHZ!8Q2gq0)@fi2q8*L0Ey)S z?Ep6jfoaPGQ7mMa7~l&6JkEmooD`rY$=!4AbU6->Tm5t6MQcD?l3N(Fh31DN`26q2 zR@i@A6^TwoAcLZ)A?&~7S^hgA)*JYM2I%e@sRtzhDYz&Lu8M$;DUpg+yrA!=2&UPX zzDicT5Ty#HnVeVOhAfi*6p8i^W@n*GZm`jyY_>RcE4oC$mIbi~1rD&+jRvuMU4LgH zZ;Dcb!Qf2fBepz<4bJ(Tg?zjvQfZsk$5Q#naN;(lc->5NKm3%vxoHm@i7CAMsT`+> zlW}1@&P3XjhpRcDnXATP-+mehxnr1sLkMmdP@b^0X2QQ2p+PubXMqRapaOq*-! z=g5o_ai4*y^uxRKY)^+6g4DgVwOL5JEleaB7#TIhN5(lyBq{wVG6c*dxupsEfmEy7 zG(ghv-#!kj{~fP^gP**SaY&x-JUt<7gtQ%-_{muSh$DDv74(E;h1^Z*#aCHmP<{OF zaWy-0@HSW`Mwod$Ye9Y^?NCnnMj8?S$JkY~d&UfY^*{$y(A3m~^_v*&L+IHb@t7qY$|n?V^#&LCS7M z+sI!OfxcM(WK|jijle11eSUW|VXlk}}O#%wcPq!=4OsdMy?g~;{MQs=_5o)+3?#uV7tr&`Zq1PeoC*Lz(UVE>at!@LAN|9P!#>V{ zog}wBZ&DnV15_Xi=6Kw{P+8IWAEM2p{6H!e-{J!pdxLRkfX7p(^R(Z*M7fqaBZ+`QVqOK@k9@k`t9BCIsTo$j){-w&fVru*-M9x3oZ}3fP=1u7sp9 zzy*M80pPNd@!yI{0E~(t58D9*(RT(nx&V-hjo^}KTu^`qKmiHh;%H(t4H`hR;Bt`y zBnuEX1!xL@GMphq5e;zNdboh($~XWK0>qqYG`M=M0+dt*AO)a6mqxSU(%@18I{^*k zf?Q-ARtn&9-Dq%AaO+ajT2V3>P+&!aOBun1Hvtq{oGJ<_fVeaqw-&>aMRDEeTtLbq z10_SD(LjMdK+_NaG+BX}K)_I80%Ar04aFq_v_>i_M*yIjv;-l#fM{_y+?*{4Hw53v zCT$u`k}C?xL}$2(!#D$gM0O-?gQcz@-cmJ=f&gfGAP}mg#g@t-iF_Nm ztf;!u!>#b>uyBn^6H2mNu2G=`k3G;&1Q4ZOCEJF+6w2NMi5Un4`dZWONG4iZ#$Y~? z2mqL`AH!}8eF3EQBBiCNY*{H8KsnJ8E+#JC@t~)lD=S*>gZ_9xDqI%B7XuOT9oI&Y zAW+(Cz(%I4fdI0zW1AYX-eH>>)>wfJrx+??nFeU_LS$qmTnkzz0}Y}+#h!_jm7QDJ z2+T*iKryN$V>v?>$xu!fdlE#!Q{e|Bz{`oE=fplw+=VtJo1_ECEP75}=`jx4f=tE_ z$Rca$IY*E0+J&}hG?@pGSLr!7B9=I42h(W~IZV$P3vJ?{T|~eSdd}bGat_+fWEw=} z66m=q(Qi0t&wr3PJ=f+)G6%ipALK{R4Xmbe(Chv|Tj{wwqDMJse^DiTdhWgfX%0G2 z1e~Vlp3@89phHDKA3gV>i6jRdE&|@ub3Z?E;h>{LHRPe_c@iP7IB3>C2%_idHu-SS zasMD1JIQMpMW!&-R?~St8v8luViCZg^Fn)bIB32Ih@$giKf7_zr6Pb$=Owp(M$03w~v z%e+!rQ!Yy2(RoEenN-;d5l~L&RlU&Rp!bV_S~~A&eIN&2B?3;;d94?7Ip_nT^6hlq zmAL#5)uIFeop;CjPO9u75g?@Vo+NGMpbv|HVLES&Rm?%xihxNv@8g~w9CW=1_(JC` zRD^NRM?{q^((}QA(wd_%3!w5b^nB?)?^M}i{~!WAUqwEGgKiWRBGU6I&UGAglL#=R z=bNQlbI{Eqz?Pox#D2;_pA-RfdcN0UHwS%M1o+YO13y-A&}T#dlb*lv?0XKnRRqM* z^Aq#TIOww?AcdaK2_bRNZ6bh6&(D9W%0ZtO0epJ?zNYgW^hFV-)%5(j^F_znMG1}c z{8Irfsj`3V-=5szAOT|==nE6GzWb}1oYAKA4Xi_ps$L60eb$6{6-GCO9V{N z^WUA^%t3dHfN6UE*I6M4eFFw$f6?=o{^)4{BzZwm(4;tBkqgmuK?T6|9@I}p0|1VI zkkcRfY@CJ(W?Ah4rn*c>W#&a+Ae=cUp#%^~kIV|HNQKr|*`MJ_>j4XSL5b_6xW5HM zS+s;g(a(Z{)Dit|{`X7PM=SbaU=_xt(JTw4MC$=1XfzZ+6QF1`0c=xk_#`JC42dbR z6+l{}xSO98h!oIhOmXBb`2CC8QgPOzxcF80dC6$G7i7r*pe9S)!Hf&Y!P;JttCC~X z;xB;wOe7=#ELR#<%~%1J#y|iFEFeY0azz_uNOPrV(r|uh0sI~%Lz5Or!zohmbb}R0 z18@ld$7O>+7FUjj1*GBR$N{|IrbsCRfI(1`ukUXDNIg8QXu>zF>jCBPaJ3gI%$E;B z;h)fv5~gy<%i+)$YwOj*WMyBeg<&)fF>7CjjqF{`U(3f7s)SXKyig50^muh$xJt=7 zOrh-Ky())C4~K-S|L=orjfRH0Ov!`M;g>35A!|zok;8BsY-O-|WMr*BBD6~dCFEme ze5GEb%IxJLFzSyhVGP9pFc%SJ1l$Rwg_kG5$VtGn7z##Ev43QwP9>~PX;71?!W9#nY?QF|^Vj?2reSX1^xRYN%xH!4DfRJA_Q7nZz1Q_>Y~*PH zhrMNgW!Z3%RGCJ<;?L>8#jmz4UYa{2J-M|(Y5{ne23RoHyd0%*)F2tavc^pKx5@Rr2F zg|+pe2RA_kE91fo|Zq0sx9~MyOQROAVLD0RW3}>1{)wn2T7_)hE0SXZo|+&F}n0 z4p0qFN0ocKWXlE@w7&mXnJO&tyc2pZIetR&C2;|I-cSuMaH6z3kooOE2zR za!jD~^IbY-<+!PIgYaR17P+LQxLo=ErU(n?4;Zl8RYv@GX7)gBaafj0Dr|~d+CqsZg&4E{;`{U zlstC>@1b)8H?W2jJZ-+aSao_A$=%FkWcBLf&o4!->MOJNdu=u8s6LNEXgk=&M_f~< zeX{&^;GLlHhmbIpKsI?Xe%2l0jTcjV6or)Rw zcwhWl+{Me2?1ZL{Ftt`0+28$Ze{ZkqI1*RX{^<~+aY^g*GRXKJ$tOqQq_cn&U>p{F zUHC@8f}ataUI=X4Vd>V;C$8NYG@1RAy8V5WCqH9v^?~j3+Hl|hq}e4r$$7NgX`B9T zXXw%{wUpo0l{l%JWMs@EW45HEW-_;u`XZX2{gbB6Omxf3DT%#f{^z6lj_SpTz`tL* zo|x4rztz(r+~eE-xY_-h=WC-G>9w)7b;9psXy%%~5wD#*2JreQc}dr;w=`^ZT7;MVy(@bfRlO8NUeg z8i57e1Ueu1=|U;bYz)C5l@uvl5zav7o{f7I(%OL%{Aw_!ie=-iq1T{ z=DT;vW5>n2OR=5Jt;VC@x9{7o7^8Tmwq$k8xtc4%r2!!q8=9NDTt7Y`plYLYcjWpA zBEPT6^0LF(raH{ZgjksGbGi4XWt`w)1o~%oBvpWKwf}Asfgy1dMTnfMtobP73(`>s0ce^+DbQ>3E9NnCyb3yDsJk7 z_7Fb|RgfpPcQ9k=ApOLZ#`3rC)~Z;z^FKX%czJwB>=E2Cv$K=z)>Aii9WR|VeX9PW zwD)OUL(X5Aqvoe#=tVDjRaslowSPGd6uC#d5A*Brtou~mV6Q%aBCIWalNoRz53qV6 zro6dab>2?pywPJ+4mtBH<_`QlIig!$@e&Kh+ zrgahS8L6r#Ld}0Pf6jTd;?>CPj2GtgKfNAc{?vcx7P%O>e{-fE(y^}b3eR?J1H_mI z5(wUf9Ea+2nmHCTxUo8N_z$ql7jN`vd1U1cfn>ucFQxX(Z=>I zYfmkCTdNP|Zzw)hHgJlQw%hT_!Ds%`)Y<$~{*eCKll$KDSc4MLpCYi;1H9U~NAF3O z);d5xnFD)ubJx02U%9RK-rWDDqu35+-zDvt!$+gMw!NOnR@gFUH26HxH#=i;h$2B6 z+7n)MzIMedA>yHT!Vw$c3VBzr^tbn~(}Ojaj!5f1d(ql+R|=n35x{#^_o^No(M070 zcHMW^FOqs3_<-TwQl_>36m`kcYO|?o#~uU5lY^CehwIm$>@EI4Nc;H2Y(`JhUH2Z$ zW`j7x+vRmf{@~FvQ;*jL?i)Mxx-Z2hg`R4EdGFcxE!QH2ICo{b*dVsWlu?jYYvo(G zO=YdZ&YqK@@l;vNme`^L&#p^7P9~i7LTXkQk!NGTny6K6x!*aD57OoKEUu87&feee z6_d#(HROdHjXl{>;=Dd9AnO6Y9kH$PusA#l_b0v`yqTKx)NeAwb5n1jQE)(at;`OJ z%;U`Omc}ub3x0VkLx=NT_HKQ5`@tj0`%?EJ{R~oTcQZbm(ooN-Uw^pWVo)Y3W6yT2 z{w=zL#GS9yyO48br#KQ~kG}Gktpp zui*({^MWR)&9Owvy~2`c5L#rVYHn~x)_GUpy3@A@FZ^ui{&Rd@Bk_RCT*7tIJ}0H~ znZ#?2dnFm^`_I|0=`fvBnWwL0CePnwvc{jA{U;lOz_TwLTat7Uxlb*}Wup5%?4u=K zyE+CL#8jk=o6hd}^kA5ZE-A3>=g(+O?o}!Iat{A3OsMF4)Z6a9*XA8oEk-e+H`9yu z*PVS@s2>bt@Wr0<@^ZKTj>w=@y+0|w*2G~7U}e-R(%gg5G7G zV*Cf=vS^0f-h9;)!$On!%;2pX#AI;v&}G*$!ciCP={?N%_G+;no|7$WVB7mf=;PTq zm1g_2kqu^u`*BYm2U|V+b+ceyd{^}9#)BUg&P~5G+y-Otq{rO)>~c`kvO*+b<5cdM z&Y`kxhn9aW6vYG@Q}y4RQM%J_e{8n7{%!q;=iejJ{2O+e+jW$bW|NO|zW?;mUpt5*yy{(GWjigS$vz< zao;<&iuH^X$zoU*22QkZlfWLn_B&v?If^11y6JkLe|H^`VlehcI4r~t+dO<9^2hu~ zaOt`i_tWpZjwKByUJPJeEsTzSHudLqjq1tt1KX|*Nxd8X+AEWN$x&tUH@$L7Iu*w}VDu2W%**End zNas98!@yz9_LtC3*^^YqfoH37gKkt|C^viUeGJo^Vfr8 z>l41LlPXBbTXXh>D*EZ5Ka9Z}Zfo4&x0jc*a`H+|6#V<{1-A}HB-;6?`%w4hwC(Jr z?%rEtzPZEF^&`>gJM*IEe)mbg@UL}GQ}EIOZQV=T{QsO9)G66^V3*O1Rp93U{l}3q z!Q{3z+m*~y0gnccfJ5a0l^WSs(>-6zQeOPvb6rDI@u56De#tqDuqM<9Q-&83ed@EhL(DqWkQdAc)iq&;0((?Ot)ur%E`RL8c8D*`jUmFl2Kdt%!;<=&;w|I3=#PY1;Q*Mr05x=M-MSa#+cPGx%3un6e)hj zz~`{n?#UXRx#ZiA9+$73a5UQ&os?dgnWddfNjvxSn9`0NHF9kahW>n52JL2ieB+Az zTs>7nM`HJ!XPVv{Q~)(V%D)0N7LFc#s330acU*WJRGK2C-7elBI6)>TzxaWJ)x#fO zR|S2!=k-^tTt6E&VZF4^y?Z~XG3$rlJ|@4{G?FRl=jeUGwI zi2cpiPqnR1@!9w*sN?qLQ}u1#;aSt;R%Z08BVhuG=3gvY(HwB8W823`PP zWs_z2(~A#GGLLVzIO-_bzVgPl^v1v)n5Hvst~2Myw?{fwlyA=YvgM~j??qwzcbn+L zA~#ZRQAcv^?mmr!uve`K-!eq04^pE+q;?~~7xpCGVNX&!eaoc1M-1GTx31ftM@wOn zj^n)1m+yI0l`LoM{jg)o+IIV%-2c2uztZYPOZ{svsuhpSY2A(C zJ6jdhp3zfp-}{B{lAc|9wZ#o$dAAu$Zg$`7B-&<32Ocb0LozO78icWaU{z?{Z7l35 z06ybk+h5ECQGH;THr6a-dPq6>-XD;T61(Sm?Ab#4ot~zRabw7#qna~r5gu+?gG;Yrc6|2Ytzz<tYCCl{*q4!~ILMQqQ+5m2G$Yq8J=;q4Rl2^C`wk9%Fh` za>p3!?mpOelHzg!S)!Dm$(NvzeAsMi8mQ7lOAPAbA}KUwA{ zb;ZagJ|aJ8TxRE}LP~h*Ll3J&)k>qCpDnkYz9qBgYE{6xv-Q4K*D1nZV%e?3+AX&) z9y-&XdEkWFHETC--zjUEM~n4A_qE z&y6cubJgu*ny@*m!AG&bz@paT;>8p30oI>Pbow18tA{5qjLO%(?pkU*oAB_!=Eq!@ zo0WL|j1aNd!^vK%{Q`gu*#43M;V$-@G`RIA0RPA9s!&OINJjdQ3igql+Q?|_J#W60 zmp5PGW!NFLvC#+nMwBCJ!VZc4GDjbjkEnz&OKQ~)yyWFpaNS*gFUrZN~*%KDOvH|lf8V-_6QI#er?A)b)(ZB{f zyg2GK`-9r`L8aqy>aha_EvVBmX6X+O)tucUyXEMOrIn>f0oT<1?p~PIUy9Zq_r&xh zdm`LWoWE`c2`|OZoNA4wLG4D zd?jkHn9Jz*-?LYHBQHrr7$3_x(-TF6v>b65DhgMnuyxzq$Xhal+h)c*8+1kxr43lwOdTniQGEzVtoF?cnd&x?=67bnD0@VPEFJM6~pUcLP1e2$TEubdd}7?uv8 z^l)+@u>ix>!$CZH^oJVjnPNmC=41s3Kwr~4ZHXE;OTNgE&Y!SMJ9lmH)8NjfpY``c z6=TDLWAD)_^l|~n+*)wto85IF{pSb}1!-?ScdIX19CsTBLMV6?KGJcyrb)+-nF@8A zbupcXrB8q3@vQ!grH;|`D3Zt83NSs&Z*diu_xDI{?9{b?cyQ;^8%0uhhUvNouMrp; zk!BMRt;^i>p_eyb;Nzc4*?T7!C?6+AOI&&bATTIOpmJHyu9(lv zv9rFiL$?|j#l@UN-1!2GzoG~3n0)G7XH`4gppV>2~8(Syo4MpiW&v$FS9slSWXP~a=SbmE<@9&TC0`zba9&Bf5 zc4+Uu!mdJBj4P(>%4eh0O9jN%%xhc6Mt+{t%=mpVwB=S(#ND@+3CbZw4&yQStiIvn zhP#)0h#l7tJzj<}m{HxtbJ1V;JeB$U>iFwTjGa$tf)tHAxy@I2dU;bNYq;8U!0X12 zfeF7{YN|@eEBkxRcPejT*CydK41-PTyLVkn8~e8SF?>h;-#NdVa+rP}p5-VI|Q&?rh7)xDgw(|rZ& zG%=iKQNLj-F>H_a(%r}Bv@-u*agx@y)m8sqzkB#23UhhzmSyJ3I#Q!aa7T5Y|Dm7W zPC84RBgQ^vO$vdVOv@6VAIv6;Z`E8e$S*WQX(`*>ykrscm3;BqseU~V)kT9X0)gVF zAn_JGI4d;9a$V@(b?_wi_T*jv-;YtM2^qfw>`cS^EsRIL3U-D`9~^hw$hc5eKOJn; zGS>1V+0^;VeXr!OZ&IF32((VXuvvP|k ze#O%T#HFWhk2n+EHz`Kq>pqruNg2NITD=c1HFacv=OdGPXV$ro1r%5{4qSQhdpwOc z!TeredS^`H9FU+&F1GFx1ef(SS~#52~4R_pJte zRd!zQB`%F0sP2omK)D|O>G}i^)7!J$`uAr`P|AUPf5s+U!AK%u*ZH^NT35gj$B>P_ zy+PRxMe8eyV_gABFR16pAD9MDt7VmT&+lE)h@nV*`{0T~_)}A5NF8N4V%W2+eFQh$ zDrFAXUj!5y-QWTQs}8TJapzOx%cmB9>~?Z+&{{dZvY2^!YcD!s=$3ie$lJBsdy30T zOvYCI)cRz9XSRYKY5w|Nf%bT$!?+tU+VT{ky9iK_~OHR z_wKF8b(9_bUhgsd+aPWxEoj@N7gy`@N3QfQ=B=!3oBRF51{-o*w%%b5IdwQ}vb8y8 zN6fc3)=sk^lP=bGeb9WH+nOz1Fb%%YV11^PdON)r*Xe935q3&?Oq|oFpWBMmOyy8sMgdFA0-QkS# zQ)1R5%Y4^g77j#YxMcl#5VUtm~!9e!&pm%|8m}Ih4`4t$0xmB-E z?s{~jN@mBJ^mgRW`0Cf6*P1_GCO%%)d%S$|=klNRZ{NOMc>gRE{k?L$> z@8AFI&+NW^)KoR;>%U-Z##gKoUe~TC`y(x`KefY6TU8wjN)24Q;T>fx#doKk&H9xO z=p@a@c+V(5^|WWnp$WgH8icz#i9eRS%kN=wl$C!?DLl({yKBLiq8+yH11Ru9$wfmklMX! zTI-u1!?9#$`tQdXWY}v@puy@u*RzkY*knDJ26rdð~G4JibA_@^Wqc>4zj-oCq6 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.0.0. + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +3. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node data.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx cross-env MAPS_SUBSCRIPTION_KEY="" node data.js +``` + +[alias]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-creator/samples/v1/javascript/src/alias.js +[conversion]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-creator/samples/v1/javascript/src/conversion.js +[data]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-creator/samples/v1/javascript/src/data.js +[dataset]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-creator/samples/v1/javascript/src/dataset.js +[featurestate]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-creator/samples/v1/javascript/src/featurestate.js +[spatial]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-creator/samples/v1/javascript/src/spatial.js +[tileset]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-creator/samples/v1/javascript/src/tileset.js +[wfs]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-creator/samples/v1/javascript/src/wfs.js +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-creator/README.md diff --git a/sdk/maps/maps-creator/samples/v1/javascript/alias.js b/sdk/maps/maps-creator/samples/v1/javascript/alias.js new file mode 100644 index 000000000000..098d3327ad6e --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/javascript/alias.js @@ -0,0 +1,79 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Alias API usage. Simple CRUD operations are performed. + */ + +const { DefaultAzureCredential } = require("@azure/identity"); +const { CreatorClient } = require("@azure/maps-creator"); +require("dotenv").config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + const alias = new CreatorClient(credential).alias; + + console.log(" --- Create Alias:"); + const aliasCreateResponse = await alias.create(operationOptions); + console.log(aliasCreateResponse); + const aliasId = aliasCreateResponse.aliasId; + + // TO USE need to have some data uploaded already - please use env CREATOR_DWG_ZIP_UDID or CREATOR_GEOJSON_UDID + const udid = process.env.CREATOR_DWG_ZIP_UDID; + if ((typeof udid === "string") && (udid.length == 36)) { + console.log(" --- Assign the aliasId to some Creator's udid:"); + console.log(await alias.assign(aliasId, udid, operationOptions)); + } + + console.log(" --- Get details about the created Alias:"); + console.log(await alias.getDetails(aliasId, operationOptions)); + + console.log(" --- Delete the created Alias:"); + await alias.delete(aliasId, operationOptions); + console.log("Done (no response body)"); + + console.log(" --- List all the created Aliases:"); + for await (const aliasItem of alias.list(operationOptions)) { + console.log(aliasItem); + } + +} + +main(); diff --git a/sdk/maps/maps-creator/samples/v1/javascript/conversion.js b/sdk/maps/maps-creator/samples/v1/javascript/conversion.js new file mode 100644 index 000000000000..0f223183ac16 --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/javascript/conversion.js @@ -0,0 +1,117 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Conversion API usage. Simple CRUD operations are performed. + */ + +const { DefaultAzureCredential } = require("@azure/identity"); +const { CreatorClient } = require("@azure/maps-creator"); +require("dotenv").config(); + +const wait = (ms) => new Promise(res => setTimeout(res, ms)); + +/** + * This method is used for LROs (long running operations) in the Azure Maps API. + * Since Maps API is not 100% compatible with Azure LROs it needs to be used. + * + * @param operation The operation that would be polled for the status. + */ +async function pollUntilOperationIsDone(operation) { + let operationResponse = await operation(); + console.log(operationResponse); + while ((operationResponse.status == "NotStarted") || (operationResponse.status == "Running")) { + console.log(" --> operation status: " + operationResponse.status); + await wait(5000); // wait for 5 seconds between each poll + operationResponse = await operation(); + console.log(operationResponse); + } + if (operationResponse.status == "Failed") { + const operationError = operationResponse.error; + if ((operationError !== null) && (operationError !== void 0)) { + console.log(operationError.details); + if (operationError.details) + console.log(operationError.details[0].details); + } + throw "Failed operation!"; + } + + // get resource ID from the response header "Resource-Location" + const resourceLocation = operationResponse.resourceLocation; + if ((resourceLocation === null) || (resourceLocation === void 0)) + return Promise.resolve(void 0); + const resourceId = resourceLocation.match("[0-9A-Fa-f\-]{36}"); + if ((resourceId === null) || (resourceId === void 0)) + return Promise.resolve(void 0); + return Promise.resolve(resourceId.join()); +} + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + const conversion = new CreatorClient(credential).conversion; + + // TO USE need to have some DWG data uploaded already - please use env CREATOR_DWG_ZIP_UDID + const udid = process.env.CREATOR_DWG_ZIP_UDID; + if ((typeof udid !== "string") || (udid.length != 36)) { + throw "This sample needs some DWG data uploaded"; + } + + console.log(" --- Begin the Conversion:"); + const convertResult = await conversion.beginConvertAndWait(udid, "facility-2.0", operationOptions); + console.log(convertResult); + const conversionId = await pollUntilOperationIsDone(() => conversion.getOperation(convertResult.operationId, operationOptions)); + + // ! you can use the converted data in the Dataset API - please put in env CREATOR_CONVERSION_ID + + console.log(" --- Get details about the created Conversion:"); + console.log(await conversion.get(conversionId, operationOptions)); + + console.log(" --- Delete the created Conversion:"); + await conversion.delete(conversionId, operationOptions); + console.log("Done (no response body)"); + + console.log(" --- List all the Conversions:"); + for await (const conversionItem of conversion.list(operationOptions)) { + console.log(conversionItem); + } + +} + +main(); diff --git a/sdk/maps/maps-creator/samples/v1/javascript/data.js b/sdk/maps/maps-creator/samples/v1/javascript/data.js new file mode 100644 index 000000000000..c66c38706951 --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/javascript/data.js @@ -0,0 +1,165 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Data API usage. Simple CRUD operations are performed. + */ + +const fs = require("fs"); +const { DefaultAzureCredential } = require("@azure/identity"); +const { CreatorClient } = require("@azure/maps-creator"); +require("dotenv").config(); + +const wait = (ms) => new Promise(res => setTimeout(res, ms)); + +/** + * This method is used for LROs (long running operations) in the Azure Maps API. + * Since Maps API is not 100% compatible with Azure LROs it needs to be used. + * + * @param operation The operation that would be polled for the status. + */ +async function pollUntilOperationIsDone(operation) { + let operationResponse = await operation(); + console.log(operationResponse); + while ((operationResponse.status == "NotStarted") || (operationResponse.status == "Running")) { + console.log(" --> operation status: " + operationResponse.status); + await wait(5000); // wait for 5 seconds between each poll + operationResponse = await operation(); + console.log(operationResponse); + } + if (operationResponse.status == "Failed") { + const operationError = operationResponse.error; + if ((operationError !== null) && (operationError !== void 0)) { + console.log(operationError.details); + if (operationError.details) + console.log(operationError.details[0].details); + } + throw "Failed operation!"; + } + + // get resource ID from the response header "Resource-Location" + const resourceLocation = operationResponse.resourceLocation; + if ((resourceLocation === null) || (resourceLocation === void 0)) + return Promise.resolve(void 0); + const resourceId = resourceLocation.match("[0-9A-Fa-f\-]{36}"); + if ((resourceId === null) || (resourceId === void 0)) + return Promise.resolve(void 0); + return Promise.resolve(resourceId.join()); +} + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + const data = new CreatorClient(credential).data; + + const filePathForUpload = "../../resources/data_sample_upload.json"; + const filePathForZipUpload = "../../resources/data_sample_upload.zip" + const filePathForUpdate = "../../resources/data_sample_update.json"; + + + // This will upload new resource for Creator returning unique ID (udid) that might be used for other + // Creator's services: Alias, Conversion, etc. Please put it in the env CREATOR_DWG_ZIP_UDID or CREATOR_GEOJSON_UDID. + + // Upload GeoJson: + + const geoJsonUpload = JSON.parse(fs.readFileSync(filePathForUpload, "utf8")); + + console.log(" --- Begin the upload Data (single JSON file):"); + const uploadResult = await data.beginUploadPreviewAndWait("geojson", "application/json", geoJsonUpload, operationOptions); + console.log(uploadResult); + const udid = await pollUntilOperationIsDone(() => data.getOperationPreview(uploadResult.operationId, operationOptions)); + + console.log(" --- Download the uploaded Data:"); + let result = await data.downloadPreview(udid, operationOptions); + console.log("Done (content type: " + result.contentType + ")"); + // use result.blobBody for Browser, readableStreamBody for Node.js: + console.log("Matches input? " + (JSON.stringify(geoJsonUpload) == result.readableStreamBody?.read().toString())); + + // Update GeoJson: + + const geoJsonUpdate = JSON.parse(fs.readFileSync(filePathForUpdate, "utf8")); + + console.log(" --- Begin the update Data (single JSON file):"); + const updateResult = await data.beginUpdatePreviewAndWait(udid, geoJsonUpdate, operationOptions); + console.log(updateResult); + await pollUntilOperationIsDone(() => data.getOperationPreview(updateResult.operationId, operationOptions)); + + console.log(" --- Download the updated Data:"); + result = await data.downloadPreview(udid, operationOptions); + console.log("Done (content type: " + result.contentType + ")"); + // use result.blobBody for Browser, readableStreamBody for Node.js: + console.log("Matches input? " + (JSON.stringify(geoJsonUpdate) == result.readableStreamBody?.read().toString())); + + // Delete the data (cleanup) + + console.log(" --- Delete the created Data item:"); + await data.deletePreview(udid, operationOptions); + console.log("Done (no response body)"); + + + // Upload ZIP with DWG files: + + console.log(" --- Begin the upload Data (single ZIP file):"); + const uploadZipResult = await data.beginUploadPreviewAndWait("dwgzippackage", "application/octet-stream", fs.readFileSync(filePathForZipUpload), operationOptions); + console.log(uploadZipResult); + const zipUdid = await pollUntilOperationIsDone(() => data.getOperationPreview(uploadZipResult.operationId, operationOptions)); + + if (!fs.existsSync("tmp")) + fs.mkdirSync("tmp"); + console.log(" --- Download the uploaded Data:"); + let zipResult = await data.downloadPreview(zipUdid, operationOptions); + console.log("Done (content type: " + zipResult.contentType + ")"); + // use result.blobBody for Browser, readableStreamBody for Node.js: + zipResult.readableStreamBody?.pipe(fs.createWriteStream("tmp/Data_uploaded.zip")); + + // Delete the data (cleanup) + + console.log(" --- Delete the created Data item:"); + await data.deletePreview(zipUdid, operationOptions); + console.log("Done (no response body)"); + + + // List all the data + + console.log(" --- List all the Data uploaded:"); + (await data.listPreview(operationOptions)).mapDataList?.forEach((dataItem) => { console.log(dataItem); }); + +} + +main(); diff --git a/sdk/maps/maps-creator/samples/v1/javascript/dataset.js b/sdk/maps/maps-creator/samples/v1/javascript/dataset.js new file mode 100644 index 000000000000..2c99f3cc255a --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/javascript/dataset.js @@ -0,0 +1,117 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Dataset API usage. Simple CRUD operations are performed. + */ + +const { DefaultAzureCredential } = require("@azure/identity"); +const { CreatorClient } = require("@azure/maps-creator"); +require("dotenv").config(); + +const wait = (ms) => new Promise(res => setTimeout(res, ms)); + +/** + * This method is used for LROs (long running operations) in the Azure Maps API. + * Since Maps API is not 100% compatible with Azure LROs it needs to be used. + * + * @param operation The operation that would be polled for the status. + */ +async function pollUntilOperationIsDone(operation) { + let operationResponse = await operation(); + console.log(operationResponse); + while ((operationResponse.status == "NotStarted") || (operationResponse.status == "Running")) { + console.log(" --> operation status: " + operationResponse.status); + await wait(5000); // wait for 5 seconds between each poll + operationResponse = await operation(); + console.log(operationResponse); + } + if (operationResponse.status == "Failed") { + const operationError = operationResponse.error; + if ((operationError !== null) && (operationError !== void 0)) { + console.log(operationError.details); + if (operationError.details) + console.log(operationError.details[0].details); + } + throw "Failed operation!"; + } + + // get resource ID from the response header "Resource-Location" + const resourceLocation = operationResponse.resourceLocation; + if ((resourceLocation === null) || (resourceLocation === void 0)) + return Promise.resolve(void 0); + const resourceId = resourceLocation.match("[0-9A-Fa-f\-]{36}"); + if ((resourceId === null) || (resourceId === void 0)) + return Promise.resolve(void 0); + return Promise.resolve(resourceId.join()); +} + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + const dataset = new CreatorClient(credential).dataset; + + // TO USE need to have some DWG Conversion done already - please use env CREATOR_CONVERSION_ID + const conversionId = process.env.CREATOR_CONVERSION_ID; + if ((typeof conversionId !== "string") || (conversionId.length != 36)) { + throw "This sample needs some DWG Conversion done"; + } + + console.log(" --- Create Dataset:"); + const createResult = await dataset.beginCreateAndWait(conversionId, operationOptions); + console.log(createResult); + const datasetId = await pollUntilOperationIsDone(() => dataset.getOperation(createResult.operationId, operationOptions)); + + // ! you can use the created dataset in the Tileset API - please put in env CREATOR_DATASET_ID + + console.log(" --- Get details about the created Dataset:"); + console.log(await dataset.get(datasetId, operationOptions)); + + console.log(" --- Delete the created Dataset:"); + await dataset.delete(datasetId, operationOptions); + console.log("Done (no response body)"); + + console.log(" --- List all the Datasets:"); + for await (const datasetItem of dataset.list(operationOptions)) { + console.log(datasetItem); + } + +} + +main(); diff --git a/sdk/maps/maps-creator/samples/v1/javascript/featurestate.js b/sdk/maps/maps-creator/samples/v1/javascript/featurestate.js new file mode 100644 index 000000000000..a633f63ef402 --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/javascript/featurestate.js @@ -0,0 +1,107 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Feature State API usage. Simple CRUD operations are performed. + */ + +const fs = require("fs"); +const { DefaultAzureCredential } = require("@azure/identity"); +const { CreatorClient } = require("@azure/maps-creator"); +require("dotenv").config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + const featureState = new CreatorClient(credential).featureState; + + const filePathForCreate = "../../s/featurestate_sample_create.json"; + const filePathForUpdate = "../../resources/featurestate_sample_put.json"; + const filePathForUpdateStates = "../../resources/featurestate_sample_update_states.json"; + + // TO USE need to have some Dataset created already - please use env CREATOR_DATASET_ID + const datasetId = process.env.CREATOR_DATASET_ID; + if ((typeof datasetId !== "string") || (datasetId.length != 36)) { + throw "This sample needs some Dataset created"; + } + const featureId = "FCL13"; // this is taken from WFS GetFeatures call with "facility" as a collection + + const featureStateSetCreate = JSON.parse(fs.readFileSync(filePathForCreate, "utf8")); + + console.log(" --- Create Feature State Set:"); + const createResult = await featureState.createStateset(datasetId, featureStateSetCreate, operationOptions); + console.log(createResult); + const statesetId = createResult.statesetId; + + console.log(" --- Get Feature State Set:"); + console.log(await featureState.getStateset(statesetId, operationOptions)); + + const featureStateSetUpdateStates = JSON.parse(fs.readFileSync(filePathForUpdateStates, "utf8")); + + console.log(" --- Update states of the Feature State set:"); + console.log(await featureState.updateStates(statesetId, featureId, featureStateSetUpdateStates, operationOptions)); + + console.log(" --- Get states of the Feature State set:"); + console.log(await featureState.getStates(statesetId, featureId, operationOptions)); + + const featureStateSetUpdate = JSON.parse(fs.readFileSync(filePathForUpdate, "utf8")); + + console.log(" --- Update Feature State set:"); + console.log(await featureState.putStateset(statesetId, featureStateSetUpdate, operationOptions)); + + console.log(" --- Get states of the Feature State set:"); + console.log(await featureState.getStates(statesetId, featureId, operationOptions)); + + console.log(" --- Delete state of the Feature State set:"); + console.log(await featureState.deleteState(statesetId, featureId, "s2", operationOptions)); + + console.log(" --- Get states of the Feature State set:"); + console.log(await featureState.getStates(statesetId, featureId, operationOptions)); + + console.log(" --- Delete the created Feature State set:"); + await featureState.deleteStateset(statesetId, operationOptions); + console.log("Done (no response body)"); + + console.log(" --- List all the Feature State sets:"); + for await (const featureStateSet of featureState.listStateset(operationOptions)) { + console.log(featureStateSet); + } +} + +main(); diff --git a/sdk/maps/maps-creator/samples/v1/javascript/package.json b/sdk/maps/maps-creator/samples/v1/javascript/package.json new file mode 100644 index 000000000000..17abd7ffdab2 --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/javascript/package.json @@ -0,0 +1,28 @@ +{ + "name": "azure-maps-creator-samples-js", + "private": true, + "version": "1.0.0", + "description": "Azure Maps Creator client library samples for JavaScript", + "engine": { + "node": ">=12.0.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/maps/maps-creator" + }, + "keywords": [ + "Azure", + "cloud" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-creator", + "dependencies": { + "@azure/maps-creator": "next", + "dotenv": "latest" + } +} diff --git a/sdk/maps/maps-creator/samples/v1/javascript/sample.env b/sdk/maps/maps-creator/samples/v1/javascript/sample.env new file mode 100644 index 000000000000..e7ee18aa8ede --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/javascript/sample.env @@ -0,0 +1,15 @@ +# Maps subscription key when using AzureKey authentication +MAPS_SUBSCRIPTION_KEY="" + +# Maps Azure AD authentication +AZURE_CLIENT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_TENANT_ID="" + +# Variables needed for samples to work. +# Start by uploading GeoJSON and DWG ZIP file using Data API to get proper IDs. +CREATOR_GEOJSON_UDID="" +CREATOR_DWG_ZIP_UDID="" +CREATOR_CONVERSION_ID="" +CREATOR_DATASET_ID="" +CREATOR_STATESET_ID="" diff --git a/sdk/maps/maps-creator/samples/v1/javascript/spatial.js b/sdk/maps/maps-creator/samples/v1/javascript/spatial.js new file mode 100644 index 000000000000..04e31435565d --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/javascript/spatial.js @@ -0,0 +1,106 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Spatial API usage. Simple queries are performed. + */ + +const fs = require("fs"); +const { DefaultAzureCredential } = require("@azure/identity"); +const { CreatorClient } = require("@azure/maps-creator"); +require("dotenv").config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + const spatial = new CreatorClient(credential).spatial; + + const filePathForPostSpatialBuffer = "../../resources/spatial_buffer_request_body.json"; + const filePathForPostSpatialClosestPoint = "../../resources/spatial_closest_point_request_body.json"; + const filePathForPostSpatialGeofence = "../../resources/spatial_geofence_request_body.json"; + const filePathForPostSpatialPointInPolygon = "../../resources/spatial_point_in_polygon_request_body.json"; + + // TO USE need to have some GeoJson Data uploaded already - please use env CREATOR_GEOJSON_UDID + const udid = process.env.CREATOR_GEOJSON_UDID; + if ((typeof udid !== "string") || (udid.length != 36)) { + throw "This sample needs some GeoJson Data uploaded"; + } + + console.log(" --- Get buffer:"); + const res = await spatial.getBuffer("json", udid, "176.3", operationOptions); + console.log(res); + console.log(res.result?.features); + + console.log(" --- Get closest point:"); + console.log(await spatial.getClosestPoint("json", udid, 47.622942, -122.316456, operationOptions)); + + console.log(" --- Get geofence:"); + const spatialGeofenceParams = { + "searchBuffer": 50, + "userTime": new Date("2017-07-21T17:32:28Z"), + "mode": "EnterAndExit" + }; + console.log(await spatial.getGeofence("json", "unique_device_name_under_account", udid, 48.36, -124.63, { ...spatialGeofenceParams, ...operationOptions })); + + console.log(" --- Get great circle distance:"); + console.log(await spatial.getGreatCircleDistance("json", "47.622942,-122.316456:47.610378,-122.200676", operationOptions)); + + /* TODO: use udid with some Polygon as a "geometry" of the Feature + console.log(" --- Get point in polygon:"); + console.log(await spatial.getPointInPolygon("json", udid, 47.622942, -122.316456, operationOptions));*/ + + console.log(" --- Post buffer:"); + const postSpatialBufferPayload = JSON.parse(fs.readFileSync(filePathForPostSpatialBuffer, "utf8")); + console.log(await spatial.postBuffer("json", postSpatialBufferPayload, operationOptions)); + + console.log(" --- Post closest point:"); + const postSpatialClosestPointPayload = JSON.parse(fs.readFileSync(filePathForPostSpatialClosestPoint, "utf8")); + console.log(await spatial.postClosestPoint("json", 47.622942, -122.316456, postSpatialClosestPointPayload, operationOptions)); + + console.log(" --- Post geofence:"); + const postSpatialGeofencePayload = JSON.parse(fs.readFileSync(filePathForPostSpatialGeofence, "utf8")); + console.log(await spatial.postGeofence("json", "unique_device_name_under_account", 48.36, -124.63, postSpatialGeofencePayload, { ...spatialGeofenceParams, ...operationOptions })); + + console.log(" --- Post point in polygon:"); + const postSpatialPointInPolygonPayload = JSON.parse(fs.readFileSync(filePathForPostSpatialPointInPolygon, "utf8")); + console.log(await spatial.postPointInPolygon("json", 48.36, -124.63, postSpatialPointInPolygonPayload, operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-creator/samples/v1/javascript/tileset.js b/sdk/maps/maps-creator/samples/v1/javascript/tileset.js new file mode 100644 index 000000000000..2b4666e7aaab --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/javascript/tileset.js @@ -0,0 +1,115 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Tileset API usage. Simple queries are performed. + */ + +const { DefaultAzureCredential } = require("@azure/identity"); +const { CreatorClient } = require("@azure/maps-creator"); +require("dotenv").config(); + +const wait = (ms) => new Promise(res => setTimeout(res, ms)); + +/** + * This method is used for LROs (long running operations) in the Azure Maps API. + * Since Maps API is not 100% compatible with Azure LROs it needs to be used. + * + * @param operation The operation that would be polled for the status. + */ +async function pollUntilOperationIsDone(operation) { + let operationResponse = await operation(); + console.log(operationResponse); + while ((operationResponse.status == "NotStarted") || (operationResponse.status == "Running")) { + console.log(" --> operation status: " + operationResponse.status); + await wait(5000); // wait for 5 seconds between each poll + operationResponse = await operation(); + console.log(operationResponse); + } + if (operationResponse.status == "Failed") { + const operationError = operationResponse.error; + if ((operationError !== null) && (operationError !== void 0)) { + console.log(operationError.details); + if (operationError.details) + console.log(operationError.details[0].details); + } + throw "Failed operation!"; + } + + // get resource ID from the response header "Resource-Location" + const resourceLocation = operationResponse.resourceLocation; + if ((resourceLocation === null) || (resourceLocation === void 0)) + return Promise.resolve(void 0); + const resourceId = resourceLocation.match("[0-9A-Fa-f\-]{36}"); + if ((resourceId === null) || (resourceId === void 0)) + return Promise.resolve(void 0); + return Promise.resolve(resourceId.join()); +} + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + const tileset = new CreatorClient(credential).tileset; + + // TO USE need to have some Dataset created already - please use env CREATOR_DATASET_ID + const datasetId = process.env.CREATOR_DATASET_ID; + if ((typeof datasetId !== "string") || (datasetId.length != 36)) { + throw "This sample needs some Dataset created"; + } + + console.log(" --- Create Tileset:"); + const createResult = await tileset.beginCreateAndWait(datasetId, operationOptions); + console.log(createResult); + const tilesetId = await pollUntilOperationIsDone(() => tileset.getOperation(createResult.operationId, operationOptions)); + + console.log(" --- Get details about the created Tileset:"); + console.log(await tileset.get(tilesetId, operationOptions)); + + console.log(" --- Delete the created Tileset:"); + await tileset.delete(tilesetId, operationOptions); + console.log("Done (no response body)"); + + console.log(" --- List all the Tilesets:"); + for await (const tileSet of tileset.list(operationOptions)) { + console.log(tileSet); + } + +} + +main(); diff --git a/sdk/maps/maps-creator/samples/v1/javascript/wfs.js b/sdk/maps/maps-creator/samples/v1/javascript/wfs.js new file mode 100644 index 000000000000..459f95fe64d5 --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/javascript/wfs.js @@ -0,0 +1,89 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates WFS API usage. Simple queries are performed. + */ + +const { DefaultAzureCredential } = require("@azure/identity"); +const { CreatorClient } = require("@azure/maps-creator"); +require("dotenv").config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + const wfs = new CreatorClient(credential).wfs; + + // TO USE need to have some Dataset created already - please use env CREATOR_DATASET_ID + const datasetId = process.env.CREATOR_DATASET_ID; + if ((typeof datasetId !== "string") || (datasetId.length != 36)) { + throw "This sample needs some Dataset created"; + } + + console.log(" --- Get conformance of the dataset:"); + console.log(await wfs.getConformance(datasetId, operationOptions)); + + console.log(" --- Get landing page of the dataset:"); + console.log(await wfs.getLandingPage(datasetId, operationOptions)); + + console.log(" --- Get collections:"); + console.log(await wfs.getCollections(datasetId, operationOptions)); + + console.log(" --- Get collection:"); + console.log(await wfs.getCollection(datasetId, "facility", operationOptions)); + + console.log(" --- Get collection definition:"); + console.log(await wfs.getCollectionDefinition(datasetId, "facility", operationOptions)); + + console.log(" --- Get features of the collection:"); + const collectionFeatures = await wfs.getFeatures(datasetId, "facility", operationOptions); + console.log(collectionFeatures); + const featureId = collectionFeatures.features[0].id; + + console.log(" --- Get details of the feature of the collection:"); + console.log(await wfs.getFeature(datasetId, "facility", featureId, operationOptions)); + + /* This code works as expected however it would remove the feature and require to create the dataset once again. + console.log(" --- Remove the feature:"); + await wfs.deleteFeature(datasetId, "facility", featureId, operationOptions); + console.log("Done (no response body)");*/ + +} + +main(); diff --git a/sdk/maps/maps-creator/samples/v1/typescript/README.md b/sdk/maps/maps-creator/samples/v1/typescript/README.md new file mode 100644 index 000000000000..66959cc274bd --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/typescript/README.md @@ -0,0 +1,81 @@ +--- +page_type: sample +languages: + - typescript +products: + - azure +urlFragment: maps-creator-typescript +--- + +# Azure Maps Creator client library samples for TypeScript + +These sample programs show how to use the TypeScript client libraries for Azure Maps Creator in some common scenarios. + +| **File Name** | **Description** | +| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | +| [alias.ts][alias] | Manages aliases of the data uploaded using [Data API][data]. | +| [conversion.ts][conversion] | Converts DWG ZIP packages uploaded using [Data API][data]. | +| [data.ts][data] | Uploads both GeoJSON files for [Spatial API][spatial] and DWG ZIP packages for [Conversion][conversion] and [Dataset][dataset] APIs. | +| [dataset.ts][dataset] | Creates dataset from converted DWG ZIP file. | +| [featurestate.ts][featurestate] | Manages states of the features of the given dataset. | +| [spatial.ts][spatial] | Operations for geospatial calculations. | +| [tileset.ts][tileset] | Manages tileset used for rendering the dataset. | +| [wfs.ts][wfs] | The Web Feature Service API that manages features and feature collections within the dataset. | + +## Prerequisites + +The sample programs are compatible with Node.js >=12.0.0. + +Before running the samples in Node, they must be compiled to JavaScript using the TypeScript compiler. For more information on TypeScript, see the [TypeScript documentation][typescript]. Install the TypeScript compiler using: + +```bash +npm install -g typescript +``` + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Compile the samples: + +```bash +npm run build +``` + +3. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +4. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node dist/data.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx cross-env MAPS_SUBSCRIPTION_KEY="" node dist/data.js +``` + +[alias]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-creator/samples/v1/typescript/src/alias.ts +[conversion]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-creator/samples/v1/typescript/src/conversion.ts +[data]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-creator/samples/v1/typescript/src/data.ts +[dataset]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-creator/samples/v1/typescript/src/dataset.ts +[featurestate]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-creator/samples/v1/typescript/src/featurestate.ts +[spatial]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-creator/samples/v1/typescript/src/spatial.ts +[tileset]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-creator/samples/v1/typescript/src/tileset.ts +[wfs]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-creator/samples/v1/typescript/src/wfs.ts +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-creator/README.md +[typescript]: https://www.typescriptlang.org/docs/home.html diff --git a/sdk/maps/maps-creator/samples/v1/typescript/package.json b/sdk/maps/maps-creator/samples/v1/typescript/package.json new file mode 100644 index 000000000000..799b0d955aa0 --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/typescript/package.json @@ -0,0 +1,36 @@ +{ + "name": "azure-maps-creator-samples-ts", + "private": true, + "version": "1.0.0", + "description": "Azure Maps Creator client library samples for TypeScript", + "engine": { + "node": ">=12.0.0" + }, + "scripts": { + "build": "tsc", + "prebuild": "rimraf dist/" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/maps/maps-creator" + }, + "keywords": [ + "Azure", + "cloud" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-creator", + "dependencies": { + "@azure/maps-creator": "next", + "dotenv": "latest" + }, + "devDependencies": { + "typescript": "~4.2.0", + "rimraf": "latest" + } +} diff --git a/sdk/maps/maps-creator/samples/v1/typescript/sample.env b/sdk/maps/maps-creator/samples/v1/typescript/sample.env new file mode 100644 index 000000000000..e7ee18aa8ede --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/typescript/sample.env @@ -0,0 +1,15 @@ +# Maps subscription key when using AzureKey authentication +MAPS_SUBSCRIPTION_KEY="" + +# Maps Azure AD authentication +AZURE_CLIENT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_TENANT_ID="" + +# Variables needed for samples to work. +# Start by uploading GeoJSON and DWG ZIP file using Data API to get proper IDs. +CREATOR_GEOJSON_UDID="" +CREATOR_DWG_ZIP_UDID="" +CREATOR_CONVERSION_ID="" +CREATOR_DATASET_ID="" +CREATOR_STATESET_ID="" diff --git a/sdk/maps/maps-creator/samples/v1/typescript/src/alias.ts b/sdk/maps/maps-creator/samples/v1/typescript/src/alias.ts new file mode 100644 index 000000000000..b2d606aa914f --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/typescript/src/alias.ts @@ -0,0 +1,85 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Alias API usage. Simple CRUD operations are performed. + */ + +import { getDefaultAzureCredential } from "@azure/identity"; +import * as coreAuth from "@azure/core-auth"; +import * as coreClient from "@azure/core-client"; +import { CreatorClient } from "@azure/maps-creator"; +import * as dotenv from "dotenv"; +dotenv.config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential implements coreAuth.TokenCredential { + async getToken( + _scopes: string | string[], + _options?: coreAuth.GetTokenOptions + ): Promise { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential: coreAuth.TokenCredential; + let operationOptions: coreClient.OperationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = getDefaultAzureCredential(); + } + + const alias = new CreatorClient(credential).alias; + + console.log(" --- Create Alias:"); + const aliasCreateResponse = await alias.create(operationOptions); + console.log(aliasCreateResponse); + const aliasId = aliasCreateResponse.aliasId; + + // TO USE need to have some data uploaded already - please use env CREATOR_DWG_ZIP_UDID or CREATOR_GEOJSON_UDID + const udid = process.env.CREATOR_DWG_ZIP_UDID; + if ((typeof udid === "string") && (udid.length == 36)) { + console.log(" --- Assign the aliasId to some Creator's udid:"); + console.log(await alias.assign(aliasId!, udid!, operationOptions)); + } + + console.log(" --- Get details about the created Alias:"); + console.log(await alias.getDetails(aliasId!, operationOptions)); + + console.log(" --- Delete the created Alias:"); + await alias.delete(aliasId!, operationOptions); + console.log("Done (no response body)"); + + console.log(" --- List all the created Aliases:"); + for await (const aliasItem of alias.list(operationOptions)) { + console.log(aliasItem); + } + +} + +main(); diff --git a/sdk/maps/maps-creator/samples/v1/typescript/src/conversion.ts b/sdk/maps/maps-creator/samples/v1/typescript/src/conversion.ts new file mode 100644 index 000000000000..39ae973719f6 --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/typescript/src/conversion.ts @@ -0,0 +1,121 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Conversion API usage. Simple CRUD operations are performed. + */ + +import { getDefaultAzureCredential } from "@azure/identity"; +import * as coreAuth from "@azure/core-auth"; +import * as coreClient from "@azure/core-client"; +import { CreatorClient, LongRunningOperationResult } from "@azure/maps-creator"; +import * as dotenv from "dotenv"; +dotenv.config(); + +const wait = (ms: number) => new Promise(res => setTimeout(res, ms)); + +declare type LongRunningOperationResponse = LongRunningOperationResult & { + /** If successful, a URI where details on the newly created resource can be found. */ + resourceLocation?: string; +}; + +/** + * This method is used for LROs (long running operations) in the Azure Maps API. + * Since Maps API is not 100% compatible with Azure LROs it needs to be used. + * + * @param operation The operation that would be polled for the status. + */ +export async function pollUntilOperationIsDone(operation: (...args: any[]) => Promise): Promise { + let operationResponse = await operation(); + console.log(operationResponse); + while ((operationResponse.status == "NotStarted") || (operationResponse.status == "Running")) { + console.log(" --> operation status: " + operationResponse.status); + await wait(5000); // wait for 5 seconds between each poll + operationResponse = await operation(); + console.log(operationResponse); + } + if (operationResponse.status == "Failed") { + console.log(operationResponse.error?.details); + if (operationResponse.error?.details) + console.log(operationResponse.error?.details[0].details); + throw "Failed operation!"; + } + + // get resource ID from the response header "Resource-Location" + const resourceId = operationResponse.resourceLocation?.match("[0-9A-Fa-f\-]{36}")?.join(); + + return Promise.resolve(resourceId!); +} + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential implements coreAuth.TokenCredential { + async getToken( + _scopes: string | string[], + _options?: coreAuth.GetTokenOptions + ): Promise { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential: coreAuth.TokenCredential; + let operationOptions: coreClient.OperationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = getDefaultAzureCredential(); + } + + const conversion = new CreatorClient(credential).conversion; + + // TO USE need to have some DWG data uploaded already - please use env CREATOR_DWG_ZIP_UDID + const udid = process.env.CREATOR_DWG_ZIP_UDID; + if ((typeof udid !== "string") || (udid.length != 36)) { + throw "This sample needs some DWG data uploaded"; + } + + console.log(" --- Begin the Conversion:"); + const convertResult = await conversion.beginConvertAndWait(udid, "facility-2.0", operationOptions); + console.log(convertResult); + const conversionId = await pollUntilOperationIsDone(() => conversion.getOperation(convertResult.operationId!, operationOptions)); + + // ! you can use the converted data in the Dataset API - please put in env CREATOR_CONVERSION_ID + + console.log(" --- Get details about the created Conversion:"); + console.log(await conversion.get(conversionId!, operationOptions)); + + console.log(" --- Delete the created Conversion:"); + await conversion.delete(conversionId!, operationOptions); + console.log("Done (no response body)"); + + console.log(" --- List all the Conversions:"); + for await (const conversionItem of conversion.list(operationOptions)) { + console.log(conversionItem); + } + +} + +main(); diff --git a/sdk/maps/maps-creator/samples/v1/typescript/src/data.ts b/sdk/maps/maps-creator/samples/v1/typescript/src/data.ts new file mode 100644 index 000000000000..b85137e82d89 --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/typescript/src/data.ts @@ -0,0 +1,169 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Data API usage. Simple CRUD operations are performed. + */ + +import fs from "fs"; +import { getDefaultAzureCredential } from "@azure/identity"; +import * as coreAuth from "@azure/core-auth"; +import * as coreClient from "@azure/core-client"; +import { CreatorClient, LongRunningOperationResult } from "@azure/maps-creator"; +import * as dotenv from "dotenv"; +dotenv.config(); + +const wait = (ms: number) => new Promise(res => setTimeout(res, ms)); + +declare type LongRunningOperationResponse = LongRunningOperationResult & { + /** If successful, a URI where details on the newly created resource can be found. */ + resourceLocation?: string; +}; + +/** + * This method is used for LROs (long running operations) in the Azure Maps API. + * Since Maps API is not 100% compatible with Azure LROs it needs to be used. + * + * @param operation The operation that would be polled for the status. + */ +export async function pollUntilOperationIsDone(operation: (...args: any[]) => Promise): Promise { + let operationResponse = await operation(); + console.log(operationResponse); + while ((operationResponse.status == "NotStarted") || (operationResponse.status == "Running")) { + console.log(" --> operation status: " + operationResponse.status); + await wait(5000); // wait for 5 seconds between each poll + operationResponse = await operation(); + console.log(operationResponse); + } + if (operationResponse.status == "Failed") { + console.log(operationResponse.error?.details); + if (operationResponse.error?.details) + console.log(operationResponse.error?.details[0].details); + throw "Failed operation!"; + } + + // get resource ID from the response header "Resource-Location" + const resourceId = operationResponse.resourceLocation?.match("[0-9A-Fa-f\-]{36}")?.join(); + + return Promise.resolve(resourceId!); +} + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential implements coreAuth.TokenCredential { + async getToken( + _scopes: string | string[], + _options?: coreAuth.GetTokenOptions + ): Promise { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential: coreAuth.TokenCredential; + let operationOptions: coreClient.OperationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = getDefaultAzureCredential(); + } + + const data = new CreatorClient(credential).data; + + const filePathForUpload = "../../resources/data_sample_upload.json"; + const filePathForZipUpload = "../../resources/data_sample_upload.zip" + const filePathForUpdate = "../../resources/data_sample_update.json"; + + + // This will upload new resource for Creator returning unique ID (udid) that might be used for other + // Creator's services: Alias, Conversion, etc. Please put it in the env CREATOR_DWG_ZIP_UDID or CREATOR_GEOJSON_UDID. + + // Upload GeoJson: + + const geoJsonUpload = JSON.parse(fs.readFileSync(filePathForUpload, "utf8")); + + console.log(" --- Begin the upload Data (single JSON file):"); + const uploadResult = await data.beginUploadPreviewAndWait("geojson", "application/json", geoJsonUpload, operationOptions); + console.log(uploadResult); + const udid = await pollUntilOperationIsDone(() => data.getOperationPreview(uploadResult.operationId!, operationOptions)); + + console.log(" --- Download the uploaded Data:"); + let result = await data.downloadPreview(udid!, operationOptions); + console.log("Done (content type: " + result.contentType + ")"); + // use result.blobBody for Browser, readableStreamBody for Node.js: + console.log("Matches input? " + (JSON.stringify(geoJsonUpload) == result.readableStreamBody?.read().toString())); + + // Update GeoJson: + + const geoJsonUpdate = JSON.parse(fs.readFileSync(filePathForUpdate, "utf8")); + + console.log(" --- Begin the update Data (single JSON file):"); + const updateResult = await data.beginUpdatePreviewAndWait(udid, geoJsonUpdate, operationOptions); + console.log(updateResult); + await pollUntilOperationIsDone(() => data.getOperationPreview(updateResult.operationId!, operationOptions)); + + console.log(" --- Download the updated Data:"); + result = await data.downloadPreview(udid!, operationOptions); + console.log("Done (content type: " + result.contentType + ")"); + // use result.blobBody for Browser, readableStreamBody for Node.js: + console.log("Matches input? " + (JSON.stringify(geoJsonUpdate) == result.readableStreamBody?.read().toString())); + + // Delete the data (cleanup) + + console.log(" --- Delete the created Data item:"); + await data.deletePreview(udid, operationOptions); + console.log("Done (no response body)"); + + + // Upload ZIP with DWG files: + + console.log(" --- Begin the upload Data (single ZIP file):"); + const uploadZipResult = await data.beginUploadPreviewAndWait("dwgzippackage", "application/octet-stream", fs.readFileSync(filePathForZipUpload), operationOptions); + console.log(uploadZipResult); + const zipUdid = await pollUntilOperationIsDone(() => data.getOperationPreview(uploadZipResult.operationId!, operationOptions)); + + if (!fs.existsSync("tmp")) + fs.mkdirSync("tmp"); + console.log(" --- Download the uploaded Data:"); + let zipResult = await data.downloadPreview(zipUdid!, operationOptions); + console.log("Done (content type: " + zipResult.contentType + ")"); + // use result.blobBody for Browser, readableStreamBody for Node.js: + zipResult.readableStreamBody?.pipe(fs.createWriteStream("tmp/Data_uploaded.zip")); + + // Delete the data (cleanup) + + console.log(" --- Delete the created Data item:"); + await data.deletePreview(zipUdid, operationOptions); + console.log("Done (no response body)"); + + + // List all the data + + console.log(" --- List all the Data uploaded:"); + (await data.listPreview(operationOptions)).mapDataList?.forEach((dataItem) => { console.log(dataItem); }); + +} + +main(); diff --git a/sdk/maps/maps-creator/samples/v1/typescript/src/dataset.ts b/sdk/maps/maps-creator/samples/v1/typescript/src/dataset.ts new file mode 100644 index 000000000000..1da556145ad1 --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/typescript/src/dataset.ts @@ -0,0 +1,121 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Dataset API usage. Simple CRUD operations are performed. + */ + +import { getDefaultAzureCredential } from "@azure/identity"; +import * as coreAuth from "@azure/core-auth"; +import * as coreClient from "@azure/core-client"; +import { CreatorClient, LongRunningOperationResult } from "@azure/maps-creator"; +import * as dotenv from "dotenv"; +dotenv.config(); + +const wait = (ms: number) => new Promise(res => setTimeout(res, ms)); + +declare type LongRunningOperationResponse = LongRunningOperationResult & { + /** If successful, a URI where details on the newly created resource can be found. */ + resourceLocation?: string; +}; + +/** + * This method is used for LROs (long running operations) in the Azure Maps API. + * Since Maps API is not 100% compatible with Azure LROs it needs to be used. + * + * @param operation The operation that would be polled for the status. + */ +export async function pollUntilOperationIsDone(operation: (...args: any[]) => Promise): Promise { + let operationResponse = await operation(); + console.log(operationResponse); + while ((operationResponse.status == "NotStarted") || (operationResponse.status == "Running")) { + console.log(" --> operation status: " + operationResponse.status); + await wait(5000); // wait for 5 seconds between each poll + operationResponse = await operation(); + console.log(operationResponse); + } + if (operationResponse.status == "Failed") { + console.log(operationResponse.error?.details); + if (operationResponse.error?.details) + console.log(operationResponse.error?.details[0].details); + throw "Failed operation!"; + } + + // get resource ID from the response header "Resource-Location" + const resourceId = operationResponse.resourceLocation?.match("[0-9A-Fa-f\-]{36}")?.join(); + + return Promise.resolve(resourceId!); +} + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential implements coreAuth.TokenCredential { + async getToken( + _scopes: string | string[], + _options?: coreAuth.GetTokenOptions + ): Promise { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential: coreAuth.TokenCredential; + let operationOptions: coreClient.OperationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = getDefaultAzureCredential(); + } + + const dataset = new CreatorClient(credential).dataset; + + // TO USE need to have some DWG Conversion done already - please use env CREATOR_CONVERSION_ID + const conversionId = process.env.CREATOR_CONVERSION_ID; + if ((typeof conversionId !== "string") || (conversionId.length != 36)) { + throw "This sample needs some DWG Conversion done"; + } + + console.log(" --- Create Dataset:"); + const createResult = await dataset.beginCreateAndWait(conversionId, operationOptions); + console.log(createResult); + const datasetId = await pollUntilOperationIsDone(() => dataset.getOperation(createResult.operationId!, operationOptions)); + + // ! you can use the created dataset in the Tileset API - please put in env CREATOR_DATASET_ID + + console.log(" --- Get details about the created Dataset:"); + console.log(await dataset.get(datasetId!, operationOptions)); + + console.log(" --- Delete the created Dataset:"); + await dataset.delete(datasetId!, operationOptions); + console.log("Done (no response body)"); + + console.log(" --- List all the Datasets:"); + for await (const datasetItem of dataset.list(operationOptions)) { + console.log(datasetItem); + } + +} + +main(); diff --git a/sdk/maps/maps-creator/samples/v1/typescript/src/featurestate.ts b/sdk/maps/maps-creator/samples/v1/typescript/src/featurestate.ts new file mode 100644 index 000000000000..bab4692f69fe --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/typescript/src/featurestate.ts @@ -0,0 +1,113 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Feature State API usage. Simple CRUD operations are performed. + */ + +import fs from "fs"; +import { getDefaultAzureCredential } from "@azure/identity"; +import * as coreAuth from "@azure/core-auth"; +import * as coreClient from "@azure/core-client"; +import { CreatorClient } from "@azure/maps-creator"; +import * as dotenv from "dotenv"; +dotenv.config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential implements coreAuth.TokenCredential { + async getToken( + _scopes: string | string[], + _options?: coreAuth.GetTokenOptions + ): Promise { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential: coreAuth.TokenCredential; + let operationOptions: coreClient.OperationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = getDefaultAzureCredential(); + } + + const featureState = new CreatorClient(credential).featureState; + + const filePathForCreate = "../../s/featurestate_sample_create.json"; + const filePathForUpdate = "../../resources/featurestate_sample_put.json"; + const filePathForUpdateStates = "../../resources/featurestate_sample_update_states.json"; + + // TO USE need to have some Dataset created already - please use env CREATOR_DATASET_ID + const datasetId = process.env.CREATOR_DATASET_ID; + if ((typeof datasetId !== "string") || (datasetId.length != 36)) { + throw "This sample needs some Dataset created"; + } + const featureId = "FCL13"; // this is taken from WFS GetFeatures call with "facility" as a collection + + const featureStateSetCreate = JSON.parse(fs.readFileSync(filePathForCreate, "utf8")); + + console.log(" --- Create Feature State Set:"); + const createResult = await featureState.createStateset(datasetId, featureStateSetCreate, operationOptions); + console.log(createResult); + const statesetId = createResult.statesetId; + + console.log(" --- Get Feature State Set:"); + console.log(await featureState.getStateset(statesetId!, operationOptions)); + + const featureStateSetUpdateStates = JSON.parse(fs.readFileSync(filePathForUpdateStates, "utf8")); + + console.log(" --- Update states of the Feature State set:"); + console.log(await featureState.updateStates(statesetId!, featureId, featureStateSetUpdateStates, operationOptions)); + + console.log(" --- Get states of the Feature State set:"); + console.log(await featureState.getStates(statesetId!, featureId, operationOptions)); + + const featureStateSetUpdate = JSON.parse(fs.readFileSync(filePathForUpdate, "utf8")); + + console.log(" --- Update Feature State set:"); + console.log(await featureState.putStateset(statesetId!, featureStateSetUpdate, operationOptions)); + + console.log(" --- Get states of the Feature State set:"); + console.log(await featureState.getStates(statesetId!, featureId, operationOptions)); + + console.log(" --- Delete state of the Feature State set:"); + console.log(await featureState.deleteState(statesetId!, featureId, "s2", operationOptions)); + + console.log(" --- Get states of the Feature State set:"); + console.log(await featureState.getStates(statesetId!, featureId, operationOptions)); + + console.log(" --- Delete the created Feature State set:"); + await featureState.deleteStateset(statesetId!, operationOptions); + console.log("Done (no response body)"); + + console.log(" --- List all the Feature State sets:"); + for await (const featureStateSet of featureState.listStateset(operationOptions)) { + console.log(featureStateSet); + } +} + +main(); diff --git a/sdk/maps/maps-creator/samples/v1/typescript/src/spatial.ts b/sdk/maps/maps-creator/samples/v1/typescript/src/spatial.ts new file mode 100644 index 000000000000..4a249c0f42dc --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/typescript/src/spatial.ts @@ -0,0 +1,112 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Spatial API usage. Simple queries are performed. + */ + +import fs from "fs"; +import { getDefaultAzureCredential } from "@azure/identity"; +import * as coreAuth from "@azure/core-auth"; +import * as coreClient from "@azure/core-client"; +import { CreatorClient } from "@azure/maps-creator"; +import * as dotenv from "dotenv"; +dotenv.config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential implements coreAuth.TokenCredential { + async getToken( + _scopes: string | string[], + _options?: coreAuth.GetTokenOptions + ): Promise { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential: coreAuth.TokenCredential; + let operationOptions: coreClient.OperationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = getDefaultAzureCredential(); + } + + const spatial = new CreatorClient(credential).spatial; + + const filePathForPostSpatialBuffer = "../../resources/spatial_buffer_request_body.json"; + const filePathForPostSpatialClosestPoint = "../../resources/spatial_closest_point_request_body.json"; + const filePathForPostSpatialGeofence = "../../resources/spatial_geofence_request_body.json"; + const filePathForPostSpatialPointInPolygon = "../../resources/spatial_point_in_polygon_request_body.json"; + + // TO USE need to have some GeoJson Data uploaded already - please use env CREATOR_GEOJSON_UDID + const udid = process.env.CREATOR_GEOJSON_UDID; + if ((typeof udid !== "string") || (udid.length != 36)) { + throw "This sample needs some GeoJson Data uploaded"; + } + + console.log(" --- Get buffer:"); + const res = await spatial.getBuffer("json", udid, "176.3", operationOptions); + console.log(res); + console.log(res.result?.features); + + console.log(" --- Get closest point:"); + console.log(await spatial.getClosestPoint("json", udid, 47.622942, -122.316456, operationOptions)); + + console.log(" --- Get geofence:"); + const spatialGeofenceParams = { + "searchBuffer": 50, + "userTime": new Date("2017-07-21T17:32:28Z"), + "mode": "EnterAndExit" + }; + console.log(await spatial.getGeofence("json", "unique_device_name_under_account", udid, 48.36, -124.63, { ...spatialGeofenceParams, ...operationOptions })); + + console.log(" --- Get great circle distance:"); + console.log(await spatial.getGreatCircleDistance("json", "47.622942,-122.316456:47.610378,-122.200676", operationOptions)); + + /* TODO: use udid with some Polygon as a "geometry" of the Feature + console.log(" --- Get point in polygon:"); + console.log(await spatial.getPointInPolygon("json", udid, 47.622942, -122.316456, operationOptions));*/ + + console.log(" --- Post buffer:"); + const postSpatialBufferPayload = JSON.parse(fs.readFileSync(filePathForPostSpatialBuffer, "utf8")); + console.log(await spatial.postBuffer("json", postSpatialBufferPayload, operationOptions)); + + console.log(" --- Post closest point:"); + const postSpatialClosestPointPayload = JSON.parse(fs.readFileSync(filePathForPostSpatialClosestPoint, "utf8")); + console.log(await spatial.postClosestPoint("json", 47.622942, -122.316456, postSpatialClosestPointPayload, operationOptions)); + + console.log(" --- Post geofence:"); + const postSpatialGeofencePayload = JSON.parse(fs.readFileSync(filePathForPostSpatialGeofence, "utf8")); + console.log(await spatial.postGeofence("json", "unique_device_name_under_account", 48.36, -124.63, postSpatialGeofencePayload, { ...spatialGeofenceParams, ...operationOptions })); + + console.log(" --- Post point in polygon:"); + const postSpatialPointInPolygonPayload = JSON.parse(fs.readFileSync(filePathForPostSpatialPointInPolygon, "utf8")); + console.log(await spatial.postPointInPolygon("json", 48.36, -124.63, postSpatialPointInPolygonPayload, operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-creator/samples/v1/typescript/src/tileset.ts b/sdk/maps/maps-creator/samples/v1/typescript/src/tileset.ts new file mode 100644 index 000000000000..882f3900a9ca --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/typescript/src/tileset.ts @@ -0,0 +1,119 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Tileset API usage. Simple queries are performed. + */ + +import { getDefaultAzureCredential } from "@azure/identity"; +import * as coreAuth from "@azure/core-auth"; +import * as coreClient from "@azure/core-client"; +import { CreatorClient, LongRunningOperationResult } from "@azure/maps-creator"; +import * as dotenv from "dotenv"; +dotenv.config(); + +const wait = (ms: number) => new Promise(res => setTimeout(res, ms)); + +declare type LongRunningOperationResponse = LongRunningOperationResult & { + /** If successful, a URI where details on the newly created resource can be found. */ + resourceLocation?: string; +}; + +/** + * This method is used for LROs (long running operations) in the Azure Maps API. + * Since Maps API is not 100% compatible with Azure LROs it needs to be used. + * + * @param operation The operation that would be polled for the status. + */ +export async function pollUntilOperationIsDone(operation: (...args: any[]) => Promise): Promise { + let operationResponse = await operation(); + console.log(operationResponse); + while ((operationResponse.status == "NotStarted") || (operationResponse.status == "Running")) { + console.log(" --> operation status: " + operationResponse.status); + await wait(5000); // wait for 5 seconds between each poll + operationResponse = await operation(); + console.log(operationResponse); + } + if (operationResponse.status == "Failed") { + console.log(operationResponse.error?.details); + if (operationResponse.error?.details) + console.log(operationResponse.error?.details[0].details); + throw "Failed operation!"; + } + + // get resource ID from the response header "Resource-Location" + const resourceId = operationResponse.resourceLocation?.match("[0-9A-Fa-f\-]{36}")?.join(); + + return Promise.resolve(resourceId!); +} + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential implements coreAuth.TokenCredential { + async getToken( + _scopes: string | string[], + _options?: coreAuth.GetTokenOptions + ): Promise { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential: coreAuth.TokenCredential; + let operationOptions: coreClient.OperationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = getDefaultAzureCredential(); + } + + const tileset = new CreatorClient(credential).tileset; + + // TO USE need to have some Dataset created already - please use env CREATOR_DATASET_ID + const datasetId = process.env.CREATOR_DATASET_ID; + if ((typeof datasetId !== "string") || (datasetId.length != 36)) { + throw "This sample needs some Dataset created"; + } + + console.log(" --- Create Tileset:"); + const createResult = await tileset.beginCreateAndWait(datasetId, operationOptions); + console.log(createResult); + const tilesetId = await pollUntilOperationIsDone(() => tileset.getOperation(createResult.operationId!, operationOptions)); + + console.log(" --- Get details about the created Tileset:"); + console.log(await tileset.get(tilesetId!, operationOptions)); + + console.log(" --- Delete the created Tileset:"); + await tileset.delete(tilesetId!, operationOptions); + console.log("Done (no response body)"); + + console.log(" --- List all the Tilesets:"); + for await (const tileSet of tileset.list(operationOptions)) { + console.log(tileSet); + } + +} + +main(); diff --git a/sdk/maps/maps-creator/samples/v1/typescript/src/wfs.ts b/sdk/maps/maps-creator/samples/v1/typescript/src/wfs.ts new file mode 100644 index 000000000000..c3aa1572c4fb --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/typescript/src/wfs.ts @@ -0,0 +1,95 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates WFS API usage. Simple queries are performed. + */ + +import { getDefaultAzureCredential } from "@azure/identity"; +import * as coreAuth from "@azure/core-auth"; +import * as coreClient from "@azure/core-client"; +import { CreatorClient } from "@azure/maps-creator"; +import * as dotenv from "dotenv"; +dotenv.config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential implements coreAuth.TokenCredential { + async getToken( + _scopes: string | string[], + _options?: coreAuth.GetTokenOptions + ): Promise { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential: coreAuth.TokenCredential; + let operationOptions: coreClient.OperationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = getDefaultAzureCredential(); + } + + const wfs = new CreatorClient(credential).wfs; + + // TO USE need to have some Dataset created already - please use env CREATOR_DATASET_ID + const datasetId = process.env.CREATOR_DATASET_ID; + if ((typeof datasetId !== "string") || (datasetId.length != 36)) { + throw "This sample needs some Dataset created"; + } + + console.log(" --- Get conformance of the dataset:"); + console.log(await wfs.getConformance(datasetId, operationOptions)); + + console.log(" --- Get landing page of the dataset:"); + console.log(await wfs.getLandingPage(datasetId, operationOptions)); + + console.log(" --- Get collections:"); + console.log(await wfs.getCollections(datasetId, operationOptions)); + + console.log(" --- Get collection:"); + console.log(await wfs.getCollection(datasetId, "facility", operationOptions)); + + console.log(" --- Get collection definition:"); + console.log(await wfs.getCollectionDefinition(datasetId, "facility", operationOptions)); + + console.log(" --- Get features of the collection:"); + const collectionFeatures = await wfs.getFeatures(datasetId, "facility", operationOptions); + console.log(collectionFeatures); + const featureId = collectionFeatures.features[0].id; + + console.log(" --- Get details of the feature of the collection:"); + console.log(await wfs.getFeature(datasetId, "facility", featureId!, operationOptions)); + + /* This code works as expected however it would remove the feature and require to create the dataset once again. + console.log(" --- Remove the feature:"); + await wfs.deleteFeature(datasetId, "facility", featureId!, operationOptions); + console.log("Done (no response body)");*/ + +} + +main(); diff --git a/sdk/maps/maps-creator/samples/v1/typescript/tsconfig.json b/sdk/maps/maps-creator/samples/v1/typescript/tsconfig.json new file mode 100644 index 000000000000..416c2dd82e00 --- /dev/null +++ b/sdk/maps/maps-creator/samples/v1/typescript/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2018", + "module": "commonjs", + "moduleResolution": "node", + "resolveJsonModule": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "alwaysStrict": true, + "outDir": "dist", + "rootDir": "src" + }, + "include": [ + "src/**.ts" + ] +} diff --git a/sdk/maps/maps-creator/src/creatorClient.ts b/sdk/maps/maps-creator/src/creatorClient.ts new file mode 100644 index 000000000000..8fe9a573fd76 --- /dev/null +++ b/sdk/maps/maps-creator/src/creatorClient.ts @@ -0,0 +1,62 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreAuth from "@azure/core-auth"; +import { + AliasImpl, + DataImpl, + DatasetImpl, + ConversionImpl, + FeatureStateImpl, + SpatialImpl, + TilesetImpl, + WfsImpl +} from "./operations"; +import { + Alias, + Data, + Dataset, + Conversion, + FeatureState, + Spatial, + Tileset, + Wfs +} from "./operationsInterfaces"; +import { CreatorClientContext } from "./creatorClientContext"; +import { CreatorClientOptionalParams } from "./models"; + +export class CreatorClient extends CreatorClientContext { + /** + * Initializes a new instance of the CreatorClient class. + * @param credentials Subscription credentials which uniquely identify client subscription. + * @param options The parameter options + */ + constructor( + credentials: coreAuth.TokenCredential, + options?: CreatorClientOptionalParams + ) { + super(credentials, options); + this.alias = new AliasImpl(this); + this.data = new DataImpl(this); + this.dataset = new DatasetImpl(this); + this.conversion = new ConversionImpl(this); + this.featureState = new FeatureStateImpl(this); + this.spatial = new SpatialImpl(this); + this.tileset = new TilesetImpl(this); + this.wfs = new WfsImpl(this); + } + + alias: Alias; + data: Data; + dataset: Dataset; + conversion: Conversion; + featureState: FeatureState; + spatial: Spatial; + tileset: Tileset; + wfs: Wfs; +} diff --git a/sdk/maps/maps-creator/src/creatorClientContext.ts b/sdk/maps/maps-creator/src/creatorClientContext.ts new file mode 100644 index 000000000000..1104fd9ec7fd --- /dev/null +++ b/sdk/maps/maps-creator/src/creatorClientContext.ts @@ -0,0 +1,61 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; +import * as coreAuth from "@azure/core-auth"; +import { Geography, CreatorClientOptionalParams } from "./models"; + +export class CreatorClientContext extends coreClient.ServiceClient { + geography: Geography; + xMsClientId?: string; + + /** + * Initializes a new instance of the CreatorClientContext class. + * @param credentials Subscription credentials which uniquely identify client subscription. + * @param options The parameter options + */ + constructor( + credentials: coreAuth.TokenCredential, + options?: CreatorClientOptionalParams + ) { + if (credentials === undefined) { + throw new Error("'credentials' cannot be null"); + } + + // Initializing default values for options + if (!options) { + options = {}; + } + const defaults: CreatorClientOptionalParams = { + requestContentType: "application/json; charset=utf-8", + credential: credentials + }; + + const packageDetails = `azsdk-js-maps-creator/1.0.0-beta.1`; + const userAgentPrefix = + options.userAgentOptions && options.userAgentOptions.userAgentPrefix + ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` + : `${packageDetails}`; + + if (!options.credentialScopes) { + options.credentialScopes = ["https://atlas.microsoft.com/.default"]; + } + const optionsWithDefaults = { + ...defaults, + ...options, + userAgentOptions: { + userAgentPrefix + }, + baseUri: options.endpoint || "https://{geography}.atlas.microsoft.com" + }; + super(optionsWithDefaults); + + // Assigning values to Constant parameters + this.geography = options.geography || "us"; + } +} diff --git a/sdk/maps/maps-creator/src/index.ts b/sdk/maps/maps-creator/src/index.ts new file mode 100644 index 000000000000..049d1a85b48c --- /dev/null +++ b/sdk/maps/maps-creator/src/index.ts @@ -0,0 +1,13 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +/// +export * from "./models"; +export { CreatorClient } from "./creatorClient"; +export { CreatorClientContext } from "./creatorClientContext"; +export * from "./operationsInterfaces"; diff --git a/sdk/maps/maps-creator/src/lro/azureAsyncPolling.ts b/sdk/maps/maps-creator/src/lro/azureAsyncPolling.ts new file mode 100644 index 000000000000..0d63c54f6026 --- /dev/null +++ b/sdk/maps/maps-creator/src/lro/azureAsyncPolling.ts @@ -0,0 +1,83 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { FullOperationResponse } from "@azure/core-client"; +import { FinalStateVia, LROResult } from "./models"; +import { failureStates, LROState, successStates } from "./stateMachine"; + +function getResponseStatus(rawResponse: FullOperationResponse): string { + const { status } = + rawResponse.parsedBody ?? + (rawResponse.bodyAsText ? JSON.parse(rawResponse.bodyAsText) : {}); + return status?.toLowerCase() ?? "succeeded"; +} + +function isAzureAsyncPollingDone(rawResponse: FullOperationResponse) { + const state = getResponseStatus(rawResponse); + if (failureStates.includes(state)) { + throw new Error(`Operation status: ${state}`); + } + return successStates.includes(state); +} + +export function processAzureAsyncOperationResult( + restrieveResource: (path?: string) => Promise>, + resourceLocation?: string, + finalStateVia?: FinalStateVia +): ( + rawResponse: FullOperationResponse, + flatResponse: TResult +) => LROState { + return ( + rawResponse: FullOperationResponse, + flatResponse: TResult + ): LROState => { + if (isAzureAsyncPollingDone(rawResponse)) { + if (resourceLocation === undefined) { + return { rawResponse, flatResponse, done: true }; + } else { + return { + rawResponse, + flatResponse, + done: false, + next: async () => { + async function sendFinalRequest(): Promise< + LROResult | undefined + > { + switch (finalStateVia) { + case "original-uri": + return restrieveResource(); + case "azure-async-operation": + return Promise.resolve(undefined); + case "location": + default: + return restrieveResource(resourceLocation); + } + } + const finalResponse = await sendFinalRequest(); + return { + ...(finalResponse ?? { + rawResponse, + flatResponse + }), + done: true + }; + } + }; + } + } + return { + rawResponse, + flatResponse, + done: false + }; + }; +} diff --git a/sdk/maps/maps-creator/src/lro/bodyPolling.ts b/sdk/maps/maps-creator/src/lro/bodyPolling.ts new file mode 100644 index 000000000000..269d8e6799a1 --- /dev/null +++ b/sdk/maps/maps-creator/src/lro/bodyPolling.ts @@ -0,0 +1,45 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { FullOperationResponse } from "@azure/core-client"; +import { failureStates, LROState, successStates } from "./stateMachine"; + +function getProvisioningState(rawResponse: FullOperationResponse): string { + const { properties, provisioningState } = + rawResponse.parsedBody ?? + (rawResponse.bodyAsText ? JSON.parse(rawResponse.bodyAsText) : {}); + const state: string | undefined = + properties?.provisioningState ?? provisioningState; + return state?.toLowerCase() ?? "succeeded"; +} + +export function isBodyPollingDone(rawResponse: FullOperationResponse) { + const state = getProvisioningState(rawResponse); + if (failureStates.includes(state)) { + throw new Error(`Provisioning state: ${state}`); + } + return successStates.includes(state); +} + +/** + * Creates a polling strategy based on BodyPolling which uses the provisioning state + * from the result to determine the current operation state + */ +export function processBodyPollingOperationResult( + rawResponse: FullOperationResponse, + flatResponse: TResult +): LROState { + return { + rawResponse, + flatResponse, + done: isBodyPollingDone(rawResponse) + }; +} diff --git a/sdk/maps/maps-creator/src/lro/index.ts b/sdk/maps/maps-creator/src/lro/index.ts new file mode 100644 index 000000000000..85c2187669e7 --- /dev/null +++ b/sdk/maps/maps-creator/src/lro/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export { shouldDeserializeLRO } from "./requestUtils"; +export { LROPoller } from "./lroPoller"; diff --git a/sdk/maps/maps-creator/src/lro/locationPolling.ts b/sdk/maps/maps-creator/src/lro/locationPolling.ts new file mode 100644 index 000000000000..6fef61938419 --- /dev/null +++ b/sdk/maps/maps-creator/src/lro/locationPolling.ts @@ -0,0 +1,32 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { FullOperationResponse } from "@azure/core-client"; +import { LROState } from "./stateMachine"; + +function isLocationPollingDone(rawResponse: FullOperationResponse) { + const code = rawResponse.status; + if (![202, 200].includes(code)) { + throw new Error(`Operation failed`); + } + return code !== 202; +} + +export function processLocationPollingOperationResult( + rawResponse: FullOperationResponse, + flatResponse: TResult +): LROState { + return { + rawResponse, + flatResponse, + done: isLocationPollingDone(rawResponse) + }; +} diff --git a/sdk/maps/maps-creator/src/lro/lroPoller.ts b/sdk/maps/maps-creator/src/lro/lroPoller.ts new file mode 100644 index 000000000000..cd1cd64fe813 --- /dev/null +++ b/sdk/maps/maps-creator/src/lro/lroPoller.ts @@ -0,0 +1,66 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { Poller, PollOperationState } from "@azure/core-lro"; +import { OperationArguments, OperationSpec } from "@azure/core-client"; +import { FinalStateVia, SendOperationFn } from "./models"; +import { GenericPollOperation } from "./operation"; + +export interface LROPollerOptions { + /** + * Defines how much time the poller is going to wait before making a new request to the service. + */ + intervalInMs?: number; + /** + * A serialized poller which can be used to resume an existing paused Long-Running-Operation. + */ + resumeFrom?: string; +} + +export class LROPoller extends Poller< + PollOperationState, + TResult +> { + private intervalInMs: number; + + constructor( + { intervalInMs = 2000, resumeFrom }: LROPollerOptions, + initialOperationArguments: OperationArguments, + initialOperationSpec: OperationSpec, + sendOperation: SendOperationFn, + finalStateVia?: FinalStateVia + ) { + const state: PollOperationState = resumeFrom + ? JSON.parse(resumeFrom).state + : {}; + + const operation = new GenericPollOperation( + state, + initialOperationArguments, + initialOperationSpec, + sendOperation, + finalStateVia + ); + super(operation); + + this.intervalInMs = intervalInMs; + operation.setPollerConfig(this as any); + } + + /** + * The method used by the poller to wait before attempting to update its operation. + */ + delay(): Promise { + return new Promise((resolve) => + setTimeout(() => resolve(), this.intervalInMs) + ); + } +} diff --git a/sdk/maps/maps-creator/src/lro/models.ts b/sdk/maps/maps-creator/src/lro/models.ts new file mode 100644 index 000000000000..a4a5a5abd6c2 --- /dev/null +++ b/sdk/maps/maps-creator/src/lro/models.ts @@ -0,0 +1,52 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + FullOperationResponse, + OperationArguments, + OperationSpec +} from "@azure/core-client"; +import { PollOperationState } from "@azure/core-lro"; + +export type FinalStateVia = + | "azure-async-operation" + | "location" + | "original-uri"; + +export interface LROResult { + flatResponse: T; + rawResponse: FullOperationResponse; +} + +export type LROMode = "AzureAsync" | "Location" | "Body"; + +export interface LROConfig { + mode?: LROMode; + resourceLocation?: string; +} + +export type SendOperationFn = ( + args: OperationArguments, + spec: OperationSpec +) => Promise>; + +/** + * Type of a polling operation state that can actually be resumed. + */ +export type ResumablePollOperationState = PollOperationState & { + initialRawResponse?: FullOperationResponse; + config?: LROConfig; + pollingURL?: string; +}; + +export interface PollerConfig { + intervalInMs: number; +} diff --git a/sdk/maps/maps-creator/src/lro/operation.ts b/sdk/maps/maps-creator/src/lro/operation.ts new file mode 100644 index 000000000000..801d03e7203a --- /dev/null +++ b/sdk/maps/maps-creator/src/lro/operation.ts @@ -0,0 +1,132 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { AbortSignalLike } from "@azure/abort-controller"; +import { OperationArguments, OperationSpec } from "@azure/core-client"; +import { PollOperation, PollOperationState } from "@azure/core-lro"; +import { + FinalStateVia, + PollerConfig, + ResumablePollOperationState, + SendOperationFn +} from "./models"; +import { getPollingURL } from "./requestUtils"; +import { createGetLROState, initializeState, LROState } from "./stateMachine"; + +export class GenericPollOperation + implements PollOperation, TResult> { + private getLROState?: ( + pollingURL: string, + pollerConfig: PollerConfig + ) => Promise>; + private pollerConfig?: PollerConfig; + constructor( + public state: PollOperationState, + private initialOperationArguments: OperationArguments, + private initialOperationSpec: OperationSpec, + private sendOperation: SendOperationFn, + private finalStateVia?: FinalStateVia + ) {} + + public setPollerConfig(pollerConfig: PollerConfig) { + this.pollerConfig = pollerConfig; + } + + /** + * General update function for LROPoller, the general process is as follows + * 1. Check initial operation result to determine the strategy to use + * - Strategies: Location, Azure-AsyncOperation, Original Uri + * 2. Check if the operation result has a terminal state + * - Terminal state will be determined by each strategy + * 2.1 If it is terminal state Check if a final GET request is required, if so + * send final GET request and return result from operation. If no final GET + * is required, just return the result from operation. + * - Determining what to call for final request is responsibility of each strategy + * 2.2 If it is not terminal state, call the polling operation and go to step 1 + * - Determining what to call for polling is responsibility of each strategy + * - Strategies will always use the latest URI for polling if provided otherwise + * the last known one + */ + async update(options?: { + abortSignal?: AbortSignalLike | undefined; + fireProgress?: ((state: PollOperationState) => void) | undefined; + }): Promise, TResult>> { + const state = this.state as ResumablePollOperationState; + const { onResponse, ...restOptions } = + this.initialOperationArguments.options || {}; + if (!state.isStarted) { + await this.sendOperation( + { + ...this.initialOperationArguments, + options: { + ...restOptions, + onResponse: initializeState( + state, + this.initialOperationSpec, + onResponse + ) + } + }, + this.initialOperationSpec + ); + } + + if (!state.isCompleted) { + if (this.getLROState === undefined) { + if (state.config === undefined) { + throw new Error("Bad state: LRO mode is undefined"); + } + this.getLROState = createGetLROState( + this.sendOperation, + this.initialOperationArguments, + this.initialOperationSpec, + state.config, + this.finalStateVia + ); + } + if (state.pollingURL === undefined) { + throw new Error("Bad state: polling URL is undefined"); + } + const currentState = await this.getLROState( + state.pollingURL, + this.pollerConfig! + ); + if (currentState.done) { + state.result = currentState.flatResponse; + state.isCompleted = true; + } else { + this.getLROState = currentState.next ?? this.getLROState; + state.pollingURL = getPollingURL( + currentState.rawResponse, + state.pollingURL + ); + } + } + if (options?.fireProgress !== undefined) { + options.fireProgress(state); + } + return this; + } + + async cancel(): Promise, TResult>> { + this.state.isCancelled = true; + return this; + } + + /** + * Serializes the Poller operation. + */ + public toString(): string { + return JSON.stringify({ + state: this.state + }); + } +} diff --git a/sdk/maps/maps-creator/src/lro/passthrough.ts b/sdk/maps/maps-creator/src/lro/passthrough.ts new file mode 100644 index 000000000000..64c10380c1b2 --- /dev/null +++ b/sdk/maps/maps-creator/src/lro/passthrough.ts @@ -0,0 +1,24 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { FullOperationResponse } from "@azure/core-client"; +import { LROState } from "./stateMachine"; + +export function processPassthroughOperationResult( + rawResponse: FullOperationResponse, + flatResponse: TResult +): LROState { + return { + rawResponse, + flatResponse, + done: true + }; +} diff --git a/sdk/maps/maps-creator/src/lro/pollingMethod.ts b/sdk/maps/maps-creator/src/lro/pollingMethod.ts new file mode 100644 index 000000000000..cb6482bbdea9 --- /dev/null +++ b/sdk/maps/maps-creator/src/lro/pollingMethod.ts @@ -0,0 +1,91 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + OperationArguments, + OperationSpec, + OperationResponseMap +} from "@azure/core-client"; +import { LROMode, LROResult, SendOperationFn } from "./models"; + +export function createPollingMethod( + sendOperationFn: SendOperationFn, + args: OperationArguments, + spec: OperationSpec, + mode?: LROMode +): (path?: string) => Promise> { + /** + * Polling calls will always return a status object i.e. {"status": "success"} + * these intermediate responses are not described in the swagger so we need to + * pass custom mappers at runtime. + * This function replaces all the existing mappers to be able to deserialize a status object + * @param responses Original set of responses defined in the operation + */ + function getCompositeMappers(responses: { + [responseCode: string]: OperationResponseMap; + }): { + [responseCode: string]: OperationResponseMap; + } { + return Object.keys(responses).reduce((acc, statusCode) => { + return { + ...acc, + [statusCode]: { + ...responses[statusCode], + bodyMapper: { + type: { + name: "Composite", + modelProperties: { + status: { + serializedName: "status", + type: { + name: "String" + } + } + } + } + } + } + }; + }, {} as { [responseCode: string]: OperationResponseMap }); + } + // Make sure we don't send any body to the get request + const { requestBody, responses, ...restSpec } = spec; + if (mode === "AzureAsync") { + return async (path?: string) => { + return sendOperationFn(args, { + ...restSpec, + responses: getCompositeMappers(responses), + httpMethod: "GET", + ...(path && { path }) + }); + }; + } + return async (path?: string) => { + return sendOperationFn(args, { + ...restSpec, + responses: responses, + httpMethod: "GET", + ...(path && { path }) + }); + }; +} + +export function createRetrieveAzureAsyncResource( + sendOperationFn: SendOperationFn, + args: OperationArguments, + spec: OperationSpec +): (path?: string) => Promise> { + const updatedArgs = { ...args }; + if (updatedArgs.options) { + (updatedArgs.options as any).shouldDeserialize = true; + } + return createPollingMethod(sendOperationFn, updatedArgs, spec); +} diff --git a/sdk/maps/maps-creator/src/lro/requestUtils.ts b/sdk/maps/maps-creator/src/lro/requestUtils.ts new file mode 100644 index 000000000000..9162f6633905 --- /dev/null +++ b/sdk/maps/maps-creator/src/lro/requestUtils.ts @@ -0,0 +1,194 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { FullOperationResponse, OperationSpec } from "@azure/core-client"; +import { LROConfig } from "./models"; +import { terminalStates } from "./stateMachine"; + +/** + * We need to selectively deserialize our responses, only deserializing if we + * are in a final LRO response, not deserializing any polling non-terminal responses + */ +export function shouldDeserializeLRO(finalStateVia?: string) { + let initialOperationInfo: LROResponseInfo | undefined; + let isInitialRequest = true; + + return (response: FullOperationResponse) => { + if (response.status < 200 || response.status >= 300) { + return true; + } + + if (!initialOperationInfo) { + initialOperationInfo = getLROData(response); + } else { + isInitialRequest = false; + } + + if ( + initialOperationInfo.azureAsyncOperation || + initialOperationInfo.operationLocation + ) { + return ( + !isInitialRequest && + isAsyncOperationFinalResponse( + response, + initialOperationInfo, + finalStateVia + ) + ); + } + + if (initialOperationInfo.location) { + return isLocationFinalResponse(response); + } + + if (initialOperationInfo.requestMethod === "PUT") { + return isBodyPollingFinalResponse(response); + } + + return true; + }; +} + +function isAsyncOperationFinalResponse( + response: FullOperationResponse, + initialOperationInfo: LROResponseInfo, + finalStateVia?: string +): boolean { + const status: string = response.parsedBody?.status || "Succeeded"; + if (!terminalStates.includes(status.toLowerCase())) { + return false; + } + + if (initialOperationInfo.requestMethod === "DELETE") { + return true; + } + + if ( + initialOperationInfo.requestMethod === "PUT" && + finalStateVia && + finalStateVia.toLowerCase() === "azure-asyncoperation" + ) { + return true; + } + + if ( + initialOperationInfo.requestMethod !== "PUT" && + !initialOperationInfo.location + ) { + return true; + } + + return false; +} + +function isLocationFinalResponse(response: FullOperationResponse): boolean { + return response.status !== 202; +} + +function isBodyPollingFinalResponse(response: FullOperationResponse): boolean { + const provisioningState: string = + response.parsedBody?.properties?.provisioningState || "Succeeded"; + + if (terminalStates.includes(provisioningState.toLowerCase())) { + return true; + } + + return false; +} + +interface LROResponseInfo { + requestMethod: string; + azureAsyncOperation?: string; + operationLocation?: string; + location?: string; +} + +function getLROData(result: FullOperationResponse): LROResponseInfo { + return { + azureAsyncOperation: result.headers.get("azure-asyncoperation"), + operationLocation: result.headers.get("operation-location"), + location: result.headers.get("location"), + requestMethod: result.request.method + }; +} + +/** + * Detects where the continuation token is and returns it. Notice that azure-asyncoperation + * must be checked first before the other location headers because there are scenarios + * where both azure-asyncoperation and location could be present in the same response but + * azure-asyncoperation should be the one to use for polling. + */ +export function getPollingURL( + rawResponse: FullOperationResponse, + defaultPath: string +): string { + return ( + getAzureAsyncoperation(rawResponse) ?? + getLocation(rawResponse) ?? + getOperationLocation(rawResponse) ?? + defaultPath + ); +} + +function getLocation(rawResponse: FullOperationResponse): string | undefined { + return rawResponse.headers?.get("location"); +} + +function getOperationLocation( + rawResponse: FullOperationResponse +): string | undefined { + return rawResponse.headers?.get("operation-location"); +} + +function getAzureAsyncoperation( + rawResponse: FullOperationResponse +): string | undefined { + return rawResponse.headers?.get("azure-asyncoperation"); +} + +export function inferLROMode( + spec: OperationSpec, + rawResponse: FullOperationResponse +): LROConfig { + const requestMethod = spec.httpMethod; + if (getAzureAsyncoperation(rawResponse) !== undefined) { + return { + mode: "AzureAsync", + resourceLocation: + requestMethod === "PUT" + ? spec.path + : requestMethod === "POST" + ? getLocation(rawResponse) + : undefined + }; + } else if ( + getLocation(rawResponse) !== undefined || + getOperationLocation(rawResponse) !== undefined + ) { + return { + mode: "Location" + }; + } else if (["PUT", "PATCH"].includes(requestMethod)) { + return { + mode: "Body" + }; + } + return {}; +} + +export function getSpecPath(spec: OperationSpec): string { + if (spec.path) { + return spec.path; + } else { + throw Error("Bad spec: request path is not found!"); + } +} diff --git a/sdk/maps/maps-creator/src/lro/stateMachine.ts b/sdk/maps/maps-creator/src/lro/stateMachine.ts new file mode 100644 index 000000000000..b2a69b554601 --- /dev/null +++ b/sdk/maps/maps-creator/src/lro/stateMachine.ts @@ -0,0 +1,216 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + FullOperationResponse, + OperationArguments, + OperationSpec, + RawResponseCallback +} from "@azure/core-client"; +import { processAzureAsyncOperationResult } from "./azureAsyncPolling"; +import { + isBodyPollingDone, + processBodyPollingOperationResult +} from "./bodyPolling"; +import { processLocationPollingOperationResult } from "./locationPolling"; +import { + FinalStateVia, + LROConfig, + LROResult, + PollerConfig, + ResumablePollOperationState, + SendOperationFn +} from "./models"; +import { processPassthroughOperationResult } from "./passthrough"; +import { + createPollingMethod, + createRetrieveAzureAsyncResource +} from "./pollingMethod"; +import { getPollingURL, getSpecPath, inferLROMode } from "./requestUtils"; + +export const successStates = ["succeeded"]; +export const failureStates = ["failed", "canceled", "cancelled"]; +export const terminalStates = successStates.concat(failureStates); + +/** + * The type of a terminal state of an LRO. + */ +interface LROTerminalState extends LROResult { + /** + * Whether the operation has finished. + */ + done: true; +} + +/** + * The type of an in-progress state of an LRO. + */ +interface LROInProgressState extends LROResult { + /** + * Whether the operation has finished. + */ + done: false; + /** + * The request to be sent next if it is different from the standard polling one. + * Notice that it will disregard any polling URLs provided to it. + */ + next?: () => Promise>; +} + +/** + * The type of an LRO state which is a tagged union of terminal and in-progress states. + */ +export type LROState = LROTerminalState | LROInProgressState; + +/** + * creates a stepping function that maps an LRO state to another. + */ +function createTransition( + sendOperationFn: SendOperationFn, + args: OperationArguments, + spec: OperationSpec, + config: LROConfig, + finalStateVia?: FinalStateVia +): ( + rawResponse: FullOperationResponse, + flatResponse: TResult +) => LROState { + switch (config.mode) { + case "AzureAsync": { + return processAzureAsyncOperationResult( + createRetrieveAzureAsyncResource(sendOperationFn, args, spec), + config.resourceLocation, + finalStateVia + ); + } + case "Location": { + return processLocationPollingOperationResult; + } + case "Body": { + return processBodyPollingOperationResult; + } + default: { + return processPassthroughOperationResult; + } + } +} + +/** + * Creates a polling operation that returns a LRO state. + */ +export function createGetLROState( + sendOperationFn: SendOperationFn, + args: OperationArguments, + spec: OperationSpec, + config: LROConfig, + finalStateVia?: FinalStateVia +): ( + pollingURL: string, + pollerConfig: PollerConfig +) => Promise> { + const step = createTransition( + sendOperationFn, + args, + spec, + config, + finalStateVia + ); + const customerCallback = args?.options?.onResponse; + let response: LROState | undefined = undefined; + let retryAfter: string | undefined = undefined; + const poll = createPollingMethod( + sendOperationFn, + { + ...args, + options: { + ...args.options, + onResponse: ( + rawResponse: FullOperationResponse, + flatResponse: unknown + ): void => { + response = step(rawResponse, flatResponse as TResult); + retryAfter = rawResponse.headers.get("Retry-After"); + if (response.done) { + customerCallback?.(rawResponse, flatResponse); + } + } + } + }, + spec, + config.mode + ); + return async ( + path: string, + pollerConfig: PollerConfig + ): Promise> => { + await poll(path); + if (retryAfter !== undefined) { + const retryAfterInMs = parseInt(retryAfter); + pollerConfig.intervalInMs = isNaN(retryAfterInMs) + ? calculatePollingIntervalFromDate( + new Date(retryAfter), + pollerConfig.intervalInMs + ) + : retryAfterInMs; + } + return response!; + }; +} + +function calculatePollingIntervalFromDate( + retryAfterDate: Date, + defaultIntervalInMs: number +): number { + const timeNow = Math.floor(new Date().getTime()); + const retryAfterTime = retryAfterDate.getTime(); + if (timeNow < retryAfterTime) { + return retryAfterTime - timeNow; + } + return defaultIntervalInMs; +} + +/** + * Creates a callback to be used to initialize the polling operation state. + * @param state of the polling operation + * @param operationSpec of the LRO + * @param callback callback to be called when the operation is done + * @returns callback that initializes the state of the polling operation + */ +export function initializeState( + state: ResumablePollOperationState, + operationSpec: OperationSpec, + callback?: RawResponseCallback +): (rawResponse: FullOperationResponse, flatResponse: unknown) => void { + return (rawResponse: FullOperationResponse, flatResponse: unknown) => { + state.initialRawResponse = rawResponse; + state.isStarted = true; + state.pollingURL = getPollingURL( + state.initialRawResponse, + getSpecPath(operationSpec) + ); + state.config = inferLROMode(operationSpec, state.initialRawResponse); + /** short circuit polling if body polling is done in the initial request */ + if ( + state.config.mode === undefined || + (state.config.mode === "Body" && + isBodyPollingDone(state.initialRawResponse)) + ) { + state.result = flatResponse as TResult; + state.isCompleted = true; + /** + * We need to check if the LRO operation is finished inside the + * call back so that we can call the customer-provided callback + * on that result. + */ + callback?.(rawResponse, flatResponse); + } + }; +} diff --git a/sdk/maps/maps-creator/src/models/index.ts b/sdk/maps/maps-creator/src/models/index.ts new file mode 100644 index 000000000000..f6cc2baded75 --- /dev/null +++ b/sdk/maps/maps-creator/src/models/index.ts @@ -0,0 +1,1742 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; + +export type StyleObjectUnion = + | StyleObject + | BooleanTypeStyleRule + | NumberTypeStyleRule + | StringTypeStyleRule; +export type GeoJsonObjectUnion = + | GeoJsonObject + | GeoJsonGeometryUnion + | GeoJsonFeature + | GeoJsonFeatureCollectionUnion; +export type GeoJsonGeometryUnion = + | GeoJsonGeometry + | GeoJsonPoint + | GeoJsonMultiPoint + | GeoJsonLineString + | GeoJsonMultiLineString + | GeoJsonPolygon + | GeoJsonMultiPolygon + | GeoJsonGeometryCollection; +export type GeoJsonFeatureCollectionUnion = + | GeoJsonFeatureCollection + | ExtendedGeoJsonFeatureCollection; + +/** The response model for the Alias Create API for the case when the alias was successfully created. */ +export interface AliasesCreateResponse { + /** + * The created timestamp for the alias. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly createdTimestamp?: string; + /** + * The id for the alias. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly aliasId?: string; + /** + * The id for the creator data item that this alias references (could be null if the alias has not been assigned). + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly creatorDataItemId?: string; + /** + * The timestamp of the last time the alias was assigned. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly lastUpdatedTimestamp?: string; +} + +/** Common error response for all Azure Resource Manager APIs to return error details for failed operations. (This also follows the OData error response format.). */ +export interface ErrorResponse { + /** The error object. */ + error?: ErrorDetail; +} + +/** The error detail. */ +export interface ErrorDetail { + /** + * The error code. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly code?: string; + /** + * The error message. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly message?: string; + /** + * The error target. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly target?: string; + /** + * The error details. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly details?: ErrorDetail[]; + /** + * The error additional info. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly additionalInfo?: ErrorAdditionalInfo[]; +} + +/** The resource management error additional info. */ +export interface ErrorAdditionalInfo { + /** + * The additional info type. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly type?: string; + /** + * The additional info. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly info?: Record; +} + +/** The response model for the List API. Returns a list of all the previously created aliases. */ +export interface AliasListResponse { + /** + * A list of all the previously created aliases. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly aliases?: AliasListItem[]; + /** + * If present, the location of the next page of data. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly nextLink?: string; +} + +/** Detailed information for the alias. */ +export interface AliasListItem { + /** + * The created timestamp for the alias. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly createdTimestamp?: string; + /** + * The id for the alias. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly aliasId?: string; + /** + * The id for the creator data item that this alias references (could be null if the alias has not been assigned). + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly creatorDataItemId?: string | null; + /** + * The timestamp of the last time the alias was assigned. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly lastUpdatedTimestamp?: string; +} + +/** The response model for a Long-Running Operations API. */ +export interface LongRunningOperationResult { + /** The Id for this long-running operation. */ + operationId?: string; + /** + * The status state of the request. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly status?: LroStatus; + /** + * The created timestamp. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly created?: string; + /** The error detail. */ + error?: ErrorDetail; + /** The error detail. */ + warning?: ErrorDetail; +} + +/** The response model for the Data List API. Returns a list of all the previously uploaded data. */ +export interface MapDataListResponse { + /** + * A list of all the previously uploaded data. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly mapDataList?: MapDataDetailInfo[]; +} + +/** Detail information for the data. */ +export interface MapDataDetailInfo { + /** + * The unique data id for the data. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly udid?: string; + /** + * The location of the data. Execute a HTTP `GET` on this location to download the data. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly location?: string; + /** + * The size of the content in bytes. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly sizeInBytes?: number; + /** + * The current upload status of the content. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly uploadStatus?: string; + /** + * The current data format. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly dataFormat?: string; + /** + * The current description. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly description?: string; +} + +/** The response model for the Dataset List API. The response body will contain a list of all the previously created datasets. */ +export interface DatasetListResponse { + /** + * A list of all the previously created datasets. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly datasets?: DatasetDetailInfo[]; + /** + * If present, the location of the next page of data. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly nextLink?: string; +} + +/** Detail information for the dataset. */ +export interface DatasetDetailInfo { + /** + * The created timestamp for the dataset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly created?: string; + /** + * The id for the dataset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly datasetId?: string; + /** + * The ontology version of this dataset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly ontology?: string; + /** + * The description for the dataset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly description?: string; + /** Information about the details of the create request for the dataset. */ + datasetSources?: DatasetSources; + /** + * The feature counts for the dataset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly featureCounts?: Record; +} + +/** Information about the details of the create request for the dataset. */ +export interface DatasetSources { + /** + * The list of `conversionId` that were used to create the dataset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly conversionIds?: string[]; + /** + * The dataset that was appended to to create the current dataset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly appendDatasetId?: string; +} + +/** The response model for the Conversion List API. */ +export interface ConversionListResponse { + /** + * A list of all the previously submitted conversion requests. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly conversions?: ConversionListDetailInfo[]; + /** + * If present, the location of the next page of data. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly nextLink?: string; +} + +/** Detail information for the conversion requests. */ +export interface ConversionListDetailInfo { + /** + * A unique id that represents the artifact of a _successfully_ completed conversion process. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly conversionId?: string; + /** + * The ontology version of this dataset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly ontology?: string; + /** + * The unique id of the content provided to create this conversion. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly udid?: string; + /** + * The date and time of this conversion. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly created?: string; + /** + * User provided description of the content being converted. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly description?: string; + /** + * A summary of feature counts in this conversion. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly featureCounts?: Record; +} + +/** The styles model. */ +export interface StylesObject { + /** An array of stateset styles. The style rule could be a numeric or string or a boolean type style rule. Refer to NumberRuleObject, StringRuleObject and BooleanRuleObject definitions [here](https://aka.ms/AzureMapsStatesetStylesObject). */ + styles?: StyleObjectUnion[]; +} + +/** The stateset style model. The style rule could be a numeric type style rule or a boolean type style rule. Refer to NumberRuleObject, StringRuleObject and BooleanRuleObject definitions [here](https://aka.ms/AzureMapsStatesetStylesObject). */ +export interface StyleObject { + /** Polymorphic discriminator, which specifies the different types this object can be */ + type: "boolean" | "number" | "string"; + /** Stateset style key name. Key names are random strings but they should be unique inside style array. */ + keyName: string; +} + +/** The response model for the successful Stateset Create API. */ +export interface StatesetCreatedResponse { + /** + * The ID for the new stateset created. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly statesetId?: string; +} + +/** The response model for the successful Stateset List API. */ +export interface StatesetListResponse { + /** A list of statesets information. */ + statesets?: StatesetInfoObject[]; + /** + * If present, the location of the next page of data. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly nextLink?: string; +} + +/** The stateset information detail. */ +export interface StatesetInfoObject { + /** The stateset ID of this stateset. */ + statesetId?: string; + /** + * Description associated with the stateset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly description?: string; + /** Dataset ID associated with the stateset. */ + datasetIds?: string[]; + /** The styles model. */ + statesetStyle?: StylesObject; +} + +/** The response model for the successful Stateset Get API. */ +export interface StatesetGetResponse { + /** + * Description associated with the stateset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly description?: string; + /** Dataset ID associated with the stateset. */ + datasetIds?: string[]; + /** The styles model. */ + statesetStyle?: StylesObject; +} + +/** The feature states model for a feature. */ +export interface FeatureStatesStructure { + /** The feature states array. */ + states?: FeatureStateObject[]; +} + +/** Single feature state model. */ +export interface FeatureStateObject { + /** Feature state Keyname. Maximum length allowed is 1000. */ + keyName?: string; + /** Value for the feature state. Type should comply with the style definition attached to the featurestate. Maximum length allowed for string type is 1024. */ + value?: string; + /** Valid Timestamp when the feature state was captured. */ + eventTimestamp?: string; +} + +/** This object is returned from a geofence proximity call. */ +export interface GeofenceResponse { + /** + * Lists the fence geometries that contain the coordinate position or overlap the searchBuffer around the position. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly geometries?: GeofenceGeometry[]; + /** + * Lists of the geometry ID of the geofence which is expired relative to the user time in the request. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly expiredGeofenceGeometryId?: string[]; + /** + * Lists of the geometry ID of the geofence which is in invalid period relative to the user time in the request. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly invalidPeriodGeofenceGeometryId?: string[]; + /** + * True if at least one event is published to the Azure Maps event subscriber, false if no event is published to the Azure Maps event subscriber. This will only be presented in response when 'isAsync' query parameter is set to true. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly isEventPublished?: boolean; +} + +/** The geofencing geometry. */ +export interface GeofenceGeometry { + /** + * ID of the device. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly deviceId?: string; + /** + * The unique id returned from [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) after uploading a valid GeoJSON FeatureCollection object. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. All the feature's properties should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly udId?: string; + /** + * The unique id identifies a geometry. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly geometryId?: string; + /** + * Distance from the coordinate to the closest border of the geofence. Positive means the coordinate is outside of the geofence. If the coordinate is outside of the geofence, but more than the value of searchBuffer away from the closest geofence border, then the value is 999. Negative means the coordinate is inside of the geofence. If the coordinate is inside the polygon, but more than the value of searchBuffer away from the closest geofencing border, then the value is -999. A value of 999 means that there is great confidence the coordinate is well outside the geofence. A value of -999 means that there is great confidence the coordinate is well within the geofence. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly distance?: number; + /** + * Latitude of the nearest point of the geometry. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly nearestLat?: number; + /** + * Longitude of the nearest point of the geometry. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly nearestLon?: number; + /** + * Sea level in meter of the nearest point on the 2D extrusion geometry. This will only be presented in response when value is provided for 'zInMeter' in the request. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly nearestZ?: number; +} + +/** An object with a FeatureCollection and a list of distances. All the feature's properties should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. */ +export interface BufferRequestBody { + /** A valid `GeoJSON FeatureCollection` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. */ + geometries?: Record; + /** List of the distances to compute the buffer for, one-to-one per Feature in the collection, or one for all Features in the collection. */ + distances?: number[]; +} + +/** This object is returned from a successful Spatial Buffer call. */ +export interface BufferResponse { + /** + * Summary of the call. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly summary?: BufferResponseSummary; + /** The FeatureCollection of buffers for the input. */ + result?: GeoJsonFeatureCollectionUnion; +} + +/** Summary of the call. */ +export interface BufferResponseSummary { + /** + * The udid for the user data if one exists + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly udid?: string; + /** + * The information about what happened during the call. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly information?: string; +} + +/** A valid `GeoJSON` object. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3) for details. */ +export interface GeoJsonObject { + /** Polymorphic discriminator, which specifies the different types this object can be */ + type: + | "GeoJsonGeometry" + | "Feature" + | "FeatureCollection" + | "FeatureCollection" + | "Point" + | "MultiPoint" + | "LineString" + | "MultiLineString" + | "Polygon" + | "MultiPolygon" + | "GeometryCollection"; +} + +export interface GeoJsonFeatureCollectionData { + /** Contains a list of valid `GeoJSON Feature` objects. */ + features: GeoJsonFeature[]; +} + +export interface GeoJsonFeatureData { + /** A valid `GeoJSON` geometry object. The type must be one of the seven valid GeoJSON geometry types - Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon and GeometryCollection. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1) for details. */ + geometry: GeoJsonGeometryUnion; + /** Properties can contain any additional metadata about the `Feature`. Value can be any JSON object or a JSON null value */ + properties?: Record; + /** Identifier for the feature. */ + id?: string; + /** The type of the feature. The value depends on the data model the current feature is part of. Some data models may have an empty value. */ + featureType?: string; +} + +/** This object is returned from a successful Spatial Closest Point call */ +export interface ClosestPointResponse { + /** + * Closest Point Summary object + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly summary?: ClosestPointSummary; + /** Closest Point Result Array */ + result?: ClosestPointResultEntry[]; +} + +/** Closest Point Summary object */ +export interface ClosestPointSummary { + /** A location represented as a latitude and longitude */ + sourcePoint?: SpatialCoordinate; + /** + * A unique data id (udid) for the uploaded content + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly udid?: string; + /** + * Processing information + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly information?: string; +} + +/** A location represented as a latitude and longitude */ +export interface SpatialCoordinate { + /** + * Latitude property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly lat?: number; + /** + * Longitude property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly lon?: number; +} + +/** Closest Point Result Entry Object */ +export interface ClosestPointResultEntry { + /** + * The distance in meters from the source point to the closest point + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly distanceInMeters?: number; + /** A location represented as a latitude and longitude */ + position?: SpatialCoordinate; + /** + * The unique id identifies a geometry + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly geometryId?: string; +} + +/** Returns true if point is within the polygon, false otherwise */ +export interface PointInPolygonResponse { + /** + * Point In Polygon Summary object + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly summary?: PointInPolygonSummary; + /** Point In Polygon Result Object */ + result?: PointInPolygonResult; +} + +/** Point In Polygon Summary object */ +export interface PointInPolygonSummary { + /** A location represented as a latitude and longitude */ + sourcePoint?: SpatialCoordinate; + /** + * A unique data id (udid) for the uploaded content. Udid is not applicable for POST spatial operations(set to null) + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly udid?: string; + /** + * Processing information + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly information?: string; +} + +/** Point In Polygon Result Object */ +export interface PointInPolygonResult { + /** + * Point In Polygons Property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly pointInPolygons?: boolean; + /** + * Geometries array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly intersectingGeometries?: string[]; +} + +/** This object is returned from a successful Great Circle Distance call */ +export interface GreatCircleDistanceResponse { + /** + * Summary object + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly summary?: GreatCircleDistanceResponseSummary; + /** + * Result Object + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly result?: GreatCircleDistanceResponseResult; +} + +/** Summary object */ +export interface GreatCircleDistanceResponseSummary { + /** A location represented as a latitude and longitude */ + sourcePoint?: SpatialCoordinate; + /** A location represented as a latitude and longitude */ + targetPoint?: SpatialCoordinate; +} + +/** Result Object */ +export interface GreatCircleDistanceResponseResult { + /** + * The great circle distance in meters from the source point to the target point + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly distanceInMeters?: number; +} + +/** The response model for the Tileset List API. Returns a list of all tilesets. */ +export interface TilesetListResponse { + /** + * A list of all tilesets. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly tilesets?: TilesetDetailInfo[]; + /** + * If present, the location of the next page of data. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly nextLink?: string; +} + +/** Detail information for the data. */ +export interface TilesetDetailInfo { + /** + * The unique tileset id for the tileset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly tilesetId?: string; + /** + * The ontology version of this dataset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly ontology?: string; + /** + * The unique dataset Id used to create the tileset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly datasetId?: string; + /** + * The description the caller provided when creating the tileset. Maximum length 1024 characters. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly description?: string; + /** + * The lowest tile zoom level tile generated for the tileset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly minZoom?: number; + /** + * The highest tile zoom level tile generated for the tileset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly maxZoom?: number; + /** + * Bounding box which all features of the tileset lay within. Projection used - EPSG:3857. Format : 'minLon, minLat, maxLon, maxLat'. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly bbox?: number[]; +} + +export interface LandingPageResponse { + /** + * The ontology version of this dataset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly ontology?: string; + /** Links to other WFS endpoints. */ + links: WfsEndpointLink[]; +} + +/** Links to other WFS endpoints */ +export interface WfsEndpointLink { + /** The link target. */ + href: string; + /** The relation type. */ + rel?: string; + /** A hint indicating what the media type of the result of dereferencing the link should be. */ + type?: string; + /** A hint indicating what the language of the result of dereferencing the link should be. */ + hreflang?: string; + /** Used to label the destination of a link such that it can be used as a human-readable identifier (e.g., a menu entry) in the language indicated by the Content-Language header field (if present). */ + title?: string; +} + +export interface ConformanceResponse { + /** List of requirements classes that the server conforms to. */ + conformsTo: string[]; +} + +export interface CollectionsResponse { + /** + * The ontology version of this dataset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly ontology?: string; + /** Links to other WFS endpoints. */ + links: WfsEndpointLink[]; + /** All the collections in a given dataset. */ + collections: CollectionInfo[]; +} + +export interface CollectionInfo { + /** identifier of the collection used, for example, in URIs */ + name: string; + /** human readable title of the collection */ + title?: string; + /** + * The ontology version of this dataset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly ontology?: string; + /** a description of the features in the collection */ + description?: string; + /** Links to other WFS endpoints. */ + links: WfsEndpointLink[]; +} + +/** collection of GeoJSON features */ +export interface CollectionDefinitionResponse { + /** describes the collection */ + description?: string; + /** prefix of the collection used */ + idPrefix: string; + /** identifier of the collection used, for example, in URIs */ + name: string; + /** title of collection */ + title?: string; + /** + * The ontology version of this dataset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly ontology?: string; + /** type of geometry returned */ + geometryType: GeoJsonGeometryType; + /** type of features returned */ + featureTypes: string[]; + /** attributes of the collection used */ + properties?: DefinitionProperties[]; + /** Links to other WFS endpoints. */ + links?: WfsEndpointLink[]; +} + +export interface DefinitionProperties { + /** name of attribute */ + name: string; + /** is attribute required */ + required: boolean; + /** type of attribute */ + type: Record; +} + +export interface ExtendedGeoJsonFeatureCollectionData { + /** + * The ontology version of this dataset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly ontology?: string; + /** Number of returned features. */ + numberReturned?: number; + /** Links to other WFS endpoints. */ + links?: WfsEndpointLink[]; +} + +export interface FeatureResponse { + /** + * The ontology version of this dataset. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly ontology?: string; + /** A valid `GeoJSON Feature` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.2) for details. */ + feature: GeoJsonFeature; + /** Links to other WFS endpoints. */ + links?: WfsEndpointLink[]; +} + +/** The numeric rule. The color is selected from the first range it falls into. */ +export interface NumberRuleObject { + /** The numeric value range for this style rule. If the value is in the range, all the conditions must hold true. */ + range?: RangeObject; + /** The color when value is within the range. Color is a JSON string in a variety of permitted formats, HTML-style hex values, RGB ("#ff0", "#ffff00", "rgb(255, 255, 0)"), RGBA ("rgba(255, 255, 0, 1)"), HSL("hsl(100, 50%, 50%)"), and HSLA("hsla(100, 50%, 50%, 1)"). Predefined HTML colors names, like yellow and blue, are also permitted. */ + color?: string; +} + +/** The numeric value range for this style rule. If the value is in the range, all the conditions must hold true. */ +export interface RangeObject { + /** All the number x that x ≥ minimum. */ + minimum?: number; + /** All the number x that x ≤ maximum. */ + maximum?: number; + /** All the number x that x > exclusiveMinimum. */ + exclusiveMinimum?: number; + /** All the number x that x < exclusiveMaximum. */ + exclusiveMaximum?: number; +} + +/** The boolean rule. The color is selected based on the logic value of the key. */ +export interface BooleanRuleObject { + /** The color when value is true. Color is a JSON string in a variety of permitted formats, HTML-style hex values, RGB ("#ff0", "#ffff00", "rgb(255, 255, 0)"), RGBA ("rgba(255, 255, 0, 1)"), HSL("hsl(100, 50%, 50%)"), and HSLA("hsla(100, 50%, 50%, 1)"). Predefined HTML colors names, like yellow and blue, are also permitted. */ + true?: string; + /** The color when value is false. Color is a JSON string in a variety of permitted formats, HTML-style hex values, RGB ("#ff0", "#ffff00", "rgb(255, 255, 0)"), RGBA ("rgba(255, 255, 0, 1)"), HSL("hsl(100, 50%, 50%)"), and HSLA("hsla(100, 50%, 50%, 1)"). Predefined HTML colors names, like yellow and blue, are also permitted. */ + false?: string; +} + +/** Data contained by a `GeoJson Point`. */ +export interface GeoJsonPointData { + /** A `Position` is an array of numbers with two or more elements. The first two elements are _longitude_ and _latitude_, precisely in that order. _Altitude/Elevation_ is an optional third element. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.1) for details. */ + coordinates: number[]; +} + +/** Data contained by a `GeoJson MultiPoint`. */ +export interface GeoJsonMultiPointData { + /** Coordinates for the `GeoJson MultiPoint` geometry. */ + coordinates: number[][]; +} + +export interface GeoJsonLineStringData { + /** Coordinates for the `GeoJson LineString` geometry. */ + coordinates: number[][]; +} + +export interface GeoJsonMultiLineStringData { + /** Coordinates for the `GeoJson MultiLineString` geometry. */ + coordinates: number[][][]; +} + +export interface GeoJsonPolygonData { + /** Coordinates for the `GeoJson Polygon` geometry type. */ + coordinates: number[][][]; +} + +export interface GeoJsonMultiPolygonData { + /** Contains a list of valid `GeoJSON Polygon` objects. **Note** that coordinates in GeoJSON are in x, y order (longitude, latitude). */ + coordinates: number[][][][]; +} + +export interface GeoJsonGeometryCollectionData { + /** Contains a list of valid `GeoJSON` geometry objects. **Note** that coordinates in GeoJSON are in x, y order (longitude, latitude). */ + geometries: GeoJsonGeometryUnion[]; +} + +/** The boolean type style rule object. */ +export type BooleanTypeStyleRule = StyleObject & { + /** Polymorphic discriminator, which specifies the different types this object can be */ + type: "boolean"; + /** Boolean style rules. */ + rules: BooleanRuleObject[]; +}; + +/** The numeric type style rule object. */ +export type NumberTypeStyleRule = StyleObject & { + /** Polymorphic discriminator, which specifies the different types this object can be */ + type: "number"; + /** Numeric style rules. */ + rules: NumberRuleObject[]; +}; + +/** The string type style rule object. */ +export type StringTypeStyleRule = StyleObject & { + /** Polymorphic discriminator, which specifies the different types this object can be */ + type: "string"; + /** String style rules. */ + rules: { [propertyName: string]: string }[]; +}; + +/** A valid `GeoJSON` geometry object. The type must be one of the seven valid GeoJSON geometry types - Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon and GeometryCollection. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1) for details. */ +export type GeoJsonGeometry = GeoJsonObject & { + /** Polymorphic discriminator, which specifies the different types this object can be */ + type: + | "GeoJsonGeometry" + | "Point" + | "MultiPoint" + | "LineString" + | "MultiLineString" + | "Polygon" + | "MultiPolygon" + | "GeometryCollection"; +}; + +/** A valid `GeoJSON Feature` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.2) for details. */ +export type GeoJsonFeature = GeoJsonObject & + GeoJsonFeatureData & { + /** Polymorphic discriminator, which specifies the different types this object can be */ + type: "Feature"; + }; + +/** A valid `GeoJSON FeatureCollection` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. */ +export type GeoJsonFeatureCollection = GeoJsonObject & + GeoJsonFeatureCollectionData & { + /** Polymorphic discriminator, which specifies the different types this object can be */ + type: "FeatureCollection" | "FeatureCollection"; + }; + +/** A valid `GeoJSON FeatureCollection` object type extended with numberReturned and links array. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. */ +export type ExtendedGeoJsonFeatureCollection = GeoJsonFeatureCollection & + ExtendedGeoJsonFeatureCollectionData & {}; + +/** A valid `GeoJSON Point` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.2) for details. */ +export type GeoJsonPoint = GeoJsonGeometry & GeoJsonPointData & {}; + +/** A valid `GeoJSON MultiPoint` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.3) for details. */ +export type GeoJsonMultiPoint = GeoJsonGeometry & GeoJsonMultiPointData & {}; + +/** A valid `GeoJSON LineString` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.4) for details. */ +export type GeoJsonLineString = GeoJsonGeometry & GeoJsonLineStringData & {}; + +/** A valid `GeoJSON MultiLineString` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.5) for details. */ +export type GeoJsonMultiLineString = GeoJsonGeometry & + GeoJsonMultiLineStringData & {}; + +/** A valid `GeoJSON Polygon` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.6) for details. */ +export type GeoJsonPolygon = GeoJsonGeometry & GeoJsonPolygonData & {}; + +/** A valid `GeoJSON MultiPolygon` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.7) for details. */ +export type GeoJsonMultiPolygon = GeoJsonGeometry & + GeoJsonMultiPolygonData & {}; + +/** A valid `GeoJSON GeometryCollection` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.8) for details. */ +export type GeoJsonGeometryCollection = GeoJsonGeometry & + GeoJsonGeometryCollectionData & {}; + +/** Defines headers for Alias_create operation. */ +export interface AliasCreateHeaders { + /** The list of response headers that can be read by the client. */ + accessControlExposeHeaders?: string; +} + +/** Defines headers for Data_uploadPreview operation. */ +export interface DataUploadPreviewHeaders { + /** If successful, a URI where details on the newly created resource can be found. */ + resourceLocation?: string; +} + +/** Defines headers for Data_updatePreview operation. */ +export interface DataUpdatePreviewHeaders { + /** If successful, a URI where details on the newly created resource can be found. */ + resourceLocation?: string; +} + +/** Defines headers for Data_downloadPreview operation. */ +export interface DataDownloadPreviewHeaders { + /** The content-type for the Download API response. */ + contentType?: string; +} + +/** Defines headers for Data_getOperationPreview operation. */ +export interface DataGetOperationPreviewHeaders { + /** If successful, a URI where details on the newly created resource can be found. */ + resourceLocation?: string; +} + +/** Defines headers for Dataset_create operation. */ +export interface DatasetCreateHeaders { + /** If successful, a URI where details on the newly created resource can be found. */ + resourceLocation?: string; +} + +/** Defines headers for Dataset_getOperation operation. */ +export interface DatasetGetOperationHeaders { + /** If successful, a URI where details on the newly created resource can be found. */ + resourceLocation?: string; +} + +/** Defines headers for Conversion_convert operation. */ +export interface ConversionConvertHeaders { + /** If successful, a URI where details on the newly created resource can be found. */ + resourceLocation?: string; +} + +/** Defines headers for Conversion_getOperation operation. */ +export interface ConversionGetOperationHeaders { + /** If successful, a URI where details on the newly created resource can be found. */ + resourceLocation?: string; +} + +/** Defines headers for Spatial_getGeofence operation. */ +export interface SpatialGetGeofenceHeaders { + /** Value present in an async call's response and the Event Grid event data. It helps correlate the async call’s response with the corresponding Event Grid event. */ + xCorrelationId?: string; +} + +/** Defines headers for Spatial_postGeofence operation. */ +export interface SpatialPostGeofenceHeaders { + /** Value present in an async call's response and the Event Grid event data. It helps correlate the async call’s response with the corresponding Event Grid event. */ + xCorrelationId?: string; +} + +/** Defines headers for Tileset_create operation. */ +export interface TilesetCreateHeaders { + /** If successful, a URI where details on the newly created resource can be found. */ + resourceLocation?: string; +} + +/** Defines headers for Tileset_getOperation operation. */ +export interface TilesetGetOperationHeaders { + /** If successful, a URI where details on the newly created resource can be found. */ + resourceLocation?: string; +} + +/** Known values of {@link Geography} that the service accepts. */ +export const enum KnownGeography { + Us = "us", + Eu = "eu" +} + +/** + * Defines values for Geography. \ + * {@link KnownGeography} can be used interchangeably with Geography, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **us** \ + * **eu** + */ +export type Geography = string; + +/** Known values of {@link UploadDataFormat} that the service accepts. */ +export const enum KnownUploadDataFormat { + /** [GeoJSON](https://tools.ietf.org/html/rfc7946) is a JSON based geospatial data interchange format. */ + Geojson = "geojson", + /** Compressed data format. */ + Zip = "zip", + /** ZIP package containing DWG file. */ + Dwgzippackage = "dwgzippackage" +} + +/** + * Defines values for UploadDataFormat. \ + * {@link KnownUploadDataFormat} can be used interchangeably with UploadDataFormat, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **geojson**: [GeoJSON](https:\/\/tools.ietf.org\/html\/rfc7946) is a JSON based geospatial data interchange format. \ + * **zip**: Compressed data format. \ + * **dwgzippackage**: ZIP package containing DWG file. + */ +export type UploadDataFormat = string; + +/** Known values of {@link LroStatus} that the service accepts. */ +export const enum KnownLroStatus { + /** The request has not started processing yet. */ + NotStarted = "NotStarted", + /** The request has started processing. */ + Running = "Running", + /** The request has one or more failures. */ + Failed = "Failed", + /** The request has successfully completed. */ + Succeeded = "Succeeded" +} + +/** + * Defines values for LroStatus. \ + * {@link KnownLroStatus} can be used interchangeably with LroStatus, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **NotStarted**: The request has not started processing yet. \ + * **Running**: The request has started processing. \ + * **Failed**: The request has one or more failures. \ + * **Succeeded**: The request has successfully completed. + */ +export type LroStatus = string; + +/** Known values of {@link StyleObjectType} that the service accepts. */ +export const enum KnownStyleObjectType { + /** Boolean type of stateset style. */ + BooleanTypeStyleRule = "boolean", + /** Number type of stateset style. */ + NumberTypeStyleRule = "number", + /** String type of stateset style. */ + StringTypeStyleRule = "string" +} + +/** + * Defines values for StyleObjectType. \ + * {@link KnownStyleObjectType} can be used interchangeably with StyleObjectType, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **boolean**: Boolean type of stateset style. \ + * **number**: Number type of stateset style. \ + * **string**: String type of stateset style. + */ +export type StyleObjectType = string; + +/** Known values of {@link ResponseFormat} that the service accepts. */ +export const enum KnownResponseFormat { + /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ + Json = "json" +} + +/** + * Defines values for ResponseFormat. \ + * {@link KnownResponseFormat} can be used interchangeably with ResponseFormat, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) + */ +export type ResponseFormat = string; + +/** Known values of {@link GeofenceMode} that the service accepts. */ +export const enum KnownGeofenceMode { + /** Publish all the query results to Azure Maps account event subscription. */ + All = "All", + /** Only publish result when user location is considered as crossing geofencing boarder. */ + EnterAndExit = "EnterAndExit" +} + +/** + * Defines values for GeofenceMode. \ + * {@link KnownGeofenceMode} can be used interchangeably with GeofenceMode, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **All**: Publish all the query results to Azure Maps account event subscription. \ + * **EnterAndExit**: Only publish result when user location is considered as crossing geofencing boarder. + */ +export type GeofenceMode = string; + +/** Known values of {@link GeoJsonObjectType} that the service accepts. */ +export const enum KnownGeoJsonObjectType { + /** `GeoJSON Point` geometry. */ + GeoJsonPoint = "Point", + /** `GeoJSON MultiPoint` geometry. */ + GeoJsonMultiPoint = "MultiPoint", + /** `GeoJSON LineString` geometry. */ + GeoJsonLineString = "LineString", + /** `GeoJSON MultiLineString` geometry. */ + GeoJsonMultiLineString = "MultiLineString", + /** `GeoJSON Polygon` geometry. */ + GeoJsonPolygon = "Polygon", + /** `GeoJSON MultiPolygon` geometry. */ + GeoJsonMultiPolygon = "MultiPolygon", + /** `GeoJSON GeometryCollection` geometry. */ + GeoJsonGeometryCollection = "GeometryCollection", + /** `GeoJSON Feature` object. */ + GeoJsonFeature = "Feature", + /** `GeoJSON FeatureCollection` object. */ + GeoJsonFeatureCollection = "FeatureCollection" +} + +/** + * Defines values for GeoJsonObjectType. \ + * {@link KnownGeoJsonObjectType} can be used interchangeably with GeoJsonObjectType, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **Point**: `GeoJSON Point` geometry. \ + * **MultiPoint**: `GeoJSON MultiPoint` geometry. \ + * **LineString**: `GeoJSON LineString` geometry. \ + * **MultiLineString**: `GeoJSON MultiLineString` geometry. \ + * **Polygon**: `GeoJSON Polygon` geometry. \ + * **MultiPolygon**: `GeoJSON MultiPolygon` geometry. \ + * **GeometryCollection**: `GeoJSON GeometryCollection` geometry. \ + * **Feature**: `GeoJSON Feature` object. \ + * **FeatureCollection**: `GeoJSON FeatureCollection` object. + */ +export type GeoJsonObjectType = string; + +/** Known values of {@link GeoJsonGeometryType} that the service accepts. */ +export const enum KnownGeoJsonGeometryType { + /** `GeoJSON Point` geometry. */ + GeoJsonPoint = "Point", + /** `GeoJSON MultiPoint` geometry. */ + GeoJsonMultiPoint = "MultiPoint", + /** `GeoJSON LineString` geometry. */ + GeoJsonLineString = "LineString", + /** `GeoJSON MultiLineString` geometry. */ + GeoJsonMultiLineString = "MultiLineString", + /** `GeoJSON Polygon` geometry. */ + GeoJsonPolygon = "Polygon", + /** `GeoJSON MultiPolygon` geometry. */ + GeoJsonMultiPolygon = "MultiPolygon", + /** `GeoJSON GeometryCollection` geometry. */ + GeoJsonGeometryCollection = "GeometryCollection" +} + +/** + * Defines values for GeoJsonGeometryType. \ + * {@link KnownGeoJsonGeometryType} can be used interchangeably with GeoJsonGeometryType, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **Point**: `GeoJSON Point` geometry. \ + * **MultiPoint**: `GeoJSON MultiPoint` geometry. \ + * **LineString**: `GeoJSON LineString` geometry. \ + * **MultiLineString**: `GeoJSON MultiLineString` geometry. \ + * **Polygon**: `GeoJSON Polygon` geometry. \ + * **MultiPolygon**: `GeoJSON MultiPolygon` geometry. \ + * **GeometryCollection**: `GeoJSON GeometryCollection` geometry. + */ +export type GeoJsonGeometryType = string; + +/** Known values of {@link GeographicResourceLocation} that the service accepts. */ +export const enum KnownGeographicResourceLocation { + /** Used to access an Azure Maps Creator resource in the United States */ + Us = "us", + /** Used to access an Azure Maps Creator resource in Europe */ + Eu = "eu" +} + +/** + * Defines values for GeographicResourceLocation. \ + * {@link KnownGeographicResourceLocation} can be used interchangeably with GeographicResourceLocation, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **us**: Used to access an Azure Maps Creator resource in the United States \ + * **eu**: Used to access an Azure Maps Creator resource in Europe + */ +export type GeographicResourceLocation = string; + +/** Optional parameters. */ +export interface AliasCreateOptionalParams extends coreClient.OperationOptions { + /** The unique id that references a creator data item to be aliased. */ + creatorDataItemId?: string; +} + +/** Contains response data for the create operation. */ +export type AliasCreateResponse = AliasCreateHeaders & AliasesCreateResponse; + +/** Optional parameters. */ +export interface AliasListOptionalParams extends coreClient.OperationOptions {} + +/** Contains response data for the list operation. */ +export type AliasListOperationResponse = AliasListResponse; + +/** Optional parameters. */ +export interface AliasAssignOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the assign operation. */ +export type AliasAssignResponse = AliasListItem; + +/** Optional parameters. */ +export interface AliasDeleteOptionalParams + extends coreClient.OperationOptions {} + +/** Optional parameters. */ +export interface AliasGetDetailsOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getDetails operation. */ +export type AliasGetDetailsResponse = AliasListItem; + +/** Optional parameters. */ +export interface AliasListNextOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the listNext operation. */ +export type AliasListNextResponse = AliasListResponse; + +/** Optional parameters. */ +export interface DataUploadPreview$binaryOptionalParams + extends coreClient.OperationOptions { + /** The description to be given to the upload. */ + uploadDataDescription?: string; + /** Delay to wait until next poll, in milliseconds. */ + updateIntervalInMs?: number; + /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ + resumeFrom?: string; +} + +/** Optional parameters. */ +export interface DataUploadPreview$jsonOptionalParams + extends coreClient.OperationOptions { + /** The description to be given to the upload. */ + uploadDataDescription?: string; + /** Delay to wait until next poll, in milliseconds. */ + updateIntervalInMs?: number; + /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ + resumeFrom?: string; +} + +/** Contains response data for the uploadPreview operation. */ +export type DataUploadPreviewResponse = DataUploadPreviewHeaders & + LongRunningOperationResult; + +/** Optional parameters. */ +export interface DataListPreviewOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the listPreview operation. */ +export type DataListPreviewResponse = MapDataListResponse; + +/** Optional parameters. */ +export interface DataUpdatePreviewOptionalParams + extends coreClient.OperationOptions { + /** The description to be given to the upload. */ + uploadDataDescription?: string; + /** Delay to wait until next poll, in milliseconds. */ + updateIntervalInMs?: number; + /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ + resumeFrom?: string; +} + +/** Contains response data for the updatePreview operation. */ +export type DataUpdatePreviewResponse = DataUpdatePreviewHeaders & + LongRunningOperationResult; + +/** Optional parameters. */ +export interface DataDownloadPreviewOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the downloadPreview operation. */ +export type DataDownloadPreviewResponse = DataDownloadPreviewHeaders & { + /** + * BROWSER ONLY + * + * The response body as a browser Blob. + * Always `undefined` in node.js. + */ + blobBody?: Promise; + /** + * NODEJS ONLY + * + * The response body as a node.js Readable stream. + * Always `undefined` in the browser. + */ + readableStreamBody?: NodeJS.ReadableStream; +}; + +/** Optional parameters. */ +export interface DataDeletePreviewOptionalParams + extends coreClient.OperationOptions {} + +/** Optional parameters. */ +export interface DataGetOperationPreviewOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getOperationPreview operation. */ +export type DataGetOperationPreviewResponse = DataGetOperationPreviewHeaders & + LongRunningOperationResult; + +/** Optional parameters. */ +export interface DatasetCreateOptionalParams + extends coreClient.OperationOptions { + /** The ID for the dataset to append with. The dataset must originate from a previous dataset creation call that matches the datasetId */ + datasetId?: string; + /** The description to be given to the dataset. */ + descriptionDataset?: string; + /** Delay to wait until next poll, in milliseconds. */ + updateIntervalInMs?: number; + /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ + resumeFrom?: string; +} + +/** Contains response data for the create operation. */ +export type DatasetCreateResponse = DatasetCreateHeaders & + LongRunningOperationResult; + +/** Optional parameters. */ +export interface DatasetListOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the list operation. */ +export type DatasetListOperationResponse = DatasetListResponse; + +/** Optional parameters. */ +export interface DatasetGetOptionalParams extends coreClient.OperationOptions {} + +/** Contains response data for the get operation. */ +export type DatasetGetResponse = DatasetDetailInfo; + +/** Optional parameters. */ +export interface DatasetDeleteOptionalParams + extends coreClient.OperationOptions {} + +/** Optional parameters. */ +export interface DatasetGetOperationOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getOperation operation. */ +export type DatasetGetOperationResponse = DatasetGetOperationHeaders & + LongRunningOperationResult; + +/** Optional parameters. */ +export interface DatasetListNextOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the listNext operation. */ +export type DatasetListNextResponse = DatasetListResponse; + +/** Optional parameters. */ +export interface ConversionConvertOptionalParams + extends coreClient.OperationOptions { + /** User provided description of the content being converted. */ + description?: string; + /** Delay to wait until next poll, in milliseconds. */ + updateIntervalInMs?: number; + /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ + resumeFrom?: string; +} + +/** Contains response data for the convert operation. */ +export type ConversionConvertResponse = ConversionConvertHeaders & + LongRunningOperationResult; + +/** Optional parameters. */ +export interface ConversionListOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the list operation. */ +export type ConversionListOperationResponse = ConversionListResponse; + +/** Optional parameters. */ +export interface ConversionGetOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the get operation. */ +export type ConversionGetResponse = ConversionListDetailInfo; + +/** Optional parameters. */ +export interface ConversionDeleteOptionalParams + extends coreClient.OperationOptions {} + +/** Optional parameters. */ +export interface ConversionGetOperationOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getOperation operation. */ +export type ConversionGetOperationResponse = ConversionGetOperationHeaders & + LongRunningOperationResult; + +/** Optional parameters. */ +export interface ConversionListNextOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the listNext operation. */ +export type ConversionListNextResponse = ConversionListResponse; + +/** Optional parameters. */ +export interface FeatureStateCreateStatesetOptionalParams + extends coreClient.OperationOptions { + /** Description for the stateset. Max length allowed is 1000. */ + description?: string; +} + +/** Contains response data for the createStateset operation. */ +export type FeatureStateCreateStatesetResponse = StatesetCreatedResponse; + +/** Optional parameters. */ +export interface FeatureStateListStatesetOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the listStateset operation. */ +export type FeatureStateListStatesetResponse = StatesetListResponse; + +/** Optional parameters. */ +export interface FeatureStatePutStatesetOptionalParams + extends coreClient.OperationOptions {} + +/** Optional parameters. */ +export interface FeatureStateDeleteStatesetOptionalParams + extends coreClient.OperationOptions {} + +/** Optional parameters. */ +export interface FeatureStateGetStatesetOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getStateset operation. */ +export type FeatureStateGetStatesetResponse = StatesetGetResponse; + +/** Optional parameters. */ +export interface FeatureStateUpdateStatesOptionalParams + extends coreClient.OperationOptions {} + +/** Optional parameters. */ +export interface FeatureStateDeleteStateOptionalParams + extends coreClient.OperationOptions {} + +/** Optional parameters. */ +export interface FeatureStateGetStatesOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getStates operation. */ +export type FeatureStateGetStatesResponse = FeatureStatesStructure; + +/** Optional parameters. */ +export interface FeatureStateListStatesetNextOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the listStatesetNext operation. */ +export type FeatureStateListStatesetNextResponse = StatesetListResponse; + +/** Optional parameters. */ +export interface SpatialGetGeofenceOptionalParams + extends coreClient.OperationOptions { + /** The sea level in meter of the location being passed. If this parameter is presented, 2D extrusion is used. Example: 200. */ + z?: number; + /** The user request time. If not presented in the request, the default value is DateTime.Now. */ + userTime?: Date; + /** The radius of the buffer around the geofence in meters that defines how far to search inside and outside the border of the fence against the coordinate that was provided when calculating the result. The minimum value is 0, and the maximum is 500. The default value is 50. */ + searchBuffer?: number; + /** If true, the request will use async event mechanism; if false, the request will be synchronized and do not trigger any event. The default value is false. */ + isAsync?: boolean; + /** Mode of the geofencing async event mechanism. */ + mode?: GeofenceMode; +} + +/** Contains response data for the getGeofence operation. */ +export type SpatialGetGeofenceResponse = SpatialGetGeofenceHeaders & + GeofenceResponse; + +/** Optional parameters. */ +export interface SpatialPostGeofenceOptionalParams + extends coreClient.OperationOptions { + /** The sea level in meter of the location being passed. If this parameter is presented, 2D extrusion geofencing is applied. Example: 200. */ + z?: number; + /** The user request time. If not presented in the request, the default value is DateTime.UtcNow. */ + userTime?: Date; + /** The radius of the buffer around the geofence in meters that defines how far to search inside and outside the border of the fence against the coordinate that was provided when calculating the result. The minimum value is 0, and the maximum is 500. The default value is 50. */ + searchBuffer?: number; + /** If true, the request will use async event mechanism; if false, the request will be synchronized and do not trigger any event. The default value is false. */ + isAsync?: boolean; + /** Mode of the geofencing async event mechanism. */ + mode?: GeofenceMode; +} + +/** Contains response data for the postGeofence operation. */ +export type SpatialPostGeofenceResponse = SpatialPostGeofenceHeaders & + GeofenceResponse; + +/** Optional parameters. */ +export interface SpatialPostBufferOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the postBuffer operation. */ +export type SpatialPostBufferResponse = BufferResponse; + +/** Optional parameters. */ +export interface SpatialGetBufferOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getBuffer operation. */ +export type SpatialGetBufferResponse = BufferResponse; + +/** Optional parameters. */ +export interface SpatialPostClosestPointOptionalParams + extends coreClient.OperationOptions { + /** The number of closest points expected from response. Default: 1, minimum: 1 and maximum: 50 */ + numberOfClosestPoints?: number; +} + +/** Contains response data for the postClosestPoint operation. */ +export type SpatialPostClosestPointResponse = ClosestPointResponse; + +/** Optional parameters. */ +export interface SpatialGetClosestPointOptionalParams + extends coreClient.OperationOptions { + /** The number of closest points expected from response. Default: 1, minimum: 1 and maximum: 50 */ + numberOfClosestPoints?: number; +} + +/** Contains response data for the getClosestPoint operation. */ +export type SpatialGetClosestPointResponse = ClosestPointResponse; + +/** Optional parameters. */ +export interface SpatialPostPointInPolygonOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the postPointInPolygon operation. */ +export type SpatialPostPointInPolygonResponse = PointInPolygonResponse; + +/** Optional parameters. */ +export interface SpatialGetPointInPolygonOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getPointInPolygon operation. */ +export type SpatialGetPointInPolygonResponse = PointInPolygonResponse; + +/** Optional parameters. */ +export interface SpatialGetGreatCircleDistanceOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getGreatCircleDistance operation. */ +export type SpatialGetGreatCircleDistanceResponse = GreatCircleDistanceResponse; + +/** Optional parameters. */ +export interface TilesetCreateOptionalParams + extends coreClient.OperationOptions { + /** User provided description of the tileset. */ + description?: string; + /** Delay to wait until next poll, in milliseconds. */ + updateIntervalInMs?: number; + /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ + resumeFrom?: string; +} + +/** Contains response data for the create operation. */ +export type TilesetCreateResponse = TilesetCreateHeaders & + LongRunningOperationResult; + +/** Optional parameters. */ +export interface TilesetListOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the list operation. */ +export type TilesetListOperationResponse = TilesetListResponse; + +/** Optional parameters. */ +export interface TilesetGetOptionalParams extends coreClient.OperationOptions {} + +/** Contains response data for the get operation. */ +export type TilesetGetResponse = TilesetDetailInfo; + +/** Optional parameters. */ +export interface TilesetDeleteOptionalParams + extends coreClient.OperationOptions {} + +/** Optional parameters. */ +export interface TilesetGetOperationOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getOperation operation. */ +export type TilesetGetOperationResponse = TilesetGetOperationHeaders & + LongRunningOperationResult; + +/** Optional parameters. */ +export interface TilesetListNextOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the listNext operation. */ +export type TilesetListNextResponse = TilesetListResponse; + +/** Optional parameters. */ +export interface WfsGetLandingPageOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getLandingPage operation. */ +export type WfsGetLandingPageResponse = LandingPageResponse; + +/** Optional parameters. */ +export interface WfsGetConformanceOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getConformance operation. */ +export type WfsGetConformanceResponse = ConformanceResponse; + +/** Optional parameters. */ +export interface WfsGetCollectionsOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getCollections operation. */ +export type WfsGetCollectionsResponse = CollectionsResponse; + +/** Optional parameters. */ +export interface WfsGetCollectionOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getCollection operation. */ +export type WfsGetCollectionResponse = CollectionInfo; + +/** Optional parameters. */ +export interface WfsGetCollectionDefinitionOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getCollectionDefinition operation. */ +export type WfsGetCollectionDefinitionResponse = CollectionDefinitionResponse; + +/** Optional parameters. */ +export interface WfsGetFeaturesOptionalParams + extends coreClient.OperationOptions { + /** + * The optional limit parameter limits the number of features that are presented in the response document. + * Only features that are on the first level of the collection in the response document are counted. Nested objects contained within the explicitly requested features shall not be counted. + * * Minimum = 1 * Maximum = 50 * Default = 10 + */ + limit?: number; + /** + * Only features that have a geometry that intersects the supplied bounding box are selected. + * * Lower left corner, coordinate axis 1 * Lower left corner, coordinate axis 2 * Upper right corner, coordinate axis 1 * Upper right corner, coordinate axis 2 + * The coordinate reference system of the values is WGS84 longitude/latitude (http://www.opengis.net/def/crs/OGC/1.3/CRS84) unless a different coordinate reference system is specified in the parameter `bbox-crs`. + * For WGS84 longitude/latitude the values are in most cases the sequence of minimum longitude, minimum latitude, maximum longitude and maximum latitude. However, in cases where the box spans the antimeridian the first value (west-most box edge) is larger than the third value (east-most box edge). + */ + bbox?: string; + /** + * Filter expression to search for features with specific property values in a given collection. Only feature properties of scalar type and equals operator are supported. + * This is a special parameter where the parameter name is a case sensitive property name. The scheme for this parameter is {property name}={property value}. Unless "filter" is one of the property names in the collection, "filter" should not be used as a parameter name. To search for features with "name" property value "21N13", use "name=21N13". + * Multiple filters are supported and should be represented as multiple query parameters. E.g., =&= String values are case sensitive. + */ + filter?: string; +} + +/** Contains response data for the getFeatures operation. */ +export type WfsGetFeaturesResponse = ExtendedGeoJsonFeatureCollection; + +/** Optional parameters. */ +export interface WfsGetFeatureOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getFeature operation. */ +export type WfsGetFeatureResponse = FeatureResponse; + +/** Optional parameters. */ +export interface WfsDeleteFeatureOptionalParams + extends coreClient.OperationOptions {} + +/** Optional parameters. */ +export interface CreatorClientOptionalParams + extends coreClient.ServiceClientOptions { + /** This parameter specifies where the Azure Maps Creator resource is located. Valid values are us and eu. */ + geography?: Geography; + /** Specifies which account is intended for usage in conjunction with the Azure AD security model. It represents a unique ID for the Azure Maps account and can be retrieved from the Azure Maps management plane Account API. To use Azure AD security in Azure Maps see the following [articles](https://aka.ms/amauthdetails) for guidance. */ + xMsClientId?: string; + /** Overrides client endpoint. */ + endpoint?: string; +} diff --git a/sdk/maps/maps-creator/src/models/mappers.ts b/sdk/maps/maps-creator/src/models/mappers.ts new file mode 100644 index 000000000000..4bb4e8bbca34 --- /dev/null +++ b/sdk/maps/maps-creator/src/models/mappers.ts @@ -0,0 +1,2429 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; + +export const AliasesCreateResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "AliasesCreateResponse", + modelProperties: { + createdTimestamp: { + serializedName: "createdTimestamp", + readOnly: true, + type: { + name: "String" + } + }, + aliasId: { + serializedName: "aliasId", + readOnly: true, + type: { + name: "String" + } + }, + creatorDataItemId: { + serializedName: "creatorDataItemId", + readOnly: true, + type: { + name: "String" + } + }, + lastUpdatedTimestamp: { + serializedName: "lastUpdatedTimestamp", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const ErrorResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorResponse", + modelProperties: { + error: { + serializedName: "error", + type: { + name: "Composite", + className: "ErrorDetail" + } + } + } + } +}; + +export const ErrorDetail: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorDetail", + modelProperties: { + code: { + serializedName: "code", + readOnly: true, + type: { + name: "String" + } + }, + message: { + serializedName: "message", + readOnly: true, + type: { + name: "String" + } + }, + target: { + serializedName: "target", + readOnly: true, + type: { + name: "String" + } + }, + details: { + serializedName: "details", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ErrorDetail" + } + } + } + }, + additionalInfo: { + serializedName: "additionalInfo", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ErrorAdditionalInfo" + } + } + } + } + } + } +}; + +export const ErrorAdditionalInfo: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorAdditionalInfo", + modelProperties: { + type: { + serializedName: "type", + readOnly: true, + type: { + name: "String" + } + }, + info: { + serializedName: "info", + readOnly: true, + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } + } + } +}; + +export const AliasListResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "AliasListResponse", + modelProperties: { + aliases: { + serializedName: "aliases", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "AliasListItem" + } + } + } + }, + nextLink: { + serializedName: "nextLink", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const AliasListItem: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "AliasListItem", + modelProperties: { + createdTimestamp: { + serializedName: "createdTimestamp", + readOnly: true, + type: { + name: "String" + } + }, + aliasId: { + serializedName: "aliasId", + readOnly: true, + type: { + name: "String" + } + }, + creatorDataItemId: { + serializedName: "creatorDataItemId", + readOnly: true, + nullable: true, + type: { + name: "String" + } + }, + lastUpdatedTimestamp: { + serializedName: "lastUpdatedTimestamp", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const LongRunningOperationResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "LongRunningOperationResult", + modelProperties: { + operationId: { + serializedName: "operationId", + type: { + name: "String" + } + }, + status: { + serializedName: "status", + readOnly: true, + type: { + name: "String" + } + }, + created: { + serializedName: "created", + readOnly: true, + type: { + name: "String" + } + }, + error: { + serializedName: "error", + type: { + name: "Composite", + className: "ErrorDetail" + } + }, + warning: { + serializedName: "warning", + type: { + name: "Composite", + className: "ErrorDetail" + } + } + } + } +}; + +export const MapDataListResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "MapDataListResponse", + modelProperties: { + mapDataList: { + serializedName: "mapDataList", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "MapDataDetailInfo" + } + } + } + } + } + } +}; + +export const MapDataDetailInfo: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "MapDataDetailInfo", + modelProperties: { + udid: { + serializedName: "udid", + readOnly: true, + type: { + name: "String" + } + }, + location: { + serializedName: "location", + readOnly: true, + type: { + name: "String" + } + }, + sizeInBytes: { + serializedName: "sizeInBytes", + readOnly: true, + type: { + name: "Number" + } + }, + uploadStatus: { + serializedName: "uploadStatus", + readOnly: true, + type: { + name: "String" + } + }, + dataFormat: { + serializedName: "dataFormat", + readOnly: true, + type: { + name: "String" + } + }, + description: { + serializedName: "description", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const DatasetListResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "DatasetListResponse", + modelProperties: { + datasets: { + serializedName: "datasets", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "DatasetDetailInfo" + } + } + } + }, + nextLink: { + serializedName: "nextLink", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const DatasetDetailInfo: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "DatasetDetailInfo", + modelProperties: { + created: { + serializedName: "created", + readOnly: true, + type: { + name: "String" + } + }, + datasetId: { + serializedName: "datasetId", + readOnly: true, + type: { + name: "String" + } + }, + ontology: { + serializedName: "ontology", + readOnly: true, + type: { + name: "String" + } + }, + description: { + serializedName: "description", + readOnly: true, + type: { + name: "String" + } + }, + datasetSources: { + serializedName: "datasetSources", + type: { + name: "Composite", + className: "DatasetSources" + } + }, + featureCounts: { + serializedName: "featureCounts", + readOnly: true, + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } + } + } +}; + +export const DatasetSources: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "DatasetSources", + modelProperties: { + conversionIds: { + serializedName: "conversionIds", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + appendDatasetId: { + serializedName: "appendDatasetId", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const ConversionListResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ConversionListResponse", + modelProperties: { + conversions: { + serializedName: "conversions", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ConversionListDetailInfo" + } + } + } + }, + nextLink: { + serializedName: "nextLink", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const ConversionListDetailInfo: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ConversionListDetailInfo", + modelProperties: { + conversionId: { + serializedName: "conversionId", + readOnly: true, + type: { + name: "String" + } + }, + ontology: { + serializedName: "ontology", + readOnly: true, + type: { + name: "String" + } + }, + udid: { + serializedName: "udid", + readOnly: true, + type: { + name: "String" + } + }, + created: { + serializedName: "created", + readOnly: true, + type: { + name: "String" + } + }, + description: { + serializedName: "description", + readOnly: true, + type: { + name: "String" + } + }, + featureCounts: { + serializedName: "featureCounts", + readOnly: true, + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } + } + } +}; + +export const StylesObject: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "StylesObject", + modelProperties: { + styles: { + serializedName: "styles", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "StyleObject" + } + } + } + } + } + } +}; + +export const StyleObject: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "StyleObject", + uberParent: "StyleObject", + polymorphicDiscriminator: { + serializedName: "type", + clientName: "type" + }, + modelProperties: { + keyName: { + serializedName: "keyName", + required: true, + type: { + name: "String" + } + }, + type: { + serializedName: "type", + required: true, + type: { + name: "String" + } + } + } + } +}; + +export const StatesetCreatedResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "StatesetCreatedResponse", + modelProperties: { + statesetId: { + serializedName: "statesetId", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const StatesetListResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "StatesetListResponse", + modelProperties: { + statesets: { + serializedName: "statesets", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "StatesetInfoObject" + } + } + } + }, + nextLink: { + serializedName: "nextLink", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const StatesetInfoObject: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "StatesetInfoObject", + modelProperties: { + statesetId: { + serializedName: "statesetId", + type: { + name: "String" + } + }, + description: { + serializedName: "description", + readOnly: true, + type: { + name: "String" + } + }, + datasetIds: { + serializedName: "datasetIds", + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + statesetStyle: { + serializedName: "statesetStyle", + type: { + name: "Composite", + className: "StylesObject" + } + } + } + } +}; + +export const StatesetGetResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "StatesetGetResponse", + modelProperties: { + description: { + serializedName: "description", + readOnly: true, + type: { + name: "String" + } + }, + datasetIds: { + serializedName: "datasetIds", + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + statesetStyle: { + serializedName: "statesetStyle", + type: { + name: "Composite", + className: "StylesObject" + } + } + } + } +}; + +export const FeatureStatesStructure: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "FeatureStatesStructure", + modelProperties: { + states: { + serializedName: "states", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "FeatureStateObject" + } + } + } + } + } + } +}; + +export const FeatureStateObject: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "FeatureStateObject", + modelProperties: { + keyName: { + serializedName: "keyName", + type: { + name: "String" + } + }, + value: { + serializedName: "value", + type: { + name: "String" + } + }, + eventTimestamp: { + serializedName: "eventTimestamp", + type: { + name: "String" + } + } + } + } +}; + +export const GeofenceResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeofenceResponse", + modelProperties: { + geometries: { + serializedName: "geometries", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "GeofenceGeometry" + } + } + } + }, + expiredGeofenceGeometryId: { + serializedName: "expiredGeofenceGeometryId", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + invalidPeriodGeofenceGeometryId: { + serializedName: "invalidPeriodGeofenceGeometryId", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + isEventPublished: { + serializedName: "isEventPublished", + readOnly: true, + type: { + name: "Boolean" + } + } + } + } +}; + +export const GeofenceGeometry: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeofenceGeometry", + modelProperties: { + deviceId: { + serializedName: "deviceId", + readOnly: true, + type: { + name: "String" + } + }, + udId: { + serializedName: "udId", + readOnly: true, + type: { + name: "String" + } + }, + geometryId: { + serializedName: "geometryId", + readOnly: true, + type: { + name: "String" + } + }, + distance: { + serializedName: "distance", + readOnly: true, + type: { + name: "Number" + } + }, + nearestLat: { + serializedName: "nearestLat", + readOnly: true, + type: { + name: "Number" + } + }, + nearestLon: { + serializedName: "nearestLon", + readOnly: true, + type: { + name: "Number" + } + }, + nearestZ: { + serializedName: "nearestZ", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const BufferRequestBody: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "BufferRequestBody", + modelProperties: { + geometries: { + serializedName: "geometries", + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + }, + distances: { + serializedName: "distances", + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } +}; + +export const BufferResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "BufferResponse", + modelProperties: { + summary: { + serializedName: "summary", + type: { + name: "Composite", + className: "BufferResponseSummary" + } + }, + result: { + serializedName: "result", + type: { + name: "Composite", + className: "GeoJsonFeatureCollection" + } + } + } + } +}; + +export const BufferResponseSummary: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "BufferResponseSummary", + modelProperties: { + udid: { + serializedName: "udid", + readOnly: true, + type: { + name: "String" + } + }, + information: { + serializedName: "information", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const GeoJsonObject: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonObject", + uberParent: "GeoJsonObject", + polymorphicDiscriminator: { + serializedName: "type", + clientName: "type" + }, + modelProperties: { + type: { + serializedName: "type", + required: true, + type: { + name: "String" + } + } + } + } +}; + +export const GeoJsonFeatureCollectionData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonFeatureCollectionData", + modelProperties: { + features: { + serializedName: "features", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "GeoJsonFeature" + } + } + } + } + } + } +}; + +export const GeoJsonFeatureData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonFeatureData", + modelProperties: { + geometry: { + serializedName: "geometry", + type: { + name: "Composite", + className: "GeoJsonGeometry" + } + }, + properties: { + serializedName: "properties", + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + }, + id: { + serializedName: "id", + type: { + name: "String" + } + }, + featureType: { + serializedName: "featureType", + type: { + name: "String" + } + } + } + } +}; + +export const ClosestPointResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ClosestPointResponse", + modelProperties: { + summary: { + serializedName: "summary", + type: { + name: "Composite", + className: "ClosestPointSummary" + } + }, + result: { + serializedName: "result", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ClosestPointResultEntry" + } + } + } + } + } + } +}; + +export const ClosestPointSummary: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ClosestPointSummary", + modelProperties: { + sourcePoint: { + serializedName: "sourcePoint", + type: { + name: "Composite", + className: "SpatialCoordinate" + } + }, + udid: { + serializedName: "udid", + readOnly: true, + type: { + name: "String" + } + }, + information: { + serializedName: "information", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const SpatialCoordinate: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SpatialCoordinate", + modelProperties: { + lat: { + serializedName: "lat", + readOnly: true, + type: { + name: "Number" + } + }, + lon: { + serializedName: "lon", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const ClosestPointResultEntry: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ClosestPointResultEntry", + modelProperties: { + distanceInMeters: { + serializedName: "distanceInMeters", + readOnly: true, + type: { + name: "Number" + } + }, + position: { + serializedName: "position", + type: { + name: "Composite", + className: "SpatialCoordinate" + } + }, + geometryId: { + serializedName: "geometryId", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const PointInPolygonResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "PointInPolygonResponse", + modelProperties: { + summary: { + serializedName: "summary", + type: { + name: "Composite", + className: "PointInPolygonSummary" + } + }, + result: { + serializedName: "result", + type: { + name: "Composite", + className: "PointInPolygonResult" + } + } + } + } +}; + +export const PointInPolygonSummary: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "PointInPolygonSummary", + modelProperties: { + sourcePoint: { + serializedName: "sourcePoint", + type: { + name: "Composite", + className: "SpatialCoordinate" + } + }, + udid: { + serializedName: "udid", + readOnly: true, + type: { + name: "String" + } + }, + information: { + serializedName: "information", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const PointInPolygonResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "PointInPolygonResult", + modelProperties: { + pointInPolygons: { + serializedName: "pointInPolygons", + readOnly: true, + type: { + name: "Boolean" + } + }, + intersectingGeometries: { + serializedName: "intersectingGeometries", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + } + } + } +}; + +export const GreatCircleDistanceResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GreatCircleDistanceResponse", + modelProperties: { + summary: { + serializedName: "summary", + type: { + name: "Composite", + className: "GreatCircleDistanceResponseSummary" + } + }, + result: { + serializedName: "result", + type: { + name: "Composite", + className: "GreatCircleDistanceResponseResult" + } + } + } + } +}; + +export const GreatCircleDistanceResponseSummary: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GreatCircleDistanceResponseSummary", + modelProperties: { + sourcePoint: { + serializedName: "sourcePoint", + type: { + name: "Composite", + className: "SpatialCoordinate" + } + }, + targetPoint: { + serializedName: "targetPoint", + type: { + name: "Composite", + className: "SpatialCoordinate" + } + } + } + } +}; + +export const GreatCircleDistanceResponseResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GreatCircleDistanceResponseResult", + modelProperties: { + distanceInMeters: { + serializedName: "distanceInMeters", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const TilesetListResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TilesetListResponse", + modelProperties: { + tilesets: { + serializedName: "tilesets", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "TilesetDetailInfo" + } + } + } + }, + nextLink: { + serializedName: "nextLink", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const TilesetDetailInfo: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TilesetDetailInfo", + modelProperties: { + tilesetId: { + serializedName: "tilesetId", + readOnly: true, + type: { + name: "String" + } + }, + ontology: { + serializedName: "ontology", + readOnly: true, + type: { + name: "String" + } + }, + datasetId: { + serializedName: "datasetId", + readOnly: true, + type: { + name: "String" + } + }, + description: { + serializedName: "description", + readOnly: true, + type: { + name: "String" + } + }, + minZoom: { + serializedName: "minZoom", + readOnly: true, + type: { + name: "Number" + } + }, + maxZoom: { + serializedName: "maxZoom", + readOnly: true, + type: { + name: "Number" + } + }, + bbox: { + serializedName: "bbox", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } +}; + +export const LandingPageResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "LandingPageResponse", + modelProperties: { + ontology: { + serializedName: "ontology", + readOnly: true, + type: { + name: "String" + } + }, + links: { + serializedName: "links", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "WfsEndpointLink" + } + } + } + } + } + } +}; + +export const WfsEndpointLink: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "WfsEndpointLink", + modelProperties: { + href: { + serializedName: "href", + required: true, + type: { + name: "String" + } + }, + rel: { + serializedName: "rel", + type: { + name: "String" + } + }, + type: { + serializedName: "type", + type: { + name: "String" + } + }, + hreflang: { + serializedName: "hreflang", + type: { + name: "String" + } + }, + title: { + serializedName: "title", + type: { + name: "String" + } + } + } + } +}; + +export const ConformanceResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ConformanceResponse", + modelProperties: { + conformsTo: { + serializedName: "conformsTo", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + } + } + } +}; + +export const CollectionsResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "CollectionsResponse", + modelProperties: { + ontology: { + serializedName: "ontology", + readOnly: true, + type: { + name: "String" + } + }, + links: { + serializedName: "links", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "WfsEndpointLink" + } + } + } + }, + collections: { + serializedName: "collections", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "CollectionInfo" + } + } + } + } + } + } +}; + +export const CollectionInfo: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "CollectionInfo", + modelProperties: { + name: { + serializedName: "name", + required: true, + type: { + name: "String" + } + }, + title: { + serializedName: "title", + type: { + name: "String" + } + }, + ontology: { + serializedName: "ontology", + readOnly: true, + type: { + name: "String" + } + }, + description: { + serializedName: "description", + type: { + name: "String" + } + }, + links: { + serializedName: "links", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "WfsEndpointLink" + } + } + } + } + } + } +}; + +export const CollectionDefinitionResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "CollectionDefinitionResponse", + modelProperties: { + description: { + serializedName: "description", + type: { + name: "String" + } + }, + idPrefix: { + serializedName: "idPrefix", + required: true, + type: { + name: "String" + } + }, + name: { + serializedName: "name", + required: true, + type: { + name: "String" + } + }, + title: { + serializedName: "title", + type: { + name: "String" + } + }, + ontology: { + serializedName: "ontology", + readOnly: true, + type: { + name: "String" + } + }, + geometryType: { + serializedName: "geometryType", + required: true, + type: { + name: "String" + } + }, + featureTypes: { + serializedName: "featureTypes", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + properties: { + serializedName: "properties", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "DefinitionProperties" + } + } + } + }, + links: { + serializedName: "links", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "WfsEndpointLink" + } + } + } + } + } + } +}; + +export const DefinitionProperties: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "DefinitionProperties", + modelProperties: { + name: { + serializedName: "name", + required: true, + type: { + name: "String" + } + }, + required: { + serializedName: "required", + required: true, + type: { + name: "Boolean" + } + }, + type: { + serializedName: "type", + required: true, + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } + } + } +}; + +export const ExtendedGeoJsonFeatureCollectionData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ExtendedGeoJsonFeatureCollectionData", + modelProperties: { + ontology: { + serializedName: "ontology", + readOnly: true, + type: { + name: "String" + } + }, + numberReturned: { + serializedName: "numberReturned", + type: { + name: "Number" + } + }, + links: { + serializedName: "links", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "WfsEndpointLink" + } + } + } + } + } + } +}; + +export const FeatureResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "FeatureResponse", + modelProperties: { + ontology: { + serializedName: "ontology", + readOnly: true, + type: { + name: "String" + } + }, + feature: { + serializedName: "feature", + type: { + name: "Composite", + className: "GeoJsonFeature" + } + }, + links: { + serializedName: "links", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "WfsEndpointLink" + } + } + } + } + } + } +}; + +export const NumberRuleObject: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "NumberRuleObject", + modelProperties: { + range: { + serializedName: "range", + type: { + name: "Composite", + className: "RangeObject" + } + }, + color: { + serializedName: "color", + type: { + name: "String" + } + } + } + } +}; + +export const RangeObject: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RangeObject", + modelProperties: { + minimum: { + serializedName: "minimum", + type: { + name: "Number" + } + }, + maximum: { + serializedName: "maximum", + type: { + name: "Number" + } + }, + exclusiveMinimum: { + serializedName: "exclusiveMinimum", + type: { + name: "Number" + } + }, + exclusiveMaximum: { + serializedName: "exclusiveMaximum", + type: { + name: "Number" + } + } + } + } +}; + +export const BooleanRuleObject: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "BooleanRuleObject", + modelProperties: { + true: { + serializedName: "true", + type: { + name: "String" + } + }, + false: { + serializedName: "false", + type: { + name: "String" + } + } + } + } +}; + +export const GeoJsonPointData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonPointData", + modelProperties: { + coordinates: { + serializedName: "coordinates", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } +}; + +export const GeoJsonMultiPointData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonMultiPointData", + modelProperties: { + coordinates: { + serializedName: "coordinates", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } + } + } +}; + +export const GeoJsonLineStringData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonLineStringData", + modelProperties: { + coordinates: { + serializedName: "coordinates", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } + } + } +}; + +export const GeoJsonMultiLineStringData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonMultiLineStringData", + modelProperties: { + coordinates: { + serializedName: "coordinates", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } + } + } + } + } +}; + +export const GeoJsonPolygonData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonPolygonData", + modelProperties: { + coordinates: { + serializedName: "coordinates", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } + } + } + } + } +}; + +export const GeoJsonMultiPolygonData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonMultiPolygonData", + modelProperties: { + coordinates: { + serializedName: "coordinates", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } + } + } + } + } + } + } +}; + +export const GeoJsonGeometryCollectionData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonGeometryCollectionData", + modelProperties: { + geometries: { + serializedName: "geometries", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "GeoJsonGeometry" + } + } + } + } + } + } +}; + +export const BooleanTypeStyleRule: coreClient.CompositeMapper = { + serializedName: "boolean", + type: { + name: "Composite", + className: "BooleanTypeStyleRule", + uberParent: "StyleObject", + polymorphicDiscriminator: StyleObject.type.polymorphicDiscriminator, + modelProperties: { + ...StyleObject.type.modelProperties, + rules: { + serializedName: "rules", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "BooleanRuleObject" + } + } + } + } + } + } +}; + +export const NumberTypeStyleRule: coreClient.CompositeMapper = { + serializedName: "number", + type: { + name: "Composite", + className: "NumberTypeStyleRule", + uberParent: "StyleObject", + polymorphicDiscriminator: StyleObject.type.polymorphicDiscriminator, + modelProperties: { + ...StyleObject.type.modelProperties, + rules: { + serializedName: "rules", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "NumberRuleObject" + } + } + } + } + } + } +}; + +export const StringTypeStyleRule: coreClient.CompositeMapper = { + serializedName: "string", + type: { + name: "Composite", + className: "StringTypeStyleRule", + uberParent: "StyleObject", + polymorphicDiscriminator: StyleObject.type.polymorphicDiscriminator, + modelProperties: { + ...StyleObject.type.modelProperties, + rules: { + serializedName: "rules", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Dictionary", + value: { type: { name: "String" } } + } + } + } + } + } + } +}; + +export const GeoJsonGeometry: coreClient.CompositeMapper = { + serializedName: "GeoJsonGeometry", + type: { + name: "Composite", + className: "GeoJsonGeometry", + uberParent: "GeoJsonObject", + polymorphicDiscriminator: { + serializedName: "type", + clientName: "type" + }, + modelProperties: { + ...GeoJsonObject.type.modelProperties + } + } +}; + +export const GeoJsonFeature: coreClient.CompositeMapper = { + serializedName: "Feature", + type: { + name: "Composite", + className: "GeoJsonFeature", + uberParent: "GeoJsonObject", + polymorphicDiscriminator: GeoJsonObject.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonObject.type.modelProperties, + ...GeoJsonFeatureData.type.modelProperties + } + } +}; + +export const GeoJsonFeatureCollection: coreClient.CompositeMapper = { + serializedName: "FeatureCollection", + type: { + name: "Composite", + className: "GeoJsonFeatureCollection", + uberParent: "GeoJsonObject", + polymorphicDiscriminator: { + serializedName: "type", + clientName: "type" + }, + modelProperties: { + ...GeoJsonObject.type.modelProperties, + ...GeoJsonFeatureCollectionData.type.modelProperties + } + } +}; + +export const ExtendedGeoJsonFeatureCollection: coreClient.CompositeMapper = { + serializedName: "FeatureCollection", + type: { + name: "Composite", + className: "ExtendedGeoJsonFeatureCollection", + uberParent: "ExtendedGeoJsonFeatureCollectionData", + polymorphicDiscriminator: + ExtendedGeoJsonFeatureCollectionData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonFeatureCollection.type.modelProperties, + ...ExtendedGeoJsonFeatureCollectionData.type.modelProperties + } + } +}; + +export const GeoJsonPoint: coreClient.CompositeMapper = { + serializedName: "Point", + type: { + name: "Composite", + className: "GeoJsonPoint", + uberParent: "GeoJsonPointData", + polymorphicDiscriminator: GeoJsonPointData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonPointData.type.modelProperties + } + } +}; + +export const GeoJsonMultiPoint: coreClient.CompositeMapper = { + serializedName: "MultiPoint", + type: { + name: "Composite", + className: "GeoJsonMultiPoint", + uberParent: "GeoJsonMultiPointData", + polymorphicDiscriminator: + GeoJsonMultiPointData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonMultiPointData.type.modelProperties + } + } +}; + +export const GeoJsonLineString: coreClient.CompositeMapper = { + serializedName: "LineString", + type: { + name: "Composite", + className: "GeoJsonLineString", + uberParent: "GeoJsonLineStringData", + polymorphicDiscriminator: + GeoJsonLineStringData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonLineStringData.type.modelProperties + } + } +}; + +export const GeoJsonMultiLineString: coreClient.CompositeMapper = { + serializedName: "MultiLineString", + type: { + name: "Composite", + className: "GeoJsonMultiLineString", + uberParent: "GeoJsonMultiLineStringData", + polymorphicDiscriminator: + GeoJsonMultiLineStringData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonMultiLineStringData.type.modelProperties + } + } +}; + +export const GeoJsonPolygon: coreClient.CompositeMapper = { + serializedName: "Polygon", + type: { + name: "Composite", + className: "GeoJsonPolygon", + uberParent: "GeoJsonPolygonData", + polymorphicDiscriminator: GeoJsonPolygonData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonPolygonData.type.modelProperties + } + } +}; + +export const GeoJsonMultiPolygon: coreClient.CompositeMapper = { + serializedName: "MultiPolygon", + type: { + name: "Composite", + className: "GeoJsonMultiPolygon", + uberParent: "GeoJsonMultiPolygonData", + polymorphicDiscriminator: + GeoJsonMultiPolygonData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonMultiPolygonData.type.modelProperties + } + } +}; + +export const GeoJsonGeometryCollection: coreClient.CompositeMapper = { + serializedName: "GeometryCollection", + type: { + name: "Composite", + className: "GeoJsonGeometryCollection", + uberParent: "GeoJsonGeometryCollectionData", + polymorphicDiscriminator: + GeoJsonGeometryCollectionData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonGeometryCollectionData.type.modelProperties + } + } +}; + +export const AliasCreateHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "AliasCreateHeaders", + modelProperties: { + accessControlExposeHeaders: { + serializedName: "access-control-expose-headers", + type: { + name: "String" + } + } + } + } +}; + +export const DataUploadPreviewHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "DataUploadPreviewHeaders", + modelProperties: { + resourceLocation: { + serializedName: "resource-location", + type: { + name: "String" + } + } + } + } +}; + +export const DataUpdatePreviewHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "DataUpdatePreviewHeaders", + modelProperties: { + resourceLocation: { + serializedName: "resource-location", + type: { + name: "String" + } + } + } + } +}; + +export const DataDownloadPreviewHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "DataDownloadPreviewHeaders", + modelProperties: { + contentType: { + serializedName: "content-type", + type: { + name: "String" + } + } + } + } +}; + +export const DataGetOperationPreviewHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "DataGetOperationPreviewHeaders", + modelProperties: { + resourceLocation: { + serializedName: "resource-location", + type: { + name: "String" + } + } + } + } +}; + +export const DatasetCreateHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "DatasetCreateHeaders", + modelProperties: { + resourceLocation: { + serializedName: "resource-location", + type: { + name: "String" + } + } + } + } +}; + +export const DatasetGetOperationHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "DatasetGetOperationHeaders", + modelProperties: { + resourceLocation: { + serializedName: "resource-location", + type: { + name: "String" + } + } + } + } +}; + +export const ConversionConvertHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ConversionConvertHeaders", + modelProperties: { + resourceLocation: { + serializedName: "resource-location", + type: { + name: "String" + } + } + } + } +}; + +export const ConversionGetOperationHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ConversionGetOperationHeaders", + modelProperties: { + resourceLocation: { + serializedName: "resource-location", + type: { + name: "String" + } + } + } + } +}; + +export const SpatialGetGeofenceHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SpatialGetGeofenceHeaders", + modelProperties: { + xCorrelationId: { + serializedName: "x-correlation-id", + type: { + name: "String" + } + } + } + } +}; + +export const SpatialPostGeofenceHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SpatialPostGeofenceHeaders", + modelProperties: { + xCorrelationId: { + serializedName: "x-correlation-id", + type: { + name: "String" + } + } + } + } +}; + +export const TilesetCreateHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TilesetCreateHeaders", + modelProperties: { + resourceLocation: { + serializedName: "resource-location", + type: { + name: "String" + } + } + } + } +}; + +export const TilesetGetOperationHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TilesetGetOperationHeaders", + modelProperties: { + resourceLocation: { + serializedName: "resource-location", + type: { + name: "String" + } + } + } + } +}; + +export let discriminators = { + StyleObject: StyleObject, + GeoJsonObject: GeoJsonObject, + "StyleObject.boolean": BooleanTypeStyleRule, + "StyleObject.number": NumberTypeStyleRule, + "StyleObject.string": StringTypeStyleRule, + "GeoJsonObject.GeoJsonGeometry": GeoJsonGeometry, + "GeoJsonObject.Feature": GeoJsonFeature, + "GeoJsonObject.FeatureCollection": GeoJsonFeatureCollection, + "ExtendedGeoJsonFeatureCollectionData.FeatureCollection": ExtendedGeoJsonFeatureCollection, + "GeoJsonPointData.Point": GeoJsonPoint, + "GeoJsonMultiPointData.MultiPoint": GeoJsonMultiPoint, + "GeoJsonLineStringData.LineString": GeoJsonLineString, + "GeoJsonMultiLineStringData.MultiLineString": GeoJsonMultiLineString, + "GeoJsonPolygonData.Polygon": GeoJsonPolygon, + "GeoJsonMultiPolygonData.MultiPolygon": GeoJsonMultiPolygon, + "GeoJsonGeometryCollectionData.GeometryCollection": GeoJsonGeometryCollection +}; diff --git a/sdk/maps/maps-creator/src/models/parameters.ts b/sdk/maps/maps-creator/src/models/parameters.ts new file mode 100644 index 000000000000..e1b3aa342168 --- /dev/null +++ b/sdk/maps/maps-creator/src/models/parameters.ts @@ -0,0 +1,629 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { + OperationParameter, + OperationURLParameter, + OperationQueryParameter +} from "@azure/core-client"; +import { + StylesObject as StylesObjectMapper, + FeatureStatesStructure as FeatureStatesStructureMapper, + BufferRequestBody as BufferRequestBodyMapper +} from "../models/mappers"; + +export const accept: OperationParameter = { + parameterPath: "accept", + mapper: { + defaultValue: "application/json", + isConstant: true, + serializedName: "Accept", + type: { + name: "String" + } + } +}; + +export const geography: OperationURLParameter = { + parameterPath: "geography", + mapper: { + serializedName: "geography", + required: true, + type: { + name: "String" + } + } +}; + +export const apiVersion: OperationQueryParameter = { + parameterPath: "apiVersion", + mapper: { + defaultValue: "2.0", + isConstant: true, + serializedName: "api-version", + type: { + name: "String" + } + } +}; + +export const creatorDataItemId: OperationQueryParameter = { + parameterPath: ["options", "creatorDataItemId"], + mapper: { + serializedName: "creatorDataItemId", + type: { + name: "String" + } + } +}; + +export const aliasId: OperationURLParameter = { + parameterPath: "aliasId", + mapper: { + serializedName: "aliasId", + required: true, + type: { + name: "String" + } + } +}; + +export const creatorDataItemId1: OperationQueryParameter = { + parameterPath: "creatorDataItemId", + mapper: { + serializedName: "creatorDataItemId", + required: true, + type: { + name: "String" + } + } +}; + +export const nextLink: OperationURLParameter = { + parameterPath: "nextLink", + mapper: { + serializedName: "nextLink", + required: true, + type: { + name: "String" + } + }, + skipEncoding: true +}; + +export const contentType: OperationParameter = { + parameterPath: "contentType", + mapper: { + defaultValue: "application/octet-stream", + isConstant: true, + serializedName: "Content-Type", + type: { + name: "String" + } + } +}; + +export const uploadContent: OperationParameter = { + parameterPath: "uploadContent", + mapper: { + serializedName: "uploadContent", + required: true, + type: { + name: "Stream" + } + } +}; + +export const accept1: OperationParameter = { + parameterPath: "accept", + mapper: { + defaultValue: "application/json", + isConstant: true, + serializedName: "Accept", + type: { + name: "String" + } + } +}; + +export const contentType1: OperationParameter = { + parameterPath: "contentType", + mapper: { + defaultValue: "application/json", + isConstant: true, + serializedName: "Content-Type", + type: { + name: "String" + } + } +}; + +export const uploadContent1: OperationParameter = { + parameterPath: "uploadContent", + mapper: { + serializedName: "uploadContent", + required: true, + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } +}; + +export const xMsClientId: OperationParameter = { + parameterPath: "xMsClientId", + mapper: { + serializedName: "x-ms-client-id", + type: { + name: "String" + } + } +}; + +export const uploadDataDescription: OperationQueryParameter = { + parameterPath: ["options", "uploadDataDescription"], + mapper: { + serializedName: "description", + type: { + name: "String" + } + } +}; + +export const uploadDataFormat: OperationQueryParameter = { + parameterPath: "uploadDataFormat", + mapper: { + serializedName: "dataFormat", + required: true, + type: { + name: "String" + } + } +}; + +export const contentType2: OperationParameter = { + parameterPath: ["options", "contentType"], + mapper: { + defaultValue: "application/json", + isConstant: true, + serializedName: "Content-Type", + type: { + name: "String" + } + } +}; + +export const updateContent: OperationParameter = { + parameterPath: "updateContent", + mapper: { + serializedName: "updateContent", + required: true, + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } +}; + +export const uniqueDataId: OperationURLParameter = { + parameterPath: "uniqueDataId", + mapper: { + serializedName: "udid", + required: true, + type: { + name: "String" + } + } +}; + +export const accept2: OperationParameter = { + parameterPath: "accept", + mapper: { + defaultValue: + "application/json, application/vnd.geo+json, application/octet-stream", + isConstant: true, + serializedName: "Accept", + type: { + name: "String" + } + } +}; + +export const operationId: OperationURLParameter = { + parameterPath: "operationId", + mapper: { + serializedName: "operationId", + required: true, + type: { + name: "String" + } + } +}; + +export const conversionId: OperationQueryParameter = { + parameterPath: "conversionId", + mapper: { + serializedName: "conversionId", + required: true, + type: { + name: "String" + } + } +}; + +export const datasetId: OperationQueryParameter = { + parameterPath: ["options", "datasetId"], + mapper: { + serializedName: "datasetId", + type: { + name: "String" + } + } +}; + +export const descriptionDataset: OperationQueryParameter = { + parameterPath: ["options", "descriptionDataset"], + mapper: { + serializedName: "description", + type: { + name: "String" + } + } +}; + +export const datasetId1: OperationURLParameter = { + parameterPath: "datasetId", + mapper: { + serializedName: "datasetId", + required: true, + type: { + name: "String" + } + } +}; + +export const udid: OperationQueryParameter = { + parameterPath: "udid", + mapper: { + serializedName: "udid", + required: true, + type: { + name: "String" + } + } +}; + +export const outputOntology: OperationQueryParameter = { + parameterPath: "outputOntology", + mapper: { + serializedName: "outputOntology", + required: true, + type: { + name: "String" + } + } +}; + +export const description: OperationQueryParameter = { + parameterPath: ["options", "description"], + mapper: { + serializedName: "description", + type: { + name: "String" + } + } +}; + +export const conversionId1: OperationURLParameter = { + parameterPath: "conversionId", + mapper: { + serializedName: "conversionId", + required: true, + type: { + name: "String" + } + } +}; + +export const statesetCreateRequestBody: OperationParameter = { + parameterPath: "statesetCreateRequestBody", + mapper: StylesObjectMapper +}; + +export const datasetId2: OperationQueryParameter = { + parameterPath: "datasetId", + mapper: { + serializedName: "datasetId", + required: true, + type: { + name: "String" + } + } +}; + +export const statesetStyleUpdateRequestBody: OperationParameter = { + parameterPath: "statesetStyleUpdateRequestBody", + mapper: StylesObjectMapper +}; + +export const statesetId: OperationURLParameter = { + parameterPath: "statesetId", + mapper: { + serializedName: "statesetId", + required: true, + type: { + name: "String" + } + } +}; + +export const featureStateUpdateRequestBody: OperationParameter = { + parameterPath: "featureStateUpdateRequestBody", + mapper: FeatureStatesStructureMapper +}; + +export const featureId: OperationURLParameter = { + parameterPath: "featureId", + mapper: { + serializedName: "featureId", + required: true, + type: { + name: "String" + } + } +}; + +export const stateKeyName: OperationQueryParameter = { + parameterPath: "stateKeyName", + mapper: { + serializedName: "stateKeyName", + required: true, + type: { + name: "String" + } + } +}; + +export const apiVersion1: OperationQueryParameter = { + parameterPath: "apiVersion", + mapper: { + defaultValue: "1.0", + isConstant: true, + serializedName: "api-version", + type: { + name: "String" + } + } +}; + +export const format: OperationURLParameter = { + parameterPath: "format", + mapper: { + serializedName: "format", + required: true, + type: { + name: "String" + } + } +}; + +export const deviceId: OperationQueryParameter = { + parameterPath: "deviceId", + mapper: { + serializedName: "deviceId", + required: true, + type: { + name: "String" + } + } +}; + +export const latitude: OperationQueryParameter = { + parameterPath: "latitude", + mapper: { + serializedName: "lat", + required: true, + type: { + name: "Number" + } + } +}; + +export const longitude: OperationQueryParameter = { + parameterPath: "longitude", + mapper: { + serializedName: "lon", + required: true, + type: { + name: "Number" + } + } +}; + +export const z: OperationQueryParameter = { + parameterPath: ["options", "z"], + mapper: { + serializedName: "z", + type: { + name: "Number" + } + } +}; + +export const userTime: OperationQueryParameter = { + parameterPath: ["options", "userTime"], + mapper: { + serializedName: "userTime", + type: { + name: "DateTime" + } + } +}; + +export const searchBuffer: OperationQueryParameter = { + parameterPath: ["options", "searchBuffer"], + mapper: { + constraints: { + InclusiveMaximum: 500, + InclusiveMinimum: 0 + }, + serializedName: "searchBuffer", + type: { + name: "Number" + } + } +}; + +export const isAsync: OperationQueryParameter = { + parameterPath: ["options", "isAsync"], + mapper: { + serializedName: "isAsync", + type: { + name: "Boolean" + } + } +}; + +export const mode: OperationQueryParameter = { + parameterPath: ["options", "mode"], + mapper: { + serializedName: "mode", + type: { + name: "String" + } + } +}; + +export const searchGeofenceRequestBody: OperationParameter = { + parameterPath: "searchGeofenceRequestBody", + mapper: { + serializedName: "searchGeofenceRequestBody", + required: true, + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } +}; + +export const bufferRequestBody: OperationParameter = { + parameterPath: "bufferRequestBody", + mapper: BufferRequestBodyMapper +}; + +export const distances: OperationQueryParameter = { + parameterPath: "distances", + mapper: { + serializedName: "distances", + required: true, + type: { + name: "String" + } + } +}; + +export const closestPointRequestBody: OperationParameter = { + parameterPath: "closestPointRequestBody", + mapper: { + serializedName: "closestPointRequestBody", + required: true, + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } +}; + +export const numberOfClosestPoints: OperationQueryParameter = { + parameterPath: ["options", "numberOfClosestPoints"], + mapper: { + serializedName: "numberOfClosestPoints", + type: { + name: "Number" + } + } +}; + +export const pointInPolygonRequestBody: OperationParameter = { + parameterPath: "pointInPolygonRequestBody", + mapper: { + serializedName: "pointInPolygonRequestBody", + required: true, + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } +}; + +export const query: OperationQueryParameter = { + parameterPath: "query", + mapper: { + serializedName: "query", + required: true, + type: { + name: "String" + } + } +}; + +export const tilesetId: OperationURLParameter = { + parameterPath: "tilesetId", + mapper: { + serializedName: "tilesetId", + required: true, + type: { + name: "String" + } + } +}; + +export const collectionId: OperationURLParameter = { + parameterPath: "collectionId", + mapper: { + serializedName: "collectionId", + required: true, + type: { + name: "String" + } + } +}; + +export const limit: OperationQueryParameter = { + parameterPath: ["options", "limit"], + mapper: { + constraints: { + InclusiveMaximum: 50, + InclusiveMinimum: 1 + }, + serializedName: "limit", + type: { + name: "Number" + } + } +}; + +export const bbox: OperationQueryParameter = { + parameterPath: ["options", "bbox"], + mapper: { + serializedName: "bbox", + type: { + name: "String" + } + } +}; + +export const filter: OperationQueryParameter = { + parameterPath: ["options", "filter"], + mapper: { + serializedName: "filter", + type: { + name: "String" + } + } +}; diff --git a/sdk/maps/maps-creator/src/operations/alias.ts b/sdk/maps/maps-creator/src/operations/alias.ts new file mode 100644 index 000000000000..5d9606015fc4 --- /dev/null +++ b/sdk/maps/maps-creator/src/operations/alias.ts @@ -0,0 +1,445 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import "@azure/core-paging"; +import { PagedAsyncIterableIterator } from "@azure/core-paging"; +import { Alias } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; +import * as Mappers from "../models/mappers"; +import * as Parameters from "../models/parameters"; +import { CreatorClientContext } from "../creatorClientContext"; +import { + AliasListItem, + AliasListNextOptionalParams, + AliasListOptionalParams, + AliasCreateOptionalParams, + AliasCreateResponse, + AliasListOperationResponse, + AliasAssignOptionalParams, + AliasAssignResponse, + AliasDeleteOptionalParams, + AliasGetDetailsOptionalParams, + AliasGetDetailsResponse, + AliasListNextResponse +} from "../models"; + +/// +/** Class representing a Alias. */ +export class AliasImpl implements Alias { + private readonly client: CreatorClientContext; + + /** + * Initialize a new instance of the class Alias class. + * @param client Reference to the service client + */ + constructor(client: CreatorClientContext) { + this.client = client; + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a list of all previously successfully created aliases. + * + * ### Submit List Request + * + * To list all your aliases, you will issue a `GET` request with no additional parameters. + * + * ### List Data Response + * + * The List API returns the complete list of all aliases in `json` format. The response contains the + * following details for each alias resource: + * > createdTimestamp - The timestamp that the alias was created. Format yyyy-MM-ddTHH:mm:ss.sssZ + * > aliasId - The id for the alias. + * > creatorDataItemId - The id for the creator data item that this alias references (could be null + * if the alias has not been assigned). + * > lastUpdatedTimestamp - The last time the alias was assigned to a resource. Format + * yyyy-MM-ddTHH:mm:ss.sssZ + * + * A sample response returning 2 alias resources: + * + * ```json + * { + * "aliases": [ + * { + * "createdTimestamp": "2020-02-13T21:19:11.123Z", + * "aliasId": "a8a4b8bb-ecf4-fb27-a618-f41721552766", + * "creatorDataItemId": "e89aebb9-70a3-8fe1-32bb-1fbd0c725f14", + * "lastUpdatedTimestamp": "2020-02-13T21:19:22.123Z" + * }, + * { + * "createdTimestamp": "2020-02-18T19:53:33.123Z", + * "aliasId": "1856dbfc-7a66-ee5a-bf8d-51dbfe1906f6", + * "creatorDataItemId": null, + * "lastUpdatedTimestamp": "2020-02-18T19:53:33.123Z" + * } + * ] + * } + * ``` + * @param options The options parameters. + */ + public list( + options?: AliasListOptionalParams + ): PagedAsyncIterableIterator { + const iter = this.listPagingAll(options); + return { + next() { + return iter.next(); + }, + [Symbol.asyncIterator]() { + return this; + }, + byPage: () => { + return this.listPagingPage(options); + } + }; + } + + private async *listPagingPage( + options?: AliasListOptionalParams + ): AsyncIterableIterator { + let result = await this._list(options); + yield result.aliases || []; + let continuationToken = result.nextLink; + while (continuationToken) { + result = await this._listNext(continuationToken, options); + continuationToken = result.nextLink; + yield result.aliases || []; + } + } + + private async *listPagingAll( + options?: AliasListOptionalParams + ): AsyncIterableIterator { + for await (const page of this.listPagingPage(options)) { + yield* page; + } + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to create an alias. You can also assign the alias during the create + * request. An alias can reference an ID generated by a creator service, but cannot reference another + * alias ID. + * + * ### Submit Create Request + * + * To create your alias, you will use a `POST` request. If you would like to assign the alias during + * the creation, you will pass the `resourceId` query parameter. + * + * ### Create Alias Response + * + * The Create API returns a HTTP `201 Created` response with the alias resource in the body. + * + * A sample response from creating an alias: + * + * ```json + * { + * "createdTimestamp": "2020-02-13T21:19:11.123Z", + * "aliasId": "a8a4b8bb-ecf4-fb27-a618-f41721552766", + * "creatorDataItemId": "e89aebb9-70a3-8fe1-32bb-1fbd0c725f14", + * "lastUpdatedTimestamp": "2020-02-13T21:19:22.123Z" + * } + * ``` + * @param options The options parameters. + */ + create(options?: AliasCreateOptionalParams): Promise { + return this.client.sendOperationRequest({ options }, createOperationSpec); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a list of all previously successfully created aliases. + * + * ### Submit List Request + * + * To list all your aliases, you will issue a `GET` request with no additional parameters. + * + * ### List Data Response + * + * The List API returns the complete list of all aliases in `json` format. The response contains the + * following details for each alias resource: + * > createdTimestamp - The timestamp that the alias was created. Format yyyy-MM-ddTHH:mm:ss.sssZ + * > aliasId - The id for the alias. + * > creatorDataItemId - The id for the creator data item that this alias references (could be null + * if the alias has not been assigned). + * > lastUpdatedTimestamp - The last time the alias was assigned to a resource. Format + * yyyy-MM-ddTHH:mm:ss.sssZ + * + * A sample response returning 2 alias resources: + * + * ```json + * { + * "aliases": [ + * { + * "createdTimestamp": "2020-02-13T21:19:11.123Z", + * "aliasId": "a8a4b8bb-ecf4-fb27-a618-f41721552766", + * "creatorDataItemId": "e89aebb9-70a3-8fe1-32bb-1fbd0c725f14", + * "lastUpdatedTimestamp": "2020-02-13T21:19:22.123Z" + * }, + * { + * "createdTimestamp": "2020-02-18T19:53:33.123Z", + * "aliasId": "1856dbfc-7a66-ee5a-bf8d-51dbfe1906f6", + * "creatorDataItemId": null, + * "lastUpdatedTimestamp": "2020-02-18T19:53:33.123Z" + * } + * ] + * } + * ``` + * @param options The options parameters. + */ + private _list( + options?: AliasListOptionalParams + ): Promise { + return this.client.sendOperationRequest({ options }, listOperationSpec); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to assign an alias to reference a resource. + * + * ### Submit Assign Request + * + * To assign your alias to a resource, you will use a `PUT` request with the `aliasId` in the path and + * the `creatorDataItemId` passed as a query parameter. + * + * ### Assign Alias Response + * + * The Assign API returns a HTTP `200 OK` response with the updated alias resource in the body, if the + * alias was assigned successfully. A sample of the assign response is + * + * ```json + * { + * "createdTimestamp": "2020-02-13T21:19:11.123Z", + * "aliasId": "a8a4b8bb-ecf4-fb27-a618-f41721552766", + * "creatorDataItemId": "e89aebb9-70a3-8fe1-32bb-1fbd0c725f14", + * "lastUpdatedTimestamp": "2020-02-13T21:19:22.123Z" + * } + * ``` + * @param aliasId The unique id that references an existing alias. + * @param creatorDataItemId The unique id that references a creator data item to be aliased. + * @param options The options parameters. + */ + assign( + aliasId: string, + creatorDataItemId: string, + options?: AliasAssignOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { aliasId, creatorDataItemId, options }, + assignOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to delete a previously created alias. You can also use this API to delete + * old/unused aliases to create space for new content.This API does not delete the references resource, + * only the alias referencing the resource. + * + * ### Submit Delete Request + * + * To delete your alias you will issue a `DELETE` request where the path will contain the `aliasId` of + * the alias to delete. + * + * ### Delete Alias Response + * + * The Delete API returns a HTTP `204 No Content` response with an empty body, if the alias was deleted + * successfully. + * @param aliasId The unique id that references an existing alias. + * @param options The options parameters. + */ + delete(aliasId: string, options?: AliasDeleteOptionalParams): Promise { + return this.client.sendOperationRequest( + { aliasId, options }, + deleteOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch the details of a previously created alias. + * + * ### Submit Get Details Request + * + * To get the details of your alias, you will issue a `GET` request with the `aliasId` in the path. + * + * ### Get Details Response + * + * The Get Details API returns the previously created alias in `json` format. The response contains the + * following details for the alias resource: + * > createdTimestamp - The timestamp that the alias was created. + * > aliasId - The id for the alias. + * > creatorDataItemId - The id for the creator data item that this alias references (could be null + * if the alias has not been assigned). + * > lastUpdatedTimestamp - The last time the alias was assigned to a resource. + * + * Here's a sample response: + * ```json + * { + * "createdTimestamp": "2020-02-13T21:19:11.123Z", + * "aliasId": "a8a4b8bb-ecf4-fb27-a618-f41721552766", + * "creatorDataItemId": "e89aebb9-70a3-8fe1-32bb-1fbd0c725f14", + * "lastUpdatedTimestamp": "2020-02-13T21:19:22.123Z" + * } + * ``` + * @param aliasId The unique id that references an existing alias. + * @param options The options parameters. + */ + getDetails( + aliasId: string, + options?: AliasGetDetailsOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { aliasId, options }, + getDetailsOperationSpec + ); + } + + /** + * ListNext + * @param nextLink The nextLink from the previous successful call to the List method. + * @param options The options parameters. + */ + private _listNext( + nextLink: string, + options?: AliasListNextOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { nextLink, options }, + listNextOperationSpec + ); + } +} +// Operation Specifications +const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); + +const createOperationSpec: coreClient.OperationSpec = { + path: "/aliases", + httpMethod: "POST", + responses: { + 201: { + bodyMapper: Mappers.AliasesCreateResponse, + headersMapper: Mappers.AliasCreateHeaders + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion, Parameters.creatorDataItemId], + urlParameters: [Parameters.geography], + headerParameters: [Parameters.accept], + serializer +}; +const listOperationSpec: coreClient.OperationSpec = { + path: "/aliases", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.AliasListResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography], + headerParameters: [Parameters.accept], + serializer +}; +const assignOperationSpec: coreClient.OperationSpec = { + path: "/aliases/{aliasId}", + httpMethod: "PUT", + responses: { + 200: { + bodyMapper: Mappers.AliasListItem + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion, Parameters.creatorDataItemId1], + urlParameters: [Parameters.geography, Parameters.aliasId], + headerParameters: [Parameters.accept], + serializer +}; +const deleteOperationSpec: coreClient.OperationSpec = { + path: "/aliases/{aliasId}", + httpMethod: "DELETE", + responses: { + 204: {}, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.aliasId], + headerParameters: [Parameters.accept], + serializer +}; +const getDetailsOperationSpec: coreClient.OperationSpec = { + path: "/aliases/{aliasId}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.AliasListItem + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.aliasId], + headerParameters: [Parameters.accept], + serializer +}; +const listNextOperationSpec: coreClient.OperationSpec = { + path: "{nextLink}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.AliasListResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.nextLink], + headerParameters: [Parameters.accept], + serializer +}; diff --git a/sdk/maps/maps-creator/src/operations/conversion.ts b/sdk/maps/maps-creator/src/operations/conversion.ts new file mode 100644 index 000000000000..ea3eb40775eb --- /dev/null +++ b/sdk/maps/maps-creator/src/operations/conversion.ts @@ -0,0 +1,593 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import "@azure/core-paging"; +import { PagedAsyncIterableIterator } from "@azure/core-paging"; +import { Conversion } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; +import * as Mappers from "../models/mappers"; +import * as Parameters from "../models/parameters"; +import { CreatorClientContext } from "../creatorClientContext"; +import { LROPoller, shouldDeserializeLRO } from "../lro"; +import { PollerLike, PollOperationState } from "@azure/core-lro"; +import { + ConversionListDetailInfo, + ConversionListNextOptionalParams, + ConversionListOptionalParams, + ConversionConvertOptionalParams, + ConversionConvertResponse, + ConversionListOperationResponse, + ConversionGetOptionalParams, + ConversionGetResponse, + ConversionDeleteOptionalParams, + ConversionGetOperationOptionalParams, + ConversionGetOperationResponse, + ConversionListNextResponse +} from "../models"; + +/// +/** Class representing a Conversion. */ +export class ConversionImpl implements Conversion { + private readonly client: CreatorClientContext; + + /** + * Initialize a new instance of the class Conversion class. + * @param client Reference to the service client + */ + constructor(client: CreatorClientContext) { + this.client = client; + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a list of all successful data conversions submitted previously + * using the [Conversion + * API](https://docs.microsoft.com/en-us/rest/api/maps/conversion/convertpreview). + * + * ### Submit List Request + * + * To list all successful conversions you will issue a `GET` request with no additional parameters. + * + * ### List Data Response + * + * The Conversion List API returns the complete list of all conversion details in `json` format.
+ * + * Here is a sample response returning the details of two successful conversion requests: + * + *
+ * + * ```json + * { + * "conversions": + * [ + * { + * "conversionId": "54398242-ea6c-1f31-4fa6-79b1ae0fc24d", + * "udid": "31838736-8b84-11ea-bc55-0242ac130003", + * "created": "5/19/2020 9:00:00 AM +00:00", + * "description": "User provided description.", + * "featureCounts": { + * "DIR": 1, + * "LVL": 3, + * "FCL": 1, + * "UNIT": 150, + * "CTG": 8, + * "AEL": 0, + * "OPN": 10 + * } + * }, + * { + * "conversionId": "2acf7d32-8b84-11ea-bc55-0242ac130003", + * "udid": "1214bc58-8b84-11ea-bc55-0242ac1300039", + * "created": "5/19/2020 9:00:00 AM +00:00", + * "description": "User provided description.", + * "featureCounts": { + * "DIR": 1, + * "LVL": 3, + * "FCL": 1, + * "UNIT": 150, + * "CTG": 8, + * "AEL": 0, + * "OPN": 10 + * } + * } + * ] + * } + * ``` + * + *
+ * @param options The options parameters. + */ + public list( + options?: ConversionListOptionalParams + ): PagedAsyncIterableIterator { + const iter = this.listPagingAll(options); + return { + next() { + return iter.next(); + }, + [Symbol.asyncIterator]() { + return this; + }, + byPage: () => { + return this.listPagingPage(options); + } + }; + } + + private async *listPagingPage( + options?: ConversionListOptionalParams + ): AsyncIterableIterator { + let result = await this._list(options); + yield result.conversions || []; + let continuationToken = result.nextLink; + while (continuationToken) { + result = await this._listNext(continuationToken, options); + continuationToken = result.nextLink; + yield result.conversions || []; + } + } + + private async *listPagingAll( + options?: ConversionListOptionalParams + ): AsyncIterableIterator { + for await (const page of this.listPagingPage(options)) { + yield* page; + } + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * The Conversion API lets the caller import a set of DWG design files as a zipped [Drawing + * Package](https://aka.ms/am-drawing-package) into Azure Maps. The [Drawing + * Package](https://aka.ms/am-drawing-package) should first be uploaded using the [Azure Maps Data + * Service](https://docs.microsoft.com/rest/api/maps/data). Once uploaded, use the `udid` returned by + * the [Data Upload API](https://docs.microsoft.com/rest/api/maps/data/uploadpreview) to call this + * Conversion API. + * + * ## Convert DWG package + * + * The Conversion API performs a [long-running request](https://aka.ms/am-creator-lrt-v2). + * + * ## Debug DWG package issues + * + * + * During the Conversion process, if there are any issues with the DWG package [errors and + * warnings](https://aka.ms/am-conversion-errors) are provided in the response along with a *diagnostic + * package* to visualize and diagnose these issues. In case any issues are encountered with your DWG + * package, the Conversion operation status process as detailed + * [here](https://aka.ms/am-creator-lrt-v2) returns the location of the *diagnostic package* that can + * be downloaded by the caller to help them visualize and diagnose these issues. The *diagnostic + * package* location can be found in the properties section of the conversion operation status response + * and looks like the following: + * + * ```json + * { + * "properties": { + * "diagnosticPackageLocation": + * "https://us.atlas.microsoft.com/mapdata/{DiagnosticPackageId}?api-version=1.0" + * } + * } + * ``` + * + * The *diagnostic package* can be downloaded by executing a `HTTP GET` request on the + * `diagnosticPackageLocation`. + * For more details on how to use the tool to visualize and diagnose all the errors and warnings see + * [Drawing Error Visualizer](https://aka.ms/am-drawing-errors-visualizer).
+ * + * A conversion operation will be marked as *success* if there are zero or more warnings but will be + * marked as *failed* if any errors are encountered. + * @param udid The unique data id for the content. The `udid` must have been obtained from a successful + * [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) call. + * @param outputOntology Output ontology version. "facility-2.0" is the only supported value at this + * time. Please refer to this + * [article](https://docs.microsoft.com/en-us/azure/azure-maps/creator-facility-ontology) for more + * information about Azure Maps Creator ontologies. + * @param options The options parameters. + */ + async beginConvert( + udid: string, + outputOntology: string, + options?: ConversionConvertOptionalParams + ): Promise< + PollerLike< + PollOperationState, + ConversionConvertResponse + > + > { + const directSendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ): Promise => { + return this.client.sendOperationRequest(args, spec); + }; + const sendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ) => { + let currentRawResponse: + | coreClient.FullOperationResponse + | undefined = undefined; + const providedCallback = args.options?.onResponse; + const callback: coreClient.RawResponseCallback = ( + rawResponse: coreClient.FullOperationResponse, + flatResponse: unknown + ) => { + currentRawResponse = rawResponse; + providedCallback?.(rawResponse, flatResponse); + }; + const updatedArgs = { + ...args, + options: { + ...args.options, + onResponse: callback + } + }; + const flatResponse = await directSendOperation(updatedArgs, spec); + return { flatResponse, rawResponse: currentRawResponse! }; + }; + + return new LROPoller( + { intervalInMs: options?.updateIntervalInMs }, + { udid, outputOntology, options }, + convertOperationSpec, + sendOperation, + "location" + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * The Conversion API lets the caller import a set of DWG design files as a zipped [Drawing + * Package](https://aka.ms/am-drawing-package) into Azure Maps. The [Drawing + * Package](https://aka.ms/am-drawing-package) should first be uploaded using the [Azure Maps Data + * Service](https://docs.microsoft.com/rest/api/maps/data). Once uploaded, use the `udid` returned by + * the [Data Upload API](https://docs.microsoft.com/rest/api/maps/data/uploadpreview) to call this + * Conversion API. + * + * ## Convert DWG package + * + * The Conversion API performs a [long-running request](https://aka.ms/am-creator-lrt-v2). + * + * ## Debug DWG package issues + * + * + * During the Conversion process, if there are any issues with the DWG package [errors and + * warnings](https://aka.ms/am-conversion-errors) are provided in the response along with a *diagnostic + * package* to visualize and diagnose these issues. In case any issues are encountered with your DWG + * package, the Conversion operation status process as detailed + * [here](https://aka.ms/am-creator-lrt-v2) returns the location of the *diagnostic package* that can + * be downloaded by the caller to help them visualize and diagnose these issues. The *diagnostic + * package* location can be found in the properties section of the conversion operation status response + * and looks like the following: + * + * ```json + * { + * "properties": { + * "diagnosticPackageLocation": + * "https://us.atlas.microsoft.com/mapdata/{DiagnosticPackageId}?api-version=1.0" + * } + * } + * ``` + * + * The *diagnostic package* can be downloaded by executing a `HTTP GET` request on the + * `diagnosticPackageLocation`. + * For more details on how to use the tool to visualize and diagnose all the errors and warnings see + * [Drawing Error Visualizer](https://aka.ms/am-drawing-errors-visualizer).
+ * + * A conversion operation will be marked as *success* if there are zero or more warnings but will be + * marked as *failed* if any errors are encountered. + * @param udid The unique data id for the content. The `udid` must have been obtained from a successful + * [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) call. + * @param outputOntology Output ontology version. "facility-2.0" is the only supported value at this + * time. Please refer to this + * [article](https://docs.microsoft.com/en-us/azure/azure-maps/creator-facility-ontology) for more + * information about Azure Maps Creator ontologies. + * @param options The options parameters. + */ + async beginConvertAndWait( + udid: string, + outputOntology: string, + options?: ConversionConvertOptionalParams + ): Promise { + const poller = await this.beginConvert(udid, outputOntology, options); + return poller.pollUntilDone(); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a list of all successful data conversions submitted previously + * using the [Conversion + * API](https://docs.microsoft.com/en-us/rest/api/maps/conversion/convertpreview). + * + * ### Submit List Request + * + * To list all successful conversions you will issue a `GET` request with no additional parameters. + * + * ### List Data Response + * + * The Conversion List API returns the complete list of all conversion details in `json` format.
+ * + * Here is a sample response returning the details of two successful conversion requests: + * + *
+ * + * ```json + * { + * "conversions": + * [ + * { + * "conversionId": "54398242-ea6c-1f31-4fa6-79b1ae0fc24d", + * "udid": "31838736-8b84-11ea-bc55-0242ac130003", + * "created": "5/19/2020 9:00:00 AM +00:00", + * "description": "User provided description.", + * "featureCounts": { + * "DIR": 1, + * "LVL": 3, + * "FCL": 1, + * "UNIT": 150, + * "CTG": 8, + * "AEL": 0, + * "OPN": 10 + * } + * }, + * { + * "conversionId": "2acf7d32-8b84-11ea-bc55-0242ac130003", + * "udid": "1214bc58-8b84-11ea-bc55-0242ac1300039", + * "created": "5/19/2020 9:00:00 AM +00:00", + * "description": "User provided description.", + * "featureCounts": { + * "DIR": 1, + * "LVL": 3, + * "FCL": 1, + * "UNIT": 150, + * "CTG": 8, + * "AEL": 0, + * "OPN": 10 + * } + * } + * ] + * } + * ``` + * + *
+ * @param options The options parameters. + */ + private _list( + options?: ConversionListOptionalParams + ): Promise { + return this.client.sendOperationRequest({ options }, listOperationSpec); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a successful data conversion submitted previously using the + * [Conversion API](https://docs.microsoft.com/en-us/rest/api/maps/conversion/convertpreview). + * @param conversionId The conversion id for the content. The `conversionId` must have been obtained + * from a successful [Conversion + * API](https://docs.microsoft.com/en-us/rest/api/maps/v2/conversion/convert) call. + * @param options The options parameters. + */ + get( + conversionId: string, + options?: ConversionGetOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { conversionId, options }, + getOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to delete any data conversions created previously using the [Conversion + * API](https://docs.microsoft.com/en-us/rest/api/maps/conversion/convertpreview). + * + * ### Submit Delete Request + * + * To delete your conversion data you will issue a `DELETE` request where the path will contain the + * `conversionId` of the data to delete. + * + * ### Conversion Delete Response + * + * The Conversion Delete API returns a HTTP `204 No Content` response with an empty body, if the + * converted data resources were deleted successfully.
+ * A HTTP `400 Bad Request` error response will be returned if no resource associated with the + * passed-in `conversionId` is found. + * @param conversionId The conversion id for the content. The `conversionId` must have been obtained + * from a successful [Conversion + * API](https://docs.microsoft.com/en-us/rest/api/maps/v2/conversion/convert) call. + * @param options The options parameters. + */ + delete( + conversionId: string, + options?: ConversionDeleteOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { conversionId, options }, + deleteOperationSpec + ); + } + + /** + * This path will be obtained from a call to POST /conversions. While in progress, an http200 will be + * returned with no extra headers - followed by an http200 with Resource-Location header once + * successfully completed. + * @param operationId The ID to query the status for the dataset create/import request. + * @param options The options parameters. + */ + getOperation( + operationId: string, + options?: ConversionGetOperationOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { operationId, options }, + getOperationOperationSpec + ); + } + + /** + * ListNext + * @param nextLink The nextLink from the previous successful call to the List method. + * @param options The options parameters. + */ + private _listNext( + nextLink: string, + options?: ConversionListNextOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { nextLink, options }, + listNextOperationSpec + ); + } +} +// Operation Specifications +const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); + +const convertOperationSpec: coreClient.OperationSpec = { + path: "/conversions", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.ConversionConvertHeaders + }, + 201: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.ConversionConvertHeaders + }, + 202: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.ConversionConvertHeaders + }, + 204: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.ConversionConvertHeaders + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.udid, + Parameters.outputOntology, + Parameters.description + ], + urlParameters: [Parameters.geography], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const listOperationSpec: coreClient.OperationSpec = { + path: "/conversions", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.ConversionListResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getOperationSpec: coreClient.OperationSpec = { + path: "/conversions/{conversionId}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.ConversionListDetailInfo + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.conversionId1], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const deleteOperationSpec: coreClient.OperationSpec = { + path: "/conversions/{conversionId}", + httpMethod: "DELETE", + responses: { + 204: {}, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.conversionId1], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getOperationOperationSpec: coreClient.OperationSpec = { + path: "/conversions/operations/{operationId}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.ConversionGetOperationHeaders + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.operationId], + headerParameters: [Parameters.accept], + serializer +}; +const listNextOperationSpec: coreClient.OperationSpec = { + path: "{nextLink}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.ConversionListResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.nextLink], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; diff --git a/sdk/maps/maps-creator/src/operations/data.ts b/sdk/maps/maps-creator/src/operations/data.ts new file mode 100644 index 000000000000..33033f61a396 --- /dev/null +++ b/sdk/maps/maps-creator/src/operations/data.ts @@ -0,0 +1,1051 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { Data } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; +import * as coreRestPipeline from "@azure/core-rest-pipeline"; +import * as Mappers from "../models/mappers"; +import * as Parameters from "../models/parameters"; +import { CreatorClientContext } from "../creatorClientContext"; +import { LROPoller, shouldDeserializeLRO } from "../lro"; +import { PollerLike, PollOperationState } from "@azure/core-lro"; +import { + UploadDataFormat, + DataUploadPreview$binaryOptionalParams, + DataUploadPreview$jsonOptionalParams, + DataUploadPreviewResponse, + DataListPreviewOptionalParams, + DataListPreviewResponse, + DataUpdatePreviewOptionalParams, + DataUpdatePreviewResponse, + DataDownloadPreviewOptionalParams, + DataDownloadPreviewResponse, + DataDeletePreviewOptionalParams, + DataGetOperationPreviewOptionalParams, + DataGetOperationPreviewResponse +} from "../models"; + +/** Class representing a Data. */ +export class DataImpl implements Data { + private readonly client: CreatorClientContext; + + /** + * Initialize a new instance of the class Data class. + * @param client Reference to the service client + */ + constructor(client: CreatorClientContext) { + this.client = client; + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * The Data Upload API allows the caller to upload data content to the Azure Maps service. + * You can use this API in a scenario like uploading a collection of Geofences in `GeoJSON` + * format, for use in our [Azure Maps Geofencing + * Service](https://docs.microsoft.com/rest/api/maps/spatial). + * + * ## Submit Upload Request + * + * To upload your content you will use a `POST` request. The request body will contain the data to + * upload. The + * `dataFormat` query parameter will contain the format for the data, the `dataSharingLevel` query + * parameter + * can contain the sharing level for the data. The `Content-Type` header will be set to the content + * type of the + * data. + * + * For example, to upload a collection of geofences in `GeoJSON` format, set the request body to the + * geofence + * content. Set the `dataFormat` query parameter to _geojson_, and set the `Content-Type` header to + * either one + * of the following media types: + * + * - `application/json` + * - `application/vnd.geo+json` + * - `application/octet-stream` + * + * Here's a sample request body for uploading a simple Geofence represented as a circle geometry using + * a center + * point and a radius. The sample below is in `GeoJSON`: + * + * ```json + * { + * "type": "FeatureCollection", + * "features": [{ + * "type": "Feature", + * "geometry": { + * "type": "Point", + * "coordinates": [-122.126986, 47.639754] + * }, + * "properties": { + * "geometryId": "001", + * "radius": 500 + * } + * }] + * } + * ``` + * + * The Data Upload API performs a + * [long-running request](https://aka.ms/am-creator-lrt-v2). + * + * ## Data Upload Limits + * + * Please, be aware that currently every Azure Maps account has a [data storage + * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). + * + * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http + * error response. + * You can always use the [Data Delete + * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to + * delete old/unused content and create space for new uploads. + * @param uploadDataFormat Data format of the content being uploaded. + * @param contentType Upload file type + * @param uploadContent The content to upload. + * @param options The options parameters. + */ + beginUploadPreview( + uploadDataFormat: UploadDataFormat, + contentType: "application/octet-stream", + uploadContent: coreRestPipeline.RequestBodyType, + options?: DataUploadPreview$binaryOptionalParams + ): Promise< + PollerLike< + PollOperationState, + DataUploadPreviewResponse + > + >; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * The Data Upload API allows the caller to upload data content to the Azure Maps service. + * You can use this API in a scenario like uploading a collection of Geofences in `GeoJSON` + * format, for use in our [Azure Maps Geofencing + * Service](https://docs.microsoft.com/rest/api/maps/spatial). + * + * ## Submit Upload Request + * + * To upload your content you will use a `POST` request. The request body will contain the data to + * upload. The + * `dataFormat` query parameter will contain the format for the data, the `dataSharingLevel` query + * parameter + * can contain the sharing level for the data. The `Content-Type` header will be set to the content + * type of the + * data. + * + * For example, to upload a collection of geofences in `GeoJSON` format, set the request body to the + * geofence + * content. Set the `dataFormat` query parameter to _geojson_, and set the `Content-Type` header to + * either one + * of the following media types: + * + * - `application/json` + * - `application/vnd.geo+json` + * - `application/octet-stream` + * + * Here's a sample request body for uploading a simple Geofence represented as a circle geometry using + * a center + * point and a radius. The sample below is in `GeoJSON`: + * + * ```json + * { + * "type": "FeatureCollection", + * "features": [{ + * "type": "Feature", + * "geometry": { + * "type": "Point", + * "coordinates": [-122.126986, 47.639754] + * }, + * "properties": { + * "geometryId": "001", + * "radius": 500 + * } + * }] + * } + * ``` + * + * The Data Upload API performs a + * [long-running request](https://aka.ms/am-creator-lrt-v2). + * + * ## Data Upload Limits + * + * Please, be aware that currently every Azure Maps account has a [data storage + * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). + * + * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http + * error response. + * You can always use the [Data Delete + * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to + * delete old/unused content and create space for new uploads. + * @param uploadDataFormat Data format of the content being uploaded. + * @param contentType Body Parameter content-type + * @param uploadContent The content to upload. + * @param options The options parameters. + */ + beginUploadPreview( + uploadDataFormat: UploadDataFormat, + contentType: "application/json", + uploadContent: Record, + options?: DataUploadPreview$jsonOptionalParams + ): Promise< + PollerLike< + PollOperationState, + DataUploadPreviewResponse + > + >; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * The Data Upload API allows the caller to upload data content to the Azure Maps service. + * You can use this API in a scenario like uploading a collection of Geofences in `GeoJSON` + * format, for use in our [Azure Maps Geofencing + * Service](https://docs.microsoft.com/rest/api/maps/spatial). + * + * ## Submit Upload Request + * + * To upload your content you will use a `POST` request. The request body will contain the data to + * upload. The + * `dataFormat` query parameter will contain the format for the data, the `dataSharingLevel` query + * parameter + * can contain the sharing level for the data. The `Content-Type` header will be set to the content + * type of the + * data. + * + * For example, to upload a collection of geofences in `GeoJSON` format, set the request body to the + * geofence + * content. Set the `dataFormat` query parameter to _geojson_, and set the `Content-Type` header to + * either one + * of the following media types: + * + * - `application/json` + * - `application/vnd.geo+json` + * - `application/octet-stream` + * + * Here's a sample request body for uploading a simple Geofence represented as a circle geometry using + * a center + * point and a radius. The sample below is in `GeoJSON`: + * + * ```json + * { + * "type": "FeatureCollection", + * "features": [{ + * "type": "Feature", + * "geometry": { + * "type": "Point", + * "coordinates": [-122.126986, 47.639754] + * }, + * "properties": { + * "geometryId": "001", + * "radius": 500 + * } + * }] + * } + * ``` + * + * The Data Upload API performs a + * [long-running request](https://aka.ms/am-creator-lrt-v2). + * + * ## Data Upload Limits + * + * Please, be aware that currently every Azure Maps account has a [data storage + * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). + * + * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http + * error response. + * You can always use the [Data Delete + * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to + * delete old/unused content and create space for new uploads. + * @param args Includes all the parameters for this operation. + */ + async beginUploadPreview( + ...args: + | [ + UploadDataFormat, + "application/octet-stream", + coreRestPipeline.RequestBodyType, + DataUploadPreview$binaryOptionalParams? + ] + | [ + UploadDataFormat, + "application/json", + Record, + DataUploadPreview$jsonOptionalParams? + ] + ): Promise< + PollerLike< + PollOperationState, + DataUploadPreviewResponse + > + > { + let operationSpec: coreClient.OperationSpec; + let operationArguments: coreClient.OperationArguments; + let options; + if (args[1] === "application/octet-stream") { + operationSpec = uploadPreview$binaryOperationSpec; + operationArguments = { + uploadDataFormat: args[0], + contentType: args[1], + uploadContent: args[2], + options: args[3] + }; + options = args[3]; + } else if (args[1] === "application/json") { + operationSpec = uploadPreview$jsonOperationSpec; + operationArguments = { + uploadDataFormat: args[0], + contentType: args[1], + uploadContent: args[2], + options: args[3] + }; + options = args[3]; + } else { + throw new TypeError( + `"contentType" must be a valid value but instead was "${args[1]}".` + ); + } + operationArguments.options = this.getOperationOptions(options, "location"); + const directSendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ): Promise => { + return this.client.sendOperationRequest(args, spec); + }; + const sendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ) => { + let currentRawResponse: + | coreClient.FullOperationResponse + | undefined = undefined; + const providedCallback = args.options?.onResponse; + const callback: coreClient.RawResponseCallback = ( + rawResponse: coreClient.FullOperationResponse, + flatResponse: unknown + ) => { + currentRawResponse = rawResponse; + providedCallback?.(rawResponse, flatResponse); + }; + const updatedArgs = { + ...args, + options: { + ...args.options, + onResponse: callback + } + }; + const flatResponse = await directSendOperation(updatedArgs, spec); + return { flatResponse, rawResponse: currentRawResponse! }; + }; + + return new LROPoller( + { intervalInMs: options?.updateIntervalInMs }, + operationArguments, + operationSpec, + sendOperation, + "location" + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * The Data Upload API allows the caller to upload data content to the Azure Maps service. + * You can use this API in a scenario like uploading a collection of Geofences in `GeoJSON` + * format, for use in our [Azure Maps Geofencing + * Service](https://docs.microsoft.com/rest/api/maps/spatial). + * + * ## Submit Upload Request + * + * To upload your content you will use a `POST` request. The request body will contain the data to + * upload. The + * `dataFormat` query parameter will contain the format for the data, the `dataSharingLevel` query + * parameter + * can contain the sharing level for the data. The `Content-Type` header will be set to the content + * type of the + * data. + * + * For example, to upload a collection of geofences in `GeoJSON` format, set the request body to the + * geofence + * content. Set the `dataFormat` query parameter to _geojson_, and set the `Content-Type` header to + * either one + * of the following media types: + * + * - `application/json` + * - `application/vnd.geo+json` + * - `application/octet-stream` + * + * Here's a sample request body for uploading a simple Geofence represented as a circle geometry using + * a center + * point and a radius. The sample below is in `GeoJSON`: + * + * ```json + * { + * "type": "FeatureCollection", + * "features": [{ + * "type": "Feature", + * "geometry": { + * "type": "Point", + * "coordinates": [-122.126986, 47.639754] + * }, + * "properties": { + * "geometryId": "001", + * "radius": 500 + * } + * }] + * } + * ``` + * + * The Data Upload API performs a + * [long-running request](https://aka.ms/am-creator-lrt-v2). + * + * ## Data Upload Limits + * + * Please, be aware that currently every Azure Maps account has a [data storage + * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). + * + * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http + * error response. + * You can always use the [Data Delete + * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to + * delete old/unused content and create space for new uploads. + * @param args Includes all the parameters for this operation. + */ + async beginUploadPreviewAndWait( + ...args: + | [ + UploadDataFormat, + "application/octet-stream", + coreRestPipeline.RequestBodyType, + DataUploadPreview$binaryOptionalParams? + ] + | [ + UploadDataFormat, + "application/json", + Record, + DataUploadPreview$jsonOptionalParams? + ] + ): Promise { + if (args[1] === "application/octet-stream") { + const poller = await this.beginUploadPreview(...args); + return poller.pollUntilDone(); + } else if (args[1] === "application/json") { + const poller = await this.beginUploadPreview(...args); + return poller.pollUntilDone(); + } + throw new Error("Impossible case"); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * This API allows the caller to fetch a list of all content uploaded previously using the [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview). + * + * + * ### Submit List Request + * + * To list all your map data content you will issue a `GET` request with no additional parameters. + * + * + * ### List Data Response + * + * The Data List API returns the complete list of all data in `json` format. The response contains the + * following details for each data resource: + * + * > udid - The unique data id for the data resource. + * + * > location - The location of the data resource. Execute a HTTP `GET` on this location to download + * the data. + * + * + * Here's a sample response returning the `udid` and `location` of 3 data resources: + * + *
+ * + * ```json + * { + * "mapDataList": + * [ + * { + * "udid": "9a1288fa-1858-4a3b-b68d-13a8j5af7d7c", + * "location": + * "https://us.atlas.microsoft.com/mapData/9a1288fa-1858-4a3b-b68d-13a8j5af7d7c?api-version=1.0", + * "sizeInBytes": 29920, + * "uploadStatus": "Completed" + * }, + * { + * "udid": "8b1288fa-1958-4a2b-b68e-13a7i5af7d7c", + * "location": + * "https://us.atlas.microsoft.com/mapData/8b1288fa-1958-4a2b-b68e-13a7i5af7d7c?api-version=1.0", + * "sizeInBytes": 1339, + * "uploadStatus": "Completed" + * }, + * { + * "udid": "7c1288fa-2058-4a1b-b68f-13a6h5af7d7c", + * "location": + * "https://us.atlas.microsoft.com/mapData/7c1288fa-2058-4a1b-b68f-13a6h5af7d7c?api-version=1.0", + * "sizeInBytes": 1650, + * "uploadStatus": "Pending" + * }] + * } + * ``` + * + *
+ * @param options The options parameters. + */ + listPreview( + options?: DataListPreviewOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { options }, + listPreviewOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * The Data Update API allows the caller to update a previously uploaded data content. + * + * You can use this API in a scenario like adding or removing geofences to or from an existing + * collection of geofences. + * Geofences are uploaded using the [Data Upload + * API](https://docs.microsoft.com/rest/api/maps/data%20v2/uploadpreview), for + * use in the [Azure Maps Geofencing Service](https://docs.microsoft.com/rest/api/maps/spatial). + * + * Please note that the Update API will *replace* and *override* the existing data content. + * + * ## Submit Update Request + * + * To update your content you will use a `PUT` request. The request body will contain the new data that + * will replace + * the existing data. The `Content-Type` header will be set to the content type of the data, and the + * path will contain + * the `udid` of the data to be update. + * + * For example, to update a collection of geofences that were previously uploaded using the Upload API, + * place the new + * geofence content in the request body. Set the `udid` parameter in the path to the `udid` of the data + * received + * previously in the upload API response. And set the `Content-Type` header to one of the following + * media types: + * + * - `application/json` + * - `application/vnd.geo+json` + * - `application/octet-stream` + * + * Here's a sample request body for updating a simple Geofence. It's represented as a circle geometry + * using a center + * point and a radius. The sample below is in `GeoJSON`: + * + * ```json + * { + * "type": "FeatureCollection", + * "features": [{ + * "type": "Feature", + * "geometry": { + * "type": "Point", + * "coordinates": [-122.126986, 47.639754] + * }, + * "properties": { + * "geometryId": "001", + * "radius": 500 + * } + * }] + * } + * ``` + * + * The previously uploaded geofence had a radius of 100m. The above request will update it to 500m. + * + * The Data Update API performs a + * [long-running request](https://aka.ms/am-creator-lrt-v2). + * + * ## Data Update Limits + * + * Please, be aware that currently every Azure Maps account has a [data storage + * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). + * + * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http + * error response. + * You can always use the [Data Delete + * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to + * delete old/unused content and create space for new uploads. + * @param uniqueDataId The unique data id for the content. The `udid` must have been obtained from a + * successful [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) + * call. + * @param updateContent The new content that will update/replace the previously uploaded content. + * @param options The options parameters. + */ + async beginUpdatePreview( + uniqueDataId: string, + updateContent: Record, + options?: DataUpdatePreviewOptionalParams + ): Promise< + PollerLike< + PollOperationState, + DataUpdatePreviewResponse + > + > { + const directSendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ): Promise => { + return this.client.sendOperationRequest(args, spec); + }; + const sendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ) => { + let currentRawResponse: + | coreClient.FullOperationResponse + | undefined = undefined; + const providedCallback = args.options?.onResponse; + const callback: coreClient.RawResponseCallback = ( + rawResponse: coreClient.FullOperationResponse, + flatResponse: unknown + ) => { + currentRawResponse = rawResponse; + providedCallback?.(rawResponse, flatResponse); + }; + const updatedArgs = { + ...args, + options: { + ...args.options, + onResponse: callback + } + }; + const flatResponse = await directSendOperation(updatedArgs, spec); + return { flatResponse, rawResponse: currentRawResponse! }; + }; + + return new LROPoller( + { intervalInMs: options?.updateIntervalInMs }, + { uniqueDataId, updateContent, options }, + updatePreviewOperationSpec, + sendOperation, + "location" + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * The Data Update API allows the caller to update a previously uploaded data content. + * + * You can use this API in a scenario like adding or removing geofences to or from an existing + * collection of geofences. + * Geofences are uploaded using the [Data Upload + * API](https://docs.microsoft.com/rest/api/maps/data%20v2/uploadpreview), for + * use in the [Azure Maps Geofencing Service](https://docs.microsoft.com/rest/api/maps/spatial). + * + * Please note that the Update API will *replace* and *override* the existing data content. + * + * ## Submit Update Request + * + * To update your content you will use a `PUT` request. The request body will contain the new data that + * will replace + * the existing data. The `Content-Type` header will be set to the content type of the data, and the + * path will contain + * the `udid` of the data to be update. + * + * For example, to update a collection of geofences that were previously uploaded using the Upload API, + * place the new + * geofence content in the request body. Set the `udid` parameter in the path to the `udid` of the data + * received + * previously in the upload API response. And set the `Content-Type` header to one of the following + * media types: + * + * - `application/json` + * - `application/vnd.geo+json` + * - `application/octet-stream` + * + * Here's a sample request body for updating a simple Geofence. It's represented as a circle geometry + * using a center + * point and a radius. The sample below is in `GeoJSON`: + * + * ```json + * { + * "type": "FeatureCollection", + * "features": [{ + * "type": "Feature", + * "geometry": { + * "type": "Point", + * "coordinates": [-122.126986, 47.639754] + * }, + * "properties": { + * "geometryId": "001", + * "radius": 500 + * } + * }] + * } + * ``` + * + * The previously uploaded geofence had a radius of 100m. The above request will update it to 500m. + * + * The Data Update API performs a + * [long-running request](https://aka.ms/am-creator-lrt-v2). + * + * ## Data Update Limits + * + * Please, be aware that currently every Azure Maps account has a [data storage + * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). + * + * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http + * error response. + * You can always use the [Data Delete + * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to + * delete old/unused content and create space for new uploads. + * @param uniqueDataId The unique data id for the content. The `udid` must have been obtained from a + * successful [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) + * call. + * @param updateContent The new content that will update/replace the previously uploaded content. + * @param options The options parameters. + */ + async beginUpdatePreviewAndWait( + uniqueDataId: string, + updateContent: Record, + options?: DataUpdatePreviewOptionalParams + ): Promise { + const poller = await this.beginUpdatePreview( + uniqueDataId, + updateContent, + options + ); + return poller.pollUntilDone(); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * This API allows the caller to download a previously uploaded data content.
+ * You can use this API in a scenario like downloading an existing collection of geofences uploaded + * previously using the [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) for use in our [Azure + * Maps Geofencing Service](https://docs.microsoft.com/en-us/rest/api/maps/spatial). + * + * + * ### Submit Download Request + * + * To download your content you will use a `GET` request where the path will contain the `udid` of the + * data to download. Optionally, you can also pass in an `Accept` header to specify a preference for + * the `Content-Type` of the data response.
+ * For example, to download a collection of geofences previously uploaded using the Upload API, set the + * `udid` parameter in the path to the `udid` of the data received previously in the upload API + * response and set the `Accept` header to either one of the following media types: + * + * - `application/json` + * - `application/vnd.geo+json` + * - `application/octet-stream` + * + * + * ### Download Data Response + * + * The Download API will return a HTTP `200 OK` response if the data resource with the passed-in `udid` + * is found, where the response body will contain the content of the data resource.
+ * A HTTP `400 Bad Request` error response will be returned if the data resource with the passed-in + * `udid` is not found.
+ * + * Here's a sample response body for a simple geofence represented in `GeoJSON` uploaded previously + * using the Upload API: + *
+ * + * ```json + * { + * "type": "FeatureCollection", + * "features": [{ + * "type": "Feature", + * "geometry": { + * "type": "Point", + * "coordinates": [-122.126986, 47.639754] + * }, + * "properties": { + * "geometryId": "001", + * "radius": 500 + * } + * }] + * } + * ``` + * @param uniqueDataId The unique data id for the content. The `udid` must have been obtained from a + * successful [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) + * call. + * @param options The options parameters. + */ + downloadPreview( + uniqueDataId: string, + options?: DataDownloadPreviewOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { uniqueDataId, options }, + downloadPreviewOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * This API allows the caller to delete a previously uploaded data content.
+ * You can use this API in a scenario like removing geofences previously uploaded using the [Data + * Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) for use in our + * [Azure Maps Geofencing Service](https://docs.microsoft.com/en-us/rest/api/maps/spatial). You can + * also use this API to delete old/unused uploaded content and create space for new content. + * + * + * ### Submit Delete Request + * + * To delete your content you will issue a `DELETE` request where the path will contain the `udid` of + * the data to delete.
+ * For example, to delete a collection of geofences previously uploaded using the Upload API, set the + * `udid` parameter in the path to the `udid` of the data received previously in the upload API + * response. + * + * + * ### Delete Data Response + * + * The Data Delete API returns a HTTP `204 No Content` response with an empty body, if the data + * resource was deleted successfully.
+ * A HTTP `400 Bad Request` error response will be returned if the data resource with the passed-in + * `udid` is not found. + * @param uniqueDataId The unique data id for the content. The `udid` must have been obtained from a + * successful [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) + * call. + * @param options The options parameters. + */ + deletePreview( + uniqueDataId: string, + options?: DataDeletePreviewOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { uniqueDataId, options }, + deletePreviewOperationSpec + ); + } + + /** + * This path will be obtained from a call to POST /mapData. While in progress, an http200 will be + * returned with no extra headers - followed by an http200 with Resource-Location header once + * completed. + * @param operationId The ID to query the status for the data upload request. + * @param options The options parameters. + */ + getOperationPreview( + operationId: string, + options?: DataGetOperationPreviewOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { operationId, options }, + getOperationPreviewOperationSpec + ); + } + + private getOperationOptions( + options: TOptions | undefined, + finalStateVia?: string + ): coreClient.OperationOptions { + const operationOptions: coreClient.OperationOptions = options || {}; + operationOptions.requestOptions = { + ...operationOptions.requestOptions, + shouldDeserialize: shouldDeserializeLRO(finalStateVia) + }; + return operationOptions; + } +} +// Operation Specifications +const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); + +const uploadPreview$binaryOperationSpec: coreClient.OperationSpec = { + path: "/mapData", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.DataUploadPreviewHeaders + }, + 201: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.DataUploadPreviewHeaders + }, + 202: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.DataUploadPreviewHeaders + }, + 204: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.DataUploadPreviewHeaders + }, + 409: { + bodyMapper: Mappers.ErrorResponse, + isError: true + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.uploadContent, + queryParameters: [ + Parameters.apiVersion, + Parameters.uploadDataDescription, + Parameters.uploadDataFormat + ], + urlParameters: [Parameters.geography], + headerParameters: [ + Parameters.accept, + Parameters.contentType, + Parameters.accept1, + Parameters.xMsClientId + ], + mediaType: "binary", + serializer +}; +const uploadPreview$jsonOperationSpec: coreClient.OperationSpec = { + path: "/mapData", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.DataUploadPreviewHeaders + }, + 201: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.DataUploadPreviewHeaders + }, + 202: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.DataUploadPreviewHeaders + }, + 204: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.DataUploadPreviewHeaders + }, + 409: { + bodyMapper: Mappers.ErrorResponse, + isError: true + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.uploadContent1, + queryParameters: [ + Parameters.apiVersion, + Parameters.uploadDataDescription, + Parameters.uploadDataFormat + ], + urlParameters: [Parameters.geography], + headerParameters: [ + Parameters.accept, + Parameters.contentType1, + Parameters.xMsClientId + ], + mediaType: "json", + serializer +}; +const listPreviewOperationSpec: coreClient.OperationSpec = { + path: "/mapData", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.MapDataListResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const updatePreviewOperationSpec: coreClient.OperationSpec = { + path: "/mapData/{udid}", + httpMethod: "PUT", + responses: { + 200: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.DataUpdatePreviewHeaders + }, + 201: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.DataUpdatePreviewHeaders + }, + 202: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.DataUpdatePreviewHeaders + }, + 204: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.DataUpdatePreviewHeaders + }, + 409: { + bodyMapper: Mappers.ErrorResponse, + isError: true + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.updateContent, + queryParameters: [Parameters.apiVersion, Parameters.uploadDataDescription], + urlParameters: [Parameters.geography, Parameters.uniqueDataId], + headerParameters: [ + Parameters.accept, + Parameters.xMsClientId, + Parameters.contentType2 + ], + mediaType: "json", + serializer +}; +const downloadPreviewOperationSpec: coreClient.OperationSpec = { + path: "/mapData/{udid}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: { + type: { name: "Stream" }, + serializedName: "parsedResponse" + }, + headersMapper: Mappers.DataDownloadPreviewHeaders + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.uniqueDataId], + headerParameters: [Parameters.xMsClientId, Parameters.accept2], + serializer +}; +const deletePreviewOperationSpec: coreClient.OperationSpec = { + path: "/mapData/{udid}", + httpMethod: "DELETE", + responses: { + 204: {}, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.uniqueDataId], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getOperationPreviewOperationSpec: coreClient.OperationSpec = { + path: "/mapData/operations/{operationId}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.DataGetOperationPreviewHeaders + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.operationId], + headerParameters: [Parameters.accept], + serializer +}; diff --git a/sdk/maps/maps-creator/src/operations/dataset.ts b/sdk/maps/maps-creator/src/operations/dataset.ts new file mode 100644 index 000000000000..acd9b8307ed2 --- /dev/null +++ b/sdk/maps/maps-creator/src/operations/dataset.ts @@ -0,0 +1,635 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import "@azure/core-paging"; +import { PagedAsyncIterableIterator } from "@azure/core-paging"; +import { Dataset } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; +import * as Mappers from "../models/mappers"; +import * as Parameters from "../models/parameters"; +import { CreatorClientContext } from "../creatorClientContext"; +import { LROPoller, shouldDeserializeLRO } from "../lro"; +import { PollerLike, PollOperationState } from "@azure/core-lro"; +import { + DatasetDetailInfo, + DatasetListNextOptionalParams, + DatasetListOptionalParams, + DatasetCreateOptionalParams, + DatasetCreateResponse, + DatasetListOperationResponse, + DatasetGetOptionalParams, + DatasetGetResponse, + DatasetDeleteOptionalParams, + DatasetGetOperationOptionalParams, + DatasetGetOperationResponse, + DatasetListNextResponse +} from "../models"; + +/// +/** Class representing a Dataset. */ +export class DatasetImpl implements Dataset { + private readonly client: CreatorClientContext; + + /** + * Initialize a new instance of the class Dataset class. + * @param client Reference to the service client + */ + constructor(client: CreatorClientContext) { + this.client = client; + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a list of all previously successfully created datasets. + * + * ### Submit List Request + * + * To list all your datasets, you will issue a `GET` request with no additional parameters. + * + * + * ### List Data Response + * + * The List API returns the complete list of all datasets in `json` format. The response contains the + * following fields (if they are not null or empty): + * > created - The timestamp the dataset was created. + * > datasetId - The id for the dataset. + * > description - The description for the dataset. + * > datasetSources - The source data that was used when the create request was issued. + * > ontology - The source + * [ontology](https://docs.microsoft.com/en-us/azure/azure-maps/creator-facility-ontology) that was + * used in the conversion service for the input data.
+ * + * The `datasetSources` describes the source data that was used when the create request was issued and + * contains the following elements (if they are not null or empty): + * + * > conversionIds - The list of `conversionId` (null if none were provided). + * > appendDatasetId - The `datasetId` that was used for an append operation (null if none was used). + * >featureCounts - The counts for each feature type in the dataset.
+ * + * Here's a sample response returning the `timestamp`, `datasetId`, `description`, `datasetSources`, + * and `ontology` of 3 dataset resources: + * + * + * ```json + * { + * "datasets": [ + * { + * "timestamp": "2020-01-01T22:50:48.123Z", + * "datasetId": "f6495f62-94f8-0ec2-c252-45626f82fcb2", + * "description": "Some description or comment for the dataset.", + * "datasetSources": { + * "conversionIds": [ + * "15d21452-c9bb-27b6-5e79-743ca5c3205d" + * ], }, + * "ontology": "facility-2.0", + * "featureCounts": { + * "directoryInfo": 2, + * "category": 10, + * "facility": 1, + * "level": 3, + * "unit": 183, + * "zone": 3, + * "verticalPenetration": 6, + * "opening": 48, + * "areaElement": 108 + * } + * }, + * { + * "timestamp": "2020-01-01T22:57:53.123Z", + * "datasetId": "8b1288fa-1958-4a2b-b68e-13a7i5af7d7c", + * "description": "Create from upload '0c1288fa-2058-4a1b-b68d-13a5f5af7d7c'.", + * "datasetSources": { + * "conversionIds": [ + * "0c1288fa-2058-4a1b-b68d-13a5f5af7d7c" + * ], + * "appendDatasetId": "46d1edb6-d29e-4786-9589-dbd4efd7a977" + * }, + * "ontology": "facility-2.0", + * "featureCounts": { + * "directoryInfo": 2, + * "category": 10, + * "facility": 1, + * "level": 3, + * "unit": 183, + * "zone": 3, + * "verticalPenetration": 6, + * "opening": 48, + * "areaElement": 108 + * } + * } + * ] + * } + * ``` + * @param options The options parameters. + */ + public list( + options?: DatasetListOptionalParams + ): PagedAsyncIterableIterator { + const iter = this.listPagingAll(options); + return { + next() { + return iter.next(); + }, + [Symbol.asyncIterator]() { + return this; + }, + byPage: () => { + return this.listPagingPage(options); + } + }; + } + + private async *listPagingPage( + options?: DatasetListOptionalParams + ): AsyncIterableIterator { + let result = await this._list(options); + yield result.datasets || []; + let continuationToken = result.nextLink; + while (continuationToken) { + result = await this._listNext(continuationToken, options); + continuationToken = result.nextLink; + yield result.datasets || []; + } + } + + private async *listPagingAll( + options?: DatasetListOptionalParams + ): AsyncIterableIterator { + for await (const page of this.listPagingPage(options)) { + yield* page; + } + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to create a dataset from data that was uploaded to the Azure Maps Data + * Service and converted using the Azure Maps Conversion Service. + * + * You can use this API in a scenario like uploading a DWG zip package for a building, converting the + * zip package using the Azure Maps Conversion Service, and creating a dataset from the converted zip + * package. The created dataset can be used to create tilesets using the Azure Maps Tileset Service and + * can be queried via the Azure Maps WFS Service. + * + * ### Submit Create Request + * + * To create your dataset, you will use a `POST` request where the `conversionId` query parameter is an + * ID that represents the converted DWG zip package, the `datasetId` parameter will be the ID of a + * previously created dataset to append with the current dataset and, optionally, the `description` + * query parameter will contain a description (if description is not provided a default description + * will be given). + * + * The Create API is a [long-running request](https://aka.ms/am-creator-lrt-v2). + * @param conversionId The unique ID used to create the dataset. The `conversionId` must have been + * obtained from a successful call to the Conversion Service Convert API and may be provided with + * multiple query parameters with same name (if more than one is provided). + * @param options The options parameters. + */ + async beginCreate( + conversionId: string, + options?: DatasetCreateOptionalParams + ): Promise< + PollerLike, DatasetCreateResponse> + > { + const directSendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ): Promise => { + return this.client.sendOperationRequest(args, spec); + }; + const sendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ) => { + let currentRawResponse: + | coreClient.FullOperationResponse + | undefined = undefined; + const providedCallback = args.options?.onResponse; + const callback: coreClient.RawResponseCallback = ( + rawResponse: coreClient.FullOperationResponse, + flatResponse: unknown + ) => { + currentRawResponse = rawResponse; + providedCallback?.(rawResponse, flatResponse); + }; + const updatedArgs = { + ...args, + options: { + ...args.options, + onResponse: callback + } + }; + const flatResponse = await directSendOperation(updatedArgs, spec); + return { flatResponse, rawResponse: currentRawResponse! }; + }; + + return new LROPoller( + { intervalInMs: options?.updateIntervalInMs }, + { conversionId, options }, + createOperationSpec, + sendOperation, + "location" + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to create a dataset from data that was uploaded to the Azure Maps Data + * Service and converted using the Azure Maps Conversion Service. + * + * You can use this API in a scenario like uploading a DWG zip package for a building, converting the + * zip package using the Azure Maps Conversion Service, and creating a dataset from the converted zip + * package. The created dataset can be used to create tilesets using the Azure Maps Tileset Service and + * can be queried via the Azure Maps WFS Service. + * + * ### Submit Create Request + * + * To create your dataset, you will use a `POST` request where the `conversionId` query parameter is an + * ID that represents the converted DWG zip package, the `datasetId` parameter will be the ID of a + * previously created dataset to append with the current dataset and, optionally, the `description` + * query parameter will contain a description (if description is not provided a default description + * will be given). + * + * The Create API is a [long-running request](https://aka.ms/am-creator-lrt-v2). + * @param conversionId The unique ID used to create the dataset. The `conversionId` must have been + * obtained from a successful call to the Conversion Service Convert API and may be provided with + * multiple query parameters with same name (if more than one is provided). + * @param options The options parameters. + */ + async beginCreateAndWait( + conversionId: string, + options?: DatasetCreateOptionalParams + ): Promise { + const poller = await this.beginCreate(conversionId, options); + return poller.pollUntilDone(); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a list of all previously successfully created datasets. + * + * ### Submit List Request + * + * To list all your datasets, you will issue a `GET` request with no additional parameters. + * + * + * ### List Data Response + * + * The List API returns the complete list of all datasets in `json` format. The response contains the + * following fields (if they are not null or empty): + * > created - The timestamp the dataset was created. + * > datasetId - The id for the dataset. + * > description - The description for the dataset. + * > datasetSources - The source data that was used when the create request was issued. + * > ontology - The source + * [ontology](https://docs.microsoft.com/en-us/azure/azure-maps/creator-facility-ontology) that was + * used in the conversion service for the input data.
+ * + * The `datasetSources` describes the source data that was used when the create request was issued and + * contains the following elements (if they are not null or empty): + * + * > conversionIds - The list of `conversionId` (null if none were provided). + * > appendDatasetId - The `datasetId` that was used for an append operation (null if none was used). + * >featureCounts - The counts for each feature type in the dataset.
+ * + * Here's a sample response returning the `timestamp`, `datasetId`, `description`, `datasetSources`, + * and `ontology` of 3 dataset resources: + * + * + * ```json + * { + * "datasets": [ + * { + * "timestamp": "2020-01-01T22:50:48.123Z", + * "datasetId": "f6495f62-94f8-0ec2-c252-45626f82fcb2", + * "description": "Some description or comment for the dataset.", + * "datasetSources": { + * "conversionIds": [ + * "15d21452-c9bb-27b6-5e79-743ca5c3205d" + * ], }, + * "ontology": "facility-2.0", + * "featureCounts": { + * "directoryInfo": 2, + * "category": 10, + * "facility": 1, + * "level": 3, + * "unit": 183, + * "zone": 3, + * "verticalPenetration": 6, + * "opening": 48, + * "areaElement": 108 + * } + * }, + * { + * "timestamp": "2020-01-01T22:57:53.123Z", + * "datasetId": "8b1288fa-1958-4a2b-b68e-13a7i5af7d7c", + * "description": "Create from upload '0c1288fa-2058-4a1b-b68d-13a5f5af7d7c'.", + * "datasetSources": { + * "conversionIds": [ + * "0c1288fa-2058-4a1b-b68d-13a5f5af7d7c" + * ], + * "appendDatasetId": "46d1edb6-d29e-4786-9589-dbd4efd7a977" + * }, + * "ontology": "facility-2.0", + * "featureCounts": { + * "directoryInfo": 2, + * "category": 10, + * "facility": 1, + * "level": 3, + * "unit": 183, + * "zone": 3, + * "verticalPenetration": 6, + * "opening": 48, + * "areaElement": 108 + * } + * } + * ] + * } + * ``` + * @param options The options parameters. + */ + private _list( + options?: DatasetListOptionalParams + ): Promise { + return this.client.sendOperationRequest({ options }, listOperationSpec); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a previously successfully created dataset. + * + * ### Submit Get Details Request + * + * To get the details for a previously created dataset, you will issue a `GET` request with the + * `datasetId` in the path. + * + * ### Get Details Response + * + * The Get Details API returns the details for a dataset in `json` format. The response contains the + * following fields (if they are not null or empty): + * > created - The timestamp the dataset was created. + * > datasetId - The id for the dataset. + * > description - The description for the dataset. + * > datasetSources - The source data that was used when the create request was issued. + * > ontology - The source + * [ontology](https://docs.microsoft.com/en-us/azure/azure-maps/creator-facility-ontology) that was + * used in the conversion service for the input data.
+ * + * The `datasetSources` describes the source data that was used when the create request was issued and + * contains the following elements (if they are not null or empty): + * > conversionIds - The list of `conversionId` (null if none were provided). + * > appendDatasetId - The `datasetId` that was used for an append operation (null if none was used). + * >featureCounts - The counts for each feature type in the dataset.
+ * + * Here's a sample response returning the `timestamp`, `datasetId`, `description`, `datasetSources`, + * and `ontology` of a dataset resource: + * + * ```json + * { + * "timestamp": "2020-01-01T22:50:48.123Z", + * "datasetId": "f6495f62-94f8-0ec2-c252-45626f82fcb2", + * "description": "Some description or comment for the dataset.", + * "datasetSources": { + * "conversionIds": [ + * "15d21452-c9bb-27b6-5e79-743ca5c3205d" + * ], + * }, + * "ontology": "facility-2.0", + * "featureCounts": { + * "directoryInfo": 2, + * "category": 10, + * "facility": 1, + * "level": 3, + * "unit": 183, + * "zone": 3, + * "verticalPenetration": 6, + * "opening": 48, + * "areaElement": 108 + * } + * } + * ``` + * @param datasetId The identifier for the dataset to query from. + * @param options The options parameters. + */ + get( + datasetId: string, + options?: DatasetGetOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { datasetId, options }, + getOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * You can also use this API to delete old/unused datasets to create space for new Creator content. + * + * ### Submit Delete Request + * + * To delete your content you will issue a `DELETE` request where the path will contain the `datasetId` + * of the dataset to delete. + * @param datasetId The identifier for the dataset to query from. + * @param options The options parameters. + */ + delete( + datasetId: string, + options?: DatasetDeleteOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { datasetId, options }, + deleteOperationSpec + ); + } + + /** + * This API allows the caller to view the current progress of a dataset operation and the path is + * obtained from a call to the Create API. + * + * ### Submit Operations Request + * + * To view the current progress of a dataset operation, you will use a `GET` request where the + * `operationId` given the path is the ID that represents the operation. + * + * ### Operation Response + * + * While in progress, a `200-OK` http status code will be returned with no extra headers. If the + * operation succeeds, a `200-OK` http status code with Resource-Location header will be returned. + * @param operationId The ID to query the status for the dataset create/import request. + * @param options The options parameters. + */ + getOperation( + operationId: string, + options?: DatasetGetOperationOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { operationId, options }, + getOperationOperationSpec + ); + } + + /** + * ListNext + * @param nextLink The nextLink from the previous successful call to the List method. + * @param options The options parameters. + */ + private _listNext( + nextLink: string, + options?: DatasetListNextOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { nextLink, options }, + listNextOperationSpec + ); + } +} +// Operation Specifications +const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); + +const createOperationSpec: coreClient.OperationSpec = { + path: "/datasets", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.DatasetCreateHeaders + }, + 201: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.DatasetCreateHeaders + }, + 202: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.DatasetCreateHeaders + }, + 204: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.DatasetCreateHeaders + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.conversionId, + Parameters.datasetId, + Parameters.descriptionDataset + ], + urlParameters: [Parameters.geography], + headerParameters: [Parameters.accept], + serializer +}; +const listOperationSpec: coreClient.OperationSpec = { + path: "/datasets", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.DatasetListResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography], + headerParameters: [Parameters.accept], + serializer +}; +const getOperationSpec: coreClient.OperationSpec = { + path: "/datasets/{datasetId}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.DatasetDetailInfo + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.datasetId1], + headerParameters: [Parameters.accept], + serializer +}; +const deleteOperationSpec: coreClient.OperationSpec = { + path: "/datasets/{datasetId}", + httpMethod: "DELETE", + responses: { + 204: {}, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.datasetId1], + headerParameters: [Parameters.accept], + serializer +}; +const getOperationOperationSpec: coreClient.OperationSpec = { + path: "/datasets/operations/{operationId}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.DatasetGetOperationHeaders + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.operationId], + headerParameters: [Parameters.accept], + serializer +}; +const listNextOperationSpec: coreClient.OperationSpec = { + path: "{nextLink}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.DatasetListResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.nextLink], + headerParameters: [Parameters.accept], + serializer +}; diff --git a/sdk/maps/maps-creator/src/operations/featureState.ts b/sdk/maps/maps-creator/src/operations/featureState.ts new file mode 100644 index 000000000000..28c406988606 --- /dev/null +++ b/sdk/maps/maps-creator/src/operations/featureState.ts @@ -0,0 +1,484 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import "@azure/core-paging"; +import { PagedAsyncIterableIterator } from "@azure/core-paging"; +import { FeatureState } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; +import * as Mappers from "../models/mappers"; +import * as Parameters from "../models/parameters"; +import { CreatorClientContext } from "../creatorClientContext"; +import { + StatesetInfoObject, + FeatureStateListStatesetNextOptionalParams, + FeatureStateListStatesetOptionalParams, + StylesObject, + FeatureStateCreateStatesetOptionalParams, + FeatureStateCreateStatesetResponse, + FeatureStateListStatesetResponse, + FeatureStatePutStatesetOptionalParams, + FeatureStateDeleteStatesetOptionalParams, + FeatureStateGetStatesetOptionalParams, + FeatureStateGetStatesetResponse, + FeatureStatesStructure, + FeatureStateUpdateStatesOptionalParams, + FeatureStateDeleteStateOptionalParams, + FeatureStateGetStatesOptionalParams, + FeatureStateGetStatesResponse, + FeatureStateListStatesetNextResponse +} from "../models"; + +/// +/** Class representing a FeatureState. */ +export class FeatureStateImpl implements FeatureState { + private readonly client: CreatorClientContext; + + /** + * Initialize a new instance of the class FeatureState class. + * @param client Reference to the service client + */ + constructor(client: CreatorClientContext) { + this.client = client; + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a list of all previously successfully created statesets. + * @param options The options parameters. + */ + public listStateset( + options?: FeatureStateListStatesetOptionalParams + ): PagedAsyncIterableIterator { + const iter = this.listStatesetPagingAll(options); + return { + next() { + return iter.next(); + }, + [Symbol.asyncIterator]() { + return this; + }, + byPage: () => { + return this.listStatesetPagingPage(options); + } + }; + } + + private async *listStatesetPagingPage( + options?: FeatureStateListStatesetOptionalParams + ): AsyncIterableIterator { + let result = await this._listStateset(options); + yield result.statesets || []; + let continuationToken = result.nextLink; + while (continuationToken) { + result = await this._listStatesetNext(continuationToken, options); + continuationToken = result.nextLink; + yield result.statesets || []; + } + } + + private async *listStatesetPagingAll( + options?: FeatureStateListStatesetOptionalParams + ): AsyncIterableIterator { + for await (const page of this.listStatesetPagingPage(options)) { + yield* page; + } + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This POST API allows the user to create a new Stateset and define stateset style using request body. + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. The Feature State API is part of Creator. + * + * The Feature State service allows the user to update the states of a feature and query them to be + * used in other services. The dynamic properties of a feature that don't belong to the dataset are + * referred to as *states* here. + * + * This Feature State service pivot on the Stateset. Like Tileset, Stateset encapsulates the storage + * mechanism for feature states for a dataset. + * + * Once the stateset is created, users can use that statesetId to post feature state updates and + * retrieve the current feature states. A feature can have only one state at a given point in time. + * + * Feature state is defined by the key name, value and the timestamp. When a feature state update is + * posted to Azure Maps, the state value gets updated only if the provided state’s timestamp is later + * than the stored timestamp. + * + * Azure Maps MapControl provides a way to use these feature states to style the features. Please refer + * to the State Tile documentation for more information. + * @param datasetId The datasetId must have been obtained from a successful [Dataset Create + * API](https://docs.microsoft.com/en-us/rest/api/maps/v2/dataset/create) call. + * @param statesetCreateRequestBody The stateset style JSON data. + * @param options The options parameters. + */ + createStateset( + datasetId: string, + statesetCreateRequestBody: StylesObject, + options?: FeatureStateCreateStatesetOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { datasetId, statesetCreateRequestBody, options }, + createStatesetOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a list of all previously successfully created statesets. + * @param options The options parameters. + */ + private _listStateset( + options?: FeatureStateListStatesetOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { options }, + listStatesetOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This PUT API allows the user to update the stateset style rules. + * @param statesetId The stateset id that was created. + * @param statesetStyleUpdateRequestBody The stateset style JSON data. Only style rules are allowed to + * be updated, update on keyname and type is not allowed. + * @param options The options parameters. + */ + putStateset( + statesetId: string, + statesetStyleUpdateRequestBody: StylesObject, + options?: FeatureStatePutStatesetOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { statesetId, statesetStyleUpdateRequestBody, options }, + putStatesetOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This DELETE API allows the user to delete the stateset and the associated data. + * @param statesetId The stateset id that was created. + * @param options The options parameters. + */ + deleteStateset( + statesetId: string, + options?: FeatureStateDeleteStatesetOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { statesetId, options }, + deleteStatesetOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This GET API allows the user to get the stateset Information. + * + * The stateset Information includes the datasetId associated to the stateset, and the styles of that + * stateset. + * @param statesetId The stateset id that was created. + * @param options The options parameters. + */ + getStateset( + statesetId: string, + options?: FeatureStateGetStatesetOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { statesetId, options }, + getStatesetOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This PUT API allows the user to update the state of the given feature in the given stateset. + * @param statesetId The stateset id that was created. + * @param featureId The id of a feature in the given dataset. If the featureId is not present in the + * dataset, Bad Request response will be returned. + * @param featureStateUpdateRequestBody The feature state JSON data. A feature can have only one state + * at a given point in time. The specified state keyname must have been defined during the stateset + * creation. + * @param options The options parameters. + */ + updateStates( + statesetId: string, + featureId: string, + featureStateUpdateRequestBody: FeatureStatesStructure, + options?: FeatureStateUpdateStatesOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { statesetId, featureId, featureStateUpdateRequestBody, options }, + updateStatesOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API deletes the state information identified by the StateKeyName parameter for the feature + * identified by the FeatureId parameter in the the stateset. + * @param statesetId The stateset id that was created. + * @param featureId The id of a feature in the given stateset. If no state was set for the featureId in + * the stateset earlier, Bad Request response will be returned. + * @param stateKeyName The Name of the state to be deleted. + * @param options The options parameters. + */ + deleteState( + statesetId: string, + featureId: string, + stateKeyName: string, + options?: FeatureStateDeleteStateOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { statesetId, featureId, stateKeyName, options }, + deleteStateOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API returns the current state information associated with the given feature in the given + * stateset. + * @param statesetId The stateset id that was created. + * @param featureId The id of a feature in the given stateset. If no state was set for the featureId in + * the stateset earlier, Bad Request response will be returned. + * @param options The options parameters. + */ + getStates( + statesetId: string, + featureId: string, + options?: FeatureStateGetStatesOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { statesetId, featureId, options }, + getStatesOperationSpec + ); + } + + /** + * ListStatesetNext + * @param nextLink The nextLink from the previous successful call to the ListStateset method. + * @param options The options parameters. + */ + private _listStatesetNext( + nextLink: string, + options?: FeatureStateListStatesetNextOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { nextLink, options }, + listStatesetNextOperationSpec + ); + } +} +// Operation Specifications +const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); + +const createStatesetOperationSpec: coreClient.OperationSpec = { + path: "/featureStateSets", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.StatesetCreatedResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.statesetCreateRequestBody, + queryParameters: [ + Parameters.apiVersion, + Parameters.description, + Parameters.datasetId2 + ], + urlParameters: [Parameters.geography], + headerParameters: [Parameters.accept, Parameters.contentType2], + mediaType: "json", + serializer +}; +const listStatesetOperationSpec: coreClient.OperationSpec = { + path: "/featureStateSets", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.StatesetListResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography], + headerParameters: [Parameters.accept], + serializer +}; +const putStatesetOperationSpec: coreClient.OperationSpec = { + path: "/featureStateSets/{statesetId}", + httpMethod: "PUT", + responses: { + 200: {}, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.statesetStyleUpdateRequestBody, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.statesetId], + headerParameters: [Parameters.accept, Parameters.contentType2], + mediaType: "json", + serializer +}; +const deleteStatesetOperationSpec: coreClient.OperationSpec = { + path: "/featureStateSets/{statesetId}", + httpMethod: "DELETE", + responses: { + 204: {}, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.statesetId], + headerParameters: [Parameters.accept], + serializer +}; +const getStatesetOperationSpec: coreClient.OperationSpec = { + path: "/featureStateSets/{statesetId}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.StatesetGetResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.statesetId], + headerParameters: [Parameters.accept], + serializer +}; +const updateStatesOperationSpec: coreClient.OperationSpec = { + path: "/featureStateSets/{statesetId}/featureStates/{featureId}", + httpMethod: "PUT", + responses: { + 200: {}, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.featureStateUpdateRequestBody, + queryParameters: [Parameters.apiVersion], + urlParameters: [ + Parameters.geography, + Parameters.statesetId, + Parameters.featureId + ], + headerParameters: [Parameters.accept, Parameters.contentType2], + mediaType: "json", + serializer +}; +const deleteStateOperationSpec: coreClient.OperationSpec = { + path: "/featureStateSets/{statesetId}/featureStates/{featureId}", + httpMethod: "DELETE", + responses: { + 204: {}, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion, Parameters.stateKeyName], + urlParameters: [ + Parameters.geography, + Parameters.statesetId, + Parameters.featureId + ], + headerParameters: [Parameters.accept], + serializer +}; +const getStatesOperationSpec: coreClient.OperationSpec = { + path: "/featureStateSets/{statesetId}/featureStates/{featureId}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.FeatureStatesStructure + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [ + Parameters.geography, + Parameters.statesetId, + Parameters.featureId + ], + headerParameters: [Parameters.accept], + serializer +}; +const listStatesetNextOperationSpec: coreClient.OperationSpec = { + path: "{nextLink}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.StatesetListResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.nextLink], + headerParameters: [Parameters.accept], + serializer +}; diff --git a/sdk/maps/maps-creator/src/operations/index.ts b/sdk/maps/maps-creator/src/operations/index.ts new file mode 100644 index 000000000000..7fe2a1f1d8c6 --- /dev/null +++ b/sdk/maps/maps-creator/src/operations/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./alias"; +export * from "./data"; +export * from "./dataset"; +export * from "./conversion"; +export * from "./featureState"; +export * from "./spatial"; +export * from "./tileset"; +export * from "./wfs"; diff --git a/sdk/maps/maps-creator/src/operations/spatial.ts b/sdk/maps/maps-creator/src/operations/spatial.ts new file mode 100644 index 000000000000..b5ca4ec871ba --- /dev/null +++ b/sdk/maps/maps-creator/src/operations/spatial.ts @@ -0,0 +1,631 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { Spatial } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; +import * as Mappers from "../models/mappers"; +import * as Parameters from "../models/parameters"; +import { CreatorClientContext } from "../creatorClientContext"; +import { + ResponseFormat, + SpatialGetGeofenceOptionalParams, + SpatialGetGeofenceResponse, + SpatialPostGeofenceOptionalParams, + SpatialPostGeofenceResponse, + BufferRequestBody, + SpatialPostBufferOptionalParams, + SpatialPostBufferResponse, + SpatialGetBufferOptionalParams, + SpatialGetBufferResponse, + SpatialPostClosestPointOptionalParams, + SpatialPostClosestPointResponse, + SpatialGetClosestPointOptionalParams, + SpatialGetClosestPointResponse, + SpatialPostPointInPolygonOptionalParams, + SpatialPostPointInPolygonResponse, + SpatialGetPointInPolygonOptionalParams, + SpatialGetPointInPolygonResponse, + SpatialGetGreatCircleDistanceOptionalParams, + SpatialGetGreatCircleDistanceResponse +} from "../models"; + +/** Class representing a Spatial. */ +export class SpatialImpl implements Spatial { + private readonly client: CreatorClientContext; + + /** + * Initialize a new instance of the class Spatial class. + * @param client Reference to the service client + */ + constructor(client: CreatorClientContext) { + this.client = client; + } + + /** + * **Search Geofence Get API** + * + * **Applies to:** S1 Pricing tier. + * + * The Geofence Get API allows you to retrieve the proximity of a coordinate to a + * geofence that has been uploaded to the Data service. You can use the + * [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) to upload + * a geofence or set of fences. See [Geofencing GeoJSON + * data](https://docs.microsoft.com/en-us/azure/azure-maps/geofence-geojson) + * for more details on the geofence data format. To query the proximity of a coordinate, you supply the + * location of the object you are tracking as well + * as the ID for the fence or set of fences, and the response will contain information about + * the distance from the outer edge of the geofence. A negative value signifies that the + * coordinate is inside of the fence while a positive value means that it is outside of the + * fence.

This API can be used for a variety of scenarios that include things like asset + * tracking, fleet management, or setting up alerts for moving objects. + * + * The API supports [integration with Event + * Grid](https://docs.microsoft.com/azure/azure-maps/azure-maps-event-grid-integration). The isAsync + * parameter is used to enable integration with Event Grid (disabled by default). + * To test this API, you can upload the sample data from Post Geofence API examples(Request Body) via + * Data Upload API and replace the [udid] from the sample request below with the udid returned by Data + * Upload API. + * + * + * ### Geofencing InnerError code + * + * In geofencing response error contract, `innererror` is an object containing service specific + * information about the error. `code` is a property in `innererror` which can map to a specific + * geofencing error type. The table belows shows the code mapping between all the known client error + * type to the corresponding geofencing error `message`. + * + * innererror.code | error.message + * ---------------------------- | -------------------------------------- + * NullDeviceId | Device Id should not be null. + * NullUdid | Udid should not be null. + * UdidWrongFormat| Udid should be acquired from user data ingestion API. + * InvalidUserTime| Usertime is invalid. + * InvalidSearchBuffer| Searchbuffer is invalid. + * InvalidSearchRange| The value range of searchbuffer should be from 0 to 500 meters. + * InvalidLatLon| Lat and/or lon parameters are invalid. + * InvalidIsAsyncValue| The IsAsync parameter is invalid. + * InvalidModeValue| The mode parameter invalid. + * InvalidJson| Geofencing data is not a valid json file. + * NotSupportedGeoJson| Geofencing data can't be read as a Feature or FeatureCollections. + * InvalidGeoJson| Geofencing data is invalid. + * NoUserDataWithAccountOrSubscription| Can't find user geofencing data with provided account-id and/or + * subscription-id. + * NoUserDataWithUdid| Can't find user geofencing data with provided udid. + * @param format Desired format of the response. Only `json` format is supported. + * @param deviceId ID of the device + * @param udid The unique id returned from [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) after uploading a valid + * GeoJSON FeatureCollection object. Please refer to [RFC + * 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. All the feature's properties + * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. + * @param latitude The latitude of the location being passed. Example: 48.36. + * @param longitude The longitude of the location being passed. Example: -124.63. + * @param options The options parameters. + */ + getGeofence( + format: ResponseFormat, + deviceId: string, + udid: string, + latitude: number, + longitude: number, + options?: SpatialGetGeofenceOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, deviceId, udid, latitude, longitude, options }, + getGeofenceOperationSpec + ); + } + + /** + * **Search Geofence Post API** + * **Applies to:** S1 Pricing tier. + * The Geofence Post API allows you to retrieve the proximity of a coordinate to a provided geofence + * or set of fences. With POST call, you do not have to upload the fence data in advance, instead you + * supply the location of the object you are tracking in query parameters as well as the fence or set + * of fences data in post request body. See [Geofencing GeoJSON + * data](https://docs.microsoft.com/en-us/azure/azure-maps/geofence-geojson) for more details on the + * geofence data format. The response will contain information about the distance from the outer edge + * of the geofence. A negative value signifies that the coordinate is inside of the fence while a + * positive value means that it is outside of the fence.

This API can be used for a variety of + * scenarios that include things like asset tracking, fleet management, or setting up alerts for + * moving objects. + * + * The API supports [integration with Event + * Grid](https://docs.microsoft.com/azure/azure-maps/azure-maps-event-grid-integration). The isAsync + * parameter is used to enable integration with Event Grid (disabled by default). + * @param format Desired format of the response. Only `json` format is supported. + * @param deviceId ID of the device + * @param latitude The latitude of the location being passed. Example: 48.36. + * @param longitude The longitude of the location being passed. Example: -124.63. + * @param searchGeofenceRequestBody The geofencing GeoJSON data. + * @param options The options parameters. + */ + postGeofence( + format: ResponseFormat, + deviceId: string, + latitude: number, + longitude: number, + searchGeofenceRequestBody: Record, + options?: SpatialPostGeofenceOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { + format, + deviceId, + latitude, + longitude, + searchGeofenceRequestBody, + options + }, + postGeofenceOperationSpec + ); + } + + /** + * **Applies to**: S1 pricing tier. + * + * This API returns a FeatureCollection where each Feature is a buffer around the corresponding indexed + * Feature of the input. The buffer could be either on the outside or the inside of the provided + * Feature, depending on the distance provided in the input. There must be either one distance provided + * per Feature in the FeatureCollection input, or if only one distance is provided, then that distance + * is applied to every Feature in the collection. The positive (or negative) buffer of a geometry is + * defined as the Minkowski sum (or difference) of the geometry with a circle of radius equal to the + * absolute value of the buffer distance. The buffer API always returns a polygonal result. The + * negative or zero-distance buffer of lines and points is always an empty polygon. The input may + * contain a collection of Point, MultiPoint, Polygon, MultiPolygon, LineString and MultiLineString. + * GeometryCollection will be ignored if provided. + * @param format Desired format of the response. Only `json` format is supported. + * @param bufferRequestBody The FeatureCollection and the list of distances (one per feature or one for + * all features). + * @param options The options parameters. + */ + postBuffer( + format: ResponseFormat, + bufferRequestBody: BufferRequestBody, + options?: SpatialPostBufferOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, bufferRequestBody, options }, + postBufferOperationSpec + ); + } + + /** + * **Applies to**: S1 pricing tier. + * + * This API returns a FeatureCollection where each Feature is a buffer around the corresponding indexed + * Feature of the input. The buffer could be either on the outside or the inside of the provided + * Feature, depending on the distance provided in the input. There must be either one distance provided + * per Feature in the FeatureCollection input, or if only one distance is provided, then that distance + * is applied to every Feature in the collection. The positive (or negative) buffer of a geometry is + * defined as the Minkowski sum (or difference) of the geometry with a circle of radius equal to the + * absolute value of the buffer distance. The buffer API always returns a polygonal result. The + * negative or zero-distance buffer of lines and points is always an empty polygon. The input features + * are provided by a GeoJSON file which is uploaded via [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and referenced by a unique + * udid. The GeoJSON file may contain a collection of Point, MultiPoint, Polygon, MultiPolygon, + * LineString and MultiLineString. GeometryCollection will be ignored if provided. + * + * To test this API, you can upload the sample data from [Post Buffer + * API](https://docs.microsoft.com/en-us/rest/api/maps/spatial/postbuffer#examples) examples(Request + * Body without distances array) via [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and replace the [udid] from + * the [sample request + * below](https://docs.microsoft.com/en-us/rest/api/maps/spatial/getbuffer#examples) with the udid + * returned by Data Upload API. + * @param format Desired format of the response. Only `json` format is supported. + * @param udid The unique id returned from [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) after uploading a valid + * GeoJSON FeatureCollection object. Please refer to [RFC + * 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. All the feature's properties + * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. + * @param distances The list of distances (one per feature or one for all features), delimited by + * semicolons. For example, 12.34;-56.78. Positive distance will generate a buffer outside of the + * feature, whereas negative distance will generate a buffer inside of the feature. If the negative + * distance larger than the geometry itself, an empty polygon will be returned. + * @param options The options parameters. + */ + getBuffer( + format: ResponseFormat, + udid: string, + distances: string, + options?: SpatialGetBufferOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, udid, distances, options }, + getBufferOperationSpec + ); + } + + /** + * **Applies to**: S1 pricing tier. + * + * This API returns the closest point between a base point and a given set of target points. The set of + * target points is provided by user data in post request body. The user data may only contain a + * collection of Point geometry. MultiPoint or other geometries will be ignored if provided. The + * algorithm does not take into account routing or traffic. The maximum number of points accepted is + * 100,000. Information returned includes closest point latitude, longitude, and distance in meters + * from the closest point. + * @param format Desired format of the response. Only `json` format is supported. + * @param latitude The latitude of the location being passed. Example: 48.36. + * @param longitude The longitude of the location being passed. Example: -124.63. + * @param closestPointRequestBody The FeatureCollection of Point geometries from which closest point to + * source point should be determined. All the feature's properties should contain `geometryId`, which + * is used for identifying the geometry and is case-sensitive. + * @param options The options parameters. + */ + postClosestPoint( + format: ResponseFormat, + latitude: number, + longitude: number, + closestPointRequestBody: Record, + options?: SpatialPostClosestPointOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, latitude, longitude, closestPointRequestBody, options }, + postClosestPointOperationSpec + ); + } + + /** + * **Applies to**: S1 pricing tier. + * + * This API returns the closest point between a base point and a given set of points in the user + * uploaded data set identified by udid. The set of target points is provided by a GeoJSON file which + * is uploaded via [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) + * and referenced by a unique udid. The GeoJSON file may only contain a collection of Point geometry. + * MultiPoint or other geometries will be ignored if provided. The maximum number of points accepted is + * 100,000. The algorithm does not take into account routing or traffic. Information returned includes + * closest point latitude, longitude, and distance in meters from the closest point. + * + * To test this API, you can upload the sample data from [Post Closest Point + * API](https://docs.microsoft.com/en-us/rest/api/maps/spatial/postclosestpoint#examples) + * examples(Request Body) via [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and replace the [udid] from + * the [sample request + * below](https://docs.microsoft.com/en-us/rest/api/maps/spatial/getclosestpoint#examples) with the + * udid returned by Data Upload API. + * @param format Desired format of the response. Only `json` format is supported. + * @param udid The unique id returned from [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) after uploading a valid + * GeoJSON FeatureCollection object. Please refer to [RFC + * 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. All the feature's properties + * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. + * @param latitude The latitude of the location being passed. Example: 48.36. + * @param longitude The longitude of the location being passed. Example: -124.63. + * @param options The options parameters. + */ + getClosestPoint( + format: ResponseFormat, + udid: string, + latitude: number, + longitude: number, + options?: SpatialGetClosestPointOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, udid, latitude, longitude, options }, + getClosestPointOperationSpec + ); + } + + /** + * **Applies to**: S1 pricing tier. + * + * This API returns a boolean value indicating whether a point is inside a set of polygons. The user + * data may contain Polygon and MultiPolygon geometries, other geometries will be ignored if provided. + * If the point is inside or on the boundary of one of these polygons, the value returned is true. In + * all other cases, the value returned is false. When the point is inside multiple polygons, the result + * will give intersecting geometries section to show all valid geometries (referenced by geometryId) in + * user data. The maximum number of vertices accepted to form a Polygon is 10,000. + * @param format Desired format of the response. Only `json` format is supported. + * @param latitude The latitude of the location being passed. Example: 48.36. + * @param longitude The longitude of the location being passed. Example: -124.63. + * @param pointInPolygonRequestBody A FeatureCollection with a set of Polygon/MultiPolygon geometries. + * The maximum number of vertices accepted to form a Polygon is 10,000. All the feature's properties + * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. + * @param options The options parameters. + */ + postPointInPolygon( + format: ResponseFormat, + latitude: number, + longitude: number, + pointInPolygonRequestBody: Record, + options?: SpatialPostPointInPolygonOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, latitude, longitude, pointInPolygonRequestBody, options }, + postPointInPolygonOperationSpec + ); + } + + /** + * **Applies to**: S1 pricing tier. + * + * This API returns a boolean value indicating whether a point is inside a set of polygons. The set of + * polygons is provided by a GeoJSON file which is uploaded via [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and referenced by a unique + * udid. The GeoJSON file may contain Polygon and MultiPolygon geometries, other geometries will be + * ignored if provided. If the point is inside or on the boundary of one of these polygons, the value + * returned is true. In all other cases, the value returned is false. When the point is inside multiple + * polygons, the result will give intersecting geometries section to show all valid + * geometries(referenced by geometryId) in user data. The maximum number of vertices accepted to form a + * Polygon is 10,000. + * + * + * To test this API, you can upload the sample data from [Post Point In Polygon + * API](https://docs.microsoft.com/en-us/rest/api/maps/spatial/postpointinpolygon#examples) + * examples(Request Body) via [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and replace the [udid] from + * the [sample request + * below](https://docs.microsoft.com/en-us/rest/api/maps/spatial/getpointinpolygon#examples) with the + * udid returned by Data Upload API. + * @param format Desired format of the response. Only `json` format is supported. + * @param udid The unique id returned from [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) after uploading a valid + * GeoJSON FeatureCollection object. Please refer to [RFC + * 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. All the feature's properties + * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. + * @param latitude The latitude of the location being passed. Example: 48.36. + * @param longitude The longitude of the location being passed. Example: -124.63. + * @param options The options parameters. + */ + getPointInPolygon( + format: ResponseFormat, + udid: string, + latitude: number, + longitude: number, + options?: SpatialGetPointInPolygonOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, udid, latitude, longitude, options }, + getPointInPolygonOperationSpec + ); + } + + /** + * **Applies to**: S1 pricing tier. + * + * This API will return the great-circle or shortest distance between two points on the surface of a + * sphere, measured along the surface of the sphere. This differs from calculating a straight line + * through the sphere's interior. This method is helpful for estimating travel distances for airplanes + * by calculating the shortest distance between airports. + * @param format Desired format of the response. Only `json` format is supported. + * @param query The Coordinates through which the distance is calculated, delimited by a colon. Two + * coordinates are required. The first one is the source point coordinate and the last is the target + * point coordinate. For example, 47.622942,122.316456:57.673988,127.121513 + * @param options The options parameters. + */ + getGreatCircleDistance( + format: ResponseFormat, + query: string, + options?: SpatialGetGreatCircleDistanceOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getGreatCircleDistanceOperationSpec + ); + } +} +// Operation Specifications +const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); + +const getGeofenceOperationSpec: coreClient.OperationSpec = { + path: "/spatial/geofence/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.GeofenceResponse, + headersMapper: Mappers.SpatialGetGeofenceHeaders + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.udid, + Parameters.apiVersion1, + Parameters.deviceId, + Parameters.latitude, + Parameters.longitude, + Parameters.z, + Parameters.userTime, + Parameters.searchBuffer, + Parameters.isAsync, + Parameters.mode + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const postGeofenceOperationSpec: coreClient.OperationSpec = { + path: "/spatial/geofence/{format}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.GeofenceResponse, + headersMapper: Mappers.SpatialPostGeofenceHeaders + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.searchGeofenceRequestBody, + queryParameters: [ + Parameters.apiVersion1, + Parameters.deviceId, + Parameters.latitude, + Parameters.longitude, + Parameters.z, + Parameters.userTime, + Parameters.searchBuffer, + Parameters.isAsync, + Parameters.mode + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [ + Parameters.accept, + Parameters.xMsClientId, + Parameters.contentType2 + ], + mediaType: "json", + serializer +}; +const postBufferOperationSpec: coreClient.OperationSpec = { + path: "/spatial/buffer/{format}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.BufferResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.bufferRequestBody, + queryParameters: [Parameters.apiVersion1], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [ + Parameters.accept, + Parameters.xMsClientId, + Parameters.contentType2 + ], + mediaType: "json", + serializer +}; +const getBufferOperationSpec: coreClient.OperationSpec = { + path: "/spatial/buffer/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.BufferResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.udid, + Parameters.apiVersion1, + Parameters.distances + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const postClosestPointOperationSpec: coreClient.OperationSpec = { + path: "/spatial/closestPoint/{format}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.ClosestPointResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.closestPointRequestBody, + queryParameters: [ + Parameters.apiVersion1, + Parameters.latitude, + Parameters.longitude, + Parameters.numberOfClosestPoints + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [ + Parameters.accept, + Parameters.xMsClientId, + Parameters.contentType2 + ], + mediaType: "json", + serializer +}; +const getClosestPointOperationSpec: coreClient.OperationSpec = { + path: "/spatial/closestPoint/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.ClosestPointResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.udid, + Parameters.apiVersion1, + Parameters.latitude, + Parameters.longitude, + Parameters.numberOfClosestPoints + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const postPointInPolygonOperationSpec: coreClient.OperationSpec = { + path: "/spatial/pointInPolygon/{format}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.PointInPolygonResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.pointInPolygonRequestBody, + queryParameters: [ + Parameters.apiVersion1, + Parameters.latitude, + Parameters.longitude + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [ + Parameters.accept, + Parameters.xMsClientId, + Parameters.contentType2 + ], + mediaType: "json", + serializer +}; +const getPointInPolygonOperationSpec: coreClient.OperationSpec = { + path: "/spatial/pointInPolygon/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.PointInPolygonResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.udid, + Parameters.apiVersion1, + Parameters.latitude, + Parameters.longitude + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getGreatCircleDistanceOperationSpec: coreClient.OperationSpec = { + path: "/spatial/greatCircleDistance/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.GreatCircleDistanceResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion1, Parameters.query], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; diff --git a/sdk/maps/maps-creator/src/operations/tileset.ts b/sdk/maps/maps-creator/src/operations/tileset.ts new file mode 100644 index 000000000000..79d99c31c082 --- /dev/null +++ b/sdk/maps/maps-creator/src/operations/tileset.ts @@ -0,0 +1,442 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import "@azure/core-paging"; +import { PagedAsyncIterableIterator } from "@azure/core-paging"; +import { Tileset } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; +import * as Mappers from "../models/mappers"; +import * as Parameters from "../models/parameters"; +import { CreatorClientContext } from "../creatorClientContext"; +import { LROPoller, shouldDeserializeLRO } from "../lro"; +import { PollerLike, PollOperationState } from "@azure/core-lro"; +import { + TilesetDetailInfo, + TilesetListNextOptionalParams, + TilesetListOptionalParams, + TilesetCreateOptionalParams, + TilesetCreateResponse, + TilesetListOperationResponse, + TilesetGetOptionalParams, + TilesetGetResponse, + TilesetDeleteOptionalParams, + TilesetGetOperationOptionalParams, + TilesetGetOperationResponse, + TilesetListNextResponse +} from "../models"; + +/// +/** Class representing a Tileset. */ +export class TilesetImpl implements Tileset { + private readonly client: CreatorClientContext; + + /** + * Initialize a new instance of the class Tileset class. + * @param client Reference to the service client + */ + constructor(client: CreatorClientContext) { + this.client = client; + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a list of all tilesets created. + *
+ * @param options The options parameters. + */ + public list( + options?: TilesetListOptionalParams + ): PagedAsyncIterableIterator { + const iter = this.listPagingAll(options); + return { + next() { + return iter.next(); + }, + [Symbol.asyncIterator]() { + return this; + }, + byPage: () => { + return this.listPagingPage(options); + } + }; + } + + private async *listPagingPage( + options?: TilesetListOptionalParams + ): AsyncIterableIterator { + let result = await this._list(options); + yield result.tilesets || []; + let continuationToken = result.nextLink; + while (continuationToken) { + result = await this._listNext(continuationToken, options); + continuationToken = result.nextLink; + yield result.tilesets || []; + } + } + + private async *listPagingAll( + options?: TilesetListOptionalParams + ): AsyncIterableIterator { + for await (const page of this.listPagingPage(options)) { + yield* page; + } + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * [This](https://docs.microsoft.com/en-us/azure/azure-maps/creator-indoor-maps) article introduces + * concepts and tools that apply to Azure Maps Creator. + * + * The Tileset Create API allows the caller to create a tileset from a dataset. A tileset contains a + * set of tiles that can be consumed + * from the [Get Map Tile](/rest/api/maps/render/getmaptile) to retrieve custom tiles. To make a + * dataset, use the + * [DataSet Create API](/rest/api/maps/dataset/createpreview). + * + * ## Submit Create Request + * + * To create your tileset you will make a `POST` request with an empty body. The `datasetId` query + * parameter will be + * used as the source of the tileset data. + * + * The Create Tileset API is a + * [long-running request](https://aka.ms/am-creator-lrt-v2). + * @param datasetId The unique `datasetId` that the tileset create API uses to retrieve features to + * generate tiles. The `datasetId` must have been obtained from a successful [Dataset Create + * API](/en-us/rest/api/maps/dataset/createpreview) call. + * @param options The options parameters. + */ + async beginCreate( + datasetId: string, + options?: TilesetCreateOptionalParams + ): Promise< + PollerLike, TilesetCreateResponse> + > { + const directSendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ): Promise => { + return this.client.sendOperationRequest(args, spec); + }; + const sendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ) => { + let currentRawResponse: + | coreClient.FullOperationResponse + | undefined = undefined; + const providedCallback = args.options?.onResponse; + const callback: coreClient.RawResponseCallback = ( + rawResponse: coreClient.FullOperationResponse, + flatResponse: unknown + ) => { + currentRawResponse = rawResponse; + providedCallback?.(rawResponse, flatResponse); + }; + const updatedArgs = { + ...args, + options: { + ...args.options, + onResponse: callback + } + }; + const flatResponse = await directSendOperation(updatedArgs, spec); + return { flatResponse, rawResponse: currentRawResponse! }; + }; + + return new LROPoller( + { intervalInMs: options?.updateIntervalInMs }, + { datasetId, options }, + createOperationSpec, + sendOperation, + "location" + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * [This](https://docs.microsoft.com/en-us/azure/azure-maps/creator-indoor-maps) article introduces + * concepts and tools that apply to Azure Maps Creator. + * + * The Tileset Create API allows the caller to create a tileset from a dataset. A tileset contains a + * set of tiles that can be consumed + * from the [Get Map Tile](/rest/api/maps/render/getmaptile) to retrieve custom tiles. To make a + * dataset, use the + * [DataSet Create API](/rest/api/maps/dataset/createpreview). + * + * ## Submit Create Request + * + * To create your tileset you will make a `POST` request with an empty body. The `datasetId` query + * parameter will be + * used as the source of the tileset data. + * + * The Create Tileset API is a + * [long-running request](https://aka.ms/am-creator-lrt-v2). + * @param datasetId The unique `datasetId` that the tileset create API uses to retrieve features to + * generate tiles. The `datasetId` must have been obtained from a successful [Dataset Create + * API](/en-us/rest/api/maps/dataset/createpreview) call. + * @param options The options parameters. + */ + async beginCreateAndWait( + datasetId: string, + options?: TilesetCreateOptionalParams + ): Promise { + const poller = await this.beginCreate(datasetId, options); + return poller.pollUntilDone(); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a list of all tilesets created. + *
+ * @param options The options parameters. + */ + private _list( + options?: TilesetListOptionalParams + ): Promise { + return this.client.sendOperationRequest({ options }, listOperationSpec); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a tileset. + * @param tilesetId The Tileset Id + * @param options The options parameters. + */ + get( + tilesetId: string, + options?: TilesetGetOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { tilesetId, options }, + getOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to delete a created tileset.
+ * You can use this API if a tileset is no longer needed. + * + * ### Submit Delete Request + * + * To delete your content you will issue a `DELETE` request where the path will contain the `tilesetId` + * of the tileset to delete.
+ * + * #### Delete request "Successful" + * + * The Tileset Delete API returns a HTTP `204 No Content` response with an empty body, if the tileset + * was deleted successfully.
+ * + * #### Delete request "Failed" + * + * A HTTP `400 Bad Request` error response will be returned if the tileset with the passed-in + * `tilesetId` is not found. + * + * Here is a sample error response: + * + *
+ * + * ```json + * { + * "error": { + * "code": "400 BadRequest", + * "message": "Bad request - Tileset Id: d85b5b27-5fc4-4599-8b50-47160e90f8ce does not exist." + * } + * } + * ``` + * @param tilesetId The Tileset Id + * @param options The options parameters. + */ + delete( + tilesetId: string, + options?: TilesetDeleteOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { tilesetId, options }, + deleteOperationSpec + ); + } + + /** + * This path will be obtained from a call to /tilesets/create. While in progress, an http200 will be + * returned with no extra headers - followed by an http200 with Resource-Location header once + * successfully completed. + * @param operationId The ID to query the status for the dataset create/import request. + * @param options The options parameters. + */ + getOperation( + operationId: string, + options?: TilesetGetOperationOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { operationId, options }, + getOperationOperationSpec + ); + } + + /** + * ListNext + * @param nextLink The nextLink from the previous successful call to the List method. + * @param options The options parameters. + */ + private _listNext( + nextLink: string, + options?: TilesetListNextOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { nextLink, options }, + listNextOperationSpec + ); + } +} +// Operation Specifications +const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); + +const createOperationSpec: coreClient.OperationSpec = { + path: "/tilesets", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.TilesetCreateHeaders + }, + 201: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.TilesetCreateHeaders + }, + 202: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.TilesetCreateHeaders + }, + 204: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.TilesetCreateHeaders + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.description, + Parameters.datasetId2 + ], + urlParameters: [Parameters.geography], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const listOperationSpec: coreClient.OperationSpec = { + path: "/tilesets", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.TilesetListResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getOperationSpec: coreClient.OperationSpec = { + path: "/tilesets/{tilesetId}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.TilesetDetailInfo + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.tilesetId], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const deleteOperationSpec: coreClient.OperationSpec = { + path: "/tilesets/{tilesetId}", + httpMethod: "DELETE", + responses: { + 204: {}, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.tilesetId], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getOperationOperationSpec: coreClient.OperationSpec = { + path: "/tilesets/operations/{operationId}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.LongRunningOperationResult, + headersMapper: Mappers.TilesetGetOperationHeaders + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.operationId], + headerParameters: [Parameters.accept], + serializer +}; +const listNextOperationSpec: coreClient.OperationSpec = { + path: "{nextLink}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.TilesetListResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.nextLink], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; diff --git a/sdk/maps/maps-creator/src/operations/wfs.ts b/sdk/maps/maps-creator/src/operations/wfs.ts new file mode 100644 index 000000000000..0840d999bc6d --- /dev/null +++ b/sdk/maps/maps-creator/src/operations/wfs.ts @@ -0,0 +1,431 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { Wfs } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; +import * as Mappers from "../models/mappers"; +import * as Parameters from "../models/parameters"; +import { CreatorClientContext } from "../creatorClientContext"; +import { + WfsGetLandingPageOptionalParams, + WfsGetLandingPageResponse, + WfsGetConformanceOptionalParams, + WfsGetConformanceResponse, + WfsGetCollectionsOptionalParams, + WfsGetCollectionsResponse, + WfsGetCollectionOptionalParams, + WfsGetCollectionResponse, + WfsGetCollectionDefinitionOptionalParams, + WfsGetCollectionDefinitionResponse, + WfsGetFeaturesOptionalParams, + WfsGetFeaturesResponse, + WfsGetFeatureOptionalParams, + WfsGetFeatureResponse, + WfsDeleteFeatureOptionalParams +} from "../models"; + +/** Class representing a Wfs. */ +export class WfsImpl implements Wfs { + private readonly client: CreatorClientContext; + + /** + * Initialize a new instance of the class Wfs class. + * @param client Reference to the service client + */ + constructor(client: CreatorClientContext) { + this.client = client; + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial + * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to + * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). + * A dataset consists of multiple feature collections. A feature collection is a collection of features + * of a similar type, based on a common schema. + * The Get Landing Page API provides links to the API definition, the Conformance statements and the + * metadata about the feature data in this dataset. + * @param datasetId The identifier for the dataset to query from. + * @param options The options parameters. + */ + getLandingPage( + datasetId: string, + options?: WfsGetLandingPageOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { datasetId, options }, + getLandingPageOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial + * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to + * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). + * A dataset consists of multiple feature collections. A feature collection is a collection of features + * of a similar type, based on a common schema. + * The Get Requirements Classes lists all requirements classes specified in the standard that the + * server conforms to. + * @param datasetId The identifier for the dataset to query from. + * @param options The options parameters. + */ + getConformance( + datasetId: string, + options?: WfsGetConformanceOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { datasetId, options }, + getConformanceOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial + * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to + * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). + * A dataset consists of multiple feature collections. A feature collection is a collection of features + * of a similar type, based on a common schema. + * The Collections Description API provides descriptions of all the collections in a given dataset. + * @param datasetId The identifier for the dataset to query from. + * @param options The options parameters. + */ + getCollections( + datasetId: string, + options?: WfsGetCollectionsOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { datasetId, options }, + getCollectionsOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial + * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to + * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). + * A dataset consists of multiple feature collections. A feature collection is a collection of features + * of a similar type, based on a common schema. + * + * The Collection Description API provides the description of a given collection. It includes the links + * to the operations that can be performed on the collection. + * @param datasetId The identifier for the dataset to query from. + * @param collectionId Identifier (name) of a specific collection + * @param options The options parameters. + */ + getCollection( + datasetId: string, + collectionId: string, + options?: WfsGetCollectionOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { datasetId, collectionId, options }, + getCollectionOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * [This](https://docs.microsoft.com/en-us/azure/azure-maps/creator-indoor-maps) article introduces + * concepts and tools that apply to Azure Maps Creator. WFS API follows the [Open Geospatial Consortium + * API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to query + * [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). + * A dataset consists of multiple feature collections. A feature collection is a collection of features + * of a similar type, based on a common schema. + * + * The Collection Definition API provides the detailed data model of a given collection. + * @param datasetId The identifier for the dataset to query from. + * @param collectionId Identifier (name) of a specific collection + * @param options The options parameters. + */ + getCollectionDefinition( + datasetId: string, + collectionId: string, + options?: WfsGetCollectionDefinitionOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { datasetId, collectionId, options }, + getCollectionDefinitionOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial + * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to + * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). + * A dataset consists of multiple feature collections. A feature collection is a collection of features + * of a similar type, based on a common schema. + * The Get Features API returns the list of features in the given collection. + * @param datasetId The identifier for the dataset to query from. + * @param collectionId Identifier (name) of a specific collection + * @param options The options parameters. + */ + getFeatures( + datasetId: string, + collectionId: string, + options?: WfsGetFeaturesOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { datasetId, collectionId, options }, + getFeaturesOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial + * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to + * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). + * A dataset consists of multiple feature collections. A feature collection is a collection of features + * of a similar type, based on a common schema. + * The Get Feature API returns the feature identified by the provided id in the given collection. + * @param datasetId The identifier for the dataset to query from. + * @param collectionId Identifier (name) of a specific collection + * @param featureId Local identifier of a specific feature + * @param options The options parameters. + */ + getFeature( + datasetId: string, + collectionId: string, + featureId: string, + options?: WfsGetFeatureOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { datasetId, collectionId, featureId, options }, + getFeatureOperationSpec + ); + } + + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial + * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to + * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). + * A dataset consists of multiple feature collections. A feature collection is a collection of features + * of a similar type, based on a common schema. + * The Delete Feature API deletes the feature identified by the provided id in the given collection. At + * this point this API supports only facility features. Deleting a facility feature deletes all the + * child features of that facility recursively. + * @param datasetId The identifier for the dataset to query from. + * @param collectionId Identifier (name) of a specific collection + * @param featureId Local identifier of a specific feature + * @param options The options parameters. + */ + deleteFeature( + datasetId: string, + collectionId: string, + featureId: string, + options?: WfsDeleteFeatureOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { datasetId, collectionId, featureId, options }, + deleteFeatureOperationSpec + ); + } +} +// Operation Specifications +const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); + +const getLandingPageOperationSpec: coreClient.OperationSpec = { + path: "/wfs/datasets/{datasetId}/", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.LandingPageResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.datasetId1], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getConformanceOperationSpec: coreClient.OperationSpec = { + path: "/wfs/datasets/{datasetId}/conformance", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.ConformanceResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.datasetId1], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getCollectionsOperationSpec: coreClient.OperationSpec = { + path: "/wfs/datasets/{datasetId}/collections", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.CollectionsResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.datasetId1], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getCollectionOperationSpec: coreClient.OperationSpec = { + path: "/wfs/datasets/{datasetId}/collections/{collectionId}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.CollectionInfo + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [ + Parameters.geography, + Parameters.datasetId1, + Parameters.collectionId + ], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getCollectionDefinitionOperationSpec: coreClient.OperationSpec = { + path: "/wfs/datasets/{datasetId}/collections/{collectionId}/definition", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.CollectionDefinitionResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [ + Parameters.geography, + Parameters.datasetId1, + Parameters.collectionId + ], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getFeaturesOperationSpec: coreClient.OperationSpec = { + path: "/wfs/datasets/{datasetId}/collections/{collectionId}/items", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.ExtendedGeoJsonFeatureCollection + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.limit, + Parameters.bbox, + Parameters.filter + ], + urlParameters: [ + Parameters.geography, + Parameters.datasetId1, + Parameters.collectionId + ], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getFeatureOperationSpec: coreClient.OperationSpec = { + path: + "/wfs/datasets/{datasetId}/collections/{collectionId}/items/{featureId}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.FeatureResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [ + Parameters.geography, + Parameters.datasetId1, + Parameters.featureId, + Parameters.collectionId + ], + headerParameters: [Parameters.accept], + serializer +}; +const deleteFeatureOperationSpec: coreClient.OperationSpec = { + path: + "/wfs/datasets/{datasetId}/collections/{collectionId}/items/{featureId}", + httpMethod: "DELETE", + responses: { + 204: {}, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [ + Parameters.geography, + Parameters.datasetId1, + Parameters.featureId, + Parameters.collectionId + ], + headerParameters: [Parameters.accept], + serializer +}; diff --git a/sdk/maps/maps-creator/src/operationsInterfaces/alias.ts b/sdk/maps/maps-creator/src/operationsInterfaces/alias.ts new file mode 100644 index 000000000000..469956ab0d8b --- /dev/null +++ b/sdk/maps/maps-creator/src/operationsInterfaces/alias.ts @@ -0,0 +1,207 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import "@azure/core-paging"; +import { PagedAsyncIterableIterator } from "@azure/core-paging"; +import { + AliasListItem, + AliasListOptionalParams, + AliasCreateOptionalParams, + AliasCreateResponse, + AliasAssignOptionalParams, + AliasAssignResponse, + AliasDeleteOptionalParams, + AliasGetDetailsOptionalParams, + AliasGetDetailsResponse +} from "../models"; + +/// +/** Interface representing a Alias. */ +export interface Alias { + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a list of all previously successfully created aliases. + * + * ### Submit List Request + * + * To list all your aliases, you will issue a `GET` request with no additional parameters. + * + * ### List Data Response + * + * The List API returns the complete list of all aliases in `json` format. The response contains the + * following details for each alias resource: + * > createdTimestamp - The timestamp that the alias was created. Format yyyy-MM-ddTHH:mm:ss.sssZ + * > aliasId - The id for the alias. + * > creatorDataItemId - The id for the creator data item that this alias references (could be null + * if the alias has not been assigned). + * > lastUpdatedTimestamp - The last time the alias was assigned to a resource. Format + * yyyy-MM-ddTHH:mm:ss.sssZ + * + * A sample response returning 2 alias resources: + * + * ```json + * { + * "aliases": [ + * { + * "createdTimestamp": "2020-02-13T21:19:11.123Z", + * "aliasId": "a8a4b8bb-ecf4-fb27-a618-f41721552766", + * "creatorDataItemId": "e89aebb9-70a3-8fe1-32bb-1fbd0c725f14", + * "lastUpdatedTimestamp": "2020-02-13T21:19:22.123Z" + * }, + * { + * "createdTimestamp": "2020-02-18T19:53:33.123Z", + * "aliasId": "1856dbfc-7a66-ee5a-bf8d-51dbfe1906f6", + * "creatorDataItemId": null, + * "lastUpdatedTimestamp": "2020-02-18T19:53:33.123Z" + * } + * ] + * } + * ``` + * @param options The options parameters. + */ + list( + options?: AliasListOptionalParams + ): PagedAsyncIterableIterator; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to create an alias. You can also assign the alias during the create + * request. An alias can reference an ID generated by a creator service, but cannot reference another + * alias ID. + * + * ### Submit Create Request + * + * To create your alias, you will use a `POST` request. If you would like to assign the alias during + * the creation, you will pass the `resourceId` query parameter. + * + * ### Create Alias Response + * + * The Create API returns a HTTP `201 Created` response with the alias resource in the body. + * + * A sample response from creating an alias: + * + * ```json + * { + * "createdTimestamp": "2020-02-13T21:19:11.123Z", + * "aliasId": "a8a4b8bb-ecf4-fb27-a618-f41721552766", + * "creatorDataItemId": "e89aebb9-70a3-8fe1-32bb-1fbd0c725f14", + * "lastUpdatedTimestamp": "2020-02-13T21:19:22.123Z" + * } + * ``` + * @param options The options parameters. + */ + create(options?: AliasCreateOptionalParams): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to assign an alias to reference a resource. + * + * ### Submit Assign Request + * + * To assign your alias to a resource, you will use a `PUT` request with the `aliasId` in the path and + * the `creatorDataItemId` passed as a query parameter. + * + * ### Assign Alias Response + * + * The Assign API returns a HTTP `200 OK` response with the updated alias resource in the body, if the + * alias was assigned successfully. A sample of the assign response is + * + * ```json + * { + * "createdTimestamp": "2020-02-13T21:19:11.123Z", + * "aliasId": "a8a4b8bb-ecf4-fb27-a618-f41721552766", + * "creatorDataItemId": "e89aebb9-70a3-8fe1-32bb-1fbd0c725f14", + * "lastUpdatedTimestamp": "2020-02-13T21:19:22.123Z" + * } + * ``` + * @param aliasId The unique id that references an existing alias. + * @param creatorDataItemId The unique id that references a creator data item to be aliased. + * @param options The options parameters. + */ + assign( + aliasId: string, + creatorDataItemId: string, + options?: AliasAssignOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to delete a previously created alias. You can also use this API to delete + * old/unused aliases to create space for new content.This API does not delete the references resource, + * only the alias referencing the resource. + * + * ### Submit Delete Request + * + * To delete your alias you will issue a `DELETE` request where the path will contain the `aliasId` of + * the alias to delete. + * + * ### Delete Alias Response + * + * The Delete API returns a HTTP `204 No Content` response with an empty body, if the alias was deleted + * successfully. + * @param aliasId The unique id that references an existing alias. + * @param options The options parameters. + */ + delete(aliasId: string, options?: AliasDeleteOptionalParams): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch the details of a previously created alias. + * + * ### Submit Get Details Request + * + * To get the details of your alias, you will issue a `GET` request with the `aliasId` in the path. + * + * ### Get Details Response + * + * The Get Details API returns the previously created alias in `json` format. The response contains the + * following details for the alias resource: + * > createdTimestamp - The timestamp that the alias was created. + * > aliasId - The id for the alias. + * > creatorDataItemId - The id for the creator data item that this alias references (could be null + * if the alias has not been assigned). + * > lastUpdatedTimestamp - The last time the alias was assigned to a resource. + * + * Here's a sample response: + * ```json + * { + * "createdTimestamp": "2020-02-13T21:19:11.123Z", + * "aliasId": "a8a4b8bb-ecf4-fb27-a618-f41721552766", + * "creatorDataItemId": "e89aebb9-70a3-8fe1-32bb-1fbd0c725f14", + * "lastUpdatedTimestamp": "2020-02-13T21:19:22.123Z" + * } + * ``` + * @param aliasId The unique id that references an existing alias. + * @param options The options parameters. + */ + getDetails( + aliasId: string, + options?: AliasGetDetailsOptionalParams + ): Promise; +} diff --git a/sdk/maps/maps-creator/src/operationsInterfaces/conversion.ts b/sdk/maps/maps-creator/src/operationsInterfaces/conversion.ts new file mode 100644 index 000000000000..938dad939d14 --- /dev/null +++ b/sdk/maps/maps-creator/src/operationsInterfaces/conversion.ts @@ -0,0 +1,276 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import "@azure/core-paging"; +import { PagedAsyncIterableIterator } from "@azure/core-paging"; +import { PollerLike, PollOperationState } from "@azure/core-lro"; +import { + ConversionListDetailInfo, + ConversionListOptionalParams, + ConversionConvertOptionalParams, + ConversionConvertResponse, + ConversionGetOptionalParams, + ConversionGetResponse, + ConversionDeleteOptionalParams, + ConversionGetOperationOptionalParams, + ConversionGetOperationResponse +} from "../models"; + +/// +/** Interface representing a Conversion. */ +export interface Conversion { + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a list of all successful data conversions submitted previously + * using the [Conversion + * API](https://docs.microsoft.com/en-us/rest/api/maps/conversion/convertpreview). + * + * ### Submit List Request + * + * To list all successful conversions you will issue a `GET` request with no additional parameters. + * + * ### List Data Response + * + * The Conversion List API returns the complete list of all conversion details in `json` format.
+ * + * Here is a sample response returning the details of two successful conversion requests: + * + *
+ * + * ```json + * { + * "conversions": + * [ + * { + * "conversionId": "54398242-ea6c-1f31-4fa6-79b1ae0fc24d", + * "udid": "31838736-8b84-11ea-bc55-0242ac130003", + * "created": "5/19/2020 9:00:00 AM +00:00", + * "description": "User provided description.", + * "featureCounts": { + * "DIR": 1, + * "LVL": 3, + * "FCL": 1, + * "UNIT": 150, + * "CTG": 8, + * "AEL": 0, + * "OPN": 10 + * } + * }, + * { + * "conversionId": "2acf7d32-8b84-11ea-bc55-0242ac130003", + * "udid": "1214bc58-8b84-11ea-bc55-0242ac1300039", + * "created": "5/19/2020 9:00:00 AM +00:00", + * "description": "User provided description.", + * "featureCounts": { + * "DIR": 1, + * "LVL": 3, + * "FCL": 1, + * "UNIT": 150, + * "CTG": 8, + * "AEL": 0, + * "OPN": 10 + * } + * } + * ] + * } + * ``` + * + *
+ * @param options The options parameters. + */ + list( + options?: ConversionListOptionalParams + ): PagedAsyncIterableIterator; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * The Conversion API lets the caller import a set of DWG design files as a zipped [Drawing + * Package](https://aka.ms/am-drawing-package) into Azure Maps. The [Drawing + * Package](https://aka.ms/am-drawing-package) should first be uploaded using the [Azure Maps Data + * Service](https://docs.microsoft.com/rest/api/maps/data). Once uploaded, use the `udid` returned by + * the [Data Upload API](https://docs.microsoft.com/rest/api/maps/data/uploadpreview) to call this + * Conversion API. + * + * ## Convert DWG package + * + * The Conversion API performs a [long-running request](https://aka.ms/am-creator-lrt-v2). + * + * ## Debug DWG package issues + * + * + * During the Conversion process, if there are any issues with the DWG package [errors and + * warnings](https://aka.ms/am-conversion-errors) are provided in the response along with a *diagnostic + * package* to visualize and diagnose these issues. In case any issues are encountered with your DWG + * package, the Conversion operation status process as detailed + * [here](https://aka.ms/am-creator-lrt-v2) returns the location of the *diagnostic package* that can + * be downloaded by the caller to help them visualize and diagnose these issues. The *diagnostic + * package* location can be found in the properties section of the conversion operation status response + * and looks like the following: + * + * ```json + * { + * "properties": { + * "diagnosticPackageLocation": + * "https://us.atlas.microsoft.com/mapdata/{DiagnosticPackageId}?api-version=1.0" + * } + * } + * ``` + * + * The *diagnostic package* can be downloaded by executing a `HTTP GET` request on the + * `diagnosticPackageLocation`. + * For more details on how to use the tool to visualize and diagnose all the errors and warnings see + * [Drawing Error Visualizer](https://aka.ms/am-drawing-errors-visualizer).
+ * + * A conversion operation will be marked as *success* if there are zero or more warnings but will be + * marked as *failed* if any errors are encountered. + * @param udid The unique data id for the content. The `udid` must have been obtained from a successful + * [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) call. + * @param outputOntology Output ontology version. "facility-2.0" is the only supported value at this + * time. Please refer to this + * [article](https://docs.microsoft.com/en-us/azure/azure-maps/creator-facility-ontology) for more + * information about Azure Maps Creator ontologies. + * @param options The options parameters. + */ + beginConvert( + udid: string, + outputOntology: string, + options?: ConversionConvertOptionalParams + ): Promise< + PollerLike< + PollOperationState, + ConversionConvertResponse + > + >; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * The Conversion API lets the caller import a set of DWG design files as a zipped [Drawing + * Package](https://aka.ms/am-drawing-package) into Azure Maps. The [Drawing + * Package](https://aka.ms/am-drawing-package) should first be uploaded using the [Azure Maps Data + * Service](https://docs.microsoft.com/rest/api/maps/data). Once uploaded, use the `udid` returned by + * the [Data Upload API](https://docs.microsoft.com/rest/api/maps/data/uploadpreview) to call this + * Conversion API. + * + * ## Convert DWG package + * + * The Conversion API performs a [long-running request](https://aka.ms/am-creator-lrt-v2). + * + * ## Debug DWG package issues + * + * + * During the Conversion process, if there are any issues with the DWG package [errors and + * warnings](https://aka.ms/am-conversion-errors) are provided in the response along with a *diagnostic + * package* to visualize and diagnose these issues. In case any issues are encountered with your DWG + * package, the Conversion operation status process as detailed + * [here](https://aka.ms/am-creator-lrt-v2) returns the location of the *diagnostic package* that can + * be downloaded by the caller to help them visualize and diagnose these issues. The *diagnostic + * package* location can be found in the properties section of the conversion operation status response + * and looks like the following: + * + * ```json + * { + * "properties": { + * "diagnosticPackageLocation": + * "https://us.atlas.microsoft.com/mapdata/{DiagnosticPackageId}?api-version=1.0" + * } + * } + * ``` + * + * The *diagnostic package* can be downloaded by executing a `HTTP GET` request on the + * `diagnosticPackageLocation`. + * For more details on how to use the tool to visualize and diagnose all the errors and warnings see + * [Drawing Error Visualizer](https://aka.ms/am-drawing-errors-visualizer).
+ * + * A conversion operation will be marked as *success* if there are zero or more warnings but will be + * marked as *failed* if any errors are encountered. + * @param udid The unique data id for the content. The `udid` must have been obtained from a successful + * [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) call. + * @param outputOntology Output ontology version. "facility-2.0" is the only supported value at this + * time. Please refer to this + * [article](https://docs.microsoft.com/en-us/azure/azure-maps/creator-facility-ontology) for more + * information about Azure Maps Creator ontologies. + * @param options The options parameters. + */ + beginConvertAndWait( + udid: string, + outputOntology: string, + options?: ConversionConvertOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a successful data conversion submitted previously using the + * [Conversion API](https://docs.microsoft.com/en-us/rest/api/maps/conversion/convertpreview). + * @param conversionId The conversion id for the content. The `conversionId` must have been obtained + * from a successful [Conversion + * API](https://docs.microsoft.com/en-us/rest/api/maps/v2/conversion/convert) call. + * @param options The options parameters. + */ + get( + conversionId: string, + options?: ConversionGetOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to delete any data conversions created previously using the [Conversion + * API](https://docs.microsoft.com/en-us/rest/api/maps/conversion/convertpreview). + * + * ### Submit Delete Request + * + * To delete your conversion data you will issue a `DELETE` request where the path will contain the + * `conversionId` of the data to delete. + * + * ### Conversion Delete Response + * + * The Conversion Delete API returns a HTTP `204 No Content` response with an empty body, if the + * converted data resources were deleted successfully.
+ * A HTTP `400 Bad Request` error response will be returned if no resource associated with the + * passed-in `conversionId` is found. + * @param conversionId The conversion id for the content. The `conversionId` must have been obtained + * from a successful [Conversion + * API](https://docs.microsoft.com/en-us/rest/api/maps/v2/conversion/convert) call. + * @param options The options parameters. + */ + delete( + conversionId: string, + options?: ConversionDeleteOptionalParams + ): Promise; + /** + * This path will be obtained from a call to POST /conversions. While in progress, an http200 will be + * returned with no extra headers - followed by an http200 with Resource-Location header once + * successfully completed. + * @param operationId The ID to query the status for the dataset create/import request. + * @param options The options parameters. + */ + getOperation( + operationId: string, + options?: ConversionGetOperationOptionalParams + ): Promise; +} diff --git a/sdk/maps/maps-creator/src/operationsInterfaces/data.ts b/sdk/maps/maps-creator/src/operationsInterfaces/data.ts new file mode 100644 index 000000000000..8f51c0f0fa5a --- /dev/null +++ b/sdk/maps/maps-creator/src/operationsInterfaces/data.ts @@ -0,0 +1,521 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreRestPipeline from "@azure/core-rest-pipeline"; +import { PollerLike, PollOperationState } from "@azure/core-lro"; +import { + UploadDataFormat, + DataUploadPreview$binaryOptionalParams, + DataUploadPreview$jsonOptionalParams, + DataUploadPreviewResponse, + DataListPreviewOptionalParams, + DataListPreviewResponse, + DataUpdatePreviewOptionalParams, + DataUpdatePreviewResponse, + DataDownloadPreviewOptionalParams, + DataDownloadPreviewResponse, + DataDeletePreviewOptionalParams, + DataGetOperationPreviewOptionalParams, + DataGetOperationPreviewResponse +} from "../models"; + +/** Interface representing a Data. */ +export interface Data { + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * The Data Upload API allows the caller to upload data content to the Azure Maps service. + * You can use this API in a scenario like uploading a collection of Geofences in `GeoJSON` + * format, for use in our [Azure Maps Geofencing + * Service](https://docs.microsoft.com/rest/api/maps/spatial). + * + * ## Submit Upload Request + * + * To upload your content you will use a `POST` request. The request body will contain the data to + * upload. The + * `dataFormat` query parameter will contain the format for the data, the `dataSharingLevel` query + * parameter + * can contain the sharing level for the data. The `Content-Type` header will be set to the content + * type of the + * data. + * + * For example, to upload a collection of geofences in `GeoJSON` format, set the request body to the + * geofence + * content. Set the `dataFormat` query parameter to _geojson_, and set the `Content-Type` header to + * either one + * of the following media types: + * + * - `application/json` + * - `application/vnd.geo+json` + * - `application/octet-stream` + * + * Here's a sample request body for uploading a simple Geofence represented as a circle geometry using + * a center + * point and a radius. The sample below is in `GeoJSON`: + * + * ```json + * { + * "type": "FeatureCollection", + * "features": [{ + * "type": "Feature", + * "geometry": { + * "type": "Point", + * "coordinates": [-122.126986, 47.639754] + * }, + * "properties": { + * "geometryId": "001", + * "radius": 500 + * } + * }] + * } + * ``` + * + * The Data Upload API performs a + * [long-running request](https://aka.ms/am-creator-lrt-v2). + * + * ## Data Upload Limits + * + * Please, be aware that currently every Azure Maps account has a [data storage + * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). + * + * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http + * error response. + * You can always use the [Data Delete + * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to + * delete old/unused content and create space for new uploads. + * @param args Includes all the parameters for this operation. + */ + beginUploadPreview( + ...args: + | [ + UploadDataFormat, + "application/octet-stream", + coreRestPipeline.RequestBodyType, + DataUploadPreview$binaryOptionalParams? + ] + | [ + UploadDataFormat, + "application/json", + Record, + DataUploadPreview$jsonOptionalParams? + ] + ): Promise< + PollerLike< + PollOperationState, + DataUploadPreviewResponse + > + >; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * The Data Upload API allows the caller to upload data content to the Azure Maps service. + * You can use this API in a scenario like uploading a collection of Geofences in `GeoJSON` + * format, for use in our [Azure Maps Geofencing + * Service](https://docs.microsoft.com/rest/api/maps/spatial). + * + * ## Submit Upload Request + * + * To upload your content you will use a `POST` request. The request body will contain the data to + * upload. The + * `dataFormat` query parameter will contain the format for the data, the `dataSharingLevel` query + * parameter + * can contain the sharing level for the data. The `Content-Type` header will be set to the content + * type of the + * data. + * + * For example, to upload a collection of geofences in `GeoJSON` format, set the request body to the + * geofence + * content. Set the `dataFormat` query parameter to _geojson_, and set the `Content-Type` header to + * either one + * of the following media types: + * + * - `application/json` + * - `application/vnd.geo+json` + * - `application/octet-stream` + * + * Here's a sample request body for uploading a simple Geofence represented as a circle geometry using + * a center + * point and a radius. The sample below is in `GeoJSON`: + * + * ```json + * { + * "type": "FeatureCollection", + * "features": [{ + * "type": "Feature", + * "geometry": { + * "type": "Point", + * "coordinates": [-122.126986, 47.639754] + * }, + * "properties": { + * "geometryId": "001", + * "radius": 500 + * } + * }] + * } + * ``` + * + * The Data Upload API performs a + * [long-running request](https://aka.ms/am-creator-lrt-v2). + * + * ## Data Upload Limits + * + * Please, be aware that currently every Azure Maps account has a [data storage + * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). + * + * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http + * error response. + * You can always use the [Data Delete + * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to + * delete old/unused content and create space for new uploads. + * @param args Includes all the parameters for this operation. + */ + beginUploadPreviewAndWait( + ...args: + | [ + UploadDataFormat, + "application/octet-stream", + coreRestPipeline.RequestBodyType, + DataUploadPreview$binaryOptionalParams? + ] + | [ + UploadDataFormat, + "application/json", + Record, + DataUploadPreview$jsonOptionalParams? + ] + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * This API allows the caller to fetch a list of all content uploaded previously using the [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview). + * + * + * ### Submit List Request + * + * To list all your map data content you will issue a `GET` request with no additional parameters. + * + * + * ### List Data Response + * + * The Data List API returns the complete list of all data in `json` format. The response contains the + * following details for each data resource: + * + * > udid - The unique data id for the data resource. + * + * > location - The location of the data resource. Execute a HTTP `GET` on this location to download + * the data. + * + * + * Here's a sample response returning the `udid` and `location` of 3 data resources: + * + *
+ * + * ```json + * { + * "mapDataList": + * [ + * { + * "udid": "9a1288fa-1858-4a3b-b68d-13a8j5af7d7c", + * "location": + * "https://us.atlas.microsoft.com/mapData/9a1288fa-1858-4a3b-b68d-13a8j5af7d7c?api-version=1.0", + * "sizeInBytes": 29920, + * "uploadStatus": "Completed" + * }, + * { + * "udid": "8b1288fa-1958-4a2b-b68e-13a7i5af7d7c", + * "location": + * "https://us.atlas.microsoft.com/mapData/8b1288fa-1958-4a2b-b68e-13a7i5af7d7c?api-version=1.0", + * "sizeInBytes": 1339, + * "uploadStatus": "Completed" + * }, + * { + * "udid": "7c1288fa-2058-4a1b-b68f-13a6h5af7d7c", + * "location": + * "https://us.atlas.microsoft.com/mapData/7c1288fa-2058-4a1b-b68f-13a6h5af7d7c?api-version=1.0", + * "sizeInBytes": 1650, + * "uploadStatus": "Pending" + * }] + * } + * ``` + * + *
+ * @param options The options parameters. + */ + listPreview( + options?: DataListPreviewOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * The Data Update API allows the caller to update a previously uploaded data content. + * + * You can use this API in a scenario like adding or removing geofences to or from an existing + * collection of geofences. + * Geofences are uploaded using the [Data Upload + * API](https://docs.microsoft.com/rest/api/maps/data%20v2/uploadpreview), for + * use in the [Azure Maps Geofencing Service](https://docs.microsoft.com/rest/api/maps/spatial). + * + * Please note that the Update API will *replace* and *override* the existing data content. + * + * ## Submit Update Request + * + * To update your content you will use a `PUT` request. The request body will contain the new data that + * will replace + * the existing data. The `Content-Type` header will be set to the content type of the data, and the + * path will contain + * the `udid` of the data to be update. + * + * For example, to update a collection of geofences that were previously uploaded using the Upload API, + * place the new + * geofence content in the request body. Set the `udid` parameter in the path to the `udid` of the data + * received + * previously in the upload API response. And set the `Content-Type` header to one of the following + * media types: + * + * - `application/json` + * - `application/vnd.geo+json` + * - `application/octet-stream` + * + * Here's a sample request body for updating a simple Geofence. It's represented as a circle geometry + * using a center + * point and a radius. The sample below is in `GeoJSON`: + * + * ```json + * { + * "type": "FeatureCollection", + * "features": [{ + * "type": "Feature", + * "geometry": { + * "type": "Point", + * "coordinates": [-122.126986, 47.639754] + * }, + * "properties": { + * "geometryId": "001", + * "radius": 500 + * } + * }] + * } + * ``` + * + * The previously uploaded geofence had a radius of 100m. The above request will update it to 500m. + * + * The Data Update API performs a + * [long-running request](https://aka.ms/am-creator-lrt-v2). + * + * ## Data Update Limits + * + * Please, be aware that currently every Azure Maps account has a [data storage + * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). + * + * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http + * error response. + * You can always use the [Data Delete + * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to + * delete old/unused content and create space for new uploads. + * @param uniqueDataId The unique data id for the content. The `udid` must have been obtained from a + * successful [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) + * call. + * @param updateContent The new content that will update/replace the previously uploaded content. + * @param options The options parameters. + */ + beginUpdatePreview( + uniqueDataId: string, + updateContent: Record, + options?: DataUpdatePreviewOptionalParams + ): Promise< + PollerLike< + PollOperationState, + DataUpdatePreviewResponse + > + >; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * The Data Update API allows the caller to update a previously uploaded data content. + * + * You can use this API in a scenario like adding or removing geofences to or from an existing + * collection of geofences. + * Geofences are uploaded using the [Data Upload + * API](https://docs.microsoft.com/rest/api/maps/data%20v2/uploadpreview), for + * use in the [Azure Maps Geofencing Service](https://docs.microsoft.com/rest/api/maps/spatial). + * + * Please note that the Update API will *replace* and *override* the existing data content. + * + * ## Submit Update Request + * + * To update your content you will use a `PUT` request. The request body will contain the new data that + * will replace + * the existing data. The `Content-Type` header will be set to the content type of the data, and the + * path will contain + * the `udid` of the data to be update. + * + * For example, to update a collection of geofences that were previously uploaded using the Upload API, + * place the new + * geofence content in the request body. Set the `udid` parameter in the path to the `udid` of the data + * received + * previously in the upload API response. And set the `Content-Type` header to one of the following + * media types: + * + * - `application/json` + * - `application/vnd.geo+json` + * - `application/octet-stream` + * + * Here's a sample request body for updating a simple Geofence. It's represented as a circle geometry + * using a center + * point and a radius. The sample below is in `GeoJSON`: + * + * ```json + * { + * "type": "FeatureCollection", + * "features": [{ + * "type": "Feature", + * "geometry": { + * "type": "Point", + * "coordinates": [-122.126986, 47.639754] + * }, + * "properties": { + * "geometryId": "001", + * "radius": 500 + * } + * }] + * } + * ``` + * + * The previously uploaded geofence had a radius of 100m. The above request will update it to 500m. + * + * The Data Update API performs a + * [long-running request](https://aka.ms/am-creator-lrt-v2). + * + * ## Data Update Limits + * + * Please, be aware that currently every Azure Maps account has a [data storage + * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). + * + * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http + * error response. + * You can always use the [Data Delete + * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to + * delete old/unused content and create space for new uploads. + * @param uniqueDataId The unique data id for the content. The `udid` must have been obtained from a + * successful [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) + * call. + * @param updateContent The new content that will update/replace the previously uploaded content. + * @param options The options parameters. + */ + beginUpdatePreviewAndWait( + uniqueDataId: string, + updateContent: Record, + options?: DataUpdatePreviewOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * This API allows the caller to download a previously uploaded data content.
+ * You can use this API in a scenario like downloading an existing collection of geofences uploaded + * previously using the [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) for use in our [Azure + * Maps Geofencing Service](https://docs.microsoft.com/en-us/rest/api/maps/spatial). + * + * + * ### Submit Download Request + * + * To download your content you will use a `GET` request where the path will contain the `udid` of the + * data to download. Optionally, you can also pass in an `Accept` header to specify a preference for + * the `Content-Type` of the data response.
+ * For example, to download a collection of geofences previously uploaded using the Upload API, set the + * `udid` parameter in the path to the `udid` of the data received previously in the upload API + * response and set the `Accept` header to either one of the following media types: + * + * - `application/json` + * - `application/vnd.geo+json` + * - `application/octet-stream` + * + * + * ### Download Data Response + * + * The Download API will return a HTTP `200 OK` response if the data resource with the passed-in `udid` + * is found, where the response body will contain the content of the data resource.
+ * A HTTP `400 Bad Request` error response will be returned if the data resource with the passed-in + * `udid` is not found.
+ * + * Here's a sample response body for a simple geofence represented in `GeoJSON` uploaded previously + * using the Upload API: + *
+ * + * ```json + * { + * "type": "FeatureCollection", + * "features": [{ + * "type": "Feature", + * "geometry": { + * "type": "Point", + * "coordinates": [-122.126986, 47.639754] + * }, + * "properties": { + * "geometryId": "001", + * "radius": 500 + * } + * }] + * } + * ``` + * @param uniqueDataId The unique data id for the content. The `udid` must have been obtained from a + * successful [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) + * call. + * @param options The options parameters. + */ + downloadPreview( + uniqueDataId: string, + options?: DataDownloadPreviewOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * This API allows the caller to delete a previously uploaded data content.
+ * You can use this API in a scenario like removing geofences previously uploaded using the [Data + * Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) for use in our + * [Azure Maps Geofencing Service](https://docs.microsoft.com/en-us/rest/api/maps/spatial). You can + * also use this API to delete old/unused uploaded content and create space for new content. + * + * + * ### Submit Delete Request + * + * To delete your content you will issue a `DELETE` request where the path will contain the `udid` of + * the data to delete.
+ * For example, to delete a collection of geofences previously uploaded using the Upload API, set the + * `udid` parameter in the path to the `udid` of the data received previously in the upload API + * response. + * + * + * ### Delete Data Response + * + * The Data Delete API returns a HTTP `204 No Content` response with an empty body, if the data + * resource was deleted successfully.
+ * A HTTP `400 Bad Request` error response will be returned if the data resource with the passed-in + * `udid` is not found. + * @param uniqueDataId The unique data id for the content. The `udid` must have been obtained from a + * successful [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) + * call. + * @param options The options parameters. + */ + deletePreview( + uniqueDataId: string, + options?: DataDeletePreviewOptionalParams + ): Promise; + /** + * This path will be obtained from a call to POST /mapData. While in progress, an http200 will be + * returned with no extra headers - followed by an http200 with Resource-Location header once + * completed. + * @param operationId The ID to query the status for the data upload request. + * @param options The options parameters. + */ + getOperationPreview( + operationId: string, + options?: DataGetOperationPreviewOptionalParams + ): Promise; +} diff --git a/sdk/maps/maps-creator/src/operationsInterfaces/dataset.ts b/sdk/maps/maps-creator/src/operationsInterfaces/dataset.ts new file mode 100644 index 000000000000..b957064d764b --- /dev/null +++ b/sdk/maps/maps-creator/src/operationsInterfaces/dataset.ts @@ -0,0 +1,293 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import "@azure/core-paging"; +import { PagedAsyncIterableIterator } from "@azure/core-paging"; +import { PollerLike, PollOperationState } from "@azure/core-lro"; +import { + DatasetDetailInfo, + DatasetListOptionalParams, + DatasetCreateOptionalParams, + DatasetCreateResponse, + DatasetGetOptionalParams, + DatasetGetResponse, + DatasetDeleteOptionalParams, + DatasetGetOperationOptionalParams, + DatasetGetOperationResponse +} from "../models"; + +/// +/** Interface representing a Dataset. */ +export interface Dataset { + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a list of all previously successfully created datasets. + * + * ### Submit List Request + * + * To list all your datasets, you will issue a `GET` request with no additional parameters. + * + * + * ### List Data Response + * + * The List API returns the complete list of all datasets in `json` format. The response contains the + * following fields (if they are not null or empty): + * > created - The timestamp the dataset was created. + * > datasetId - The id for the dataset. + * > description - The description for the dataset. + * > datasetSources - The source data that was used when the create request was issued. + * > ontology - The source + * [ontology](https://docs.microsoft.com/en-us/azure/azure-maps/creator-facility-ontology) that was + * used in the conversion service for the input data.
+ * + * The `datasetSources` describes the source data that was used when the create request was issued and + * contains the following elements (if they are not null or empty): + * + * > conversionIds - The list of `conversionId` (null if none were provided). + * > appendDatasetId - The `datasetId` that was used for an append operation (null if none was used). + * >featureCounts - The counts for each feature type in the dataset.
+ * + * Here's a sample response returning the `timestamp`, `datasetId`, `description`, `datasetSources`, + * and `ontology` of 3 dataset resources: + * + * + * ```json + * { + * "datasets": [ + * { + * "timestamp": "2020-01-01T22:50:48.123Z", + * "datasetId": "f6495f62-94f8-0ec2-c252-45626f82fcb2", + * "description": "Some description or comment for the dataset.", + * "datasetSources": { + * "conversionIds": [ + * "15d21452-c9bb-27b6-5e79-743ca5c3205d" + * ], }, + * "ontology": "facility-2.0", + * "featureCounts": { + * "directoryInfo": 2, + * "category": 10, + * "facility": 1, + * "level": 3, + * "unit": 183, + * "zone": 3, + * "verticalPenetration": 6, + * "opening": 48, + * "areaElement": 108 + * } + * }, + * { + * "timestamp": "2020-01-01T22:57:53.123Z", + * "datasetId": "8b1288fa-1958-4a2b-b68e-13a7i5af7d7c", + * "description": "Create from upload '0c1288fa-2058-4a1b-b68d-13a5f5af7d7c'.", + * "datasetSources": { + * "conversionIds": [ + * "0c1288fa-2058-4a1b-b68d-13a5f5af7d7c" + * ], + * "appendDatasetId": "46d1edb6-d29e-4786-9589-dbd4efd7a977" + * }, + * "ontology": "facility-2.0", + * "featureCounts": { + * "directoryInfo": 2, + * "category": 10, + * "facility": 1, + * "level": 3, + * "unit": 183, + * "zone": 3, + * "verticalPenetration": 6, + * "opening": 48, + * "areaElement": 108 + * } + * } + * ] + * } + * ``` + * @param options The options parameters. + */ + list( + options?: DatasetListOptionalParams + ): PagedAsyncIterableIterator; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to create a dataset from data that was uploaded to the Azure Maps Data + * Service and converted using the Azure Maps Conversion Service. + * + * You can use this API in a scenario like uploading a DWG zip package for a building, converting the + * zip package using the Azure Maps Conversion Service, and creating a dataset from the converted zip + * package. The created dataset can be used to create tilesets using the Azure Maps Tileset Service and + * can be queried via the Azure Maps WFS Service. + * + * ### Submit Create Request + * + * To create your dataset, you will use a `POST` request where the `conversionId` query parameter is an + * ID that represents the converted DWG zip package, the `datasetId` parameter will be the ID of a + * previously created dataset to append with the current dataset and, optionally, the `description` + * query parameter will contain a description (if description is not provided a default description + * will be given). + * + * The Create API is a [long-running request](https://aka.ms/am-creator-lrt-v2). + * @param conversionId The unique ID used to create the dataset. The `conversionId` must have been + * obtained from a successful call to the Conversion Service Convert API and may be provided with + * multiple query parameters with same name (if more than one is provided). + * @param options The options parameters. + */ + beginCreate( + conversionId: string, + options?: DatasetCreateOptionalParams + ): Promise< + PollerLike, DatasetCreateResponse> + >; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to create a dataset from data that was uploaded to the Azure Maps Data + * Service and converted using the Azure Maps Conversion Service. + * + * You can use this API in a scenario like uploading a DWG zip package for a building, converting the + * zip package using the Azure Maps Conversion Service, and creating a dataset from the converted zip + * package. The created dataset can be used to create tilesets using the Azure Maps Tileset Service and + * can be queried via the Azure Maps WFS Service. + * + * ### Submit Create Request + * + * To create your dataset, you will use a `POST` request where the `conversionId` query parameter is an + * ID that represents the converted DWG zip package, the `datasetId` parameter will be the ID of a + * previously created dataset to append with the current dataset and, optionally, the `description` + * query parameter will contain a description (if description is not provided a default description + * will be given). + * + * The Create API is a [long-running request](https://aka.ms/am-creator-lrt-v2). + * @param conversionId The unique ID used to create the dataset. The `conversionId` must have been + * obtained from a successful call to the Conversion Service Convert API and may be provided with + * multiple query parameters with same name (if more than one is provided). + * @param options The options parameters. + */ + beginCreateAndWait( + conversionId: string, + options?: DatasetCreateOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a previously successfully created dataset. + * + * ### Submit Get Details Request + * + * To get the details for a previously created dataset, you will issue a `GET` request with the + * `datasetId` in the path. + * + * ### Get Details Response + * + * The Get Details API returns the details for a dataset in `json` format. The response contains the + * following fields (if they are not null or empty): + * > created - The timestamp the dataset was created. + * > datasetId - The id for the dataset. + * > description - The description for the dataset. + * > datasetSources - The source data that was used when the create request was issued. + * > ontology - The source + * [ontology](https://docs.microsoft.com/en-us/azure/azure-maps/creator-facility-ontology) that was + * used in the conversion service for the input data.
+ * + * The `datasetSources` describes the source data that was used when the create request was issued and + * contains the following elements (if they are not null or empty): + * > conversionIds - The list of `conversionId` (null if none were provided). + * > appendDatasetId - The `datasetId` that was used for an append operation (null if none was used). + * >featureCounts - The counts for each feature type in the dataset.
+ * + * Here's a sample response returning the `timestamp`, `datasetId`, `description`, `datasetSources`, + * and `ontology` of a dataset resource: + * + * ```json + * { + * "timestamp": "2020-01-01T22:50:48.123Z", + * "datasetId": "f6495f62-94f8-0ec2-c252-45626f82fcb2", + * "description": "Some description or comment for the dataset.", + * "datasetSources": { + * "conversionIds": [ + * "15d21452-c9bb-27b6-5e79-743ca5c3205d" + * ], + * }, + * "ontology": "facility-2.0", + * "featureCounts": { + * "directoryInfo": 2, + * "category": 10, + * "facility": 1, + * "level": 3, + * "unit": 183, + * "zone": 3, + * "verticalPenetration": 6, + * "opening": 48, + * "areaElement": 108 + * } + * } + * ``` + * @param datasetId The identifier for the dataset to query from. + * @param options The options parameters. + */ + get( + datasetId: string, + options?: DatasetGetOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * You can also use this API to delete old/unused datasets to create space for new Creator content. + * + * ### Submit Delete Request + * + * To delete your content you will issue a `DELETE` request where the path will contain the `datasetId` + * of the dataset to delete. + * @param datasetId The identifier for the dataset to query from. + * @param options The options parameters. + */ + delete( + datasetId: string, + options?: DatasetDeleteOptionalParams + ): Promise; + /** + * This API allows the caller to view the current progress of a dataset operation and the path is + * obtained from a call to the Create API. + * + * ### Submit Operations Request + * + * To view the current progress of a dataset operation, you will use a `GET` request where the + * `operationId` given the path is the ID that represents the operation. + * + * ### Operation Response + * + * While in progress, a `200-OK` http status code will be returned with no extra headers. If the + * operation succeeds, a `200-OK` http status code with Resource-Location header will be returned. + * @param operationId The ID to query the status for the dataset create/import request. + * @param options The options parameters. + */ + getOperation( + operationId: string, + options?: DatasetGetOperationOptionalParams + ): Promise; +} diff --git a/sdk/maps/maps-creator/src/operationsInterfaces/featureState.ts b/sdk/maps/maps-creator/src/operationsInterfaces/featureState.ts new file mode 100644 index 000000000000..3369ef6123e4 --- /dev/null +++ b/sdk/maps/maps-creator/src/operationsInterfaces/featureState.ts @@ -0,0 +1,195 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import "@azure/core-paging"; +import { PagedAsyncIterableIterator } from "@azure/core-paging"; +import { + StatesetInfoObject, + FeatureStateListStatesetOptionalParams, + StylesObject, + FeatureStateCreateStatesetOptionalParams, + FeatureStateCreateStatesetResponse, + FeatureStatePutStatesetOptionalParams, + FeatureStateDeleteStatesetOptionalParams, + FeatureStateGetStatesetOptionalParams, + FeatureStateGetStatesetResponse, + FeatureStatesStructure, + FeatureStateUpdateStatesOptionalParams, + FeatureStateDeleteStateOptionalParams, + FeatureStateGetStatesOptionalParams, + FeatureStateGetStatesResponse +} from "../models"; + +/// +/** Interface representing a FeatureState. */ +export interface FeatureState { + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a list of all previously successfully created statesets. + * @param options The options parameters. + */ + listStateset( + options?: FeatureStateListStatesetOptionalParams + ): PagedAsyncIterableIterator; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This POST API allows the user to create a new Stateset and define stateset style using request body. + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. The Feature State API is part of Creator. + * + * The Feature State service allows the user to update the states of a feature and query them to be + * used in other services. The dynamic properties of a feature that don't belong to the dataset are + * referred to as *states* here. + * + * This Feature State service pivot on the Stateset. Like Tileset, Stateset encapsulates the storage + * mechanism for feature states for a dataset. + * + * Once the stateset is created, users can use that statesetId to post feature state updates and + * retrieve the current feature states. A feature can have only one state at a given point in time. + * + * Feature state is defined by the key name, value and the timestamp. When a feature state update is + * posted to Azure Maps, the state value gets updated only if the provided state’s timestamp is later + * than the stored timestamp. + * + * Azure Maps MapControl provides a way to use these feature states to style the features. Please refer + * to the State Tile documentation for more information. + * @param datasetId The datasetId must have been obtained from a successful [Dataset Create + * API](https://docs.microsoft.com/en-us/rest/api/maps/v2/dataset/create) call. + * @param statesetCreateRequestBody The stateset style JSON data. + * @param options The options parameters. + */ + createStateset( + datasetId: string, + statesetCreateRequestBody: StylesObject, + options?: FeatureStateCreateStatesetOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This PUT API allows the user to update the stateset style rules. + * @param statesetId The stateset id that was created. + * @param statesetStyleUpdateRequestBody The stateset style JSON data. Only style rules are allowed to + * be updated, update on keyname and type is not allowed. + * @param options The options parameters. + */ + putStateset( + statesetId: string, + statesetStyleUpdateRequestBody: StylesObject, + options?: FeatureStatePutStatesetOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This DELETE API allows the user to delete the stateset and the associated data. + * @param statesetId The stateset id that was created. + * @param options The options parameters. + */ + deleteStateset( + statesetId: string, + options?: FeatureStateDeleteStatesetOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This GET API allows the user to get the stateset Information. + * + * The stateset Information includes the datasetId associated to the stateset, and the styles of that + * stateset. + * @param statesetId The stateset id that was created. + * @param options The options parameters. + */ + getStateset( + statesetId: string, + options?: FeatureStateGetStatesetOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This PUT API allows the user to update the state of the given feature in the given stateset. + * @param statesetId The stateset id that was created. + * @param featureId The id of a feature in the given dataset. If the featureId is not present in the + * dataset, Bad Request response will be returned. + * @param featureStateUpdateRequestBody The feature state JSON data. A feature can have only one state + * at a given point in time. The specified state keyname must have been defined during the stateset + * creation. + * @param options The options parameters. + */ + updateStates( + statesetId: string, + featureId: string, + featureStateUpdateRequestBody: FeatureStatesStructure, + options?: FeatureStateUpdateStatesOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API deletes the state information identified by the StateKeyName parameter for the feature + * identified by the FeatureId parameter in the the stateset. + * @param statesetId The stateset id that was created. + * @param featureId The id of a feature in the given stateset. If no state was set for the featureId in + * the stateset earlier, Bad Request response will be returned. + * @param stateKeyName The Name of the state to be deleted. + * @param options The options parameters. + */ + deleteState( + statesetId: string, + featureId: string, + stateKeyName: string, + options?: FeatureStateDeleteStateOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API returns the current state information associated with the given feature in the given + * stateset. + * @param statesetId The stateset id that was created. + * @param featureId The id of a feature in the given stateset. If no state was set for the featureId in + * the stateset earlier, Bad Request response will be returned. + * @param options The options parameters. + */ + getStates( + statesetId: string, + featureId: string, + options?: FeatureStateGetStatesOptionalParams + ): Promise; +} diff --git a/sdk/maps/maps-creator/src/operationsInterfaces/index.ts b/sdk/maps/maps-creator/src/operationsInterfaces/index.ts new file mode 100644 index 000000000000..7fe2a1f1d8c6 --- /dev/null +++ b/sdk/maps/maps-creator/src/operationsInterfaces/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./alias"; +export * from "./data"; +export * from "./dataset"; +export * from "./conversion"; +export * from "./featureState"; +export * from "./spatial"; +export * from "./tileset"; +export * from "./wfs"; diff --git a/sdk/maps/maps-creator/src/operationsInterfaces/spatial.ts b/sdk/maps/maps-creator/src/operationsInterfaces/spatial.ts new file mode 100644 index 000000000000..f8b9ea8d2108 --- /dev/null +++ b/sdk/maps/maps-creator/src/operationsInterfaces/spatial.ts @@ -0,0 +1,338 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { + ResponseFormat, + SpatialGetGeofenceOptionalParams, + SpatialGetGeofenceResponse, + SpatialPostGeofenceOptionalParams, + SpatialPostGeofenceResponse, + BufferRequestBody, + SpatialPostBufferOptionalParams, + SpatialPostBufferResponse, + SpatialGetBufferOptionalParams, + SpatialGetBufferResponse, + SpatialPostClosestPointOptionalParams, + SpatialPostClosestPointResponse, + SpatialGetClosestPointOptionalParams, + SpatialGetClosestPointResponse, + SpatialPostPointInPolygonOptionalParams, + SpatialPostPointInPolygonResponse, + SpatialGetPointInPolygonOptionalParams, + SpatialGetPointInPolygonResponse, + SpatialGetGreatCircleDistanceOptionalParams, + SpatialGetGreatCircleDistanceResponse +} from "../models"; + +/** Interface representing a Spatial. */ +export interface Spatial { + /** + * **Search Geofence Get API** + * + * **Applies to:** S1 Pricing tier. + * + * The Geofence Get API allows you to retrieve the proximity of a coordinate to a + * geofence that has been uploaded to the Data service. You can use the + * [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) to upload + * a geofence or set of fences. See [Geofencing GeoJSON + * data](https://docs.microsoft.com/en-us/azure/azure-maps/geofence-geojson) + * for more details on the geofence data format. To query the proximity of a coordinate, you supply the + * location of the object you are tracking as well + * as the ID for the fence or set of fences, and the response will contain information about + * the distance from the outer edge of the geofence. A negative value signifies that the + * coordinate is inside of the fence while a positive value means that it is outside of the + * fence.

This API can be used for a variety of scenarios that include things like asset + * tracking, fleet management, or setting up alerts for moving objects. + * + * The API supports [integration with Event + * Grid](https://docs.microsoft.com/azure/azure-maps/azure-maps-event-grid-integration). The isAsync + * parameter is used to enable integration with Event Grid (disabled by default). + * To test this API, you can upload the sample data from Post Geofence API examples(Request Body) via + * Data Upload API and replace the [udid] from the sample request below with the udid returned by Data + * Upload API. + * + * + * ### Geofencing InnerError code + * + * In geofencing response error contract, `innererror` is an object containing service specific + * information about the error. `code` is a property in `innererror` which can map to a specific + * geofencing error type. The table belows shows the code mapping between all the known client error + * type to the corresponding geofencing error `message`. + * + * innererror.code | error.message + * ---------------------------- | -------------------------------------- + * NullDeviceId | Device Id should not be null. + * NullUdid | Udid should not be null. + * UdidWrongFormat| Udid should be acquired from user data ingestion API. + * InvalidUserTime| Usertime is invalid. + * InvalidSearchBuffer| Searchbuffer is invalid. + * InvalidSearchRange| The value range of searchbuffer should be from 0 to 500 meters. + * InvalidLatLon| Lat and/or lon parameters are invalid. + * InvalidIsAsyncValue| The IsAsync parameter is invalid. + * InvalidModeValue| The mode parameter invalid. + * InvalidJson| Geofencing data is not a valid json file. + * NotSupportedGeoJson| Geofencing data can't be read as a Feature or FeatureCollections. + * InvalidGeoJson| Geofencing data is invalid. + * NoUserDataWithAccountOrSubscription| Can't find user geofencing data with provided account-id and/or + * subscription-id. + * NoUserDataWithUdid| Can't find user geofencing data with provided udid. + * @param format Desired format of the response. Only `json` format is supported. + * @param deviceId ID of the device + * @param udid The unique id returned from [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) after uploading a valid + * GeoJSON FeatureCollection object. Please refer to [RFC + * 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. All the feature's properties + * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. + * @param latitude The latitude of the location being passed. Example: 48.36. + * @param longitude The longitude of the location being passed. Example: -124.63. + * @param options The options parameters. + */ + getGeofence( + format: ResponseFormat, + deviceId: string, + udid: string, + latitude: number, + longitude: number, + options?: SpatialGetGeofenceOptionalParams + ): Promise; + /** + * **Search Geofence Post API** + * **Applies to:** S1 Pricing tier. + * The Geofence Post API allows you to retrieve the proximity of a coordinate to a provided geofence + * or set of fences. With POST call, you do not have to upload the fence data in advance, instead you + * supply the location of the object you are tracking in query parameters as well as the fence or set + * of fences data in post request body. See [Geofencing GeoJSON + * data](https://docs.microsoft.com/en-us/azure/azure-maps/geofence-geojson) for more details on the + * geofence data format. The response will contain information about the distance from the outer edge + * of the geofence. A negative value signifies that the coordinate is inside of the fence while a + * positive value means that it is outside of the fence.

This API can be used for a variety of + * scenarios that include things like asset tracking, fleet management, or setting up alerts for + * moving objects. + * + * The API supports [integration with Event + * Grid](https://docs.microsoft.com/azure/azure-maps/azure-maps-event-grid-integration). The isAsync + * parameter is used to enable integration with Event Grid (disabled by default). + * @param format Desired format of the response. Only `json` format is supported. + * @param deviceId ID of the device + * @param latitude The latitude of the location being passed. Example: 48.36. + * @param longitude The longitude of the location being passed. Example: -124.63. + * @param searchGeofenceRequestBody The geofencing GeoJSON data. + * @param options The options parameters. + */ + postGeofence( + format: ResponseFormat, + deviceId: string, + latitude: number, + longitude: number, + searchGeofenceRequestBody: Record, + options?: SpatialPostGeofenceOptionalParams + ): Promise; + /** + * **Applies to**: S1 pricing tier. + * + * This API returns a FeatureCollection where each Feature is a buffer around the corresponding indexed + * Feature of the input. The buffer could be either on the outside or the inside of the provided + * Feature, depending on the distance provided in the input. There must be either one distance provided + * per Feature in the FeatureCollection input, or if only one distance is provided, then that distance + * is applied to every Feature in the collection. The positive (or negative) buffer of a geometry is + * defined as the Minkowski sum (or difference) of the geometry with a circle of radius equal to the + * absolute value of the buffer distance. The buffer API always returns a polygonal result. The + * negative or zero-distance buffer of lines and points is always an empty polygon. The input may + * contain a collection of Point, MultiPoint, Polygon, MultiPolygon, LineString and MultiLineString. + * GeometryCollection will be ignored if provided. + * @param format Desired format of the response. Only `json` format is supported. + * @param bufferRequestBody The FeatureCollection and the list of distances (one per feature or one for + * all features). + * @param options The options parameters. + */ + postBuffer( + format: ResponseFormat, + bufferRequestBody: BufferRequestBody, + options?: SpatialPostBufferOptionalParams + ): Promise; + /** + * **Applies to**: S1 pricing tier. + * + * This API returns a FeatureCollection where each Feature is a buffer around the corresponding indexed + * Feature of the input. The buffer could be either on the outside or the inside of the provided + * Feature, depending on the distance provided in the input. There must be either one distance provided + * per Feature in the FeatureCollection input, or if only one distance is provided, then that distance + * is applied to every Feature in the collection. The positive (or negative) buffer of a geometry is + * defined as the Minkowski sum (or difference) of the geometry with a circle of radius equal to the + * absolute value of the buffer distance. The buffer API always returns a polygonal result. The + * negative or zero-distance buffer of lines and points is always an empty polygon. The input features + * are provided by a GeoJSON file which is uploaded via [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and referenced by a unique + * udid. The GeoJSON file may contain a collection of Point, MultiPoint, Polygon, MultiPolygon, + * LineString and MultiLineString. GeometryCollection will be ignored if provided. + * + * To test this API, you can upload the sample data from [Post Buffer + * API](https://docs.microsoft.com/en-us/rest/api/maps/spatial/postbuffer#examples) examples(Request + * Body without distances array) via [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and replace the [udid] from + * the [sample request + * below](https://docs.microsoft.com/en-us/rest/api/maps/spatial/getbuffer#examples) with the udid + * returned by Data Upload API. + * @param format Desired format of the response. Only `json` format is supported. + * @param udid The unique id returned from [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) after uploading a valid + * GeoJSON FeatureCollection object. Please refer to [RFC + * 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. All the feature's properties + * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. + * @param distances The list of distances (one per feature or one for all features), delimited by + * semicolons. For example, 12.34;-56.78. Positive distance will generate a buffer outside of the + * feature, whereas negative distance will generate a buffer inside of the feature. If the negative + * distance larger than the geometry itself, an empty polygon will be returned. + * @param options The options parameters. + */ + getBuffer( + format: ResponseFormat, + udid: string, + distances: string, + options?: SpatialGetBufferOptionalParams + ): Promise; + /** + * **Applies to**: S1 pricing tier. + * + * This API returns the closest point between a base point and a given set of target points. The set of + * target points is provided by user data in post request body. The user data may only contain a + * collection of Point geometry. MultiPoint or other geometries will be ignored if provided. The + * algorithm does not take into account routing or traffic. The maximum number of points accepted is + * 100,000. Information returned includes closest point latitude, longitude, and distance in meters + * from the closest point. + * @param format Desired format of the response. Only `json` format is supported. + * @param latitude The latitude of the location being passed. Example: 48.36. + * @param longitude The longitude of the location being passed. Example: -124.63. + * @param closestPointRequestBody The FeatureCollection of Point geometries from which closest point to + * source point should be determined. All the feature's properties should contain `geometryId`, which + * is used for identifying the geometry and is case-sensitive. + * @param options The options parameters. + */ + postClosestPoint( + format: ResponseFormat, + latitude: number, + longitude: number, + closestPointRequestBody: Record, + options?: SpatialPostClosestPointOptionalParams + ): Promise; + /** + * **Applies to**: S1 pricing tier. + * + * This API returns the closest point between a base point and a given set of points in the user + * uploaded data set identified by udid. The set of target points is provided by a GeoJSON file which + * is uploaded via [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) + * and referenced by a unique udid. The GeoJSON file may only contain a collection of Point geometry. + * MultiPoint or other geometries will be ignored if provided. The maximum number of points accepted is + * 100,000. The algorithm does not take into account routing or traffic. Information returned includes + * closest point latitude, longitude, and distance in meters from the closest point. + * + * To test this API, you can upload the sample data from [Post Closest Point + * API](https://docs.microsoft.com/en-us/rest/api/maps/spatial/postclosestpoint#examples) + * examples(Request Body) via [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and replace the [udid] from + * the [sample request + * below](https://docs.microsoft.com/en-us/rest/api/maps/spatial/getclosestpoint#examples) with the + * udid returned by Data Upload API. + * @param format Desired format of the response. Only `json` format is supported. + * @param udid The unique id returned from [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) after uploading a valid + * GeoJSON FeatureCollection object. Please refer to [RFC + * 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. All the feature's properties + * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. + * @param latitude The latitude of the location being passed. Example: 48.36. + * @param longitude The longitude of the location being passed. Example: -124.63. + * @param options The options parameters. + */ + getClosestPoint( + format: ResponseFormat, + udid: string, + latitude: number, + longitude: number, + options?: SpatialGetClosestPointOptionalParams + ): Promise; + /** + * **Applies to**: S1 pricing tier. + * + * This API returns a boolean value indicating whether a point is inside a set of polygons. The user + * data may contain Polygon and MultiPolygon geometries, other geometries will be ignored if provided. + * If the point is inside or on the boundary of one of these polygons, the value returned is true. In + * all other cases, the value returned is false. When the point is inside multiple polygons, the result + * will give intersecting geometries section to show all valid geometries (referenced by geometryId) in + * user data. The maximum number of vertices accepted to form a Polygon is 10,000. + * @param format Desired format of the response. Only `json` format is supported. + * @param latitude The latitude of the location being passed. Example: 48.36. + * @param longitude The longitude of the location being passed. Example: -124.63. + * @param pointInPolygonRequestBody A FeatureCollection with a set of Polygon/MultiPolygon geometries. + * The maximum number of vertices accepted to form a Polygon is 10,000. All the feature's properties + * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. + * @param options The options parameters. + */ + postPointInPolygon( + format: ResponseFormat, + latitude: number, + longitude: number, + pointInPolygonRequestBody: Record, + options?: SpatialPostPointInPolygonOptionalParams + ): Promise; + /** + * **Applies to**: S1 pricing tier. + * + * This API returns a boolean value indicating whether a point is inside a set of polygons. The set of + * polygons is provided by a GeoJSON file which is uploaded via [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and referenced by a unique + * udid. The GeoJSON file may contain Polygon and MultiPolygon geometries, other geometries will be + * ignored if provided. If the point is inside or on the boundary of one of these polygons, the value + * returned is true. In all other cases, the value returned is false. When the point is inside multiple + * polygons, the result will give intersecting geometries section to show all valid + * geometries(referenced by geometryId) in user data. The maximum number of vertices accepted to form a + * Polygon is 10,000. + * + * + * To test this API, you can upload the sample data from [Post Point In Polygon + * API](https://docs.microsoft.com/en-us/rest/api/maps/spatial/postpointinpolygon#examples) + * examples(Request Body) via [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and replace the [udid] from + * the [sample request + * below](https://docs.microsoft.com/en-us/rest/api/maps/spatial/getpointinpolygon#examples) with the + * udid returned by Data Upload API. + * @param format Desired format of the response. Only `json` format is supported. + * @param udid The unique id returned from [Data Upload + * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) after uploading a valid + * GeoJSON FeatureCollection object. Please refer to [RFC + * 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. All the feature's properties + * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. + * @param latitude The latitude of the location being passed. Example: 48.36. + * @param longitude The longitude of the location being passed. Example: -124.63. + * @param options The options parameters. + */ + getPointInPolygon( + format: ResponseFormat, + udid: string, + latitude: number, + longitude: number, + options?: SpatialGetPointInPolygonOptionalParams + ): Promise; + /** + * **Applies to**: S1 pricing tier. + * + * This API will return the great-circle or shortest distance between two points on the surface of a + * sphere, measured along the surface of the sphere. This differs from calculating a straight line + * through the sphere's interior. This method is helpful for estimating travel distances for airplanes + * by calculating the shortest distance between airports. + * @param format Desired format of the response. Only `json` format is supported. + * @param query The Coordinates through which the distance is calculated, delimited by a colon. Two + * coordinates are required. The first one is the source point coordinate and the last is the target + * point coordinate. For example, 47.622942,122.316456:57.673988,127.121513 + * @param options The options parameters. + */ + getGreatCircleDistance( + format: ResponseFormat, + query: string, + options?: SpatialGetGreatCircleDistanceOptionalParams + ): Promise; +} diff --git a/sdk/maps/maps-creator/src/operationsInterfaces/tileset.ts b/sdk/maps/maps-creator/src/operationsInterfaces/tileset.ts new file mode 100644 index 000000000000..4cd641b7226b --- /dev/null +++ b/sdk/maps/maps-creator/src/operationsInterfaces/tileset.ts @@ -0,0 +1,179 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import "@azure/core-paging"; +import { PagedAsyncIterableIterator } from "@azure/core-paging"; +import { PollerLike, PollOperationState } from "@azure/core-lro"; +import { + TilesetDetailInfo, + TilesetListOptionalParams, + TilesetCreateOptionalParams, + TilesetCreateResponse, + TilesetGetOptionalParams, + TilesetGetResponse, + TilesetDeleteOptionalParams, + TilesetGetOperationOptionalParams, + TilesetGetOperationResponse +} from "../models"; + +/// +/** Interface representing a Tileset. */ +export interface Tileset { + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a list of all tilesets created. + *
+ * @param options The options parameters. + */ + list( + options?: TilesetListOptionalParams + ): PagedAsyncIterableIterator; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * [This](https://docs.microsoft.com/en-us/azure/azure-maps/creator-indoor-maps) article introduces + * concepts and tools that apply to Azure Maps Creator. + * + * The Tileset Create API allows the caller to create a tileset from a dataset. A tileset contains a + * set of tiles that can be consumed + * from the [Get Map Tile](/rest/api/maps/render/getmaptile) to retrieve custom tiles. To make a + * dataset, use the + * [DataSet Create API](/rest/api/maps/dataset/createpreview). + * + * ## Submit Create Request + * + * To create your tileset you will make a `POST` request with an empty body. The `datasetId` query + * parameter will be + * used as the source of the tileset data. + * + * The Create Tileset API is a + * [long-running request](https://aka.ms/am-creator-lrt-v2). + * @param datasetId The unique `datasetId` that the tileset create API uses to retrieve features to + * generate tiles. The `datasetId` must have been obtained from a successful [Dataset Create + * API](/en-us/rest/api/maps/dataset/createpreview) call. + * @param options The options parameters. + */ + beginCreate( + datasetId: string, + options?: TilesetCreateOptionalParams + ): Promise< + PollerLike, TilesetCreateResponse> + >; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * [This](https://docs.microsoft.com/en-us/azure/azure-maps/creator-indoor-maps) article introduces + * concepts and tools that apply to Azure Maps Creator. + * + * The Tileset Create API allows the caller to create a tileset from a dataset. A tileset contains a + * set of tiles that can be consumed + * from the [Get Map Tile](/rest/api/maps/render/getmaptile) to retrieve custom tiles. To make a + * dataset, use the + * [DataSet Create API](/rest/api/maps/dataset/createpreview). + * + * ## Submit Create Request + * + * To create your tileset you will make a `POST` request with an empty body. The `datasetId` query + * parameter will be + * used as the source of the tileset data. + * + * The Create Tileset API is a + * [long-running request](https://aka.ms/am-creator-lrt-v2). + * @param datasetId The unique `datasetId` that the tileset create API uses to retrieve features to + * generate tiles. The `datasetId` must have been obtained from a successful [Dataset Create + * API](/en-us/rest/api/maps/dataset/createpreview) call. + * @param options The options parameters. + */ + beginCreateAndWait( + datasetId: string, + options?: TilesetCreateOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to fetch a tileset. + * @param tilesetId The Tileset Id + * @param options The options parameters. + */ + get( + tilesetId: string, + options?: TilesetGetOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * This API allows the caller to delete a created tileset.
+ * You can use this API if a tileset is no longer needed. + * + * ### Submit Delete Request + * + * To delete your content you will issue a `DELETE` request where the path will contain the `tilesetId` + * of the tileset to delete.
+ * + * #### Delete request "Successful" + * + * The Tileset Delete API returns a HTTP `204 No Content` response with an empty body, if the tileset + * was deleted successfully.
+ * + * #### Delete request "Failed" + * + * A HTTP `400 Bad Request` error response will be returned if the tileset with the passed-in + * `tilesetId` is not found. + * + * Here is a sample error response: + * + *
+ * + * ```json + * { + * "error": { + * "code": "400 BadRequest", + * "message": "Bad request - Tileset Id: d85b5b27-5fc4-4599-8b50-47160e90f8ce does not exist." + * } + * } + * ``` + * @param tilesetId The Tileset Id + * @param options The options parameters. + */ + delete( + tilesetId: string, + options?: TilesetDeleteOptionalParams + ): Promise; + /** + * This path will be obtained from a call to /tilesets/create. While in progress, an http200 will be + * returned with no extra headers - followed by an http200 with Resource-Location header once + * successfully completed. + * @param operationId The ID to query the status for the dataset create/import request. + * @param options The options parameters. + */ + getOperation( + operationId: string, + options?: TilesetGetOperationOptionalParams + ): Promise; +} diff --git a/sdk/maps/maps-creator/src/operationsInterfaces/wfs.ts b/sdk/maps/maps-creator/src/operationsInterfaces/wfs.ts new file mode 100644 index 000000000000..2b75fedfc1d2 --- /dev/null +++ b/sdk/maps/maps-creator/src/operationsInterfaces/wfs.ts @@ -0,0 +1,211 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { + WfsGetLandingPageOptionalParams, + WfsGetLandingPageResponse, + WfsGetConformanceOptionalParams, + WfsGetConformanceResponse, + WfsGetCollectionsOptionalParams, + WfsGetCollectionsResponse, + WfsGetCollectionOptionalParams, + WfsGetCollectionResponse, + WfsGetCollectionDefinitionOptionalParams, + WfsGetCollectionDefinitionResponse, + WfsGetFeaturesOptionalParams, + WfsGetFeaturesResponse, + WfsGetFeatureOptionalParams, + WfsGetFeatureResponse, + WfsDeleteFeatureOptionalParams +} from "../models"; + +/** Interface representing a Wfs. */ +export interface Wfs { + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial + * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to + * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). + * A dataset consists of multiple feature collections. A feature collection is a collection of features + * of a similar type, based on a common schema. + * The Get Landing Page API provides links to the API definition, the Conformance statements and the + * metadata about the feature data in this dataset. + * @param datasetId The identifier for the dataset to query from. + * @param options The options parameters. + */ + getLandingPage( + datasetId: string, + options?: WfsGetLandingPageOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial + * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to + * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). + * A dataset consists of multiple feature collections. A feature collection is a collection of features + * of a similar type, based on a common schema. + * The Get Requirements Classes lists all requirements classes specified in the standard that the + * server conforms to. + * @param datasetId The identifier for the dataset to query from. + * @param options The options parameters. + */ + getConformance( + datasetId: string, + options?: WfsGetConformanceOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial + * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to + * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). + * A dataset consists of multiple feature collections. A feature collection is a collection of features + * of a similar type, based on a common schema. + * The Collections Description API provides descriptions of all the collections in a given dataset. + * @param datasetId The identifier for the dataset to query from. + * @param options The options parameters. + */ + getCollections( + datasetId: string, + options?: WfsGetCollectionsOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial + * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to + * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). + * A dataset consists of multiple feature collections. A feature collection is a collection of features + * of a similar type, based on a common schema. + * + * The Collection Description API provides the description of a given collection. It includes the links + * to the operations that can be performed on the collection. + * @param datasetId The identifier for the dataset to query from. + * @param collectionId Identifier (name) of a specific collection + * @param options The options parameters. + */ + getCollection( + datasetId: string, + collectionId: string, + options?: WfsGetCollectionOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * [This](https://docs.microsoft.com/en-us/azure/azure-maps/creator-indoor-maps) article introduces + * concepts and tools that apply to Azure Maps Creator. WFS API follows the [Open Geospatial Consortium + * API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to query + * [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). + * A dataset consists of multiple feature collections. A feature collection is a collection of features + * of a similar type, based on a common schema. + * + * The Collection Definition API provides the detailed data model of a given collection. + * @param datasetId The identifier for the dataset to query from. + * @param collectionId Identifier (name) of a specific collection + * @param options The options parameters. + */ + getCollectionDefinition( + datasetId: string, + collectionId: string, + options?: WfsGetCollectionDefinitionOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial + * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to + * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). + * A dataset consists of multiple feature collections. A feature collection is a collection of features + * of a similar type, based on a common schema. + * The Get Features API returns the list of features in the given collection. + * @param datasetId The identifier for the dataset to query from. + * @param collectionId Identifier (name) of a specific collection + * @param options The options parameters. + */ + getFeatures( + datasetId: string, + collectionId: string, + options?: WfsGetFeaturesOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial + * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to + * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). + * A dataset consists of multiple feature collections. A feature collection is a collection of features + * of a similar type, based on a common schema. + * The Get Feature API returns the feature identified by the provided id in the given collection. + * @param datasetId The identifier for the dataset to query from. + * @param collectionId Identifier (name) of a specific collection + * @param featureId Local identifier of a specific feature + * @param options The options parameters. + */ + getFeature( + datasetId: string, + collectionId: string, + featureId: string, + options?: WfsGetFeatureOptionalParams + ): Promise; + /** + * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). + * + * Creator makes it possible to develop applications based on your private indoor map data using Azure + * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article + * introduces concepts and tools that apply to Azure Maps Creator. + * + * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial + * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to + * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). + * A dataset consists of multiple feature collections. A feature collection is a collection of features + * of a similar type, based on a common schema. + * The Delete Feature API deletes the feature identified by the provided id in the given collection. At + * this point this API supports only facility features. Deleting a facility feature deletes all the + * child features of that facility recursively. + * @param datasetId The identifier for the dataset to query from. + * @param collectionId Identifier (name) of a specific collection + * @param featureId Local identifier of a specific feature + * @param options The options parameters. + */ + deleteFeature( + datasetId: string, + collectionId: string, + featureId: string, + options?: WfsDeleteFeatureOptionalParams + ): Promise; +} diff --git a/sdk/maps/maps-creator/tsconfig.json b/sdk/maps/maps-creator/tsconfig.json new file mode 100644 index 000000000000..0ec8659c8e83 --- /dev/null +++ b/sdk/maps/maps-creator/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "module": "es6", + "moduleResolution": "node", + "strict": true, + "target": "es6", + "sourceMap": true, + "declarationMap": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "preserveConstEnums": true, + "lib": ["es6", "dom"], + "declaration": true, + "outDir": "./esm", + "importHelpers": true + }, + "include": ["./src/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/sdk/maps/maps-elevation/LICENSE.txt b/sdk/maps/maps-elevation/LICENSE.txt new file mode 100644 index 000000000000..ccb63b166732 --- /dev/null +++ b/sdk/maps/maps-elevation/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2021 Microsoft + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/sdk/maps/maps-elevation/README.md b/sdk/maps/maps-elevation/README.md new file mode 100644 index 000000000000..52be0e8213ea --- /dev/null +++ b/sdk/maps/maps-elevation/README.md @@ -0,0 +1,91 @@ +# Azure Elevation client library for JavaScript + +This package contains an isomorphic SDK (runs both in Node.js and in browsers) for Azure Elevation client. + +The Azure Maps Elevation API provides an HTTP interface to query elevation data on the surface of the Earth. Elevation data can be retrieved at specific locations by sending lat/lon coordinates, by defining an ordered set of vertices that form a Polyline and a number of sample points along the length of a Polyline, or by defining a bounding box that consists of equally spaced vertices as rows and columns. The vertical datum is EPSG:3855. This datum uses the EGM2008 geoid model applied to the WGS84 ellipsoid as its zero height reference surface. The vertical unit is measured in meters, the spatial resolution of the elevation data is 0.8 arc-second for global coverage (~24 meters). + +[Source code](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-elevation) | +[Package (NPM)](https://www.npmjs.com/package/@azure/maps-elevation) | +[API reference documentation](https://docs.microsoft.com/javascript/api/@azure/maps-elevation) | +[Samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-elevation/samples) + +## Getting started + +### Currently supported environments + +- [LTS versions of Node.js](https://nodejs.org/about/releases/) +- Latest versions of Safari, Chrome, Edge and Firefox. + +### Prerequisites + +- An [Azure subscription][azure_sub]. + +### Install the `@azure/maps-elevation` package + +Install the Azure Elevation client library for JavaScript with `npm`: + +```bash +npm install @azure/maps-elevation +``` + +### Create and authenticate a `ElevationClient` + +To create a client object to access the Azure Elevation API, you will need the `endpoint` of your Azure Elevation resource and a `credential`. The Azure Elevation client can use Azure Active Directory credentials to authenticate. +You can find the endpoint for your Azure Elevation resource in the [Azure Portal][azure_portal]. + +#### Using an Azure Active Directory Credential + +You can authenticate with Azure Active Directory using the [Azure Identity library][azure_identity]. To use the [DefaultAzureCredential][defaultazurecredential] provider shown below, or other credential providers provided with the Azure SDK, please install the `@azure/identity` package: + +```bash +npm install @azure/identity +``` + +You will also need to register a new AAD application and grant access to Azure Elevation by assigning the suitable role to your service principal (note: roles such as `"Owner"` will not grant the necessary permissions). +Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`. + +```javascript +const { ElevationClient } = require("@azure/maps-elevation"); +const { DefaultAzureCredential } = require("@azure/identity"); +const client = new ElevationClient("", new DefaultAzureCredential()); +``` + +## Key concepts + +### ElevationClient + +`ElevationClient` is the primary interface for developers using the Azure Elevation client library. Explore the methods on this client object to understand the different features of the Azure Elevation service that you can access. + +## Troubleshooting + +### Logging + +Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: + +```javascript +import { setLogLevel } from "@azure/logger"; +setLogLevel("info"); +``` + +For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger). + +## Next steps + +Please take a look at the [samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-elevation/samples) directory for detailed examples on how to use this library. + +## Contributing + +If you'd like to contribute to this library, please read the [contributing guide](https://github.com/Azure/azure-sdk-for-js/blob/master/CONTRIBUTING.md) to learn more about how to build and test the code. + +## Related projects + +- [Microsoft Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) + +![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fmaps%2Fmaps-elevation%2FREADME.png) + +[azure_cli]: https://docs.microsoft.com/cli/azure +[azure_sub]: https://azure.microsoft.com/free/ +[azure_sub]: https://azure.microsoft.com/free/ +[azure_portal]: https://portal.azure.com +[azure_identity]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity +[defaultazurecredential]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity#defaultazurecredential diff --git a/sdk/maps/maps-elevation/api-extractor.json b/sdk/maps/maps-elevation/api-extractor.json new file mode 100644 index 000000000000..5fb5b21b56f2 --- /dev/null +++ b/sdk/maps/maps-elevation/api-extractor.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "mainEntryPointFilePath": "./esm/index.d.ts", + "docModel": { "enabled": true }, + "apiReport": { "enabled": true, "reportFolder": "./review" }, + "dtsRollup": { + "enabled": true, + "untrimmedFilePath": "", + "publicTrimmedFilePath": "./esm/index.d.ts" + }, + "messages": { + "tsdocMessageReporting": { "default": { "logLevel": "none" } }, + "extractorMessageReporting": { + "ae-missing-release-tag": { "logLevel": "none" }, + "ae-unresolved-link": { "logLevel": "none" } + } + } +} diff --git a/sdk/maps/maps-elevation/package.json b/sdk/maps/maps-elevation/package.json new file mode 100644 index 000000000000..2b5766cc1927 --- /dev/null +++ b/sdk/maps/maps-elevation/package.json @@ -0,0 +1,84 @@ +{ + "name": "@azure/maps-elevation", + "sdk-type": "client", + "author": "Microsoft Corporation", + "description": "A generated SDK for ElevationClient.", + "version": "1.0.0-beta.1", + "engines": { "node": ">=12.0.0" }, + "dependencies": { + "@azure/core-client": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-rest-pipeline": "^1.1.0", + "tslib": "^2.2.0" + }, + "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], + "license": "MIT", + "main": "./dist/index.js", + "module": "./esm/index.js", + "types": "./esm/index.d.ts", + "devDependencies": { + "@microsoft/api-extractor": "7.7.11", + "@rollup/plugin-commonjs": "11.0.2", + "@rollup/plugin-json": "^4.0.0", + "@rollup/plugin-multi-entry": "^3.0.0", + "@rollup/plugin-node-resolve": "^8.0.0", + "mkdirp": "^1.0.4", + "rollup": "^1.16.3", + "rollup-plugin-sourcemaps": "^0.4.2", + "rollup-plugin-node-resolve": "^3.4.0", + "typescript": "~4.2.0", + "uglify-js": "^3.4.9" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js", + "repository": { + "type": "git", + "url": "https://github.com/Azure/azure-sdk-for-js.git" + }, + "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, + "files": [ + "dist/**/*.js", + "dist/**/*.js.map", + "dist/**/*.d.ts", + "dist/**/*.d.ts.map", + "esm/**/*.js", + "esm/**/*.js.map", + "esm/**/*.d.ts", + "esm/**/*.d.ts.map", + "src/**/*.ts", + "README.md", + "rollup.config.js", + "tsconfig.json", + "review/*", + "CHANGELOG.md" + ], + "scripts": { + "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", + "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js", + "prepack": "npm install && npm run build", + "pack": "npm pack 2>&1", + "extract-api": "mkdirp ./review && api-extractor run --local", + "lint": "echo skipped", + "audit": "echo skipped", + "clean": "echo skipped", + "build:node": "echo skipped", + "build:browser": "echo skipped", + "build:test": "echo skipped", + "build:samples": "echo skipped.", + "check-format": "echo skipped", + "execute:samples": "echo skipped", + "format": "echo skipped", + "test": "echo skipped", + "prebuild": "echo skipped", + "test:node": "echo skipped", + "test:browser": "echo skipped", + "unit-test": "echo skipped", + "unit-test:node": "echo skipped", + "unit-test:browser": "echo skipped", + "integration-test:browser": "echo skipped", + "integration-test:node": "echo skipped", + "integration-test": "echo skipped", + "docs": "echo skipped" + }, + "sideEffects": false, + "autoPublish": true +} diff --git a/sdk/maps/maps-elevation/review/maps-elevation.api.md b/sdk/maps/maps-elevation/review/maps-elevation.api.md new file mode 100644 index 000000000000..72dc22e54101 --- /dev/null +++ b/sdk/maps/maps-elevation/review/maps-elevation.api.md @@ -0,0 +1,166 @@ +## API Report File for "@azure/maps-elevation" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import * as coreAuth from '@azure/core-auth'; +import * as coreClient from '@azure/core-client'; + +// @public +export interface BoundingBoxResult { + readonly data?: PointElevationResult[]; +} + +// @public +export interface CoordinatesPair { + latitude?: number; + longitude?: number; +} + +// @public +export interface CoordinatesPairAbbreviated { + lat?: number; + lon?: number; +} + +// @public +export interface Elevation { + getDataForBoundingBox(format: ResponseFormat, bounds: string[], rows: number, columns: number, options?: ElevationGetDataForBoundingBoxOptionalParams): Promise; + getDataForPoints(format: ResponseFormat, points: string[], options?: ElevationGetDataForPointsOptionalParams): Promise; + getDataForPolyline(format: ResponseFormat, lines: string[], options?: ElevationGetDataForPolylineOptionalParams): Promise; + postDataForPoints(format: ResponseFormat, pointsRequestBody: CoordinatesPairAbbreviated[], options?: ElevationPostDataForPointsOptionalParams): Promise; + postDataForPolyline(format: ResponseFormat, linesRequestBody: CoordinatesPairAbbreviated[], options?: ElevationPostDataForPolylineOptionalParams): Promise; +} + +// @public (undocumented) +export class ElevationClient extends ElevationClientContext { + constructor(credentials: coreAuth.TokenCredential, options?: ElevationClientOptionalParams); + // (undocumented) + elevation: Elevation; +} + +// @public (undocumented) +export class ElevationClientContext extends coreClient.ServiceClient { + constructor(credentials: coreAuth.TokenCredential, options?: ElevationClientOptionalParams); + // (undocumented) + apiVersion: string; + // (undocumented) + geography: Geography; + // (undocumented) + xMsClientId?: string; +} + +// @public +export interface ElevationClientOptionalParams extends coreClient.ServiceClientOptions { + apiVersion?: string; + endpoint?: string; + geography?: Geography; + xMsClientId?: string; +} + +// @public +export interface ElevationGetDataForBoundingBoxOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type ElevationGetDataForBoundingBoxResponse = BoundingBoxResult; + +// @public +export interface ElevationGetDataForPointsOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type ElevationGetDataForPointsResponse = PointsResult; + +// @public +export interface ElevationGetDataForPolylineOptionalParams extends coreClient.OperationOptions { + samples?: number; +} + +// @public +export type ElevationGetDataForPolylineResponse = LinesResult; + +// @public +export interface ElevationPostDataForPointsOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type ElevationPostDataForPointsResponse = PointsResult; + +// @public +export interface ElevationPostDataForPolylineOptionalParams extends coreClient.OperationOptions { + samples?: number; +} + +// @public +export type ElevationPostDataForPolylineResponse = LinesResult; + +// @public +export interface ErrorAdditionalInfo { + readonly info?: Record; + readonly type?: string; +} + +// @public +export interface ErrorDetail { + readonly additionalInfo?: ErrorAdditionalInfo[]; + readonly code?: string; + readonly details?: ErrorDetail[]; + readonly message?: string; + readonly target?: string; +} + +// @public +export interface ErrorResponse { + error?: ErrorDetail; +} + +// @public +export type GeographicResourceLocation = string; + +// @public +export type Geography = string; + +// @public +export const enum KnownGeographicResourceLocation { + Eu = "eu", + Us = "us" +} + +// @public +export const enum KnownGeography { + // (undocumented) + Eu = "eu", + // (undocumented) + Us = "us" +} + +// @public +export const enum KnownResponseFormat { + Json = "json" +} + +// @public +export interface LinesResult { + readonly data?: PointElevationResult[]; +} + +// @public +export interface PointElevationResult { + coordinate?: CoordinatesPair; + readonly elevationInMeter?: number; +} + +// @public +export interface PointsResult { + readonly data?: PointElevationResult[]; +} + +// @public +export type ResponseFormat = string; + + +// (No @packageDocumentation comment for this package) + +``` diff --git a/sdk/maps/maps-elevation/rollup.config.js b/sdk/maps/maps-elevation/rollup.config.js new file mode 100644 index 000000000000..9be1955eb7f1 --- /dev/null +++ b/sdk/maps/maps-elevation/rollup.config.js @@ -0,0 +1,188 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import nodeResolve from "@rollup/plugin-node-resolve"; +import cjs from "@rollup/plugin-commonjs"; +import sourcemaps from "rollup-plugin-sourcemaps"; +import multiEntry from "@rollup/plugin-multi-entry"; +import json from "@rollup/plugin-json"; + +import nodeBuiltins from "builtin-modules"; + +/** + * Gets the proper configuration needed for rollup's commonJS plugin for @opentelemetry/api. + * + * NOTE: this manual configuration is only needed because OpenTelemetry uses an + * __exportStar downleveled helper function to declare its exports which confuses + * rollup's automatic discovery mechanism. + * + * @returns an object reference that can be `...`'d into your cjs() configuration. + */ +export function openTelemetryCommonJs() { + const namedExports = {}; + + for (const key of [ + "@opentelemetry/api", + "@azure/core-tracing/node_modules/@opentelemetry/api" + ]) { + namedExports[key] = [ + "SpanKind", + "TraceFlags", + "getSpan", + "setSpan", + "SpanStatusCode", + "getSpanContext", + "setSpanContext" + ]; + } + + const releasedOpenTelemetryVersions = ["0.10.2", "1.0.0-rc.0"]; + + for (const version of releasedOpenTelemetryVersions) { + namedExports[ + // working around a limitation in the rollup common.js plugin - it's not able to resolve these modules so the named exports listed above will not get applied. We have to drill down to the actual path. + `../../../common/temp/node_modules/.pnpm/@opentelemetry/api@${version}/node_modules/@opentelemetry/api/build/src/index.js` + ] = [ + "SpanKind", + "TraceFlags", + "getSpan", + "setSpan", + "StatusCode", + "CanonicalCode", + "getSpanContext", + "setSpanContext" + ]; + } + + return namedExports; +} + +// #region Warning Handler + +/** + * A function that can determine whether a rollupwarning should be ignored. If + * the function returns `true`, then the warning will not be displayed. + */ + +function ignoreNiseSinonEvalWarnings(warning) { + return ( + warning.code === "EVAL" && + warning.id && + (warning.id.includes("node_modules/nise") || + warning.id.includes("node_modules/sinon")) === true + ); +} + +function ignoreChaiCircularDependencyWarnings(warning) { + return ( + warning.code === "CIRCULAR_DEPENDENCY" && + warning.importer && warning.importer.includes("node_modules/chai") === true + ); +} + +const warningInhibitors = [ + ignoreChaiCircularDependencyWarnings, + ignoreNiseSinonEvalWarnings +]; + +/** + * Construct a warning handler for the shared rollup configuration + * that ignores certain warnings that are not relevant to testing. + */ +function makeOnWarnForTesting() { + return (warning, warn) => { + // If every inhibitor returns false (i.e. no inhibitors), then show the warning + if (warningInhibitors.every((inhib) => !inhib(warning))) { + warn(warning); + } + }; +} + +// #endregion + +function makeBrowserTestConfig() { + const config = { + input: { + include: ["dist-esm/test/**/*.spec.js"], + exclude: ["dist-esm/test/**/node/**"] + }, + output: { + file: `dist-test/index.browser.js`, + format: "umd", + sourcemap: true + }, + preserveSymlinks: false, + plugins: [ + multiEntry({ exports: false }), + nodeResolve({ + mainFields: ["module", "browser"] + }), + cjs({ + namedExports: { + // Chai's strange internal architecture makes it impossible to statically + // analyze its exports. + chai: [ + "version", + "use", + "util", + "config", + "expect", + "should", + "assert" + ], + ...openTelemetryCommonJs() + } + }), + json(), + sourcemaps() + //viz({ filename: "dist-test/browser-stats.html", sourcemap: true }) + ], + onwarn: makeOnWarnForTesting(), + // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, + // rollup started respecting the "sideEffects" field in package.json. Since + // our package.json sets "sideEffects=false", this also applies to test + // code, which causes all tests to be removed by tree-shaking. + treeshake: false + }; + + return config; +} + +const defaultConfigurationOptions = { + disableBrowserBundle: false +}; + +export function makeConfig(pkg, options) { + options = { + ...defaultConfigurationOptions, + ...(options || {}) + }; + + const baseConfig = { + // Use the package's module field if it has one + input: pkg["module"] || "dist-esm/src/index.js", + external: [ + ...nodeBuiltins, + ...Object.keys(pkg.dependencies), + ...Object.keys(pkg.devDependencies) + ], + output: { file: "dist/index.js", format: "cjs", sourcemap: true }, + preserveSymlinks: false, + plugins: [sourcemaps(), nodeResolve(), cjs()] + }; + + const config = [baseConfig]; + + if (!options.disableBrowserBundle) { + config.push(makeBrowserTestConfig()); + } + + return config; +} + +export default makeConfig(require("./package.json")); diff --git a/sdk/maps/maps-elevation/samples/v1/javascript/README.md b/sdk/maps/maps-elevation/samples/v1/javascript/README.md new file mode 100644 index 000000000000..161644a007f7 --- /dev/null +++ b/sdk/maps/maps-elevation/samples/v1/javascript/README.md @@ -0,0 +1,54 @@ +--- +page_type: sample +languages: + - javascript +products: + - azure +urlFragment: maps-elevation-javascript +--- + +# Azure Maps Elevation client library samples for JavaScript + +These sample programs show how to use the JavaScript client libraries for Azure Maps Elevation in some common scenarios. + +| **File Name** | **Description** | +| ------------------------- | --------------------------------------- | +| [elevation.js][elevation] | Gets height data for specified objects. | + +## Prerequisites + +The sample programs are compatible with Node.js >=12.0.0. + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +3. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node elevation.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx cross-env MAPS_SUBSCRIPTION_KEY="" node elevation.js +``` + +[elevation]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-elevation/samples/v1/javascript/src/elevation.js +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-elevation/README.md diff --git a/sdk/maps/maps-elevation/samples/v1/javascript/elevation.js b/sdk/maps/maps-elevation/samples/v1/javascript/elevation.js new file mode 100644 index 000000000000..422587aca96f --- /dev/null +++ b/sdk/maps/maps-elevation/samples/v1/javascript/elevation.js @@ -0,0 +1,70 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Elevation API usage. Simple CRUD operations are performed. + */ + +const { DefaultAzureCredential } = require("@azure/identity"); +const { ElevationClient } = require("@azure/maps-elevation"); +require("dotenv").config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + const elevation = new ElevationClient(credential).elevation; + + console.log(" --- Get Data For Bounding Box:"); + console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); + + console.log(" --- Get Data For Points:"); + console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Get Data For Polyline:"); + console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Post Data For Points:"); + console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + + console.log(" --- Post Data For Polyline:"); + console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-elevation/samples/v1/javascript/package.json b/sdk/maps/maps-elevation/samples/v1/javascript/package.json new file mode 100644 index 000000000000..63f9096463fa --- /dev/null +++ b/sdk/maps/maps-elevation/samples/v1/javascript/package.json @@ -0,0 +1,28 @@ +{ + "name": "azure-maps-elevation-samples-js", + "private": true, + "version": "1.0.0", + "description": "Azure Maps Elevation client library samples for JavaScript", + "engine": { + "node": ">=12.0.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/maps/maps-elevation" + }, + "keywords": [ + "Azure", + "cloud" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-elevation", + "dependencies": { + "@azure/maps-elevation": "next", + "dotenv": "latest" + } +} diff --git a/sdk/maps/maps-elevation/samples/v1/javascript/sample.env b/sdk/maps/maps-elevation/samples/v1/javascript/sample.env new file mode 100644 index 000000000000..2259ae4da0ec --- /dev/null +++ b/sdk/maps/maps-elevation/samples/v1/javascript/sample.env @@ -0,0 +1,7 @@ +# Maps subscription key when using AzureKey authentication +MAPS_SUBSCRIPTION_KEY="" + +# Maps Azure AD authentication +AZURE_CLIENT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_TENANT_ID="" diff --git a/sdk/maps/maps-elevation/samples/v1/typescript/README.md b/sdk/maps/maps-elevation/samples/v1/typescript/README.md new file mode 100644 index 000000000000..3ca91e3f8b02 --- /dev/null +++ b/sdk/maps/maps-elevation/samples/v1/typescript/README.md @@ -0,0 +1,67 @@ +--- +page_type: sample +languages: + - typescript +products: + - azure +urlFragment: maps-elevation-typescript +--- + +# Azure Maps Elevation client library samples for TypeScript + +These sample programs show how to use the TypeScript client libraries for Azure Maps Elevation in some common scenarios. + +| **File Name** | **Description** | +| ------------------------- | --------------------------------------- | +| [elevation.ts][elevation] | Gets height data for specified objects. | + +## Prerequisites + +The sample programs are compatible with Node.js >=12.0.0. + +Before running the samples in Node, they must be compiled to JavaScript using the TypeScript compiler. For more information on TypeScript, see the [TypeScript documentation][typescript]. Install the TypeScript compiler using: + +```bash +npm install -g typescript +``` + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Compile the samples: + +```bash +npm run build +``` + +3. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +4. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node dist/elevation.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx cross-env MAPS_SUBSCRIPTION_KEY="" node dist/elevation.js +``` + +[elevation]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-elevation/samples/v1/typescript/src/elevation.ts +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-elevation/README.md +[typescript]: https://www.typescriptlang.org/docs/home.html diff --git a/sdk/maps/maps-elevation/samples/v1/typescript/package.json b/sdk/maps/maps-elevation/samples/v1/typescript/package.json new file mode 100644 index 000000000000..de2618430acb --- /dev/null +++ b/sdk/maps/maps-elevation/samples/v1/typescript/package.json @@ -0,0 +1,36 @@ +{ + "name": "azure-maps-elevation-samples-ts", + "private": true, + "version": "1.0.0", + "description": "Azure Maps Elevation client library samples for TypeScript", + "engine": { + "node": ">=12.0.0" + }, + "scripts": { + "build": "tsc", + "prebuild": "rimraf dist/" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/maps/maps-elevation" + }, + "keywords": [ + "Azure", + "cloud" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-elevation", + "dependencies": { + "@azure/maps-elevation": "next", + "dotenv": "latest" + }, + "devDependencies": { + "typescript": "~4.2.0", + "rimraf": "latest" + } +} diff --git a/sdk/maps/maps-elevation/samples/v1/typescript/sample.env b/sdk/maps/maps-elevation/samples/v1/typescript/sample.env new file mode 100644 index 000000000000..2259ae4da0ec --- /dev/null +++ b/sdk/maps/maps-elevation/samples/v1/typescript/sample.env @@ -0,0 +1,7 @@ +# Maps subscription key when using AzureKey authentication +MAPS_SUBSCRIPTION_KEY="" + +# Maps Azure AD authentication +AZURE_CLIENT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_TENANT_ID="" diff --git a/sdk/maps/maps-elevation/samples/v1/typescript/src/elevation.ts b/sdk/maps/maps-elevation/samples/v1/typescript/src/elevation.ts new file mode 100644 index 000000000000..5e1f91bd6989 --- /dev/null +++ b/sdk/maps/maps-elevation/samples/v1/typescript/src/elevation.ts @@ -0,0 +1,76 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Elevation API usage. Simple queries are performed. + */ + +import { getDefaultAzureCredential } from "@azure/identity"; +import * as coreAuth from "@azure/core-auth"; +import * as coreClient from "@azure/core-client"; +import { ElevationClient } from "@azure/maps-elevation"; +import * as dotenv from "dotenv"; +dotenv.config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential implements coreAuth.TokenCredential { + async getToken( + _scopes: string | string[], + _options?: coreAuth.GetTokenOptions + ): Promise { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential: coreAuth.TokenCredential; + let operationOptions: coreClient.OperationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = getDefaultAzureCredential(); + } + + const elevation = new ElevationClient(credential).elevation; + + console.log(" --- Get Data For Bounding Box:"); + console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); + + console.log(" --- Get Data For Points:"); + console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Get Data For Polyline:"); + console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Post Data For Points:"); + console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + + console.log(" --- Post Data For Polyline:"); + console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-elevation/samples/v1/typescript/tsconfig.json b/sdk/maps/maps-elevation/samples/v1/typescript/tsconfig.json new file mode 100644 index 000000000000..416c2dd82e00 --- /dev/null +++ b/sdk/maps/maps-elevation/samples/v1/typescript/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2018", + "module": "commonjs", + "moduleResolution": "node", + "resolveJsonModule": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "alwaysStrict": true, + "outDir": "dist", + "rootDir": "src" + }, + "include": [ + "src/**.ts" + ] +} diff --git a/sdk/maps/maps-elevation/src/elevationClient.ts b/sdk/maps/maps-elevation/src/elevationClient.ts new file mode 100644 index 000000000000..87d71d19ea42 --- /dev/null +++ b/sdk/maps/maps-elevation/src/elevationClient.ts @@ -0,0 +1,30 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreAuth from "@azure/core-auth"; +import { ElevationImpl } from "./operations"; +import { Elevation } from "./operationsInterfaces"; +import { ElevationClientContext } from "./elevationClientContext"; +import { ElevationClientOptionalParams } from "./models"; + +export class ElevationClient extends ElevationClientContext { + /** + * Initializes a new instance of the ElevationClient class. + * @param credentials Subscription credentials which uniquely identify client subscription. + * @param options The parameter options + */ + constructor( + credentials: coreAuth.TokenCredential, + options?: ElevationClientOptionalParams + ) { + super(credentials, options); + this.elevation = new ElevationImpl(this); + } + + elevation: Elevation; +} diff --git a/sdk/maps/maps-elevation/src/elevationClientContext.ts b/sdk/maps/maps-elevation/src/elevationClientContext.ts new file mode 100644 index 000000000000..ec7e6ee7cd6e --- /dev/null +++ b/sdk/maps/maps-elevation/src/elevationClientContext.ts @@ -0,0 +1,63 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; +import * as coreAuth from "@azure/core-auth"; +import { Geography, ElevationClientOptionalParams } from "./models"; + +export class ElevationClientContext extends coreClient.ServiceClient { + geography: Geography; + xMsClientId?: string; + apiVersion: string; + + /** + * Initializes a new instance of the ElevationClientContext class. + * @param credentials Subscription credentials which uniquely identify client subscription. + * @param options The parameter options + */ + constructor( + credentials: coreAuth.TokenCredential, + options?: ElevationClientOptionalParams + ) { + if (credentials === undefined) { + throw new Error("'credentials' cannot be null"); + } + + // Initializing default values for options + if (!options) { + options = {}; + } + const defaults: ElevationClientOptionalParams = { + requestContentType: "application/json; charset=utf-8", + credential: credentials + }; + + const packageDetails = `azsdk-js-maps-elevation/1.0.0-beta.1`; + const userAgentPrefix = + options.userAgentOptions && options.userAgentOptions.userAgentPrefix + ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` + : `${packageDetails}`; + + if (!options.credentialScopes) { + options.credentialScopes = ["https://atlas.microsoft.com/.default"]; + } + const optionsWithDefaults = { + ...defaults, + ...options, + userAgentOptions: { + userAgentPrefix + }, + baseUri: options.endpoint || "https://{geography}.atlas.microsoft.com" + }; + super(optionsWithDefaults); + + // Assigning values to Constant parameters + this.geography = options.geography || "us"; + this.apiVersion = options.apiVersion || "1.0"; + } +} diff --git a/sdk/maps/maps-elevation/src/index.ts b/sdk/maps/maps-elevation/src/index.ts new file mode 100644 index 000000000000..6a7bef3d2488 --- /dev/null +++ b/sdk/maps/maps-elevation/src/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./models"; +export { ElevationClient } from "./elevationClient"; +export { ElevationClientContext } from "./elevationClientContext"; +export * from "./operationsInterfaces"; diff --git a/sdk/maps/maps-elevation/src/models/index.ts b/sdk/maps/maps-elevation/src/models/index.ts new file mode 100644 index 000000000000..53c9bd79d050 --- /dev/null +++ b/sdk/maps/maps-elevation/src/models/index.ts @@ -0,0 +1,215 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; + +/** The response from a successful Elevation Points request. */ +export interface PointsResult { + /** + * The response for point/points elevation API. The result will be in same sequence of points listed in request. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly data?: PointElevationResult[]; +} + +/** The elevation data. */ +export interface PointElevationResult { + /** A location represented as a latitude and longitude. */ + coordinate?: CoordinatesPair; + /** + * The elevation value in meters. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly elevationInMeter?: number; +} + +/** A location represented as a latitude and longitude. */ +export interface CoordinatesPair { + /** Latitude property */ + latitude?: number; + /** Longitude property */ + longitude?: number; +} + +/** Common error response for all Azure Resource Manager APIs to return error details for failed operations. (This also follows the OData error response format.). */ +export interface ErrorResponse { + /** The error object. */ + error?: ErrorDetail; +} + +/** The error detail. */ +export interface ErrorDetail { + /** + * The error code. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly code?: string; + /** + * The error message. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly message?: string; + /** + * The error target. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly target?: string; + /** + * The error details. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly details?: ErrorDetail[]; + /** + * The error additional info. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly additionalInfo?: ErrorAdditionalInfo[]; +} + +/** The resource management error additional info. */ +export interface ErrorAdditionalInfo { + /** + * The additional info type. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly type?: string; + /** + * The additional info. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly info?: Record; +} + +/** A location represented as a latitude and longitude using short names 'lat' & 'lon'. */ +export interface CoordinatesPairAbbreviated { + /** Latitude property */ + lat?: number; + /** Longitude property */ + lon?: number; +} + +/** The response from a successful Elevation Polyline request. */ +export interface LinesResult { + /** + * The response from the Get Data for Polyline API. The results will be listed in the direction from the first endpoint towards the last endpoint. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly data?: PointElevationResult[]; +} + +/** The response from a successful Get Data for Bounding Box API. */ +export interface BoundingBoxResult { + /** + * The response from the Get Data for Bounding Box API. The results are ordered starting with the southwest corner, and then proceed west to east and south to north. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly data?: PointElevationResult[]; +} + +/** Known values of {@link Geography} that the service accepts. */ +export const enum KnownGeography { + Us = "us", + Eu = "eu" +} + +/** + * Defines values for Geography. \ + * {@link KnownGeography} can be used interchangeably with Geography, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **us** \ + * **eu** + */ +export type Geography = string; + +/** Known values of {@link ResponseFormat} that the service accepts. */ +export const enum KnownResponseFormat { + /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ + Json = "json" +} + +/** + * Defines values for ResponseFormat. \ + * {@link KnownResponseFormat} can be used interchangeably with ResponseFormat, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) + */ +export type ResponseFormat = string; + +/** Known values of {@link GeographicResourceLocation} that the service accepts. */ +export const enum KnownGeographicResourceLocation { + /** Used to access an Azure Maps Creator resource in the United States */ + Us = "us", + /** Used to access an Azure Maps Creator resource in Europe */ + Eu = "eu" +} + +/** + * Defines values for GeographicResourceLocation. \ + * {@link KnownGeographicResourceLocation} can be used interchangeably with GeographicResourceLocation, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **us**: Used to access an Azure Maps Creator resource in the United States \ + * **eu**: Used to access an Azure Maps Creator resource in Europe + */ +export type GeographicResourceLocation = string; + +/** Optional parameters. */ +export interface ElevationGetDataForPointsOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getDataForPoints operation. */ +export type ElevationGetDataForPointsResponse = PointsResult; + +/** Optional parameters. */ +export interface ElevationPostDataForPointsOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the postDataForPoints operation. */ +export type ElevationPostDataForPointsResponse = PointsResult; + +/** Optional parameters. */ +export interface ElevationGetDataForPolylineOptionalParams + extends coreClient.OperationOptions { + /** The samples parameter specifies the number of equally spaced points at which elevation values should be provided along a polyline path. The number of samples should range from 2 to 2,000. Default value is 10. */ + samples?: number; +} + +/** Contains response data for the getDataForPolyline operation. */ +export type ElevationGetDataForPolylineResponse = LinesResult; + +/** Optional parameters. */ +export interface ElevationPostDataForPolylineOptionalParams + extends coreClient.OperationOptions { + /** The samples parameter specifies the number of equally spaced points at which elevation values should be provided along a polyline path. The number of samples should range from 2 to 2,000. Default value is 10. */ + samples?: number; +} + +/** Contains response data for the postDataForPolyline operation. */ +export type ElevationPostDataForPolylineResponse = LinesResult; + +/** Optional parameters. */ +export interface ElevationGetDataForBoundingBoxOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getDataForBoundingBox operation. */ +export type ElevationGetDataForBoundingBoxResponse = BoundingBoxResult; + +/** Optional parameters. */ +export interface ElevationClientOptionalParams + extends coreClient.ServiceClientOptions { + /** This parameter specifies where the Azure Maps Creator resource is located. Valid values are us and eu. */ + geography?: Geography; + /** Specifies which account is intended for usage in conjunction with the Azure AD security model. It represents a unique ID for the Azure Maps account and can be retrieved from the Azure Maps management plane Account API. To use Azure AD security in Azure Maps see the following [articles](https://aka.ms/amauthdetails) for guidance. */ + xMsClientId?: string; + /** Api Version */ + apiVersion?: string; + /** Overrides client endpoint. */ + endpoint?: string; +} diff --git a/sdk/maps/maps-elevation/src/models/mappers.ts b/sdk/maps/maps-elevation/src/models/mappers.ts new file mode 100644 index 000000000000..d0bae3a08ab8 --- /dev/null +++ b/sdk/maps/maps-elevation/src/models/mappers.ts @@ -0,0 +1,236 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; + +export const PointsResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "PointsResult", + modelProperties: { + data: { + serializedName: "data", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "PointElevationResult" + } + } + } + } + } + } +}; + +export const PointElevationResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "PointElevationResult", + modelProperties: { + coordinate: { + serializedName: "coordinate", + type: { + name: "Composite", + className: "CoordinatesPair" + } + }, + elevationInMeter: { + serializedName: "elevationInMeter", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const CoordinatesPair: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "CoordinatesPair", + modelProperties: { + latitude: { + serializedName: "latitude", + type: { + name: "Number" + } + }, + longitude: { + serializedName: "longitude", + type: { + name: "Number" + } + } + } + } +}; + +export const ErrorResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorResponse", + modelProperties: { + error: { + serializedName: "error", + type: { + name: "Composite", + className: "ErrorDetail" + } + } + } + } +}; + +export const ErrorDetail: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorDetail", + modelProperties: { + code: { + serializedName: "code", + readOnly: true, + type: { + name: "String" + } + }, + message: { + serializedName: "message", + readOnly: true, + type: { + name: "String" + } + }, + target: { + serializedName: "target", + readOnly: true, + type: { + name: "String" + } + }, + details: { + serializedName: "details", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ErrorDetail" + } + } + } + }, + additionalInfo: { + serializedName: "additionalInfo", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ErrorAdditionalInfo" + } + } + } + } + } + } +}; + +export const ErrorAdditionalInfo: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorAdditionalInfo", + modelProperties: { + type: { + serializedName: "type", + readOnly: true, + type: { + name: "String" + } + }, + info: { + serializedName: "info", + readOnly: true, + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } + } + } +}; + +export const CoordinatesPairAbbreviated: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "CoordinatesPairAbbreviated", + modelProperties: { + lat: { + serializedName: "lat", + type: { + name: "Number" + } + }, + lon: { + serializedName: "lon", + type: { + name: "Number" + } + } + } + } +}; + +export const LinesResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "LinesResult", + modelProperties: { + data: { + serializedName: "data", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "PointElevationResult" + } + } + } + } + } + } +}; + +export const BoundingBoxResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "BoundingBoxResult", + modelProperties: { + data: { + serializedName: "data", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "PointElevationResult" + } + } + } + } + } + } +}; diff --git a/sdk/maps/maps-elevation/src/models/parameters.ts b/sdk/maps/maps-elevation/src/models/parameters.ts new file mode 100644 index 000000000000..d3d43b3c899a --- /dev/null +++ b/sdk/maps/maps-elevation/src/models/parameters.ts @@ -0,0 +1,222 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { + OperationParameter, + OperationURLParameter, + OperationQueryParameter +} from "@azure/core-client"; + +export const accept: OperationParameter = { + parameterPath: "accept", + mapper: { + defaultValue: "application/json", + isConstant: true, + serializedName: "Accept", + type: { + name: "String" + } + } +}; + +export const geography: OperationURLParameter = { + parameterPath: "geography", + mapper: { + serializedName: "geography", + required: true, + type: { + name: "String" + } + } +}; + +export const xMsClientId: OperationParameter = { + parameterPath: "xMsClientId", + mapper: { + serializedName: "x-ms-client-id", + type: { + name: "String" + } + } +}; + +export const apiVersion: OperationQueryParameter = { + parameterPath: "apiVersion", + mapper: { + defaultValue: "1.0", + isConstant: true, + serializedName: "api-version", + type: { + name: "String" + } + } +}; + +export const format: OperationURLParameter = { + parameterPath: "format", + mapper: { + serializedName: "format", + required: true, + type: { + name: "String" + } + } +}; + +export const points: OperationQueryParameter = { + parameterPath: "points", + mapper: { + serializedName: "points", + required: true, + type: { + name: "Sequence", + element: { + constraints: { + Pattern: new RegExp( + "\\s*[-]?\\d+[.]\\d+\\s*[,]\\s*[-]?\\d+[.]\\d+\\s*" + ) + }, + type: { + name: "String" + } + } + } + }, + collectionFormat: "Pipes", + skipEncoding: true +}; + +export const contentType: OperationParameter = { + parameterPath: ["options", "contentType"], + mapper: { + defaultValue: "application/json", + isConstant: true, + serializedName: "Content-Type", + type: { + name: "String" + } + } +}; + +export const pointsRequestBody: OperationParameter = { + parameterPath: "pointsRequestBody", + mapper: { + serializedName: "pointsRequestBody", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "CoordinatesPairAbbreviated" + } + } + } + } +}; + +export const lines: OperationQueryParameter = { + parameterPath: "lines", + mapper: { + serializedName: "lines", + required: true, + type: { + name: "Sequence", + element: { + constraints: { + Pattern: new RegExp( + "\\s*[-]?\\d+[.]\\d+\\s*[,]\\s*[-]?\\d+[.]\\d+\\s*" + ) + }, + type: { + name: "String" + } + } + } + }, + collectionFormat: "Pipes", + skipEncoding: true +}; + +export const samples: OperationQueryParameter = { + parameterPath: ["options", "samples"], + mapper: { + constraints: { + InclusiveMaximum: 2000, + InclusiveMinimum: 2 + }, + serializedName: "samples", + type: { + name: "Number" + } + } +}; + +export const linesRequestBody: OperationParameter = { + parameterPath: "linesRequestBody", + mapper: { + serializedName: "linesRequestBody", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "CoordinatesPairAbbreviated" + } + } + } + } +}; + +export const bounds: OperationQueryParameter = { + parameterPath: "bounds", + mapper: { + serializedName: "bounds", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + collectionFormat: "CSV" +}; + +export const rows: OperationQueryParameter = { + parameterPath: "rows", + mapper: { + constraints: { + InclusiveMaximum: 1000, + InclusiveMinimum: 2 + }, + serializedName: "rows", + required: true, + type: { + name: "Number" + } + } +}; + +export const columns: OperationQueryParameter = { + parameterPath: "columns", + mapper: { + constraints: { + InclusiveMaximum: 1000, + InclusiveMinimum: 2 + }, + serializedName: "columns", + required: true, + type: { + name: "Number" + } + } +}; diff --git a/sdk/maps/maps-elevation/src/operations/elevation.ts b/sdk/maps/maps-elevation/src/operations/elevation.ts new file mode 100644 index 000000000000..9d20f94c2928 --- /dev/null +++ b/sdk/maps/maps-elevation/src/operations/elevation.ts @@ -0,0 +1,304 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { Elevation } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; +import * as Mappers from "../models/mappers"; +import * as Parameters from "../models/parameters"; +import { ElevationClientContext } from "../elevationClientContext"; +import { + ResponseFormat, + ElevationGetDataForPointsOptionalParams, + ElevationGetDataForPointsResponse, + CoordinatesPairAbbreviated, + ElevationPostDataForPointsOptionalParams, + ElevationPostDataForPointsResponse, + ElevationGetDataForPolylineOptionalParams, + ElevationGetDataForPolylineResponse, + ElevationPostDataForPolylineOptionalParams, + ElevationPostDataForPolylineResponse, + ElevationGetDataForBoundingBoxOptionalParams, + ElevationGetDataForBoundingBoxResponse +} from "../models"; + +/** Class representing a Elevation. */ +export class ElevationImpl implements Elevation { + private readonly client: ElevationClientContext; + + /** + * Initialize a new instance of the class Elevation class. + * @param client Reference to the service client + */ + constructor(client: ElevationClientContext) { + this.client = client; + } + + /** + * **Applies to**: S1 pricing tier. + * + * The Get Data for Points API provides elevation data for one or more points. A point is defined in + * lat,long coordinate format. + * + * Due to the URL character length limit of 2048, it's not possible to pass more than 100 coordinates + * as a pipeline delimited string in a URL GET request. If you intend to pass more than 100 + * coordinates as a pipeline delimited string, use the [POST Data + * For Points](https://docs.microsoft.com/en-us/rest/api/maps/elevation/postdataforpoints). + * @param format Desired format of the response. Only `json` format is supported. + * @param points The string representation of a list of points. A point is defined in lon/lat WGS84 + * coordinate reference system format. If multiple points are requested, each of the points in a list + * should be separated by the pipe ('|') character. The maximum number of points that can be requested + * in a single request is 2,000. The resolution of the elevation data will be the highest for a single + * point and will decrease if multiple points are spread further apart. + * @param options The options parameters. + */ + getDataForPoints( + format: ResponseFormat, + points: string[], + options?: ElevationGetDataForPointsOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, points, options }, + getDataForPointsOperationSpec + ); + } + + /** + * **Applies to**: S1 pricing tier. + * + * The Post Data for Points API provides elevation data for multiple points. A point is defined + * lon/lat coordinate format. Use the POST endpoint only if you intend to pass multiple points in the + * request. If you intend to pass a single coordinate into the API, use the [GET Data For Points + * API](https://docs.microsoft.com/en-us/rest/api/maps/elevation/getdataforpoints). + * @param format Desired format of the response. Only `json` format is supported. + * @param pointsRequestBody The string representation of a list of points. A point is defined in + * lon/lat WGS84 coordinate reference system format. Each points in a list should be separated by the + * pipe ('|') character. The number of points that can be requested in a POST request ranges from 2 to + * 2,000. The resolution of the elevation data will be the highest for a single point and will + * decrease if multiple points are spread further apart. + * @param options The options parameters. + */ + postDataForPoints( + format: ResponseFormat, + pointsRequestBody: CoordinatesPairAbbreviated[], + options?: ElevationPostDataForPointsOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, pointsRequestBody, options }, + postDataForPointsOperationSpec + ); + } + + /** + * **Applies to**: S1 pricing tier. + * + * The Get Data for Polyline API provides elevation data along a polyline. + * + * A polyline is defined by passing in between 2 and N endpoint coordinates separated by a pipe ('|') + * character. In addition to passing in endpoints, customers can specify the number of sample points + * that will be used to divide polyline into equally spaced segments. Elevation data at both start and + * endpoints and equally spaced points along the polyline will be returned. + * + * A line between two endpoints is a straight Cartesian line, the shortest line between those two + * points in the coordinate reference system. Note that the point is chosen based on Euclidean + * distance and may markedly differ from the geodesic path along the curved surface of the reference + * ellipsoid. + * @param format Desired format of the response. Only `json` format is supported. + * @param lines The string representation of a polyline path. A polyline is defined by endpoint + * coordinates, with each endpoint separated by a pipe ('|') character. The polyline should be defined + * in the following format: `[longitude_point1, latitude_point1 | longitude_point2, latitude_point2, + * ..., longitude_pointN, latitude_pointN]`. + * + * The longitude and latitude values refer to the World Geodetic System (WGS84) coordinate reference + * system. The resolution of the data used to compute the elevation depends on the distance between + * the endpoints. + * @param options The options parameters. + */ + getDataForPolyline( + format: ResponseFormat, + lines: string[], + options?: ElevationGetDataForPolylineOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, lines, options }, + getDataForPolylineOperationSpec + ); + } + + /** + * **Applies to**: S1 pricing tier. + * + * The Post Data for Polyline API provides elevation data along a polyline. A polyline is defined by + * passing in between 2 and N endpoint coordinates separated by a pipe ('|') character. In addition to + * passing in endpoints, customers can specify the number of sample points that will be used to divide + * polyline into equally spaced segments. + * + * Elevation data at both start and end points and equally spaced points along the polyline will be + * returned. A line between two endpoints is a straight Cartesian line, the shortest line between + * those two points in the coordinate reference system. Note that the point is chosen based on + * Euclidean distance and may markedly differ from the geodesic path along the curved surface of the + * reference ellipsoid. + * @param format Desired format of the response. Only `json` format is supported. + * @param linesRequestBody The string representation of a polyline path. A polyline is defined by + * endpoint coordinates, with each endpoint separated by a pipe ('|') character. The polyline should + * be defined in the following format: `[longitude_point1, latitude_point1 | longitude_point2, + * latitude_point2, ..., longitude_pointN, latitude_pointN]`. The longitude and latitude values refer + * to the World Geodetic System (WGS84) coordinate reference system. The resolution of the data used + * to compute the elevation will depend on the distance between the endpoints. + * @param options The options parameters. + */ + postDataForPolyline( + format: ResponseFormat, + linesRequestBody: CoordinatesPairAbbreviated[], + options?: ElevationPostDataForPolylineOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, linesRequestBody, options }, + postDataForPolylineOperationSpec + ); + } + + /** + * **Applies to**: S1 pricing tier. + * + * The Get Data for Bounding Box API provides elevation data at equally spaced locations within a + * bounding box. A bounding box is defined by the coordinates for two corners (southwest, northeast) + * and then subsequently divided into rows and columns. + * + * Elevations are returned for the vertices of the grid created by the rows and columns. Up to 2,000 + * elevations can be returned in a single request. The returned elevation values are ordered, starting + * at the southwest corner, and then proceeding west to east along the row. At the end of the row, it + * moves north to the next row, and repeats the process until it reaches the far northeast corner. + * @param format Desired format of the response. Only `json` format is supported. + * @param bounds The string that represents the rectangular area of a bounding box. The bounds + * parameter is defined by the 4 bounding box coordinates, with WGS84 longitude and latitude of the + * southwest corner followed by WGS84 longitude and latitude of the northeast corner. The string is + * presented in the following format: `[SouthwestCorner_Longitude, SouthwestCorner_Latitude, + * NortheastCorner_Longitude, NortheastCorner_Latitude]`. + * @param rows Specifies the number of rows to use to divide the bounding box area into a grid. The + * number of vertices in the grid should be less than 2,000. + * @param columns Specifies the number of columns to use to divide the bounding box area into a grid. + * The number of vertices in the grid should be less than 2,000. + * @param options The options parameters. + */ + getDataForBoundingBox( + format: ResponseFormat, + bounds: string[], + rows: number, + columns: number, + options?: ElevationGetDataForBoundingBoxOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, bounds, rows, columns, options }, + getDataForBoundingBoxOperationSpec + ); + } +} +// Operation Specifications +const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); + +const getDataForPointsOperationSpec: coreClient.OperationSpec = { + path: "/elevation/point/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.PointsResult + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion, Parameters.points], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const postDataForPointsOperationSpec: coreClient.OperationSpec = { + path: "/elevation/point/{format}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.PointsResult + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.pointsRequestBody, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [ + Parameters.accept, + Parameters.xMsClientId, + Parameters.contentType + ], + mediaType: "json", + serializer +}; +const getDataForPolylineOperationSpec: coreClient.OperationSpec = { + path: "/elevation/line/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.LinesResult + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.lines, + Parameters.samples + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const postDataForPolylineOperationSpec: coreClient.OperationSpec = { + path: "/elevation/line/{format}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.LinesResult + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.linesRequestBody, + queryParameters: [Parameters.apiVersion, Parameters.samples], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [ + Parameters.accept, + Parameters.xMsClientId, + Parameters.contentType + ], + mediaType: "json", + serializer +}; +const getDataForBoundingBoxOperationSpec: coreClient.OperationSpec = { + path: "/elevation/lattice/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.BoundingBoxResult + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.bounds, + Parameters.rows, + Parameters.columns + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; diff --git a/sdk/maps/maps-elevation/src/operations/index.ts b/sdk/maps/maps-elevation/src/operations/index.ts new file mode 100644 index 000000000000..8b7f3e6f4fd4 --- /dev/null +++ b/sdk/maps/maps-elevation/src/operations/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./elevation"; diff --git a/sdk/maps/maps-elevation/src/operationsInterfaces/elevation.ts b/sdk/maps/maps-elevation/src/operationsInterfaces/elevation.ts new file mode 100644 index 000000000000..288101794a30 --- /dev/null +++ b/sdk/maps/maps-elevation/src/operationsInterfaces/elevation.ts @@ -0,0 +1,156 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { + ResponseFormat, + ElevationGetDataForPointsOptionalParams, + ElevationGetDataForPointsResponse, + CoordinatesPairAbbreviated, + ElevationPostDataForPointsOptionalParams, + ElevationPostDataForPointsResponse, + ElevationGetDataForPolylineOptionalParams, + ElevationGetDataForPolylineResponse, + ElevationPostDataForPolylineOptionalParams, + ElevationPostDataForPolylineResponse, + ElevationGetDataForBoundingBoxOptionalParams, + ElevationGetDataForBoundingBoxResponse +} from "../models"; + +/** Interface representing a Elevation. */ +export interface Elevation { + /** + * **Applies to**: S1 pricing tier. + * + * The Get Data for Points API provides elevation data for one or more points. A point is defined in + * lat,long coordinate format. + * + * Due to the URL character length limit of 2048, it's not possible to pass more than 100 coordinates + * as a pipeline delimited string in a URL GET request. If you intend to pass more than 100 + * coordinates as a pipeline delimited string, use the [POST Data + * For Points](https://docs.microsoft.com/en-us/rest/api/maps/elevation/postdataforpoints). + * @param format Desired format of the response. Only `json` format is supported. + * @param points The string representation of a list of points. A point is defined in lon/lat WGS84 + * coordinate reference system format. If multiple points are requested, each of the points in a list + * should be separated by the pipe ('|') character. The maximum number of points that can be requested + * in a single request is 2,000. The resolution of the elevation data will be the highest for a single + * point and will decrease if multiple points are spread further apart. + * @param options The options parameters. + */ + getDataForPoints( + format: ResponseFormat, + points: string[], + options?: ElevationGetDataForPointsOptionalParams + ): Promise; + /** + * **Applies to**: S1 pricing tier. + * + * The Post Data for Points API provides elevation data for multiple points. A point is defined + * lon/lat coordinate format. Use the POST endpoint only if you intend to pass multiple points in the + * request. If you intend to pass a single coordinate into the API, use the [GET Data For Points + * API](https://docs.microsoft.com/en-us/rest/api/maps/elevation/getdataforpoints). + * @param format Desired format of the response. Only `json` format is supported. + * @param pointsRequestBody The string representation of a list of points. A point is defined in + * lon/lat WGS84 coordinate reference system format. Each points in a list should be separated by the + * pipe ('|') character. The number of points that can be requested in a POST request ranges from 2 to + * 2,000. The resolution of the elevation data will be the highest for a single point and will + * decrease if multiple points are spread further apart. + * @param options The options parameters. + */ + postDataForPoints( + format: ResponseFormat, + pointsRequestBody: CoordinatesPairAbbreviated[], + options?: ElevationPostDataForPointsOptionalParams + ): Promise; + /** + * **Applies to**: S1 pricing tier. + * + * The Get Data for Polyline API provides elevation data along a polyline. + * + * A polyline is defined by passing in between 2 and N endpoint coordinates separated by a pipe ('|') + * character. In addition to passing in endpoints, customers can specify the number of sample points + * that will be used to divide polyline into equally spaced segments. Elevation data at both start and + * endpoints and equally spaced points along the polyline will be returned. + * + * A line between two endpoints is a straight Cartesian line, the shortest line between those two + * points in the coordinate reference system. Note that the point is chosen based on Euclidean + * distance and may markedly differ from the geodesic path along the curved surface of the reference + * ellipsoid. + * @param format Desired format of the response. Only `json` format is supported. + * @param lines The string representation of a polyline path. A polyline is defined by endpoint + * coordinates, with each endpoint separated by a pipe ('|') character. The polyline should be defined + * in the following format: `[longitude_point1, latitude_point1 | longitude_point2, latitude_point2, + * ..., longitude_pointN, latitude_pointN]`. + * + * The longitude and latitude values refer to the World Geodetic System (WGS84) coordinate reference + * system. The resolution of the data used to compute the elevation depends on the distance between + * the endpoints. + * @param options The options parameters. + */ + getDataForPolyline( + format: ResponseFormat, + lines: string[], + options?: ElevationGetDataForPolylineOptionalParams + ): Promise; + /** + * **Applies to**: S1 pricing tier. + * + * The Post Data for Polyline API provides elevation data along a polyline. A polyline is defined by + * passing in between 2 and N endpoint coordinates separated by a pipe ('|') character. In addition to + * passing in endpoints, customers can specify the number of sample points that will be used to divide + * polyline into equally spaced segments. + * + * Elevation data at both start and end points and equally spaced points along the polyline will be + * returned. A line between two endpoints is a straight Cartesian line, the shortest line between + * those two points in the coordinate reference system. Note that the point is chosen based on + * Euclidean distance and may markedly differ from the geodesic path along the curved surface of the + * reference ellipsoid. + * @param format Desired format of the response. Only `json` format is supported. + * @param linesRequestBody The string representation of a polyline path. A polyline is defined by + * endpoint coordinates, with each endpoint separated by a pipe ('|') character. The polyline should + * be defined in the following format: `[longitude_point1, latitude_point1 | longitude_point2, + * latitude_point2, ..., longitude_pointN, latitude_pointN]`. The longitude and latitude values refer + * to the World Geodetic System (WGS84) coordinate reference system. The resolution of the data used + * to compute the elevation will depend on the distance between the endpoints. + * @param options The options parameters. + */ + postDataForPolyline( + format: ResponseFormat, + linesRequestBody: CoordinatesPairAbbreviated[], + options?: ElevationPostDataForPolylineOptionalParams + ): Promise; + /** + * **Applies to**: S1 pricing tier. + * + * The Get Data for Bounding Box API provides elevation data at equally spaced locations within a + * bounding box. A bounding box is defined by the coordinates for two corners (southwest, northeast) + * and then subsequently divided into rows and columns. + * + * Elevations are returned for the vertices of the grid created by the rows and columns. Up to 2,000 + * elevations can be returned in a single request. The returned elevation values are ordered, starting + * at the southwest corner, and then proceeding west to east along the row. At the end of the row, it + * moves north to the next row, and repeats the process until it reaches the far northeast corner. + * @param format Desired format of the response. Only `json` format is supported. + * @param bounds The string that represents the rectangular area of a bounding box. The bounds + * parameter is defined by the 4 bounding box coordinates, with WGS84 longitude and latitude of the + * southwest corner followed by WGS84 longitude and latitude of the northeast corner. The string is + * presented in the following format: `[SouthwestCorner_Longitude, SouthwestCorner_Latitude, + * NortheastCorner_Longitude, NortheastCorner_Latitude]`. + * @param rows Specifies the number of rows to use to divide the bounding box area into a grid. The + * number of vertices in the grid should be less than 2,000. + * @param columns Specifies the number of columns to use to divide the bounding box area into a grid. + * The number of vertices in the grid should be less than 2,000. + * @param options The options parameters. + */ + getDataForBoundingBox( + format: ResponseFormat, + bounds: string[], + rows: number, + columns: number, + options?: ElevationGetDataForBoundingBoxOptionalParams + ): Promise; +} diff --git a/sdk/maps/maps-elevation/src/operationsInterfaces/index.ts b/sdk/maps/maps-elevation/src/operationsInterfaces/index.ts new file mode 100644 index 000000000000..8b7f3e6f4fd4 --- /dev/null +++ b/sdk/maps/maps-elevation/src/operationsInterfaces/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./elevation"; diff --git a/sdk/maps/maps-elevation/tsconfig.json b/sdk/maps/maps-elevation/tsconfig.json new file mode 100644 index 000000000000..0ec8659c8e83 --- /dev/null +++ b/sdk/maps/maps-elevation/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "module": "es6", + "moduleResolution": "node", + "strict": true, + "target": "es6", + "sourceMap": true, + "declarationMap": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "preserveConstEnums": true, + "lib": ["es6", "dom"], + "declaration": true, + "outDir": "./esm", + "importHelpers": true + }, + "include": ["./src/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/sdk/maps/maps-geolocation/LICENSE.txt b/sdk/maps/maps-geolocation/LICENSE.txt new file mode 100644 index 000000000000..ccb63b166732 --- /dev/null +++ b/sdk/maps/maps-geolocation/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2021 Microsoft + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/sdk/maps/maps-geolocation/README.md b/sdk/maps/maps-geolocation/README.md new file mode 100644 index 000000000000..df73fd4901e2 --- /dev/null +++ b/sdk/maps/maps-geolocation/README.md @@ -0,0 +1,91 @@ +# Azure Geolocation client library for JavaScript + +This package contains an isomorphic SDK (runs both in Node.js and in browsers) for Azure Geolocation client. + +Azure Maps Geolocation REST APIs + +[Source code](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-geolocation) | +[Package (NPM)](https://www.npmjs.com/package/@azure/maps-geolocation) | +[API reference documentation](https://docs.microsoft.com/javascript/api/@azure/maps-geolocation) | +[Samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-geolocation/samples) + +## Getting started + +### Currently supported environments + +- [LTS versions of Node.js](https://nodejs.org/about/releases/) +- Latest versions of Safari, Chrome, Edge and Firefox. + +### Prerequisites + +- An [Azure subscription][azure_sub]. + +### Install the `@azure/maps-geolocation` package + +Install the Azure Geolocation client library for JavaScript with `npm`: + +```bash +npm install @azure/maps-geolocation +``` + +### Create and authenticate a `GeolocationClient` + +To create a client object to access the Azure Geolocation API, you will need the `endpoint` of your Azure Geolocation resource and a `credential`. The Azure Geolocation client can use Azure Active Directory credentials to authenticate. +You can find the endpoint for your Azure Geolocation resource in the [Azure Portal][azure_portal]. + +#### Using an Azure Active Directory Credential + +You can authenticate with Azure Active Directory using the [Azure Identity library][azure_identity]. To use the [DefaultAzureCredential][defaultazurecredential] provider shown below, or other credential providers provided with the Azure SDK, please install the `@azure/identity` package: + +```bash +npm install @azure/identity +``` + +You will also need to register a new AAD application and grant access to Azure Geolocation by assigning the suitable role to your service principal (note: roles such as `"Owner"` will not grant the necessary permissions). +Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`. + +```javascript +const { GeolocationClient } = require("@azure/maps-geolocation"); +const { DefaultAzureCredential } = require("@azure/identity"); +const client = new GeolocationClient("", new DefaultAzureCredential()); +``` + +## Key concepts + +### GeolocationClient + +`GeolocationClient` is the primary interface for developers using the Azure Geolocation client library. Explore the methods on this client object to understand the different features of the Azure Geolocation service that you can access. + +## Troubleshooting + +### Logging + +Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: + +```javascript +import { setLogLevel } from "@azure/logger"; +setLogLevel("info"); +``` + +For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger). + +## Next steps + +Please take a look at the [samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-geolocation/samples) directory for detailed examples on how to use this library. + +## Contributing + +If you'd like to contribute to this library, please read the [contributing guide](https://github.com/Azure/azure-sdk-for-js/blob/master/CONTRIBUTING.md) to learn more about how to build and test the code. + +## Related projects + +- [Microsoft Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) + +![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fmaps%2Fmaps-geolocation%2FREADME.png) + +[azure_cli]: https://docs.microsoft.com/cli/azure +[azure_sub]: https://azure.microsoft.com/free/ +[azure_sub]: https://azure.microsoft.com/free/ +[azure_portal]: https://portal.azure.com +[azure_identity]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity +[defaultazurecredential]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity#defaultazurecredential diff --git a/sdk/maps/maps-geolocation/api-extractor.json b/sdk/maps/maps-geolocation/api-extractor.json new file mode 100644 index 000000000000..5fb5b21b56f2 --- /dev/null +++ b/sdk/maps/maps-geolocation/api-extractor.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "mainEntryPointFilePath": "./esm/index.d.ts", + "docModel": { "enabled": true }, + "apiReport": { "enabled": true, "reportFolder": "./review" }, + "dtsRollup": { + "enabled": true, + "untrimmedFilePath": "", + "publicTrimmedFilePath": "./esm/index.d.ts" + }, + "messages": { + "tsdocMessageReporting": { "default": { "logLevel": "none" } }, + "extractorMessageReporting": { + "ae-missing-release-tag": { "logLevel": "none" }, + "ae-unresolved-link": { "logLevel": "none" } + } + } +} diff --git a/sdk/maps/maps-geolocation/package.json b/sdk/maps/maps-geolocation/package.json new file mode 100644 index 000000000000..08f3fe4b7134 --- /dev/null +++ b/sdk/maps/maps-geolocation/package.json @@ -0,0 +1,84 @@ +{ + "name": "@azure/maps-geolocation", + "sdk-type": "client", + "author": "Microsoft Corporation", + "description": "A generated SDK for GeolocationClient.", + "version": "1.0.0-beta.1", + "engines": { "node": ">=12.0.0" }, + "dependencies": { + "@azure/core-client": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-rest-pipeline": "^1.1.0", + "tslib": "^2.2.0" + }, + "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], + "license": "MIT", + "main": "./dist/index.js", + "module": "./esm/index.js", + "types": "./esm/index.d.ts", + "devDependencies": { + "@microsoft/api-extractor": "7.7.11", + "@rollup/plugin-commonjs": "11.0.2", + "@rollup/plugin-json": "^4.0.0", + "@rollup/plugin-multi-entry": "^3.0.0", + "@rollup/plugin-node-resolve": "^8.0.0", + "mkdirp": "^1.0.4", + "rollup": "^1.16.3", + "rollup-plugin-sourcemaps": "^0.4.2", + "rollup-plugin-node-resolve": "^3.4.0", + "typescript": "~4.2.0", + "uglify-js": "^3.4.9" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js", + "repository": { + "type": "git", + "url": "https://github.com/Azure/azure-sdk-for-js.git" + }, + "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, + "files": [ + "dist/**/*.js", + "dist/**/*.js.map", + "dist/**/*.d.ts", + "dist/**/*.d.ts.map", + "esm/**/*.js", + "esm/**/*.js.map", + "esm/**/*.d.ts", + "esm/**/*.d.ts.map", + "src/**/*.ts", + "README.md", + "rollup.config.js", + "tsconfig.json", + "review/*", + "CHANGELOG.md" + ], + "scripts": { + "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", + "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js", + "prepack": "npm install && npm run build", + "pack": "npm pack 2>&1", + "extract-api": "mkdirp ./review && api-extractor run --local", + "lint": "echo skipped", + "audit": "echo skipped", + "clean": "echo skipped", + "build:node": "echo skipped", + "build:browser": "echo skipped", + "build:test": "echo skipped", + "build:samples": "echo skipped.", + "check-format": "echo skipped", + "execute:samples": "echo skipped", + "format": "echo skipped", + "test": "echo skipped", + "prebuild": "echo skipped", + "test:node": "echo skipped", + "test:browser": "echo skipped", + "unit-test": "echo skipped", + "unit-test:node": "echo skipped", + "unit-test:browser": "echo skipped", + "integration-test:browser": "echo skipped", + "integration-test:node": "echo skipped", + "integration-test": "echo skipped", + "docs": "echo skipped" + }, + "sideEffects": false, + "autoPublish": true +} diff --git a/sdk/maps/maps-geolocation/review/maps-geolocation.api.md b/sdk/maps/maps-geolocation/review/maps-geolocation.api.md new file mode 100644 index 000000000000..4e6fc215f5e9 --- /dev/null +++ b/sdk/maps/maps-geolocation/review/maps-geolocation.api.md @@ -0,0 +1,110 @@ +## API Report File for "@azure/maps-geolocation" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import * as coreAuth from '@azure/core-auth'; +import * as coreClient from '@azure/core-client'; + +// @public +export interface CountryRegion { + readonly isoCode?: string; +} + +// @public +export interface ErrorAdditionalInfo { + readonly info?: Record; + readonly type?: string; +} + +// @public +export interface ErrorDetail { + readonly additionalInfo?: ErrorAdditionalInfo[]; + readonly code?: string; + readonly details?: ErrorDetail[]; + readonly message?: string; + readonly target?: string; +} + +// @public +export interface ErrorResponse { + error?: ErrorDetail; +} + +// @public +export type GeographicResourceLocation = string; + +// @public +export type Geography = string; + +// @public +export interface Geolocation { + getIPToLocationPreview(format: ResponseFormat, ip: string, options?: GeolocationGetIPToLocationPreviewOptionalParams): Promise; +} + +// @public (undocumented) +export class GeolocationClient extends GeolocationClientContext { + constructor(credentials: coreAuth.TokenCredential, options?: GeolocationClientOptionalParams); + // (undocumented) + geolocation: Geolocation; +} + +// @public (undocumented) +export class GeolocationClientContext extends coreClient.ServiceClient { + constructor(credentials: coreAuth.TokenCredential, options?: GeolocationClientOptionalParams); + // (undocumented) + apiVersion: string; + // (undocumented) + geography: Geography; + // (undocumented) + xMsClientId?: string; +} + +// @public +export interface GeolocationClientOptionalParams extends coreClient.ServiceClientOptions { + apiVersion?: string; + endpoint?: string; + geography?: Geography; + xMsClientId?: string; +} + +// @public +export interface GeolocationGetIPToLocationPreviewOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type GeolocationGetIPToLocationPreviewResponse = IpAddressToLocationResult; + +// @public +export interface IpAddressToLocationResult { + readonly countryRegion?: CountryRegion; + readonly ipAddress?: string; +} + +// @public +export const enum KnownGeographicResourceLocation { + Eu = "eu", + Us = "us" +} + +// @public +export const enum KnownGeography { + // (undocumented) + Eu = "eu", + // (undocumented) + Us = "us" +} + +// @public +export const enum KnownResponseFormat { + Json = "json" +} + +// @public +export type ResponseFormat = string; + + +// (No @packageDocumentation comment for this package) + +``` diff --git a/sdk/maps/maps-geolocation/rollup.config.js b/sdk/maps/maps-geolocation/rollup.config.js new file mode 100644 index 000000000000..9be1955eb7f1 --- /dev/null +++ b/sdk/maps/maps-geolocation/rollup.config.js @@ -0,0 +1,188 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import nodeResolve from "@rollup/plugin-node-resolve"; +import cjs from "@rollup/plugin-commonjs"; +import sourcemaps from "rollup-plugin-sourcemaps"; +import multiEntry from "@rollup/plugin-multi-entry"; +import json from "@rollup/plugin-json"; + +import nodeBuiltins from "builtin-modules"; + +/** + * Gets the proper configuration needed for rollup's commonJS plugin for @opentelemetry/api. + * + * NOTE: this manual configuration is only needed because OpenTelemetry uses an + * __exportStar downleveled helper function to declare its exports which confuses + * rollup's automatic discovery mechanism. + * + * @returns an object reference that can be `...`'d into your cjs() configuration. + */ +export function openTelemetryCommonJs() { + const namedExports = {}; + + for (const key of [ + "@opentelemetry/api", + "@azure/core-tracing/node_modules/@opentelemetry/api" + ]) { + namedExports[key] = [ + "SpanKind", + "TraceFlags", + "getSpan", + "setSpan", + "SpanStatusCode", + "getSpanContext", + "setSpanContext" + ]; + } + + const releasedOpenTelemetryVersions = ["0.10.2", "1.0.0-rc.0"]; + + for (const version of releasedOpenTelemetryVersions) { + namedExports[ + // working around a limitation in the rollup common.js plugin - it's not able to resolve these modules so the named exports listed above will not get applied. We have to drill down to the actual path. + `../../../common/temp/node_modules/.pnpm/@opentelemetry/api@${version}/node_modules/@opentelemetry/api/build/src/index.js` + ] = [ + "SpanKind", + "TraceFlags", + "getSpan", + "setSpan", + "StatusCode", + "CanonicalCode", + "getSpanContext", + "setSpanContext" + ]; + } + + return namedExports; +} + +// #region Warning Handler + +/** + * A function that can determine whether a rollupwarning should be ignored. If + * the function returns `true`, then the warning will not be displayed. + */ + +function ignoreNiseSinonEvalWarnings(warning) { + return ( + warning.code === "EVAL" && + warning.id && + (warning.id.includes("node_modules/nise") || + warning.id.includes("node_modules/sinon")) === true + ); +} + +function ignoreChaiCircularDependencyWarnings(warning) { + return ( + warning.code === "CIRCULAR_DEPENDENCY" && + warning.importer && warning.importer.includes("node_modules/chai") === true + ); +} + +const warningInhibitors = [ + ignoreChaiCircularDependencyWarnings, + ignoreNiseSinonEvalWarnings +]; + +/** + * Construct a warning handler for the shared rollup configuration + * that ignores certain warnings that are not relevant to testing. + */ +function makeOnWarnForTesting() { + return (warning, warn) => { + // If every inhibitor returns false (i.e. no inhibitors), then show the warning + if (warningInhibitors.every((inhib) => !inhib(warning))) { + warn(warning); + } + }; +} + +// #endregion + +function makeBrowserTestConfig() { + const config = { + input: { + include: ["dist-esm/test/**/*.spec.js"], + exclude: ["dist-esm/test/**/node/**"] + }, + output: { + file: `dist-test/index.browser.js`, + format: "umd", + sourcemap: true + }, + preserveSymlinks: false, + plugins: [ + multiEntry({ exports: false }), + nodeResolve({ + mainFields: ["module", "browser"] + }), + cjs({ + namedExports: { + // Chai's strange internal architecture makes it impossible to statically + // analyze its exports. + chai: [ + "version", + "use", + "util", + "config", + "expect", + "should", + "assert" + ], + ...openTelemetryCommonJs() + } + }), + json(), + sourcemaps() + //viz({ filename: "dist-test/browser-stats.html", sourcemap: true }) + ], + onwarn: makeOnWarnForTesting(), + // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, + // rollup started respecting the "sideEffects" field in package.json. Since + // our package.json sets "sideEffects=false", this also applies to test + // code, which causes all tests to be removed by tree-shaking. + treeshake: false + }; + + return config; +} + +const defaultConfigurationOptions = { + disableBrowserBundle: false +}; + +export function makeConfig(pkg, options) { + options = { + ...defaultConfigurationOptions, + ...(options || {}) + }; + + const baseConfig = { + // Use the package's module field if it has one + input: pkg["module"] || "dist-esm/src/index.js", + external: [ + ...nodeBuiltins, + ...Object.keys(pkg.dependencies), + ...Object.keys(pkg.devDependencies) + ], + output: { file: "dist/index.js", format: "cjs", sourcemap: true }, + preserveSymlinks: false, + plugins: [sourcemaps(), nodeResolve(), cjs()] + }; + + const config = [baseConfig]; + + if (!options.disableBrowserBundle) { + config.push(makeBrowserTestConfig()); + } + + return config; +} + +export default makeConfig(require("./package.json")); diff --git a/sdk/maps/maps-geolocation/samples/v1/javascript/README.md b/sdk/maps/maps-geolocation/samples/v1/javascript/README.md new file mode 100644 index 000000000000..437d603a7d31 --- /dev/null +++ b/sdk/maps/maps-geolocation/samples/v1/javascript/README.md @@ -0,0 +1,54 @@ +--- +page_type: sample +languages: + - javascript +products: + - azure +urlFragment: maps-geolocation-javascript +--- + +# Azure Maps Geolocation client library samples for JavaScript + +These sample programs show how to use the JavaScript client libraries for Azure Maps Geolocation in some common scenarios. + +| **File Name** | **Description** | +| ----------------------------- | ------------------------------------------ | +| [geolocation.js][geolocation] | Gets the geolocation for the specified IP. | + +## Prerequisites + +The sample programs are compatible with Node.js >=12.0.0. + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +3. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node geolocation.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx cross-env MAPS_SUBSCRIPTION_KEY="" node geolocation.js +``` + +[geolocation]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-geolocation/samples/v1/javascript/src/geolocation.js +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-geolocation/README.md diff --git a/sdk/maps/maps-geolocation/samples/v1/javascript/geolocation.js b/sdk/maps/maps-geolocation/samples/v1/javascript/geolocation.js new file mode 100644 index 000000000000..06a5d3552c23 --- /dev/null +++ b/sdk/maps/maps-geolocation/samples/v1/javascript/geolocation.js @@ -0,0 +1,60 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Elevation API usage. Simple CRUD operations are performed. + */ + +const { DefaultAzureCredential } = require("@azure/identity"); +const { GeolocationClient } = require("@azure/maps-geolocation"); +require("dotenv").config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + const geolocation = new GeolocationClient(credential).geolocation; + + const ipAddressToTest = "8.8.8.8"; + + console.log(" --- Get IP to location:"); + console.log(await geolocation.getIPToLocationPreview("json", ipAddressToTest, operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-geolocation/samples/v1/javascript/package.json b/sdk/maps/maps-geolocation/samples/v1/javascript/package.json new file mode 100644 index 000000000000..91117d036b1a --- /dev/null +++ b/sdk/maps/maps-geolocation/samples/v1/javascript/package.json @@ -0,0 +1,28 @@ +{ + "name": "azure-maps-geolocation-samples-js", + "private": true, + "version": "1.0.0", + "description": "Azure Maps Geolocation client library samples for JavaScript", + "engine": { + "node": ">=12.0.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/maps/maps-geolocation" + }, + "keywords": [ + "Azure", + "cloud" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-geolocation", + "dependencies": { + "@azure/maps-geolocation": "next", + "dotenv": "latest" + } +} diff --git a/sdk/maps/maps-geolocation/samples/v1/javascript/sample.env b/sdk/maps/maps-geolocation/samples/v1/javascript/sample.env new file mode 100644 index 000000000000..2259ae4da0ec --- /dev/null +++ b/sdk/maps/maps-geolocation/samples/v1/javascript/sample.env @@ -0,0 +1,7 @@ +# Maps subscription key when using AzureKey authentication +MAPS_SUBSCRIPTION_KEY="" + +# Maps Azure AD authentication +AZURE_CLIENT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_TENANT_ID="" diff --git a/sdk/maps/maps-geolocation/samples/v1/typescript/README.md b/sdk/maps/maps-geolocation/samples/v1/typescript/README.md new file mode 100644 index 000000000000..196b1f133cb8 --- /dev/null +++ b/sdk/maps/maps-geolocation/samples/v1/typescript/README.md @@ -0,0 +1,67 @@ +--- +page_type: sample +languages: + - typescript +products: + - azure +urlFragment: maps-geolocation-typescript +--- + +# Azure Maps Geolocation client library samples for TypeScript + +These sample programs show how to use the TypeScript client libraries for Azure Maps Geolocation in some common scenarios. + +| **File Name** | **Description** | +| ----------------------------- | ------------------------------------------ | +| [geolocation.ts][geolocation] | Gets the geolocation for the specified IP. | + +## Prerequisites + +The sample programs are compatible with Node.js >=12.0.0. + +Before running the samples in Node, they must be compiled to JavaScript using the TypeScript compiler. For more information on TypeScript, see the [TypeScript documentation][typescript]. Install the TypeScript compiler using: + +```bash +npm install -g typescript +``` + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Compile the samples: + +```bash +npm run build +``` + +3. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +4. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node dist/geolocation.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx cross-env MAPS_SUBSCRIPTION_KEY="" node dist/geolocation.js +``` + +[geolocation]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-geolocation/samples/v1/typescript/src/geolocation.ts +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-geolocation/README.md +[typescript]: https://www.typescriptlang.org/docs/home.html diff --git a/sdk/maps/maps-geolocation/samples/v1/typescript/package.json b/sdk/maps/maps-geolocation/samples/v1/typescript/package.json new file mode 100644 index 000000000000..8cfc873bd785 --- /dev/null +++ b/sdk/maps/maps-geolocation/samples/v1/typescript/package.json @@ -0,0 +1,36 @@ +{ + "name": "azure-maps-geolocation-samples-ts", + "private": true, + "version": "1.0.0", + "description": "Azure Maps Geolocation client library samples for TypeScript", + "engine": { + "node": ">=12.0.0" + }, + "scripts": { + "build": "tsc", + "prebuild": "rimraf dist/" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/maps/maps-geolocation" + }, + "keywords": [ + "Azure", + "cloud" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-geolocation", + "dependencies": { + "@azure/maps-geolocation": "next", + "dotenv": "latest" + }, + "devDependencies": { + "typescript": "~4.2.0", + "rimraf": "latest" + } +} diff --git a/sdk/maps/maps-geolocation/samples/v1/typescript/sample.env b/sdk/maps/maps-geolocation/samples/v1/typescript/sample.env new file mode 100644 index 000000000000..2259ae4da0ec --- /dev/null +++ b/sdk/maps/maps-geolocation/samples/v1/typescript/sample.env @@ -0,0 +1,7 @@ +# Maps subscription key when using AzureKey authentication +MAPS_SUBSCRIPTION_KEY="" + +# Maps Azure AD authentication +AZURE_CLIENT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_TENANT_ID="" diff --git a/sdk/maps/maps-geolocation/samples/v1/typescript/src/geolocation.ts b/sdk/maps/maps-geolocation/samples/v1/typescript/src/geolocation.ts new file mode 100644 index 000000000000..e2e6239e2f90 --- /dev/null +++ b/sdk/maps/maps-geolocation/samples/v1/typescript/src/geolocation.ts @@ -0,0 +1,66 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Elevation API usage. Simple queries are performed. + */ + +import { getDefaultAzureCredential } from "@azure/identity"; +import * as coreAuth from "@azure/core-auth"; +import * as coreClient from "@azure/core-client"; +import { GeolocationClient } from "@azure/maps-geolocation"; +import * as dotenv from "dotenv"; +dotenv.config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential implements coreAuth.TokenCredential { + async getToken( + _scopes: string | string[], + _options?: coreAuth.GetTokenOptions + ): Promise { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential: coreAuth.TokenCredential; + let operationOptions: coreClient.OperationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = getDefaultAzureCredential(); + } + + const geolocation = new GeolocationClient(credential).geolocation; + + const ipAddressToTest = "8.8.8.8"; + + console.log(" --- Get IP to location:"); + console.log(await geolocation.getIPToLocationPreview("json", ipAddressToTest, operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-geolocation/samples/v1/typescript/tsconfig.json b/sdk/maps/maps-geolocation/samples/v1/typescript/tsconfig.json new file mode 100644 index 000000000000..416c2dd82e00 --- /dev/null +++ b/sdk/maps/maps-geolocation/samples/v1/typescript/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2018", + "module": "commonjs", + "moduleResolution": "node", + "resolveJsonModule": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "alwaysStrict": true, + "outDir": "dist", + "rootDir": "src" + }, + "include": [ + "src/**.ts" + ] +} diff --git a/sdk/maps/maps-geolocation/src/geolocationClient.ts b/sdk/maps/maps-geolocation/src/geolocationClient.ts new file mode 100644 index 000000000000..336ca08d7f8c --- /dev/null +++ b/sdk/maps/maps-geolocation/src/geolocationClient.ts @@ -0,0 +1,30 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreAuth from "@azure/core-auth"; +import { GeolocationImpl } from "./operations"; +import { Geolocation } from "./operationsInterfaces"; +import { GeolocationClientContext } from "./geolocationClientContext"; +import { GeolocationClientOptionalParams } from "./models"; + +export class GeolocationClient extends GeolocationClientContext { + /** + * Initializes a new instance of the GeolocationClient class. + * @param credentials Subscription credentials which uniquely identify client subscription. + * @param options The parameter options + */ + constructor( + credentials: coreAuth.TokenCredential, + options?: GeolocationClientOptionalParams + ) { + super(credentials, options); + this.geolocation = new GeolocationImpl(this); + } + + geolocation: Geolocation; +} diff --git a/sdk/maps/maps-geolocation/src/geolocationClientContext.ts b/sdk/maps/maps-geolocation/src/geolocationClientContext.ts new file mode 100644 index 000000000000..726b8fc617c8 --- /dev/null +++ b/sdk/maps/maps-geolocation/src/geolocationClientContext.ts @@ -0,0 +1,63 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; +import * as coreAuth from "@azure/core-auth"; +import { Geography, GeolocationClientOptionalParams } from "./models"; + +export class GeolocationClientContext extends coreClient.ServiceClient { + geography: Geography; + xMsClientId?: string; + apiVersion: string; + + /** + * Initializes a new instance of the GeolocationClientContext class. + * @param credentials Subscription credentials which uniquely identify client subscription. + * @param options The parameter options + */ + constructor( + credentials: coreAuth.TokenCredential, + options?: GeolocationClientOptionalParams + ) { + if (credentials === undefined) { + throw new Error("'credentials' cannot be null"); + } + + // Initializing default values for options + if (!options) { + options = {}; + } + const defaults: GeolocationClientOptionalParams = { + requestContentType: "application/json; charset=utf-8", + credential: credentials + }; + + const packageDetails = `azsdk-js-maps-geolocation/1.0.0-beta.1`; + const userAgentPrefix = + options.userAgentOptions && options.userAgentOptions.userAgentPrefix + ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` + : `${packageDetails}`; + + if (!options.credentialScopes) { + options.credentialScopes = ["https://atlas.microsoft.com/.default"]; + } + const optionsWithDefaults = { + ...defaults, + ...options, + userAgentOptions: { + userAgentPrefix + }, + baseUri: options.endpoint || "https://{geography}.atlas.microsoft.com" + }; + super(optionsWithDefaults); + + // Assigning values to Constant parameters + this.geography = options.geography || "us"; + this.apiVersion = options.apiVersion || "1.0"; + } +} diff --git a/sdk/maps/maps-geolocation/src/index.ts b/sdk/maps/maps-geolocation/src/index.ts new file mode 100644 index 000000000000..9fd9f4ff8f7e --- /dev/null +++ b/sdk/maps/maps-geolocation/src/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./models"; +export { GeolocationClient } from "./geolocationClient"; +export { GeolocationClientContext } from "./geolocationClientContext"; +export * from "./operationsInterfaces"; diff --git a/sdk/maps/maps-geolocation/src/models/index.ts b/sdk/maps/maps-geolocation/src/models/index.ts new file mode 100644 index 000000000000..558b97c0cd3b --- /dev/null +++ b/sdk/maps/maps-geolocation/src/models/index.ts @@ -0,0 +1,150 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; + +/** This object is returned from a successful call to IP Address to country/region API */ +export interface IpAddressToLocationResult { + /** + * The object containing the country/region information. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly countryRegion?: CountryRegion; + /** + * The IP Address of the request. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly ipAddress?: string; +} + +/** The object containing the country/region information. */ +export interface CountryRegion { + /** + * The IP Address's 2-character code [(ISO 3166-1)](https://www.iso.org/iso-3166-country-codes.html) of the country or region as assigned by IANA and regional internet authorities. Please note, IP address in ranges reserved for special purpose will return Null for country/region. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly isoCode?: string; +} + +/** Common error response for all Azure Resource Manager APIs to return error details for failed operations. (This also follows the OData error response format.). */ +export interface ErrorResponse { + /** The error object. */ + error?: ErrorDetail; +} + +/** The error detail. */ +export interface ErrorDetail { + /** + * The error code. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly code?: string; + /** + * The error message. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly message?: string; + /** + * The error target. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly target?: string; + /** + * The error details. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly details?: ErrorDetail[]; + /** + * The error additional info. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly additionalInfo?: ErrorAdditionalInfo[]; +} + +/** The resource management error additional info. */ +export interface ErrorAdditionalInfo { + /** + * The additional info type. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly type?: string; + /** + * The additional info. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly info?: Record; +} + +/** Known values of {@link Geography} that the service accepts. */ +export const enum KnownGeography { + Us = "us", + Eu = "eu" +} + +/** + * Defines values for Geography. \ + * {@link KnownGeography} can be used interchangeably with Geography, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **us** \ + * **eu** + */ +export type Geography = string; + +/** Known values of {@link ResponseFormat} that the service accepts. */ +export const enum KnownResponseFormat { + /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ + Json = "json" +} + +/** + * Defines values for ResponseFormat. \ + * {@link KnownResponseFormat} can be used interchangeably with ResponseFormat, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) + */ +export type ResponseFormat = string; + +/** Known values of {@link GeographicResourceLocation} that the service accepts. */ +export const enum KnownGeographicResourceLocation { + /** Used to access an Azure Maps Creator resource in the United States */ + Us = "us", + /** Used to access an Azure Maps Creator resource in Europe */ + Eu = "eu" +} + +/** + * Defines values for GeographicResourceLocation. \ + * {@link KnownGeographicResourceLocation} can be used interchangeably with GeographicResourceLocation, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **us**: Used to access an Azure Maps Creator resource in the United States \ + * **eu**: Used to access an Azure Maps Creator resource in Europe + */ +export type GeographicResourceLocation = string; + +/** Optional parameters. */ +export interface GeolocationGetIPToLocationPreviewOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getIPToLocationPreview operation. */ +export type GeolocationGetIPToLocationPreviewResponse = IpAddressToLocationResult; + +/** Optional parameters. */ +export interface GeolocationClientOptionalParams + extends coreClient.ServiceClientOptions { + /** This parameter specifies where the Azure Maps Creator resource is located. Valid values are us and eu. */ + geography?: Geography; + /** Specifies which account is intended for usage in conjunction with the Azure AD security model. It represents a unique ID for the Azure Maps account and can be retrieved from the Azure Maps management plane Account API. To use Azure AD security in Azure Maps see the following [articles](https://aka.ms/amauthdetails) for guidance. */ + xMsClientId?: string; + /** Api Version */ + apiVersion?: string; + /** Overrides client endpoint. */ + endpoint?: string; +} diff --git a/sdk/maps/maps-geolocation/src/models/mappers.ts b/sdk/maps/maps-geolocation/src/models/mappers.ts new file mode 100644 index 000000000000..8f71f8b6a591 --- /dev/null +++ b/sdk/maps/maps-geolocation/src/models/mappers.ts @@ -0,0 +1,144 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; + +export const IpAddressToLocationResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "IpAddressToLocationResult", + modelProperties: { + countryRegion: { + serializedName: "countryRegion", + type: { + name: "Composite", + className: "CountryRegion" + } + }, + ipAddress: { + serializedName: "ipAddress", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const CountryRegion: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "CountryRegion", + modelProperties: { + isoCode: { + serializedName: "isoCode", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const ErrorResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorResponse", + modelProperties: { + error: { + serializedName: "error", + type: { + name: "Composite", + className: "ErrorDetail" + } + } + } + } +}; + +export const ErrorDetail: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorDetail", + modelProperties: { + code: { + serializedName: "code", + readOnly: true, + type: { + name: "String" + } + }, + message: { + serializedName: "message", + readOnly: true, + type: { + name: "String" + } + }, + target: { + serializedName: "target", + readOnly: true, + type: { + name: "String" + } + }, + details: { + serializedName: "details", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ErrorDetail" + } + } + } + }, + additionalInfo: { + serializedName: "additionalInfo", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ErrorAdditionalInfo" + } + } + } + } + } + } +}; + +export const ErrorAdditionalInfo: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorAdditionalInfo", + modelProperties: { + type: { + serializedName: "type", + readOnly: true, + type: { + name: "String" + } + }, + info: { + serializedName: "info", + readOnly: true, + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } + } + } +}; diff --git a/sdk/maps/maps-geolocation/src/models/parameters.ts b/sdk/maps/maps-geolocation/src/models/parameters.ts new file mode 100644 index 000000000000..8552925ef08d --- /dev/null +++ b/sdk/maps/maps-geolocation/src/models/parameters.ts @@ -0,0 +1,80 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { + OperationParameter, + OperationURLParameter, + OperationQueryParameter +} from "@azure/core-client"; + +export const accept: OperationParameter = { + parameterPath: "accept", + mapper: { + defaultValue: "application/json", + isConstant: true, + serializedName: "Accept", + type: { + name: "String" + } + } +}; + +export const geography: OperationURLParameter = { + parameterPath: "geography", + mapper: { + serializedName: "geography", + required: true, + type: { + name: "String" + } + } +}; + +export const xMsClientId: OperationParameter = { + parameterPath: "xMsClientId", + mapper: { + serializedName: "x-ms-client-id", + type: { + name: "String" + } + } +}; + +export const apiVersion: OperationQueryParameter = { + parameterPath: "apiVersion", + mapper: { + defaultValue: "1.0", + isConstant: true, + serializedName: "api-version", + type: { + name: "String" + } + } +}; + +export const format: OperationURLParameter = { + parameterPath: "format", + mapper: { + serializedName: "format", + required: true, + type: { + name: "String" + } + } +}; + +export const ip: OperationQueryParameter = { + parameterPath: "ip", + mapper: { + serializedName: "ip", + required: true, + type: { + name: "String" + } + } +}; diff --git a/sdk/maps/maps-geolocation/src/operations/geolocation.ts b/sdk/maps/maps-geolocation/src/operations/geolocation.ts new file mode 100644 index 000000000000..9eaac1f1a12d --- /dev/null +++ b/sdk/maps/maps-geolocation/src/operations/geolocation.ts @@ -0,0 +1,76 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { Geolocation } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; +import * as Mappers from "../models/mappers"; +import * as Parameters from "../models/parameters"; +import { GeolocationClientContext } from "../geolocationClientContext"; +import { + ResponseFormat, + GeolocationGetIPToLocationPreviewOptionalParams, + GeolocationGetIPToLocationPreviewResponse +} from "../models"; + +/** Class representing a Geolocation. */ +export class GeolocationImpl implements Geolocation { + private readonly client: GeolocationClientContext; + + /** + * Initialize a new instance of the class Geolocation class. + * @param client Reference to the service client + */ + constructor(client: GeolocationClientContext) { + this.client = client; + } + + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * This service will return the ISO country code for the provided IP address. Developers can use this + * information to block or alter certain content based on geographical locations where the application + * is being viewed from. + * + * + * __Note:__ This service returns results from IANA and does not necessarily reflect the views of + * Microsoft Corporation. + * @param format Desired format of the response. Only `json` format is supported. + * @param ip The IP address. Both IPv4 and IPv6 are allowed. + * @param options The options parameters. + */ + getIPToLocationPreview( + format: ResponseFormat, + ip: string, + options?: GeolocationGetIPToLocationPreviewOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, ip, options }, + getIPToLocationPreviewOperationSpec + ); + } +} +// Operation Specifications +const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); + +const getIPToLocationPreviewOperationSpec: coreClient.OperationSpec = { + path: "/geolocation/ip/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.IpAddressToLocationResult + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion, Parameters.ip], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; diff --git a/sdk/maps/maps-geolocation/src/operations/index.ts b/sdk/maps/maps-geolocation/src/operations/index.ts new file mode 100644 index 000000000000..4dccaaa8afdc --- /dev/null +++ b/sdk/maps/maps-geolocation/src/operations/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./geolocation"; diff --git a/sdk/maps/maps-geolocation/src/operationsInterfaces/geolocation.ts b/sdk/maps/maps-geolocation/src/operationsInterfaces/geolocation.ts new file mode 100644 index 000000000000..acbc4fdb1316 --- /dev/null +++ b/sdk/maps/maps-geolocation/src/operationsInterfaces/geolocation.ts @@ -0,0 +1,37 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { + ResponseFormat, + GeolocationGetIPToLocationPreviewOptionalParams, + GeolocationGetIPToLocationPreviewResponse +} from "../models"; + +/** Interface representing a Geolocation. */ +export interface Geolocation { + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * This service will return the ISO country code for the provided IP address. Developers can use this + * information to block or alter certain content based on geographical locations where the application + * is being viewed from. + * + * + * __Note:__ This service returns results from IANA and does not necessarily reflect the views of + * Microsoft Corporation. + * @param format Desired format of the response. Only `json` format is supported. + * @param ip The IP address. Both IPv4 and IPv6 are allowed. + * @param options The options parameters. + */ + getIPToLocationPreview( + format: ResponseFormat, + ip: string, + options?: GeolocationGetIPToLocationPreviewOptionalParams + ): Promise; +} diff --git a/sdk/maps/maps-geolocation/src/operationsInterfaces/index.ts b/sdk/maps/maps-geolocation/src/operationsInterfaces/index.ts new file mode 100644 index 000000000000..4dccaaa8afdc --- /dev/null +++ b/sdk/maps/maps-geolocation/src/operationsInterfaces/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./geolocation"; diff --git a/sdk/maps/maps-geolocation/tsconfig.json b/sdk/maps/maps-geolocation/tsconfig.json new file mode 100644 index 000000000000..0ec8659c8e83 --- /dev/null +++ b/sdk/maps/maps-geolocation/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "module": "es6", + "moduleResolution": "node", + "strict": true, + "target": "es6", + "sourceMap": true, + "declarationMap": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "preserveConstEnums": true, + "lib": ["es6", "dom"], + "declaration": true, + "outDir": "./esm", + "importHelpers": true + }, + "include": ["./src/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/sdk/maps/maps-render/LICENSE.txt b/sdk/maps/maps-render/LICENSE.txt new file mode 100644 index 000000000000..ccb63b166732 --- /dev/null +++ b/sdk/maps/maps-render/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2021 Microsoft + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/sdk/maps/maps-render/README.md b/sdk/maps/maps-render/README.md new file mode 100644 index 000000000000..dd2805820295 --- /dev/null +++ b/sdk/maps/maps-render/README.md @@ -0,0 +1,91 @@ +# Azure Render client library for JavaScript + +This package contains an isomorphic SDK (runs both in Node.js and in browsers) for Azure Render client. + +Azure Maps Render REST APIs + +[Source code](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-render) | +[Package (NPM)](https://www.npmjs.com/package/@azure/maps-render) | +[API reference documentation](https://docs.microsoft.com/javascript/api/@azure/maps-render) | +[Samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-render/samples) + +## Getting started + +### Currently supported environments + +- [LTS versions of Node.js](https://nodejs.org/about/releases/) +- Latest versions of Safari, Chrome, Edge and Firefox. + +### Prerequisites + +- An [Azure subscription][azure_sub]. + +### Install the `@azure/maps-render` package + +Install the Azure Render client library for JavaScript with `npm`: + +```bash +npm install @azure/maps-render +``` + +### Create and authenticate a `RenderClient` + +To create a client object to access the Azure Render API, you will need the `endpoint` of your Azure Render resource and a `credential`. The Azure Render client can use Azure Active Directory credentials to authenticate. +You can find the endpoint for your Azure Render resource in the [Azure Portal][azure_portal]. + +#### Using an Azure Active Directory Credential + +You can authenticate with Azure Active Directory using the [Azure Identity library][azure_identity]. To use the [DefaultAzureCredential][defaultazurecredential] provider shown below, or other credential providers provided with the Azure SDK, please install the `@azure/identity` package: + +```bash +npm install @azure/identity +``` + +You will also need to register a new AAD application and grant access to Azure Render by assigning the suitable role to your service principal (note: roles such as `"Owner"` will not grant the necessary permissions). +Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`. + +```javascript +const { RenderClient } = require("@azure/maps-render"); +const { DefaultAzureCredential } = require("@azure/identity"); +const client = new RenderClient("", new DefaultAzureCredential()); +``` + +## Key concepts + +### RenderClient + +`RenderClient` is the primary interface for developers using the Azure Render client library. Explore the methods on this client object to understand the different features of the Azure Render service that you can access. + +## Troubleshooting + +### Logging + +Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: + +```javascript +import { setLogLevel } from "@azure/logger"; +setLogLevel("info"); +``` + +For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger). + +## Next steps + +Please take a look at the [samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-render/samples) directory for detailed examples on how to use this library. + +## Contributing + +If you'd like to contribute to this library, please read the [contributing guide](https://github.com/Azure/azure-sdk-for-js/blob/master/CONTRIBUTING.md) to learn more about how to build and test the code. + +## Related projects + +- [Microsoft Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) + +![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fmaps%2Fmaps-render%2FREADME.png) + +[azure_cli]: https://docs.microsoft.com/cli/azure +[azure_sub]: https://azure.microsoft.com/free/ +[azure_sub]: https://azure.microsoft.com/free/ +[azure_portal]: https://portal.azure.com +[azure_identity]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity +[defaultazurecredential]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity#defaultazurecredential diff --git a/sdk/maps/maps-render/api-extractor.json b/sdk/maps/maps-render/api-extractor.json new file mode 100644 index 000000000000..5fb5b21b56f2 --- /dev/null +++ b/sdk/maps/maps-render/api-extractor.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "mainEntryPointFilePath": "./esm/index.d.ts", + "docModel": { "enabled": true }, + "apiReport": { "enabled": true, "reportFolder": "./review" }, + "dtsRollup": { + "enabled": true, + "untrimmedFilePath": "", + "publicTrimmedFilePath": "./esm/index.d.ts" + }, + "messages": { + "tsdocMessageReporting": { "default": { "logLevel": "none" } }, + "extractorMessageReporting": { + "ae-missing-release-tag": { "logLevel": "none" }, + "ae-unresolved-link": { "logLevel": "none" } + } + } +} diff --git a/sdk/maps/maps-render/package.json b/sdk/maps/maps-render/package.json new file mode 100644 index 000000000000..dc3145b55e41 --- /dev/null +++ b/sdk/maps/maps-render/package.json @@ -0,0 +1,84 @@ +{ + "name": "@azure/maps-render", + "sdk-type": "client", + "author": "Microsoft Corporation", + "description": "A generated SDK for RenderClient.", + "version": "1.0.0-beta.1", + "engines": { "node": ">=12.0.0" }, + "dependencies": { + "@azure/core-client": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-rest-pipeline": "^1.1.0", + "tslib": "^2.2.0" + }, + "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], + "license": "MIT", + "main": "./dist/index.js", + "module": "./esm/index.js", + "types": "./esm/index.d.ts", + "devDependencies": { + "@microsoft/api-extractor": "7.7.11", + "@rollup/plugin-commonjs": "11.0.2", + "@rollup/plugin-json": "^4.0.0", + "@rollup/plugin-multi-entry": "^3.0.0", + "@rollup/plugin-node-resolve": "^8.0.0", + "mkdirp": "^1.0.4", + "rollup": "^1.16.3", + "rollup-plugin-sourcemaps": "^0.4.2", + "rollup-plugin-node-resolve": "^3.4.0", + "typescript": "~4.2.0", + "uglify-js": "^3.4.9" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js", + "repository": { + "type": "git", + "url": "https://github.com/Azure/azure-sdk-for-js.git" + }, + "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, + "files": [ + "dist/**/*.js", + "dist/**/*.js.map", + "dist/**/*.d.ts", + "dist/**/*.d.ts.map", + "esm/**/*.js", + "esm/**/*.js.map", + "esm/**/*.d.ts", + "esm/**/*.d.ts.map", + "src/**/*.ts", + "README.md", + "rollup.config.js", + "tsconfig.json", + "review/*", + "CHANGELOG.md" + ], + "scripts": { + "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", + "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js", + "prepack": "npm install && npm run build", + "pack": "npm pack 2>&1", + "extract-api": "mkdirp ./review && api-extractor run --local", + "lint": "echo skipped", + "audit": "echo skipped", + "clean": "echo skipped", + "build:node": "echo skipped", + "build:browser": "echo skipped", + "build:test": "echo skipped", + "build:samples": "echo skipped.", + "check-format": "echo skipped", + "execute:samples": "echo skipped", + "format": "echo skipped", + "test": "echo skipped", + "prebuild": "echo skipped", + "test:node": "echo skipped", + "test:browser": "echo skipped", + "unit-test": "echo skipped", + "unit-test:node": "echo skipped", + "unit-test:browser": "echo skipped", + "integration-test:browser": "echo skipped", + "integration-test:node": "echo skipped", + "integration-test": "echo skipped", + "docs": "echo skipped" + }, + "sideEffects": false, + "autoPublish": true +} diff --git a/sdk/maps/maps-render/review/maps-render.api.md b/sdk/maps/maps-render/review/maps-render.api.md new file mode 100644 index 000000000000..0ffe46397a10 --- /dev/null +++ b/sdk/maps/maps-render/review/maps-render.api.md @@ -0,0 +1,378 @@ +## API Report File for "@azure/maps-render" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import * as coreAuth from '@azure/core-auth'; +import * as coreClient from '@azure/core-client'; + +// @public +export interface ErrorAdditionalInfo { + readonly info?: Record; + readonly type?: string; +} + +// @public +export interface ErrorDetail { + readonly additionalInfo?: ErrorAdditionalInfo[]; + readonly code?: string; + readonly details?: ErrorDetail[]; + readonly message?: string; + readonly target?: string; +} + +// @public +export interface ErrorResponse { + error?: ErrorDetail; +} + +// @public +export type GeographicResourceLocation = string; + +// @public +export type Geography = string; + +// @public +export interface GetCopyrightCaptionResult { + readonly copyrightsCaption?: string; + readonly formatVersion?: string; +} + +// @public +export interface GetCopyrightForTileResult { + readonly formatVersion?: string; + readonly generalCopyrights?: string[]; + readonly regions?: RegionCopyrights[]; +} + +// @public +export interface GetCopyrightForWorldResult { + readonly formatVersion?: string; + readonly generalCopyrights?: string[]; + readonly regions?: RegionCopyrights[]; +} + +// @public +export interface GetCopyrightFromBoundingBoxResult { + readonly formatVersion?: string; + readonly generalCopyrights?: string[]; + readonly regions?: RegionCopyrights[]; +} + +// @public +export type IncludeText = string; + +// @public +export const enum KnownGeographicResourceLocation { + Eu = "eu", + Us = "us" +} + +// @public +export const enum KnownGeography { + // (undocumented) + Eu = "eu", + // (undocumented) + Us = "us" +} + +// @public +export const enum KnownIncludeText { + No = "no", + Yes = "yes" +} + +// @public +export const enum KnownMapImageryStyle { + Satellite = "satellite" +} + +// @public +export const enum KnownMapImageStyle { + Dark = "dark", + Main = "main" +} + +// @public +export const enum KnownMapTileLayer { + Basic = "basic", + Hybrid = "hybrid", + Labels = "labels", + Terra = "terra" +} + +// @public +export const enum KnownMapTileSize { + FiveHundredTwelve = "512", + TwoHundredFiftySix = "256" +} + +// @public +export const enum KnownMapTileStyle { + Dark = "dark", + Main = "main", + ShadedRelief = "shaded_relief" +} + +// @public +export const enum KnownRasterTileFormat { + Png = "png" +} + +// @public +export const enum KnownStaticMapLayer { + Basic = "basic", + Hybrid = "hybrid", + Labels = "labels" +} + +// @public +export const enum KnownTextFormat { + Json = "json", + Xml = "xml" +} + +// @public +export const enum KnownTileFormat { + Pbf = "pbf", + Png = "png" +} + +// @public +export const enum KnownTilesetID { + MicrosoftBase = "microsoft.base", + MicrosoftBaseDarkgrey = "microsoft.base.darkgrey", + MicrosoftBaseHybrid = "microsoft.base.hybrid", + MicrosoftBaseHybridRoad = "microsoft.base.hybrid.road", + MicrosoftBaseLabels = "microsoft.base.labels", + MicrosoftBaseLabelsRoad = "microsoft.base.labels.road", + MicrosoftBaseRoad = "microsoft.base.road", + MicrosoftDem = "microsoft.dem", + MicrosoftImagery = "microsoft.imagery", + MicrosoftTerraMain = "microsoft.terra.main", + MicrosoftWeatherInfraredMain = "microsoft.weather.infrared.main", + MicrosoftWeatherRadarMain = "microsoft.weather.radar.main" +} + +// @public +export const enum KnownTileSize { + FiveHundredTwelve = "512", + TwoHundredFiftySix = "256" +} + +// @public +export type MapImageryStyle = string; + +// @public +export type MapImageStyle = string; + +// @public +export type MapTileLayer = string; + +// @public +export type MapTileSize = string; + +// @public +export type MapTileStyle = string; + +// @public +export type RasterTileFormat = string; + +// @public (undocumented) +export interface RegionCopyrights { + readonly copyrights?: string[]; + readonly country?: RegionCopyrightsCountry; +} + +// @public +export interface RegionCopyrightsCountry { + readonly iso3?: string; + readonly label?: string; +} + +// @public +export interface Render { + getCopyrightCaption(format: TextFormat, options?: RenderGetCopyrightCaptionOptionalParams): Promise; + getCopyrightForTile(format: TextFormat, zoom: number, xTileIndex: number, yTileIndex: number, options?: RenderGetCopyrightForTileOptionalParams): Promise; + getCopyrightForWorld(format: TextFormat, options?: RenderGetCopyrightForWorldOptionalParams): Promise; + getCopyrightFromBoundingBox(format: TextFormat, mincoordinates: string, maxcoordinates: string, options?: RenderGetCopyrightFromBoundingBoxOptionalParams): Promise; + getMapImageryTile(format: RasterTileFormat, style: MapImageryStyle, zoom: number, xTileIndex: number, yTileIndex: number, options?: RenderGetMapImageryTileOptionalParams): Promise; + getMapStateTilePreview(zoom: number, xTileIndex: number, yTileIndex: number, statesetId: string, options?: RenderGetMapStateTilePreviewOptionalParams): Promise; + getMapStaticImage(format: RasterTileFormat, options?: RenderGetMapStaticImageOptionalParams): Promise; + getMapTile(format: TileFormat, layer: MapTileLayer, style: MapTileStyle, zoom: number, xTileIndex: number, yTileIndex: number, options?: RenderGetMapTileOptionalParams): Promise; +} + +// @public (undocumented) +export class RenderClient extends RenderClientContext { + constructor(credentials: coreAuth.TokenCredential, options?: RenderClientOptionalParams); + // (undocumented) + render: Render; + // (undocumented) + renderV2: RenderV2; +} + +// @public (undocumented) +export class RenderClientContext extends coreClient.ServiceClient { + constructor(credentials: coreAuth.TokenCredential, options?: RenderClientOptionalParams); + // (undocumented) + geography: Geography; + // (undocumented) + xMsClientId?: string; +} + +// @public +export interface RenderClientOptionalParams extends coreClient.ServiceClientOptions { + endpoint?: string; + geography?: Geography; + xMsClientId?: string; +} + +// @public +export interface RenderGetCopyrightCaptionOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type RenderGetCopyrightCaptionResponse = GetCopyrightCaptionResult; + +// @public +export interface RenderGetCopyrightForTileOptionalParams extends coreClient.OperationOptions { + text?: IncludeText; +} + +// @public +export type RenderGetCopyrightForTileResponse = GetCopyrightForTileResult; + +// @public +export interface RenderGetCopyrightForWorldOptionalParams extends coreClient.OperationOptions { + text?: IncludeText; +} + +// @public +export type RenderGetCopyrightForWorldResponse = GetCopyrightForWorldResult; + +// @public +export interface RenderGetCopyrightFromBoundingBoxOptionalParams extends coreClient.OperationOptions { + text?: IncludeText; +} + +// @public +export type RenderGetCopyrightFromBoundingBoxResponse = GetCopyrightFromBoundingBoxResult; + +// @public +export interface RenderGetMapImageryTileHeaders { + contentType?: string; +} + +// @public +export interface RenderGetMapImageryTileOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type RenderGetMapImageryTileResponse = RenderGetMapImageryTileHeaders & { + blobBody?: Promise; + readableStreamBody?: NodeJS.ReadableStream; +}; + +// @public +export interface RenderGetMapStateTilePreviewHeaders { + contentType?: string; +} + +// @public +export interface RenderGetMapStateTilePreviewOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type RenderGetMapStateTilePreviewResponse = RenderGetMapStateTilePreviewHeaders & { + blobBody?: Promise; + readableStreamBody?: NodeJS.ReadableStream; +}; + +// @public +export interface RenderGetMapStaticImageHeaders { + contentType?: string; +} + +// @public +export interface RenderGetMapStaticImageOptionalParams extends coreClient.OperationOptions { + bbox?: string; + center?: string; + height?: number; + language?: string; + layer?: StaticMapLayer; + path?: string[]; + pins?: string[]; + style?: MapImageStyle; + view?: string; + width?: number; + zoom?: number; +} + +// @public +export type RenderGetMapStaticImageResponse = RenderGetMapStaticImageHeaders & { + blobBody?: Promise; + readableStreamBody?: NodeJS.ReadableStream; +}; + +// @public +export interface RenderGetMapTileHeaders { + contentType?: string; +} + +// @public +export interface RenderGetMapTileOptionalParams extends coreClient.OperationOptions { + language?: string; + tileSize?: MapTileSize; + view?: string; +} + +// @public +export type RenderGetMapTileResponse = RenderGetMapTileHeaders & { + blobBody?: Promise; + readableStreamBody?: NodeJS.ReadableStream; +}; + +// @public +export interface RenderV2 { + getMapTilePreview(tilesetId: TilesetID, zoom: number, xTileIndex: number, yTileIndex: number, options?: RenderV2GetMapTilePreviewOptionalParams): Promise; +} + +// @public +export interface RenderV2GetMapTilePreviewHeaders { + contentType?: string; +} + +// @public +export interface RenderV2GetMapTilePreviewOptionalParams extends coreClient.OperationOptions { + language?: string; + tileSize?: TileSize; + timeStamp?: string; + view?: string; +} + +// @public +export type RenderV2GetMapTilePreviewResponse = RenderV2GetMapTilePreviewHeaders & { + blobBody?: Promise; + readableStreamBody?: NodeJS.ReadableStream; +}; + +// @public +export type StaticMapLayer = string; + +// @public +export type TextFormat = string; + +// @public +export type TileFormat = string; + +// @public +export type TilesetID = string; + +// @public +export type TileSize = string; + + +// (No @packageDocumentation comment for this package) + +``` diff --git a/sdk/maps/maps-render/rollup.config.js b/sdk/maps/maps-render/rollup.config.js new file mode 100644 index 000000000000..9be1955eb7f1 --- /dev/null +++ b/sdk/maps/maps-render/rollup.config.js @@ -0,0 +1,188 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import nodeResolve from "@rollup/plugin-node-resolve"; +import cjs from "@rollup/plugin-commonjs"; +import sourcemaps from "rollup-plugin-sourcemaps"; +import multiEntry from "@rollup/plugin-multi-entry"; +import json from "@rollup/plugin-json"; + +import nodeBuiltins from "builtin-modules"; + +/** + * Gets the proper configuration needed for rollup's commonJS plugin for @opentelemetry/api. + * + * NOTE: this manual configuration is only needed because OpenTelemetry uses an + * __exportStar downleveled helper function to declare its exports which confuses + * rollup's automatic discovery mechanism. + * + * @returns an object reference that can be `...`'d into your cjs() configuration. + */ +export function openTelemetryCommonJs() { + const namedExports = {}; + + for (const key of [ + "@opentelemetry/api", + "@azure/core-tracing/node_modules/@opentelemetry/api" + ]) { + namedExports[key] = [ + "SpanKind", + "TraceFlags", + "getSpan", + "setSpan", + "SpanStatusCode", + "getSpanContext", + "setSpanContext" + ]; + } + + const releasedOpenTelemetryVersions = ["0.10.2", "1.0.0-rc.0"]; + + for (const version of releasedOpenTelemetryVersions) { + namedExports[ + // working around a limitation in the rollup common.js plugin - it's not able to resolve these modules so the named exports listed above will not get applied. We have to drill down to the actual path. + `../../../common/temp/node_modules/.pnpm/@opentelemetry/api@${version}/node_modules/@opentelemetry/api/build/src/index.js` + ] = [ + "SpanKind", + "TraceFlags", + "getSpan", + "setSpan", + "StatusCode", + "CanonicalCode", + "getSpanContext", + "setSpanContext" + ]; + } + + return namedExports; +} + +// #region Warning Handler + +/** + * A function that can determine whether a rollupwarning should be ignored. If + * the function returns `true`, then the warning will not be displayed. + */ + +function ignoreNiseSinonEvalWarnings(warning) { + return ( + warning.code === "EVAL" && + warning.id && + (warning.id.includes("node_modules/nise") || + warning.id.includes("node_modules/sinon")) === true + ); +} + +function ignoreChaiCircularDependencyWarnings(warning) { + return ( + warning.code === "CIRCULAR_DEPENDENCY" && + warning.importer && warning.importer.includes("node_modules/chai") === true + ); +} + +const warningInhibitors = [ + ignoreChaiCircularDependencyWarnings, + ignoreNiseSinonEvalWarnings +]; + +/** + * Construct a warning handler for the shared rollup configuration + * that ignores certain warnings that are not relevant to testing. + */ +function makeOnWarnForTesting() { + return (warning, warn) => { + // If every inhibitor returns false (i.e. no inhibitors), then show the warning + if (warningInhibitors.every((inhib) => !inhib(warning))) { + warn(warning); + } + }; +} + +// #endregion + +function makeBrowserTestConfig() { + const config = { + input: { + include: ["dist-esm/test/**/*.spec.js"], + exclude: ["dist-esm/test/**/node/**"] + }, + output: { + file: `dist-test/index.browser.js`, + format: "umd", + sourcemap: true + }, + preserveSymlinks: false, + plugins: [ + multiEntry({ exports: false }), + nodeResolve({ + mainFields: ["module", "browser"] + }), + cjs({ + namedExports: { + // Chai's strange internal architecture makes it impossible to statically + // analyze its exports. + chai: [ + "version", + "use", + "util", + "config", + "expect", + "should", + "assert" + ], + ...openTelemetryCommonJs() + } + }), + json(), + sourcemaps() + //viz({ filename: "dist-test/browser-stats.html", sourcemap: true }) + ], + onwarn: makeOnWarnForTesting(), + // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, + // rollup started respecting the "sideEffects" field in package.json. Since + // our package.json sets "sideEffects=false", this also applies to test + // code, which causes all tests to be removed by tree-shaking. + treeshake: false + }; + + return config; +} + +const defaultConfigurationOptions = { + disableBrowserBundle: false +}; + +export function makeConfig(pkg, options) { + options = { + ...defaultConfigurationOptions, + ...(options || {}) + }; + + const baseConfig = { + // Use the package's module field if it has one + input: pkg["module"] || "dist-esm/src/index.js", + external: [ + ...nodeBuiltins, + ...Object.keys(pkg.dependencies), + ...Object.keys(pkg.devDependencies) + ], + output: { file: "dist/index.js", format: "cjs", sourcemap: true }, + preserveSymlinks: false, + plugins: [sourcemaps(), nodeResolve(), cjs()] + }; + + const config = [baseConfig]; + + if (!options.disableBrowserBundle) { + config.push(makeBrowserTestConfig()); + } + + return config; +} + +export default makeConfig(require("./package.json")); diff --git a/sdk/maps/maps-render/samples/v1/javascript/README.md b/sdk/maps/maps-render/samples/v1/javascript/README.md new file mode 100644 index 000000000000..d23f7833ac05 --- /dev/null +++ b/sdk/maps/maps-render/samples/v1/javascript/README.md @@ -0,0 +1,54 @@ +--- +page_type: sample +languages: + - javascript +products: + - azure +urlFragment: maps-render-javascript +--- + +# Azure Maps Render client library samples for JavaScript + +These sample programs show how to use the JavaScript client libraries for Azure Maps Render in some common scenarios. + +| **File Name** | **Description** | +| ------------------- | ------------------------------ | +| [render.js][render] | Gets data for rendering tiles. | + +## Prerequisites + +The sample programs are compatible with Node.js >=12.0.0. + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +3. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node render.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx cross-env MAPS_SUBSCRIPTION_KEY="" node render.js +``` + +[render]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-render/samples/v1/javascript/src/render.js +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-render/README.md diff --git a/sdk/maps/maps-render/samples/v1/javascript/package.json b/sdk/maps/maps-render/samples/v1/javascript/package.json new file mode 100644 index 000000000000..044052382739 --- /dev/null +++ b/sdk/maps/maps-render/samples/v1/javascript/package.json @@ -0,0 +1,28 @@ +{ + "name": "azure-maps-render-samples-js", + "private": true, + "version": "1.0.0", + "description": "Azure Maps Render client library samples for JavaScript", + "engine": { + "node": ">=12.0.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/maps/maps-render" + }, + "keywords": [ + "Azure", + "cloud" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-render", + "dependencies": { + "@azure/maps-render": "next", + "dotenv": "latest" + } +} diff --git a/sdk/maps/maps-render/samples/v1/javascript/render.js b/sdk/maps/maps-render/samples/v1/javascript/render.js new file mode 100644 index 000000000000..dbb4bf156e9f --- /dev/null +++ b/sdk/maps/maps-render/samples/v1/javascript/render.js @@ -0,0 +1,100 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Elevation API usage. Simple CRUD operations are performed. + */ + +const { DefaultAzureCredential } = require("@azure/identity"); +const { RenderClient } = require("@azure/maps-render"); +require("dotenv").config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + let maps = new RenderClient(credential); + const render = maps.render; + const renderV2 = maps.renderV2; + + console.log(" --- Get copyright caption:"); + console.log(await render.getCopyrightCaption("json", operationOptions)); + + console.log(" --- Get copyright for tile:"); + console.log(await render.getCopyrightForTile("json", 6, 9, 22, operationOptions)); + + console.log(" --- Get copyright for world:"); + console.log(await render.getCopyrightForWorld("json", operationOptions)); + + console.log(" --- Get copyright from bounding box:"); + console.log(await render.getCopyrightFromBoundingBox("json", "52.41064,4.84228", "52.41072,4.84239", operationOptions)); + + if (!fs.existsSync("tmp")) + fs.mkdirSync("tmp"); + + console.log(" --- Get map imagery tile:"); + let result = await render.getMapImageryTile("png", "satellite", 6, 10, 22, operationOptions); + // use result.blobBody for Browser, readableStreamBody for Node.js: + result.readableStreamBody?.pipe(fs.createWriteStream("tmp/map_imagery_tile.png")); + + const statesetId = process.env.CREATOR_STATESET_ID; + if ((typeof statesetId === "string") && (statesetId.length == 36)) { + console.log(" --- Get map state tile:"); + result = await render.getMapStateTilePreview(6, 10, 22, statesetId, operationOptions); + // use result.blobBody for Browser, readableStreamBody for Node.js: + result.readableStreamBody?.pipe(fs.createWriteStream("tmp/state_tile.png")); + } + + console.log(" --- Get map static image:"); + result = await render.getMapStaticImage("png", { "layer": "basic", "style": "dark", "zoom": 2, "bbox": "1.355233,42.982261,24.980233,56.526017" }); + // use result.blobBody for Browser, readableStreamBody for Node.js: + result.readableStreamBody?.pipe(fs.createWriteStream("tmp/static_image.png")); + + console.log(" --- Get map tile:"); + result = await render.getMapTile("png", "basic", "main", 6, 10, 22, { "tileSize": "512" }); + // use result.blobBody for Browser, readableStreamBody for Node.js: + result.readableStreamBody?.pipe(fs.createWriteStream("tmp/tile.png")); + + console.log(" --- Get map tile v2:"); + result = await renderV2.getMapTilePreview("microsoft.base", 6, 10, 22, { "tileSize": "512" }); + // use result.blobBody for Browser, readableStreamBody for Node.js: + result.readableStreamBody?.pipe(fs.createWriteStream("tmp/tile_v2.vector.pbf")); + +} + +main(); diff --git a/sdk/maps/maps-render/samples/v1/javascript/sample.env b/sdk/maps/maps-render/samples/v1/javascript/sample.env new file mode 100644 index 000000000000..2259ae4da0ec --- /dev/null +++ b/sdk/maps/maps-render/samples/v1/javascript/sample.env @@ -0,0 +1,7 @@ +# Maps subscription key when using AzureKey authentication +MAPS_SUBSCRIPTION_KEY="" + +# Maps Azure AD authentication +AZURE_CLIENT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_TENANT_ID="" diff --git a/sdk/maps/maps-render/samples/v1/typescript/README.md b/sdk/maps/maps-render/samples/v1/typescript/README.md new file mode 100644 index 000000000000..e5912c669528 --- /dev/null +++ b/sdk/maps/maps-render/samples/v1/typescript/README.md @@ -0,0 +1,67 @@ +--- +page_type: sample +languages: + - typescript +products: + - azure +urlFragment: maps-render-typescript +--- + +# Azure Maps Render client library samples for TypeScript + +These sample programs show how to use the TypeScript client libraries for Azure Maps Render in some common scenarios. + +| **File Name** | **Description** | +| ------------------- | ------------------------------ | +| [render.ts][render] | Gets data for rendering tiles. | + +## Prerequisites + +The sample programs are compatible with Node.js >=12.0.0. + +Before running the samples in Node, they must be compiled to JavaScript using the TypeScript compiler. For more information on TypeScript, see the [TypeScript documentation][typescript]. Install the TypeScript compiler using: + +```bash +npm install -g typescript +``` + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Compile the samples: + +```bash +npm run build +``` + +3. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +4. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node dist/render.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx cross-env MAPS_SUBSCRIPTION_KEY="" node dist/render.js +``` + +[render]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-render/samples/v1/typescript/src/render.ts +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-render/README.md +[typescript]: https://www.typescriptlang.org/docs/home.html diff --git a/sdk/maps/maps-render/samples/v1/typescript/package.json b/sdk/maps/maps-render/samples/v1/typescript/package.json new file mode 100644 index 000000000000..0011cfe3aef1 --- /dev/null +++ b/sdk/maps/maps-render/samples/v1/typescript/package.json @@ -0,0 +1,36 @@ +{ + "name": "azure-maps-render-samples-ts", + "private": true, + "version": "1.0.0", + "description": "Azure Maps Render client library samples for TypeScript", + "engine": { + "node": ">=12.0.0" + }, + "scripts": { + "build": "tsc", + "prebuild": "rimraf dist/" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/maps/maps-render" + }, + "keywords": [ + "Azure", + "cloud" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-render", + "dependencies": { + "@azure/maps-render": "next", + "dotenv": "latest" + }, + "devDependencies": { + "typescript": "~4.2.0", + "rimraf": "latest" + } +} diff --git a/sdk/maps/maps-render/samples/v1/typescript/sample.env b/sdk/maps/maps-render/samples/v1/typescript/sample.env new file mode 100644 index 000000000000..2259ae4da0ec --- /dev/null +++ b/sdk/maps/maps-render/samples/v1/typescript/sample.env @@ -0,0 +1,7 @@ +# Maps subscription key when using AzureKey authentication +MAPS_SUBSCRIPTION_KEY="" + +# Maps Azure AD authentication +AZURE_CLIENT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_TENANT_ID="" diff --git a/sdk/maps/maps-render/samples/v1/typescript/src/render.ts b/sdk/maps/maps-render/samples/v1/typescript/src/render.ts new file mode 100644 index 000000000000..e49b66a3423b --- /dev/null +++ b/sdk/maps/maps-render/samples/v1/typescript/src/render.ts @@ -0,0 +1,107 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Elevation API usage. Simple queries are performed. + */ + +import fs from "fs"; +import { getDefaultAzureCredential } from "@azure/identity"; +import * as coreAuth from "@azure/core-auth"; +import * as coreClient from "@azure/core-client"; +import { RenderClient } from "@azure/maps-render"; +import * as dotenv from "dotenv"; +dotenv.config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential implements coreAuth.TokenCredential { + async getToken( + _scopes: string | string[], + _options?: coreAuth.GetTokenOptions + ): Promise { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential: coreAuth.TokenCredential; + let operationOptions: coreClient.OperationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = getDefaultAzureCredential(); + } + + let maps = new RenderClient(credential); + const render = maps.render; + const renderV2 = maps.renderV2; + + console.log(" --- Get copyright caption:"); + console.log(await render.getCopyrightCaption("json", operationOptions)); + + console.log(" --- Get copyright for tile:"); + console.log(await render.getCopyrightForTile("json", 6, 9, 22, operationOptions)); + + console.log(" --- Get copyright for world:"); + console.log(await render.getCopyrightForWorld("json", operationOptions)); + + console.log(" --- Get copyright from bounding box:"); + console.log(await render.getCopyrightFromBoundingBox("json", "52.41064,4.84228", "52.41072,4.84239", operationOptions)); + + if (!fs.existsSync("tmp")) + fs.mkdirSync("tmp"); + + console.log(" --- Get map imagery tile:"); + let result = await render.getMapImageryTile("png", "satellite", 6, 10, 22, operationOptions); + // use result.blobBody for Browser, readableStreamBody for Node.js: + result.readableStreamBody?.pipe(fs.createWriteStream("tmp/map_imagery_tile.png")); + + const statesetId = process.env.CREATOR_STATESET_ID; + if ((typeof statesetId === "string") && (statesetId.length == 36)) { + console.log(" --- Get map state tile:"); + result = await render.getMapStateTilePreview(6, 10, 22, statesetId, operationOptions); + // use result.blobBody for Browser, readableStreamBody for Node.js: + result.readableStreamBody?.pipe(fs.createWriteStream("tmp/state_tile.png")); + } + + console.log(" --- Get map static image:"); + result = await render.getMapStaticImage("png", { "layer": "basic", "style": "dark", "zoom": 2, "bbox": "1.355233,42.982261,24.980233,56.526017" }); + // use result.blobBody for Browser, readableStreamBody for Node.js: + result.readableStreamBody?.pipe(fs.createWriteStream("tmp/static_image.png")); + + console.log(" --- Get map tile:"); + result = await render.getMapTile("png", "basic", "main", 6, 10, 22, { "tileSize": "512" }); + // use result.blobBody for Browser, readableStreamBody for Node.js: + result.readableStreamBody?.pipe(fs.createWriteStream("tmp/tile.png")); + + console.log(" --- Get map tile v2:"); + result = await renderV2.getMapTilePreview("microsoft.base", 6, 10, 22, { "tileSize": "512" }); + // use result.blobBody for Browser, readableStreamBody for Node.js: + result.readableStreamBody?.pipe(fs.createWriteStream("tmp/tile_v2.vector.pbf")); + +} + +main(); diff --git a/sdk/maps/maps-render/samples/v1/typescript/tsconfig.json b/sdk/maps/maps-render/samples/v1/typescript/tsconfig.json new file mode 100644 index 000000000000..416c2dd82e00 --- /dev/null +++ b/sdk/maps/maps-render/samples/v1/typescript/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2018", + "module": "commonjs", + "moduleResolution": "node", + "resolveJsonModule": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "alwaysStrict": true, + "outDir": "dist", + "rootDir": "src" + }, + "include": [ + "src/**.ts" + ] +} diff --git a/sdk/maps/maps-render/src/index.ts b/sdk/maps/maps-render/src/index.ts new file mode 100644 index 000000000000..9bf2302a0f71 --- /dev/null +++ b/sdk/maps/maps-render/src/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./models"; +export { RenderClient } from "./renderClient"; +export { RenderClientContext } from "./renderClientContext"; +export * from "./operationsInterfaces"; diff --git a/sdk/maps/maps-render/src/models/index.ts b/sdk/maps/maps-render/src/models/index.ts new file mode 100644 index 000000000000..d32cd3c74218 --- /dev/null +++ b/sdk/maps/maps-render/src/models/index.ts @@ -0,0 +1,1041 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; + +/** Common error response for all Azure Resource Manager APIs to return error details for failed operations. (This also follows the OData error response format.). */ +export interface ErrorResponse { + /** The error object. */ + error?: ErrorDetail; +} + +/** The error detail. */ +export interface ErrorDetail { + /** + * The error code. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly code?: string; + /** + * The error message. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly message?: string; + /** + * The error target. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly target?: string; + /** + * The error details. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly details?: ErrorDetail[]; + /** + * The error additional info. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly additionalInfo?: ErrorAdditionalInfo[]; +} + +/** The resource management error additional info. */ +export interface ErrorAdditionalInfo { + /** + * The additional info type. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly type?: string; + /** + * The additional info. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly info?: Record; +} + +/** This object is returned from a successful Get Copyright Caption call */ +export interface GetCopyrightCaptionResult { + /** + * Format Version property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly formatVersion?: string; + /** + * Copyrights Caption property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly copyrightsCaption?: string; +} + +/** This object is returned from a successful Get Copyright From Bounding Box call */ +export interface GetCopyrightFromBoundingBoxResult { + /** + * Format Version property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly formatVersion?: string; + /** + * General Copyrights array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly generalCopyrights?: string[]; + /** + * Regions array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly regions?: RegionCopyrights[]; +} + +export interface RegionCopyrights { + /** + * Copyrights array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly copyrights?: string[]; + /** + * Country property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly country?: RegionCopyrightsCountry; +} + +/** Country property */ +export interface RegionCopyrightsCountry { + /** + * ISO3 property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly iso3?: string; + /** + * Label property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly label?: string; +} + +/** This object is returned from a successful Get Copyright For Tile call */ +export interface GetCopyrightForTileResult { + /** + * Format Version property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly formatVersion?: string; + /** + * General Copyrights array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly generalCopyrights?: string[]; + /** + * Regions array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly regions?: RegionCopyrights[]; +} + +/** This object is returned from a successful Get Copyright For World call */ +export interface GetCopyrightForWorldResult { + /** + * Format Version property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly formatVersion?: string; + /** + * General Copyrights array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly generalCopyrights?: string[]; + /** + * Regions array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly regions?: RegionCopyrights[]; +} + +/** Defines headers for Render_getMapStaticImage operation. */ +export interface RenderGetMapStaticImageHeaders { + /** The content-type for the response. */ + contentType?: string; +} + +/** Defines headers for Render_getMapTile operation. */ +export interface RenderGetMapTileHeaders { + /** The content-type for the response. */ + contentType?: string; +} + +/** Defines headers for Render_getMapStateTilePreview operation. */ +export interface RenderGetMapStateTilePreviewHeaders { + /** The content-type for the response. */ + contentType?: string; +} + +/** Defines headers for Render_getMapImageryTile operation. */ +export interface RenderGetMapImageryTileHeaders { + /** The content-type for the response. */ + contentType?: string; +} + +/** Defines headers for RenderV2_getMapTilePreview operation. */ +export interface RenderV2GetMapTilePreviewHeaders { + /** The content-type for the response. */ + contentType?: string; +} + +/** Known values of {@link Geography} that the service accepts. */ +export const enum KnownGeography { + Us = "us", + Eu = "eu" +} + +/** + * Defines values for Geography. \ + * {@link KnownGeography} can be used interchangeably with Geography, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **us** \ + * **eu** + */ +export type Geography = string; + +/** Known values of {@link RasterTileFormat} that the service accepts. */ +export const enum KnownRasterTileFormat { + /** An image in the png format. Supports zoom levels 0 through 18. */ + Png = "png" +} + +/** + * Defines values for RasterTileFormat. \ + * {@link KnownRasterTileFormat} can be used interchangeably with RasterTileFormat, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **png**: An image in the png format. Supports zoom levels 0 through 18. + */ +export type RasterTileFormat = string; + +/** Known values of {@link StaticMapLayer} that the service accepts. */ +export const enum KnownStaticMapLayer { + /** Returns an image containing all map features including polygons, borders, roads and labels. */ + Basic = "basic", + /** Returns an image containing borders, roads, and labels, and can be overlaid on other tiles (such as satellite imagery) to produce hybrid tiles. */ + Hybrid = "hybrid", + /** Returns an image of just the map's label information. */ + Labels = "labels" +} + +/** + * Defines values for StaticMapLayer. \ + * {@link KnownStaticMapLayer} can be used interchangeably with StaticMapLayer, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **basic**: Returns an image containing all map features including polygons, borders, roads and labels. \ + * **hybrid**: Returns an image containing borders, roads, and labels, and can be overlaid on other tiles (such as satellite imagery) to produce hybrid tiles. \ + * **labels**: Returns an image of just the map's label information. + */ +export type StaticMapLayer = string; + +/** Known values of {@link MapImageStyle} that the service accepts. */ +export const enum KnownMapImageStyle { + /** Azure Maps main style */ + Main = "main", + /** Dark grey version of the Azure Maps main style */ + Dark = "dark" +} + +/** + * Defines values for MapImageStyle. \ + * {@link KnownMapImageStyle} can be used interchangeably with MapImageStyle, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **main**: Azure Maps main style \ + * **dark**: Dark grey version of the Azure Maps main style + */ +export type MapImageStyle = string; + +/** Known values of {@link TileFormat} that the service accepts. */ +export const enum KnownTileFormat { + /** An image in the png format. Supports zoom levels 0 through 18. */ + Png = "png", + /** Vector graphic in the pbf format. Supports zoom levels 0 through 22. */ + Pbf = "pbf" +} + +/** + * Defines values for TileFormat. \ + * {@link KnownTileFormat} can be used interchangeably with TileFormat, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **png**: An image in the png format. Supports zoom levels 0 through 18. \ + * **pbf**: Vector graphic in the pbf format. Supports zoom levels 0 through 22. + */ +export type TileFormat = string; + +/** Known values of {@link MapTileLayer} that the service accepts. */ +export const enum KnownMapTileLayer { + /** Returns a tile containing all map features including polygons, borders, roads and labels. */ + Basic = "basic", + /** Returns a tile containing borders, roads, and labels, and can be overlaid on other tiles (such as satellite imagery) to produce hybrid tiles. */ + Hybrid = "hybrid", + /** Returns a tile of just the map's label information. */ + Labels = "labels", + /** Map canvas complete with shaded relief tiles. Zoom levels 0-6 (inclusive) are supported. Png is the only supported TileFormat and only available MapTileSize is 512. */ + Terra = "terra" +} + +/** + * Defines values for MapTileLayer. \ + * {@link KnownMapTileLayer} can be used interchangeably with MapTileLayer, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **basic**: Returns a tile containing all map features including polygons, borders, roads and labels. \ + * **hybrid**: Returns a tile containing borders, roads, and labels, and can be overlaid on other tiles (such as satellite imagery) to produce hybrid tiles. \ + * **labels**: Returns a tile of just the map's label information. \ + * **terra**: Map canvas complete with shaded relief tiles. Zoom levels 0-6 (inclusive) are supported. Png is the only supported TileFormat and only available MapTileSize is 512. + */ +export type MapTileLayer = string; + +/** Known values of {@link MapTileStyle} that the service accepts. */ +export const enum KnownMapTileStyle { + /** Azure Maps main style */ + Main = "main", + /** Dark grey version of the Azure Maps main style. PNG is the only supported TileFormat. */ + Dark = "dark", + /** Azure Maps main style completed with shaded relief. Supported by Layer terra. */ + ShadedRelief = "shaded_relief" +} + +/** + * Defines values for MapTileStyle. \ + * {@link KnownMapTileStyle} can be used interchangeably with MapTileStyle, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **main**: Azure Maps main style \ + * **dark**: Dark grey version of the Azure Maps main style. PNG is the only supported TileFormat. \ + * **shaded_relief**: Azure Maps main style completed with shaded relief. Supported by Layer terra. + */ +export type MapTileStyle = string; + +/** Known values of {@link MapTileSize} that the service accepts. */ +export const enum KnownMapTileSize { + /** Return a 256 by 256 pixel tile. */ + TwoHundredFiftySix = "256", + /** Return a 512 by 512 pixel tile. */ + FiveHundredTwelve = "512" +} + +/** + * Defines values for MapTileSize. \ + * {@link KnownMapTileSize} can be used interchangeably with MapTileSize, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **256**: Return a 256 by 256 pixel tile. \ + * **512**: Return a 512 by 512 pixel tile. + */ +export type MapTileSize = string; + +/** Known values of {@link TextFormat} that the service accepts. */ +export const enum KnownTextFormat { + /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ + Json = "json", + /** [The Extensible Markup Language](https://www.w3.org/TR/xml/) */ + Xml = "xml" +} + +/** + * Defines values for TextFormat. \ + * {@link KnownTextFormat} can be used interchangeably with TextFormat, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) \ + * **xml**: [The Extensible Markup Language](https:\/\/www.w3.org\/TR\/xml\/) + */ +export type TextFormat = string; + +/** Known values of {@link MapImageryStyle} that the service accepts. */ +export const enum KnownMapImageryStyle { + /** Satellite imagery */ + Satellite = "satellite" +} + +/** + * Defines values for MapImageryStyle. \ + * {@link KnownMapImageryStyle} can be used interchangeably with MapImageryStyle, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **satellite**: Satellite imagery + */ +export type MapImageryStyle = string; + +/** Known values of {@link IncludeText} that the service accepts. */ +export const enum KnownIncludeText { + /** Include all textual data in response. */ + Yes = "yes", + /** Exclude textual data from response. Only images and country names will be in response. */ + No = "no" +} + +/** + * Defines values for IncludeText. \ + * {@link KnownIncludeText} can be used interchangeably with IncludeText, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **yes**: Include all textual data in response. \ + * **no**: Exclude textual data from response. Only images and country names will be in response. + */ +export type IncludeText = string; + +/** Known values of {@link TilesetID} that the service accepts. */ +export const enum KnownTilesetID { + /** + * A base map is a standard map that displays roads, natural and artificial features along with the labels for those features in a vector tile.
+ * + * Supports zoom levels 0 through 22. Format: vector (pbf). + */ + MicrosoftBase = "microsoft.base", + /** + * Displays labels for roads, natural and artificial features in a vector tile.
+ * + * Supports zoom levels 0 through 22. Format: vector (pbf). + */ + MicrosoftBaseLabels = "microsoft.base.labels", + /** + * Displays road, boundary and label data in a vector tile.
+ * + * Supports zoom levels 0 through 22. Format: vector (pbf). + */ + MicrosoftBaseHybrid = "microsoft.base.hybrid", + /** + * Shaded relief and terra layers.
+ * + * Supports zoom levels 0 through 6. Format: raster (png). + */ + MicrosoftTerraMain = "microsoft.terra.main", + /** + * All layers with our main style.
+ * + * Supports zoom levels 0 through 22. Format: raster (png). + */ + MicrosoftBaseRoad = "microsoft.base.road", + /** + * All layers with our dark grey style.
+ * + * Supports zoom levels 0 through 22. Format: raster (png). + */ + MicrosoftBaseDarkgrey = "microsoft.base.darkgrey", + /** + * Label data in our main style.
+ * + * Supports zoom levels 0 through 22. Format: raster (png). + */ + MicrosoftBaseLabelsRoad = "microsoft.base.labels.road", + /** + * Road, boundary and label data in our main style.
+ * + * Supports zoom levels 0 through 22. Format: raster (png). + */ + MicrosoftBaseHybridRoad = "microsoft.base.hybrid.road", + /** + * A combination of satellite and aerial imagery. Only available in S1 pricing SKU.
+ * + * Supports zoom levels 1 through 19. Format: raster (jpeg). + */ + MicrosoftImagery = "microsoft.imagery", + /** + * Weather radar tiles. Latest weather radar images including areas of rain, snow, ice and mixed conditions. Please see [coverage information](https://aka.ms/AzureMapsWeatherCoverage) for Azure Maps Weather service. To learn more about the Radar data, please see [Weather concepts](https://aka.ms/AzureMapsWeatherConcepts).
+ * + * Supports zoom levels 0 through 15. Format: raster (png). + */ + MicrosoftWeatherRadarMain = "microsoft.weather.radar.main", + /** + * Weather infrared tiles. Latest Infrared Satellite images shows clouds by their temperature. Please see [coverage information](https://aka.ms/AzureMapsWeatherCoverage) for Azure Maps Weather service. To learn more about the returned Satellite data, please see [Weather concepts](https://aka.ms/AzureMapsWeatherConcepts).
+ * + * Supports zoom levels 0 through 15. Format: raster (png). + */ + MicrosoftWeatherInfraredMain = "microsoft.weather.infrared.main", + /** + * Digital Elevation Model tiles. The tiles are in the GeoTIFF format with a single 32-bit floating point band. The tiles cover the whole landmass of Earth. Some small islands (e.g., atolls) might not be represented accurately.
+ * * The vertical unit for measurement of elevation height is meters. An elevation value of -32767.0 is used for points that have no data value, most often returned where there isn't landmass (i.e. water).
+ * * The horizontal reference datum is the World Geodetic System 1984 (WGS84-G1150) and the vertical reference datum is the Earth Gravitational Model 2008 (EGM2008).
+ * * Tiles are 258x258 pixel squares rather than the standard 256 x 256. This is done to allow for accurate interpolation of values at the tile edges. As such adjacent tiles overlap by 1 pixel along all edges.
+ * * Tile data comes from the [Airbus WorldDEM4Ortho product](https://www.intelligence-airbusds.com/worlddem-streaming/). Urban areas are approximately leveled down to ground level. All other areas are represented by the object surface level (e.g., trees).
+ * + * Supports zoom level 13 only. Format: raster (tiff). + */ + MicrosoftDem = "microsoft.dem" +} + +/** + * Defines values for TilesetID. \ + * {@link KnownTilesetID} can be used interchangeably with TilesetID, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **microsoft.base**: A base map is a standard map that displays roads, natural and artificial features along with the labels for those features in a vector tile.
+ * + * Supports zoom levels 0 through 22. Format: vector (pbf). \ + * **microsoft.base.labels**: Displays labels for roads, natural and artificial features in a vector tile.
+ * + * Supports zoom levels 0 through 22. Format: vector (pbf). \ + * **microsoft.base.hybrid**: Displays road, boundary and label data in a vector tile.
+ * + * Supports zoom levels 0 through 22. Format: vector (pbf). \ + * **microsoft.terra.main**: Shaded relief and terra layers.
+ * + * Supports zoom levels 0 through 6. Format: raster (png). \ + * **microsoft.base.road**: All layers with our main style.
+ * + * Supports zoom levels 0 through 22. Format: raster (png). \ + * **microsoft.base.darkgrey**: All layers with our dark grey style.
+ * + * Supports zoom levels 0 through 22. Format: raster (png). \ + * **microsoft.base.labels.road**: Label data in our main style.
+ * + * Supports zoom levels 0 through 22. Format: raster (png). \ + * **microsoft.base.hybrid.road**: Road, boundary and label data in our main style.
+ * + * Supports zoom levels 0 through 22. Format: raster (png). \ + * **microsoft.imagery**: A combination of satellite and aerial imagery. Only available in S1 pricing SKU.
+ * + * Supports zoom levels 1 through 19. Format: raster (jpeg). \ + * **microsoft.weather.radar.main**: Weather radar tiles. Latest weather radar images including areas of rain, snow, ice and mixed conditions. Please see [coverage information](https:\/\/aka.ms\/AzureMapsWeatherCoverage) for Azure Maps Weather service. To learn more about the Radar data, please see [Weather concepts](https:\/\/aka.ms\/AzureMapsWeatherConcepts).
+ * + * Supports zoom levels 0 through 15. Format: raster (png). \ + * **microsoft.weather.infrared.main**: Weather infrared tiles. Latest Infrared Satellite images shows clouds by their temperature. Please see [coverage information](https:\/\/aka.ms\/AzureMapsWeatherCoverage) for Azure Maps Weather service. To learn more about the returned Satellite data, please see [Weather concepts](https:\/\/aka.ms\/AzureMapsWeatherConcepts).
+ * + * Supports zoom levels 0 through 15. Format: raster (png). \ + * **microsoft.dem**: Digital Elevation Model tiles. The tiles are in the GeoTIFF format with a single 32-bit floating point band. The tiles cover the whole landmass of Earth. Some small islands (e.g., atolls) might not be represented accurately.
+ * * The vertical unit for measurement of elevation height is meters. An elevation value of -32767.0 is used for points that have no data value, most often returned where there isn't landmass (i.e. water).
+ * * The horizontal reference datum is the World Geodetic System 1984 (WGS84-G1150) and the vertical reference datum is the Earth Gravitational Model 2008 (EGM2008).
+ * * Tiles are 258x258 pixel squares rather than the standard 256 x 256. This is done to allow for accurate interpolation of values at the tile edges. As such adjacent tiles overlap by 1 pixel along all edges.
+ * * Tile data comes from the [Airbus WorldDEM4Ortho product](https:\/\/www.intelligence-airbusds.com\/worlddem-streaming\/). Urban areas are approximately leveled down to ground level. All other areas are represented by the object surface level (e.g., trees).
+ * + * Supports zoom level 13 only. Format: raster (tiff). + */ +export type TilesetID = string; + +/** Known values of {@link TileSize} that the service accepts. */ +export const enum KnownTileSize { + /** + * Return a 256 by 256 pixel tile. Available for all tilesetIds except for + * * microsoft.terra.main + */ + TwoHundredFiftySix = "256", + /** + * Return a 512 by 512 pixel tile. Available for all tilesetIds except for + * * microsoft.weather.radar.main + * * microsoft.weather.infrared.main + * * microsoft.base.hybrid + * * microsoft.dem + * * microsoft.imagery + */ + FiveHundredTwelve = "512" +} + +/** + * Defines values for TileSize. \ + * {@link KnownTileSize} can be used interchangeably with TileSize, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **256**: Return a 256 by 256 pixel tile. Available for all tilesetIds except for + * * microsoft.terra.main \ + * **512**: Return a 512 by 512 pixel tile. Available for all tilesetIds except for + * * microsoft.weather.radar.main + * * microsoft.weather.infrared.main + * * microsoft.base.hybrid + * * microsoft.dem + * * microsoft.imagery + */ +export type TileSize = string; + +/** Known values of {@link GeographicResourceLocation} that the service accepts. */ +export const enum KnownGeographicResourceLocation { + /** Used to access an Azure Maps Creator resource in the United States */ + Us = "us", + /** Used to access an Azure Maps Creator resource in Europe */ + Eu = "eu" +} + +/** + * Defines values for GeographicResourceLocation. \ + * {@link KnownGeographicResourceLocation} can be used interchangeably with GeographicResourceLocation, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **us**: Used to access an Azure Maps Creator resource in the United States \ + * **eu**: Used to access an Azure Maps Creator resource in Europe + */ +export type GeographicResourceLocation = string; + +/** Optional parameters. */ +export interface RenderGetMapStaticImageOptionalParams + extends coreClient.OperationOptions { + /** Map layer requested. If layer is set to labels or hybrid, the format should be png. */ + layer?: StaticMapLayer; + /** Map style to be returned. Possible values are main and dark. */ + style?: MapImageStyle; + /** Desired zoom level of the map. Zoom value must be in the range: 0-20 (inclusive). Default value is 12.

Please see [Zoom Levels and Tile Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for details. */ + zoom?: number; + /** + * Coordinates of the center point. Format: 'lon,lat'. Projection used + * - EPSG:3857. Longitude range: -180 to 180. Latitude range: -85 to 85. + * + * Note: Either center or bbox are required parameters. They are + * mutually exclusive. + */ + center?: string; + /** + * Bounding box. Projection used - EPSG:3857. Format : 'minLon, minLat, + * maxLon, maxLat'. + * + * Note: Either bbox or center are required + * parameters. They are mutually exclusive. It shouldn’t be used with + * height or width. + * + * The maximum allowed ranges for Lat and Lon are defined for each zoom level + * in the table at the top of this page. + */ + bbox?: string; + /** + * Height of the resulting image in pixels. Range is 1 to 8192. Default + * is 512. It shouldn’t be used with bbox. + */ + height?: number; + /** Width of the resulting image in pixels. Range is 1 to 8192. Default is 512. It shouldn’t be used with bbox. */ + width?: number; + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. + * + * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. + */ + language?: string; + /** + * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. + * + * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. + */ + view?: string; + /** + * Pushpin style and instances. Use this parameter to optionally add pushpins to the image. + * The pushpin style describes the appearance of the pushpins, and the instances specify + * the coordinates of the pushpins and optional labels for each pin. (Be sure to properly URL-encode values of this + * parameter since it will contain reserved characters such as pipes and punctuation.) + * + * The Azure Maps account S0 SKU only supports a single instance of the pins parameter. Other SKUs + * allow multiple instances of the pins parameter to specify multiple pin styles. + * + * To render a pushpin at latitude 45°N and longitude 122°W using the default built-in pushpin style, add the + * querystring parameter + * + * `pins=default||-122 45` + * + * Note that the longitude comes before the latitude. + * After URL encoding this will look like + * + * `pins=default%7C%7C-122+45` + * + * All of the examples here show the pins + * parameter without URL encoding, for clarity. + * + * To render a pin at multiple locations, separate each location with a pipe character. For example, use + * + * `pins=default||-122 45|-119.5 43.2|-121.67 47.12` + * + * The S0 Azure Maps account SKU only allows five pushpins. Other account SKUs do not have this limitation. + * + * ### Style Modifiers + * + * You can modify the appearance of the pins by adding style modifiers. These are added after the style but before + * the locations and labels. Style modifiers each have a two-letter name. These abbreviated names are used to help + * reduce the length of the URL. + * + * To change the color of the pushpin, use the 'co' style modifier and specify the color using the HTML/CSS RGB color + * format which is a six-digit hexadecimal number (the three-digit form is not supported). For example, to use + * a deep pink color which you would specify as #FF1493 in CSS, use + * + * `pins=default|coFF1493||-122 45` + * + * ### Pushpin Labels + * + * To add a label to the pins, put the label in single quotes just before the coordinates. For example, to label + * three pins with the values '1', '2', and '3', use + * + * `pins=default||'1'-122 45|'2'-119.5 43.2|'3'-121.67 47.12` + * + * There is a built in pushpin style called 'none' that does not display a pushpin image. You can use this if + * you want to display labels without any pin image. For example, + * + * `pins=none||'A'-122 45|'B'-119.5 43.2` + * + * To change the color of the pushpin labels, use the 'lc' label color style modifier. For example, to use pink + * pushpins with black labels, use + * + * `pins=default|coFF1493|lc000000||-122 45` + * + * To change the size of the labels, use the 'ls' label size style modifier. The label size represents the approximate + * height of the label text in pixels. For example, to increase the label size to 12, use + * + * `pins=default|ls12||'A'-122 45|'B'-119 43` + * + * The labels are centered at the pushpin 'label anchor.' The anchor location is predefined for built-in pushpins and + * is at the top center of custom pushpins (see below). To override the label anchor, using the 'la' style modifier + * and provide X and Y pixel coordinates for the anchor. These coordinates are relative to the top left corner of the + * pushpin image. Positive X values move the anchor to the right, and positive Y values move the anchor down. For example, + * to position the label anchor 10 pixels right and 4 pixels above the top left corner of the pushpin image, + * use + * + * `pins=default|la10 -4||'A'-122 45|'B'-119 43` + * + * ### Custom Pushpins + * + * To use a custom pushpin image, use the word 'custom' as the pin style name, and then specify a URL after the + * location and label information. Use two pipe characters to indicate that you're done specifying locations and are + * starting the URL. For example, + * + * `pins=custom||-122 45||http://contoso.com/pushpins/red.png` + * + * After URL encoding, this would look like + * + * `pins=custom%7C%7C-122+45%7C%7Chttp%3A%2F%2Fcontoso.com%2Fpushpins%2Fred.png` + * + * By default, custom pushpin images are drawn centered at the pin coordinates. This usually isn't ideal as it obscures + * the location that you're trying to highlight. To override the anchor location of the pin image, use the 'an' + * style modifier. This uses the same format as the 'la' label anchor style modifier. For example, if your custom + * pin image has the tip of the pin at the top left corner of the image, you can set the anchor to that spot by + * using + * + * `pins=custom|an0 0||-122 45||http://contoso.com/pushpins/red.png` + * + * Note: If you use the 'co' color modifier with a custom pushpin image, the specified color will replace the RGB + * channels of the pixels in the image but will leave the alpha (opacity) channel unchanged. This would usually + * only be done with a solid-color custom image. + * + * ### Getting Pushpins from Azure Maps Data Storage + * + * For all Azure Maps account SKUs other than S0, + * the pushpin image and location information can be obtained from Azure Maps Data Storage. After uploading a pushpin image + * or a GeoJSON document containing pin locations, the Data Storage service returns a Unique Data ID (UDID) that you can use + * to reference the data in the pins parameter. + * + * To use a custom pushpin image from Azure Maps Data Storage, specify the UDID prefixed by 'udid-' as the name of the + * pushpin style. For example, + * + * `pins=udid-fe22c504-3a81-4fcd-adc6-a3507ce866c1||-122 45` + * + * To use the point geometry from an uploaded GeoJSON document as the pin locations, specify the UDID in the locations + * section of the pins parameter. For example, + * + * `pins=default||udid-29dc105a-dee7-409f-a3f9-22b066ae4713` + * + * Note that + * only point and multipoint geometry, points and multipoints from geometry collections, and point geometry from features + * will be used. Linestring and polygon geometry will be ignored. If the point comes from a feature and the feature + * has a string property called "label", the value of that property will be used as the label for the pin. + * + * You can mix pin locations from Data Storage and pin locations specified in the pins parameter. Any of the pipe-delimited + * pin locations can be a longitude and latitude or a UDID. For example, + * + * `pins=default||-122 45|udid-29dc105a-dee7-409f-a3f9-22b066ae4713|-119 43` + * + * ### Scale, Rotation, and Opacity + * + * You can make pushpins and their labels larger or smaller by using the 'sc' scale style modifier. This is a + * value greater than zero. A value of 1 is the standard scale. Values larger than 1 will make the pins larger, and + * values smaller than 1 will make them smaller. For example, to draw the pushpins 50% larger than normal, use + * + * `pins=default|sc1.5||-122 45` + * + * You can rotate pushpins and their labels by using the 'ro' rotation style modifier. This is a number of degrees + * of clockwise rotation. Use a negative number to rotate counter-clockwise. For example, to rotate the pushpins + * 90 degrees clockwise and double their size, use + * + * `pins=default|ro90|sc2||-122 45` + * + * You can make pushpins and their labels partially transparent by specifying the 'al' alpha style modifier. + * This is a number between 0 and 1 indicating the opacity of the pushpins. Zero makes them completely transparent + * (and not visible) and 1 makes them completely opaque (which is the default). For example, to make pushpins + * and their labels only 67% opaque, use + * + * `pins=default|al.67||-122 45` + * + * ### Style Modifier Summary + * + * Modifier | Description | Range + * :--------:|-----------------|------------------ + * al | Alpha (opacity) | 0 to 1 + * an | Pin anchor | * + * co | Pin color | 000000 to FFFFFF + * la | Label anchor | * + * lc | Label color | 000000 to FFFFFF + * ls | Label size | Greater than 0 + * ro | Rotation | -360 to 360 + * sc | Scale | Greater than 0 + * + * * X and Y coordinates can be anywhere within pin image or a margin around it. + * The margin size is the minimum of the pin width and height. + */ + pins?: string[]; + /** + * Path style and locations. Use this parameter to optionally add lines, polygons or circles to the image. + * The path style describes the appearance of the line and fill. (Be sure to properly URL-encode values of this + * parameter since it will contain reserved characters such as pipes and punctuation.) + * + * Path parameter is supported in Azure Maps account SKU starting with S1. Multiple instances of the path parameter + * allow to specify multiple geometries with their styles. Number of parameters per request is limited to 10 and + * number of locations is limited to 100 per path. + * + * To render a circle with radius 100 meters and center point at latitude 45°N and longitude 122°W using the default style, add the + * querystring parameter + * + * `path=ra100||-122 45` + * + * Note that the longitude comes before the latitude. + * After URL encoding this will look like + * + * `path=ra100%7C%7C-122+45` + * + * All of the examples here show the path parameter without URL encoding, for clarity. + * + * To render a line, separate each location with a pipe character. For example, use + * + * `path=||-122 45|-119.5 43.2|-121.67 47.12` + * + * To render a polygon, last location must be equal to the start location. For example, use + * + * `path=||-122 45|-119.5 43.2|-121.67 47.12|-122 45` + * + * Longitude and latitude values for locations of lines and polygons can be in the range from -360 to 360 to allow for rendering of geometries crossing the anti-meridian. + * + * ### Style Modifiers + * + * You can modify the appearance of the path by adding style modifiers. These are added before the locations. + * Style modifiers each have a two-letter name. These abbreviated names are used to help reduce the length + * of the URL. + * + * To change the color of the outline, use the 'lc' style modifier and specify the color using the HTML/CSS RGB color + * format which is a six-digit hexadecimal number (the three-digit form is not supported). For example, to use + * a deep pink color which you would specify as #FF1493 in CSS, use + * + * `path=lcFF1493||-122 45|-119.5 43.2` + * + * Multiple style modifiers may be combined together to create a more complex visual style. + * + * `lc0000FF|lw3|la0.60|fa0.50||-122.2 47.6|-122.2 47.7|-122.3 47.7|-122.3 47.6|-122.2 47.6` + * + * ### Getting Path locations from Azure Maps Data Storage + * + * For all Azure Maps account SKUs other than S0, the path location information can be obtained from Azure Maps Data Storage. + * After uploading a GeoJSON document containing path locations, the Data Storage service returns a Unique Data ID (UDID) that you can use + * to reference the data in the path parameter. + * + * To use the point geometry from an uploaded GeoJSON document as the path locations, specify the UDID in the locations + * section of the path parameter. For example, + * + * `path=||udid-29dc105a-dee7-409f-a3f9-22b066ae4713` + * + * Note the it is not allowed to mix path locations from Data Storage with locations specified in the path parameter. + * + * ### Style Modifier Summary + * + * Modifier | Description | Range + * :--------:|------------------------|------------------ + * lc | Line color | 000000 to FFFFFF + * fc | Fill color | 000000 to FFFFFF + * la | Line alpha (opacity) | 0 to 1 + * fa | Fill alpha (opacity) | 0 to 1 + * lw | Line width | Greater than 0 + * ra | Circle radius (meters) | Greater than 0 + */ + path?: string[]; +} + +/** Contains response data for the getMapStaticImage operation. */ +export type RenderGetMapStaticImageResponse = RenderGetMapStaticImageHeaders & { + /** + * BROWSER ONLY + * + * The response body as a browser Blob. + * Always `undefined` in node.js. + */ + blobBody?: Promise; + /** + * NODEJS ONLY + * + * The response body as a node.js Readable stream. + * Always `undefined` in the browser. + */ + readableStreamBody?: NodeJS.ReadableStream; +}; + +/** Optional parameters. */ +export interface RenderGetMapTileOptionalParams + extends coreClient.OperationOptions { + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. + * + * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. + */ + language?: string; + /** + * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. + * + * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. + */ + view?: string; + /** The size of the returned map tile in pixels. */ + tileSize?: MapTileSize; +} + +/** Contains response data for the getMapTile operation. */ +export type RenderGetMapTileResponse = RenderGetMapTileHeaders & { + /** + * BROWSER ONLY + * + * The response body as a browser Blob. + * Always `undefined` in node.js. + */ + blobBody?: Promise; + /** + * NODEJS ONLY + * + * The response body as a node.js Readable stream. + * Always `undefined` in the browser. + */ + readableStreamBody?: NodeJS.ReadableStream; +}; + +/** Optional parameters. */ +export interface RenderGetMapStateTilePreviewOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getMapStateTilePreview operation. */ +export type RenderGetMapStateTilePreviewResponse = RenderGetMapStateTilePreviewHeaders & { + /** + * BROWSER ONLY + * + * The response body as a browser Blob. + * Always `undefined` in node.js. + */ + blobBody?: Promise; + /** + * NODEJS ONLY + * + * The response body as a node.js Readable stream. + * Always `undefined` in the browser. + */ + readableStreamBody?: NodeJS.ReadableStream; +}; + +/** Optional parameters. */ +export interface RenderGetCopyrightCaptionOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getCopyrightCaption operation. */ +export type RenderGetCopyrightCaptionResponse = GetCopyrightCaptionResult; + +/** Optional parameters. */ +export interface RenderGetMapImageryTileOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getMapImageryTile operation. */ +export type RenderGetMapImageryTileResponse = RenderGetMapImageryTileHeaders & { + /** + * BROWSER ONLY + * + * The response body as a browser Blob. + * Always `undefined` in node.js. + */ + blobBody?: Promise; + /** + * NODEJS ONLY + * + * The response body as a node.js Readable stream. + * Always `undefined` in the browser. + */ + readableStreamBody?: NodeJS.ReadableStream; +}; + +/** Optional parameters. */ +export interface RenderGetCopyrightFromBoundingBoxOptionalParams + extends coreClient.OperationOptions { + /** Yes/no value to exclude textual data from response. Only images and country names will be in response. */ + text?: IncludeText; +} + +/** Contains response data for the getCopyrightFromBoundingBox operation. */ +export type RenderGetCopyrightFromBoundingBoxResponse = GetCopyrightFromBoundingBoxResult; + +/** Optional parameters. */ +export interface RenderGetCopyrightForTileOptionalParams + extends coreClient.OperationOptions { + /** Yes/no value to exclude textual data from response. Only images and country names will be in response. */ + text?: IncludeText; +} + +/** Contains response data for the getCopyrightForTile operation. */ +export type RenderGetCopyrightForTileResponse = GetCopyrightForTileResult; + +/** Optional parameters. */ +export interface RenderGetCopyrightForWorldOptionalParams + extends coreClient.OperationOptions { + /** Yes/no value to exclude textual data from response. Only images and country names will be in response. */ + text?: IncludeText; +} + +/** Contains response data for the getCopyrightForWorld operation. */ +export type RenderGetCopyrightForWorldResponse = GetCopyrightForWorldResult; + +/** Optional parameters. */ +export interface RenderV2GetMapTilePreviewOptionalParams + extends coreClient.OperationOptions { + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. + * + * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. + */ + language?: string; + /** + * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. + * + * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. + */ + view?: string; + /** + * The desired date and time of the requested tile. This parameter must be specified in the standard date-time format (e.g. 2019-11-14T16:03:00-08:00), as defined by [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601). This parameter is only supported when tilesetId parameter is set to one of the values below. + * + * * microsoft.weather.infrared.main: We provide tiles up to 3 hours in the past. Tiles are available in 10-minute intervals. We round the timeStamp value to the nearest 10-minute time frame. + * * microsoft.weather.radar.main: We provide tiles up to 1.5 hours in the past and up to 2 hours in the future. Tiles are available in 5-minute intervals. We round the timeStamp value to the nearest 5-minute time frame. + */ + timeStamp?: string; + /** The size of the returned map tile in pixels. */ + tileSize?: TileSize; +} + +/** Contains response data for the getMapTilePreview operation. */ +export type RenderV2GetMapTilePreviewResponse = RenderV2GetMapTilePreviewHeaders & { + /** + * BROWSER ONLY + * + * The response body as a browser Blob. + * Always `undefined` in node.js. + */ + blobBody?: Promise; + /** + * NODEJS ONLY + * + * The response body as a node.js Readable stream. + * Always `undefined` in the browser. + */ + readableStreamBody?: NodeJS.ReadableStream; +}; + +/** Optional parameters. */ +export interface RenderClientOptionalParams + extends coreClient.ServiceClientOptions { + /** This parameter specifies where the Azure Maps Creator resource is located. Valid values are us and eu. */ + geography?: Geography; + /** Specifies which account is intended for usage in conjunction with the Azure AD security model. It represents a unique ID for the Azure Maps account and can be retrieved from the Azure Maps management plane Account API. To use Azure AD security in Azure Maps see the following [articles](https://aka.ms/amauthdetails) for guidance. */ + xMsClientId?: string; + /** Overrides client endpoint. */ + endpoint?: string; +} diff --git a/sdk/maps/maps-render/src/models/mappers.ts b/sdk/maps/maps-render/src/models/mappers.ts new file mode 100644 index 000000000000..ef5a05f15006 --- /dev/null +++ b/sdk/maps/maps-render/src/models/mappers.ts @@ -0,0 +1,377 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; + +export const ErrorResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorResponse", + modelProperties: { + error: { + serializedName: "error", + type: { + name: "Composite", + className: "ErrorDetail" + } + } + } + } +}; + +export const ErrorDetail: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorDetail", + modelProperties: { + code: { + serializedName: "code", + readOnly: true, + type: { + name: "String" + } + }, + message: { + serializedName: "message", + readOnly: true, + type: { + name: "String" + } + }, + target: { + serializedName: "target", + readOnly: true, + type: { + name: "String" + } + }, + details: { + serializedName: "details", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ErrorDetail" + } + } + } + }, + additionalInfo: { + serializedName: "additionalInfo", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ErrorAdditionalInfo" + } + } + } + } + } + } +}; + +export const ErrorAdditionalInfo: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorAdditionalInfo", + modelProperties: { + type: { + serializedName: "type", + readOnly: true, + type: { + name: "String" + } + }, + info: { + serializedName: "info", + readOnly: true, + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } + } + } +}; + +export const GetCopyrightCaptionResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GetCopyrightCaptionResult", + modelProperties: { + formatVersion: { + serializedName: "formatVersion", + readOnly: true, + type: { + name: "String" + } + }, + copyrightsCaption: { + serializedName: "copyrightsCaption", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const GetCopyrightFromBoundingBoxResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GetCopyrightFromBoundingBoxResult", + modelProperties: { + formatVersion: { + serializedName: "formatVersion", + readOnly: true, + type: { + name: "String" + } + }, + generalCopyrights: { + serializedName: "generalCopyrights", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + regions: { + serializedName: "regions", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "RegionCopyrights" + } + } + } + } + } + } +}; + +export const RegionCopyrights: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RegionCopyrights", + modelProperties: { + copyrights: { + serializedName: "copyrights", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + country: { + serializedName: "country", + type: { + name: "Composite", + className: "RegionCopyrightsCountry" + } + } + } + } +}; + +export const RegionCopyrightsCountry: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RegionCopyrightsCountry", + modelProperties: { + iso3: { + serializedName: "ISO3", + readOnly: true, + type: { + name: "String" + } + }, + label: { + serializedName: "label", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const GetCopyrightForTileResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GetCopyrightForTileResult", + modelProperties: { + formatVersion: { + serializedName: "formatVersion", + readOnly: true, + type: { + name: "String" + } + }, + generalCopyrights: { + serializedName: "generalCopyrights", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + regions: { + serializedName: "regions", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "RegionCopyrights" + } + } + } + } + } + } +}; + +export const GetCopyrightForWorldResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GetCopyrightForWorldResult", + modelProperties: { + formatVersion: { + serializedName: "formatVersion", + readOnly: true, + type: { + name: "String" + } + }, + generalCopyrights: { + serializedName: "generalCopyrights", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + regions: { + serializedName: "regions", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "RegionCopyrights" + } + } + } + } + } + } +}; + +export const RenderGetMapStaticImageHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RenderGetMapStaticImageHeaders", + modelProperties: { + contentType: { + serializedName: "content-type", + type: { + name: "String" + } + } + } + } +}; + +export const RenderGetMapTileHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RenderGetMapTileHeaders", + modelProperties: { + contentType: { + serializedName: "content-type", + type: { + name: "String" + } + } + } + } +}; + +export const RenderGetMapStateTilePreviewHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RenderGetMapStateTilePreviewHeaders", + modelProperties: { + contentType: { + serializedName: "content-type", + type: { + name: "String" + } + } + } + } +}; + +export const RenderGetMapImageryTileHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RenderGetMapImageryTileHeaders", + modelProperties: { + contentType: { + serializedName: "content-type", + type: { + name: "String" + } + } + } + } +}; + +export const RenderV2GetMapTilePreviewHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RenderV2GetMapTilePreviewHeaders", + modelProperties: { + contentType: { + serializedName: "content-type", + type: { + name: "String" + } + } + } + } +}; diff --git a/sdk/maps/maps-render/src/models/parameters.ts b/sdk/maps/maps-render/src/models/parameters.ts new file mode 100644 index 000000000000..75a7be70b9ed --- /dev/null +++ b/sdk/maps/maps-render/src/models/parameters.ts @@ -0,0 +1,424 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { + OperationParameter, + OperationURLParameter, + OperationQueryParameter +} from "@azure/core-client"; + +export const accept: OperationParameter = { + parameterPath: "accept", + mapper: { + defaultValue: + "application/json, image/jpeg, image/png, image/pbf, application/vnd.mapbox-vector-tile", + isConstant: true, + serializedName: "Accept", + type: { + name: "String" + } + } +}; + +export const geography: OperationURLParameter = { + parameterPath: "geography", + mapper: { + serializedName: "geography", + required: true, + type: { + name: "String" + } + } +}; + +export const xMsClientId: OperationParameter = { + parameterPath: "xMsClientId", + mapper: { + serializedName: "x-ms-client-id", + type: { + name: "String" + } + } +}; + +export const apiVersion: OperationQueryParameter = { + parameterPath: "apiVersion", + mapper: { + defaultValue: "1.0", + isConstant: true, + serializedName: "api-version", + type: { + name: "String" + } + } +}; + +export const format: OperationURLParameter = { + parameterPath: "format", + mapper: { + serializedName: "format", + required: true, + type: { + name: "String" + } + } +}; + +export const layer: OperationQueryParameter = { + parameterPath: ["options", "layer"], + mapper: { + serializedName: "layer", + type: { + name: "String" + } + } +}; + +export const style: OperationQueryParameter = { + parameterPath: ["options", "style"], + mapper: { + serializedName: "style", + type: { + name: "String" + } + } +}; + +export const zoom: OperationQueryParameter = { + parameterPath: ["options", "zoom"], + mapper: { + constraints: { + InclusiveMaximum: 20, + InclusiveMinimum: 0 + }, + serializedName: "zoom", + type: { + name: "Number" + } + } +}; + +export const center: OperationQueryParameter = { + parameterPath: ["options", "center"], + mapper: { + serializedName: "center", + type: { + name: "String" + } + } +}; + +export const bbox: OperationQueryParameter = { + parameterPath: ["options", "bbox"], + mapper: { + serializedName: "bbox", + type: { + name: "String" + } + } +}; + +export const height: OperationQueryParameter = { + parameterPath: ["options", "height"], + mapper: { + constraints: { + InclusiveMaximum: 8192, + InclusiveMinimum: 1 + }, + serializedName: "height", + type: { + name: "Number" + } + } +}; + +export const width: OperationQueryParameter = { + parameterPath: ["options", "width"], + mapper: { + constraints: { + InclusiveMaximum: 8192, + InclusiveMinimum: 1 + }, + serializedName: "width", + type: { + name: "Number" + } + } +}; + +export const language: OperationQueryParameter = { + parameterPath: ["options", "language"], + mapper: { + serializedName: "language", + type: { + name: "String" + } + } +}; + +export const view: OperationQueryParameter = { + parameterPath: ["options", "view"], + mapper: { + serializedName: "view", + type: { + name: "String" + } + } +}; + +export const pins: OperationQueryParameter = { + parameterPath: ["options", "pins"], + mapper: { + serializedName: "pins", + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + collectionFormat: "Multi" +}; + +export const path: OperationQueryParameter = { + parameterPath: ["options", "path"], + mapper: { + serializedName: "path", + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + collectionFormat: "Multi" +}; + +export const format1: OperationURLParameter = { + parameterPath: "format", + mapper: { + serializedName: "format", + required: true, + type: { + name: "String" + } + } +}; + +export const layer1: OperationQueryParameter = { + parameterPath: "layer", + mapper: { + serializedName: "layer", + required: true, + type: { + name: "String" + } + } +}; + +export const style1: OperationQueryParameter = { + parameterPath: "style", + mapper: { + serializedName: "style", + required: true, + type: { + name: "String" + } + } +}; + +export const zoom1: OperationQueryParameter = { + parameterPath: "zoom", + mapper: { + serializedName: "zoom", + required: true, + type: { + name: "Number" + } + } +}; + +export const xTileIndex: OperationQueryParameter = { + parameterPath: "xTileIndex", + mapper: { + serializedName: "x", + required: true, + type: { + name: "Number" + } + } +}; + +export const yTileIndex: OperationQueryParameter = { + parameterPath: "yTileIndex", + mapper: { + serializedName: "y", + required: true, + type: { + name: "Number" + } + } +}; + +export const tileSize: OperationQueryParameter = { + parameterPath: ["options", "tileSize"], + mapper: { + serializedName: "tileSize", + type: { + name: "String" + } + } +}; + +export const accept1: OperationParameter = { + parameterPath: "accept", + mapper: { + defaultValue: "application/vnd.mapbox-vector-tile, application/json", + isConstant: true, + serializedName: "Accept", + type: { + name: "String" + } + } +}; + +export const statesetId: OperationQueryParameter = { + parameterPath: "statesetId", + mapper: { + serializedName: "statesetId", + required: true, + type: { + name: "String" + } + } +}; + +export const accept2: OperationParameter = { + parameterPath: "accept", + mapper: { + defaultValue: "application/json", + isConstant: true, + serializedName: "Accept", + type: { + name: "String" + } + } +}; + +export const format2: OperationURLParameter = { + parameterPath: "format", + mapper: { + serializedName: "format", + required: true, + type: { + name: "String" + } + } +}; + +export const accept3: OperationParameter = { + parameterPath: "accept", + mapper: { + defaultValue: "application/json, image/jpeg, image/png", + isConstant: true, + serializedName: "Accept", + type: { + name: "String" + } + } +}; + +export const style2: OperationQueryParameter = { + parameterPath: "style", + mapper: { + serializedName: "style", + required: true, + type: { + name: "String" + } + } +}; + +export const mincoordinates: OperationQueryParameter = { + parameterPath: "mincoordinates", + mapper: { + serializedName: "mincoordinates", + required: true, + type: { + name: "String" + } + } +}; + +export const maxcoordinates: OperationQueryParameter = { + parameterPath: "maxcoordinates", + mapper: { + serializedName: "maxcoordinates", + required: true, + type: { + name: "String" + } + } +}; + +export const text: OperationQueryParameter = { + parameterPath: ["options", "text"], + mapper: { + serializedName: "text", + type: { + name: "String" + } + } +}; + +export const apiVersion1: OperationQueryParameter = { + parameterPath: "apiVersion", + mapper: { + defaultValue: "2.0", + isConstant: true, + serializedName: "api-version", + type: { + name: "String" + } + } +}; + +export const tilesetId: OperationQueryParameter = { + parameterPath: "tilesetId", + mapper: { + serializedName: "tilesetId", + required: true, + type: { + name: "String" + } + } +}; + +export const timeStamp: OperationQueryParameter = { + parameterPath: ["options", "timeStamp"], + mapper: { + serializedName: "timeStamp", + type: { + name: "String" + } + } +}; + +export const tileSize1: OperationQueryParameter = { + parameterPath: ["options", "tileSize"], + mapper: { + serializedName: "tileSize", + type: { + name: "String" + } + } +}; diff --git a/sdk/maps/maps-render/src/operations/index.ts b/sdk/maps/maps-render/src/operations/index.ts new file mode 100644 index 000000000000..46a2724214fc --- /dev/null +++ b/sdk/maps/maps-render/src/operations/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./render"; +export * from "./renderV2"; diff --git a/sdk/maps/maps-render/src/operations/render.ts b/sdk/maps/maps-render/src/operations/render.ts new file mode 100644 index 000000000000..17b71d9ce894 --- /dev/null +++ b/sdk/maps/maps-render/src/operations/render.ts @@ -0,0 +1,565 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { Render } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; +import * as Mappers from "../models/mappers"; +import * as Parameters from "../models/parameters"; +import { RenderClientContext } from "../renderClientContext"; +import { + RasterTileFormat, + RenderGetMapStaticImageOptionalParams, + RenderGetMapStaticImageResponse, + TileFormat, + MapTileLayer, + MapTileStyle, + RenderGetMapTileOptionalParams, + RenderGetMapTileResponse, + RenderGetMapStateTilePreviewOptionalParams, + RenderGetMapStateTilePreviewResponse, + TextFormat, + RenderGetCopyrightCaptionOptionalParams, + RenderGetCopyrightCaptionResponse, + MapImageryStyle, + RenderGetMapImageryTileOptionalParams, + RenderGetMapImageryTileResponse, + RenderGetCopyrightFromBoundingBoxOptionalParams, + RenderGetCopyrightFromBoundingBoxResponse, + RenderGetCopyrightForTileOptionalParams, + RenderGetCopyrightForTileResponse, + RenderGetCopyrightForWorldOptionalParams, + RenderGetCopyrightForWorldResponse +} from "../models"; + +/** Class representing a Render. */ +export class RenderImpl implements Render { + private readonly client: RenderClientContext; + + /** + * Initialize a new instance of the class Render class. + * @param client Reference to the service client + */ + constructor(client: RenderClientContext) { + this.client = client; + } + + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * The static image service renders a user-defined, rectangular image containing a map section using a + * zoom level from 0 to 20. The static image service renders a user-defined, rectangular image + * containing a map section using a zoom level from 0 to 20. The supported resolution range for the map + * image is from 1x1 to 8192x8192. If you are deciding when to use the static image service over the + * map tile service, you may want to consider how you would like to interact with the rendered map. If + * the map contents will be relatively unchanging, a static map is a good choice. If you want to + * support a lot of zooming, panning and changing of the map content, the map tile service would be a + * better choice. + * + * Service also provides Image Composition functionality to get a static image back with additional + * data like; pushpins and geometry overlays with following S0 and S1 capabilities. + * + * In S0 you can: + * - Render up to 5 pushpins specified in the request + * - Provide one custom image for the pins referenced in the request + * - Add labels to the pushpins + * + * In S1 you can: + * - Render pushpins through [Azure Maps Data Service](https://aka.ms/AzureMapsMapDataService) + * - Specify multiple pushpin styles + * - Provide custom pushpin images stored in [Azure Maps Data + * Service](https://aka.ms/AzureMapsMapDataService) + * - Render circle, polyline and polygon geometry types. + * - Render of supported GeoJSON geometry types uploaded through [Azure Maps Data + * Service](https://aka.ms/AzureMapsMapDataService) + * + * Please see [How-to-Guide](https://aka.ms/AzureMapsHowToGuideImageCompositor) for detailed examples. + * + * _Note_ : Either **center** or **bbox** parameter must be supplied to the + * API. + *

+ * The supported Lat and Lon ranges when using the **bbox** parameter, are as follows: + *

+ * + * |Zoom Level | Max Lon Range | Max Lat Range| + * |:----------|:----------------|:-------------| + * |0 | 360.0 | 170.0 | + * |1 | 360.0 | 170.0 | + * |2 | 360.0 | 170.0 | + * |3 | 360.0 | 170.0 | + * |4 | 360.0 | 170.0 | + * |5 | 180.0 | 85.0 | + * |6 | 90.0 | 42.5 | + * |7 | 45.0 | 21.25 | + * |8 | 22.5 | 10.625 | + * |9 | 11.25 | 5.3125 | + * |10 | 5.625 | 2.62625 | + * |11 | 2.8125 | 1.328125 | + * |12 | 1.40625 | 0.6640625 | + * |13 | 0.703125 | 0.33203125 | + * |14 | 0.3515625 | 0.166015625 | + * |15 | 0.17578125 | 0.0830078125 | + * |16 | 0.087890625 | 0.0415039063 | + * |17 | 0.0439453125 | 0.0207519531 | + * |18 | 0.0219726563 | 0.0103759766 | + * |19 | 0.0109863281 | 0.0051879883 | + * |20 | 0.0054931641 | 0.0025939941 | + * @param format Desired format of the response. Possible value: png. + * @param options The options parameters. + */ + getMapStaticImage( + format: RasterTileFormat, + options?: RenderGetMapStaticImageOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, options }, + getMapStaticImageOperationSpec + ); + } + + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Fetches map tiles in vector or raster format typically to be integrated into a new map control or + * SDK. By default, Azure uses vector map tiles for its web map control (see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid)) + * + * **Note**: Weather tiles are only available via [Get Map Tile V2 + * API](https://aka.ms/AzureMapsWeatherTiles). We recommend to start to use the new [Get Map Tile V2 + * API](https://aka.ms/GetMapTileV2). + * @param format Desired format of the response. Possible values are png & pbf. + * @param layer Map layer requested. Possible values are basic, hybrid, labels and terra. + * @param style Map style to be returned. Possible values are main, dark, and shaded_relief. + * @param zoom Zoom level for the desired tile. For _raster_ tiles, value must be in the range: 0-18 + * (inclusive). Terra raster tiles, values must be in the range 0-6 (inclusive). For _vector_ tiles, + * value must be in the range: 0-22 (inclusive). + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param options The options parameters. + */ + getMapTile( + format: TileFormat, + layer: MapTileLayer, + style: MapTileStyle, + zoom: number, + xTileIndex: number, + yTileIndex: number, + options?: RenderGetMapTileOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, layer, style, zoom, xTileIndex, yTileIndex, options }, + getMapTileOperationSpec + ); + } + + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Fetches state tiles in vector format typically to be integrated into indoor maps module of map + * control or SDK. The map control will call this API after user turns on dynamic styling (see [Zoom + * Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid)) + * @param zoom Zoom level for the desired tile. Zoom value must be in the range: 0-20 (inclusive). + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param statesetId The stateset id. + * @param options The options parameters. + */ + getMapStateTilePreview( + zoom: number, + xTileIndex: number, + yTileIndex: number, + statesetId: string, + options?: RenderGetMapStateTilePreviewOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { zoom, xTileIndex, yTileIndex, statesetId, options }, + getMapStateTilePreviewOperationSpec + ); + } + + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * + * Copyrights API is designed to serve copyright information for Render Tile + * service. In addition to basic copyright for the whole map, API is serving + * specific groups of copyrights for some countries. + * + * As an alternative to copyrights for map request, one can receive captions + * for displaying the map provider information on the map. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param options The options parameters. + */ + getCopyrightCaption( + format: TextFormat, + options?: RenderGetCopyrightCaptionOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, options }, + getCopyrightCaptionOperationSpec + ); + } + + /** + * **Applies to:** S1 pricing tier. + * + * + * This service returns a map image tile with size 256x256, given the x and y coordinates and zoom + * level. Zoom level ranges from 1 to 19. The current available style value is 'satellite' which + * provides satellite + * imagery alone. + * + * + * **Note**: We recommend to start to use the new [Get Map Tile V2 API](https://aka.ms/GetMapTileV2). + * @param format Desired format of the response. Possible value: png. + * @param style Map style to be returned. __Possible values:__ satellite. + * @param zoom Zoom level for the desired tile. Zoom value must be in the range: 1-19 (inclusive). + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param options The options parameters. + */ + getMapImageryTile( + format: RasterTileFormat, + style: MapImageryStyle, + zoom: number, + xTileIndex: number, + yTileIndex: number, + options?: RenderGetMapImageryTileOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, style, zoom, xTileIndex, yTileIndex, options }, + getMapImageryTileOperationSpec + ); + } + + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Returns copyright information for a given bounding box. Bounding-box requests should specify the + * minimum and maximum longitude and latitude (EPSG-3857) coordinates + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param mincoordinates Minimum coordinates of bounding box in latitude longitude coordinate system. + * E.g. 52.41064,4.84228 + * @param maxcoordinates Maximum coordinates of bounding box in latitude longitude coordinate system. + * E.g. 52.41064,4.84228 + * @param options The options parameters. + */ + getCopyrightFromBoundingBox( + format: TextFormat, + mincoordinates: string, + maxcoordinates: string, + options?: RenderGetCopyrightFromBoundingBoxOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, mincoordinates, maxcoordinates, options }, + getCopyrightFromBoundingBoxOperationSpec + ); + } + + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * + * Copyrights API is designed to serve copyright information for Render Tile service. In addition to + * basic copyright for the whole map, API is serving specific groups of copyrights for some countries. + * Returns the copyright information for a given tile. To obtain the copyright information for a + * particular tile, the request should specify the tile's zoom level and x and y coordinates (see: Zoom + * Levels and Tile Grid). + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param zoom Zoom level for the desired tile. Zoom value must be in the range: 0-18 (inclusive). + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param options The options parameters. + */ + getCopyrightForTile( + format: TextFormat, + zoom: number, + xTileIndex: number, + yTileIndex: number, + options?: RenderGetCopyrightForTileOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, zoom, xTileIndex, yTileIndex, options }, + getCopyrightForTileOperationSpec + ); + } + + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Copyrights API is designed to serve copyright information for Render Tile service. In addition to + * basic copyright for the whole map, API is serving specific groups of copyrights for some countries. + * Returns the copyright information for the world. To obtain the default copyright information for the + * whole world, do not specify a tile or bounding box. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param options The options parameters. + */ + getCopyrightForWorld( + format: TextFormat, + options?: RenderGetCopyrightForWorldOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, options }, + getCopyrightForWorldOperationSpec + ); + } +} +// Operation Specifications +const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); + +const getMapStaticImageOperationSpec: coreClient.OperationSpec = { + path: "/map/static/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: { + type: { name: "Stream" }, + serializedName: "parsedResponse" + }, + headersMapper: Mappers.RenderGetMapStaticImageHeaders + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.layer, + Parameters.style, + Parameters.zoom, + Parameters.center, + Parameters.bbox, + Parameters.height, + Parameters.width, + Parameters.language, + Parameters.view, + Parameters.pins, + Parameters.path + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getMapTileOperationSpec: coreClient.OperationSpec = { + path: "/map/tile/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: { + type: { name: "Stream" }, + serializedName: "parsedResponse" + }, + headersMapper: Mappers.RenderGetMapTileHeaders + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.language, + Parameters.view, + Parameters.layer1, + Parameters.style1, + Parameters.zoom1, + Parameters.xTileIndex, + Parameters.yTileIndex, + Parameters.tileSize + ], + urlParameters: [Parameters.geography, Parameters.format1], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getMapStateTilePreviewOperationSpec: coreClient.OperationSpec = { + path: "/map/statetile", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: { + type: { name: "Stream" }, + serializedName: "parsedResponse" + }, + headersMapper: Mappers.RenderGetMapStateTilePreviewHeaders + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.zoom1, + Parameters.xTileIndex, + Parameters.yTileIndex, + Parameters.statesetId + ], + urlParameters: [Parameters.geography], + headerParameters: [Parameters.xMsClientId, Parameters.accept1], + serializer +}; +const getCopyrightCaptionOperationSpec: coreClient.OperationSpec = { + path: "/map/copyright/caption/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.GetCopyrightCaptionResult + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.format2], + headerParameters: [Parameters.xMsClientId, Parameters.accept2], + serializer +}; +const getMapImageryTileOperationSpec: coreClient.OperationSpec = { + path: "/map/imagery/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: { + type: { name: "Stream" }, + serializedName: "parsedResponse" + }, + headersMapper: Mappers.RenderGetMapImageryTileHeaders + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.zoom1, + Parameters.xTileIndex, + Parameters.yTileIndex, + Parameters.style2 + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.xMsClientId, Parameters.accept3], + serializer +}; +const getCopyrightFromBoundingBoxOperationSpec: coreClient.OperationSpec = { + path: "/map/copyright/bounding/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.GetCopyrightFromBoundingBoxResult + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.mincoordinates, + Parameters.maxcoordinates, + Parameters.text + ], + urlParameters: [Parameters.geography, Parameters.format2], + headerParameters: [Parameters.xMsClientId, Parameters.accept2], + serializer +}; +const getCopyrightForTileOperationSpec: coreClient.OperationSpec = { + path: "/map/copyright/tile/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.GetCopyrightForTileResult + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.zoom1, + Parameters.xTileIndex, + Parameters.yTileIndex, + Parameters.text + ], + urlParameters: [Parameters.geography, Parameters.format2], + headerParameters: [Parameters.xMsClientId, Parameters.accept2], + serializer +}; +const getCopyrightForWorldOperationSpec: coreClient.OperationSpec = { + path: "/map/copyright/world/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.GetCopyrightForWorldResult + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion, Parameters.text], + urlParameters: [Parameters.geography, Parameters.format2], + headerParameters: [Parameters.xMsClientId, Parameters.accept2], + serializer +}; diff --git a/sdk/maps/maps-render/src/operations/renderV2.ts b/sdk/maps/maps-render/src/operations/renderV2.ts new file mode 100644 index 000000000000..c586903df589 --- /dev/null +++ b/sdk/maps/maps-render/src/operations/renderV2.ts @@ -0,0 +1,110 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { RenderV2 } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; +import * as Mappers from "../models/mappers"; +import * as Parameters from "../models/parameters"; +import { RenderClientContext } from "../renderClientContext"; +import { + TilesetID, + RenderV2GetMapTilePreviewOptionalParams, + RenderV2GetMapTilePreviewResponse +} from "../models"; + +/** Class representing a RenderV2. */ +export class RenderV2Impl implements RenderV2 { + private readonly client: RenderClientContext; + + /** + * Initialize a new instance of the class RenderV2 class. + * @param client Reference to the service client + */ + constructor(client: RenderClientContext) { + this.client = client; + } + + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * The Get Map Tiles API allows users to request map tiles in vector or raster formats typically to be + * integrated into a map control or SDK. Some example tiles that can be requested are Azure Maps road + * tiles, real-time Weather Radar tiles or the map tiles created using [Azure Maps + * Creator](https://aka.ms/amcreator). By default, Azure Maps uses vector tiles for its web map + * control (Web SDK) and Android SDK. + * @param tilesetId A tileset is a collection of raster or vector data broken up into a uniform grid of + * square tiles at preset zoom levels. Every tileset has a **tilesetId** to use when making requests. + * The **tilesetId** for tilesets created using [Azure Maps Creator](https://aka.ms/amcreator) are + * generated through the [Tileset Create API](https://docs.microsoft.com/en-us/rest/api/maps/tileset). + * The ready-to-use tilesets supplied by Azure Maps are listed below. For example, microsoft.base. + * @param zoom Zoom level for the desired tile. Please find TilesetID list below for more details on + * supported zoom level for each tilesetId.
+ * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param options The options parameters. + */ + getMapTilePreview( + tilesetId: TilesetID, + zoom: number, + xTileIndex: number, + yTileIndex: number, + options?: RenderV2GetMapTilePreviewOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { tilesetId, zoom, xTileIndex, yTileIndex, options }, + getMapTilePreviewOperationSpec + ); + } +} +// Operation Specifications +const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); + +const getMapTilePreviewOperationSpec: coreClient.OperationSpec = { + path: "/map/tile", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: { + type: { name: "Stream" }, + serializedName: "parsedResponse" + }, + headersMapper: Mappers.RenderV2GetMapTilePreviewHeaders + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.language, + Parameters.view, + Parameters.zoom1, + Parameters.xTileIndex, + Parameters.yTileIndex, + Parameters.apiVersion1, + Parameters.tilesetId, + Parameters.timeStamp, + Parameters.tileSize1 + ], + urlParameters: [Parameters.geography], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; diff --git a/sdk/maps/maps-render/src/operationsInterfaces/index.ts b/sdk/maps/maps-render/src/operationsInterfaces/index.ts new file mode 100644 index 000000000000..46a2724214fc --- /dev/null +++ b/sdk/maps/maps-render/src/operationsInterfaces/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./render"; +export * from "./renderV2"; diff --git a/sdk/maps/maps-render/src/operationsInterfaces/render.ts b/sdk/maps/maps-render/src/operationsInterfaces/render.ts new file mode 100644 index 000000000000..f25853d1b1c3 --- /dev/null +++ b/sdk/maps/maps-render/src/operationsInterfaces/render.ts @@ -0,0 +1,310 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { + RasterTileFormat, + RenderGetMapStaticImageOptionalParams, + RenderGetMapStaticImageResponse, + TileFormat, + MapTileLayer, + MapTileStyle, + RenderGetMapTileOptionalParams, + RenderGetMapTileResponse, + RenderGetMapStateTilePreviewOptionalParams, + RenderGetMapStateTilePreviewResponse, + TextFormat, + RenderGetCopyrightCaptionOptionalParams, + RenderGetCopyrightCaptionResponse, + MapImageryStyle, + RenderGetMapImageryTileOptionalParams, + RenderGetMapImageryTileResponse, + RenderGetCopyrightFromBoundingBoxOptionalParams, + RenderGetCopyrightFromBoundingBoxResponse, + RenderGetCopyrightForTileOptionalParams, + RenderGetCopyrightForTileResponse, + RenderGetCopyrightForWorldOptionalParams, + RenderGetCopyrightForWorldResponse +} from "../models"; + +/** Interface representing a Render. */ +export interface Render { + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * The static image service renders a user-defined, rectangular image containing a map section using a + * zoom level from 0 to 20. The static image service renders a user-defined, rectangular image + * containing a map section using a zoom level from 0 to 20. The supported resolution range for the map + * image is from 1x1 to 8192x8192. If you are deciding when to use the static image service over the + * map tile service, you may want to consider how you would like to interact with the rendered map. If + * the map contents will be relatively unchanging, a static map is a good choice. If you want to + * support a lot of zooming, panning and changing of the map content, the map tile service would be a + * better choice. + * + * Service also provides Image Composition functionality to get a static image back with additional + * data like; pushpins and geometry overlays with following S0 and S1 capabilities. + * + * In S0 you can: + * - Render up to 5 pushpins specified in the request + * - Provide one custom image for the pins referenced in the request + * - Add labels to the pushpins + * + * In S1 you can: + * - Render pushpins through [Azure Maps Data Service](https://aka.ms/AzureMapsMapDataService) + * - Specify multiple pushpin styles + * - Provide custom pushpin images stored in [Azure Maps Data + * Service](https://aka.ms/AzureMapsMapDataService) + * - Render circle, polyline and polygon geometry types. + * - Render of supported GeoJSON geometry types uploaded through [Azure Maps Data + * Service](https://aka.ms/AzureMapsMapDataService) + * + * Please see [How-to-Guide](https://aka.ms/AzureMapsHowToGuideImageCompositor) for detailed examples. + * + * _Note_ : Either **center** or **bbox** parameter must be supplied to the + * API. + *

+ * The supported Lat and Lon ranges when using the **bbox** parameter, are as follows: + *

+ * + * |Zoom Level | Max Lon Range | Max Lat Range| + * |:----------|:----------------|:-------------| + * |0 | 360.0 | 170.0 | + * |1 | 360.0 | 170.0 | + * |2 | 360.0 | 170.0 | + * |3 | 360.0 | 170.0 | + * |4 | 360.0 | 170.0 | + * |5 | 180.0 | 85.0 | + * |6 | 90.0 | 42.5 | + * |7 | 45.0 | 21.25 | + * |8 | 22.5 | 10.625 | + * |9 | 11.25 | 5.3125 | + * |10 | 5.625 | 2.62625 | + * |11 | 2.8125 | 1.328125 | + * |12 | 1.40625 | 0.6640625 | + * |13 | 0.703125 | 0.33203125 | + * |14 | 0.3515625 | 0.166015625 | + * |15 | 0.17578125 | 0.0830078125 | + * |16 | 0.087890625 | 0.0415039063 | + * |17 | 0.0439453125 | 0.0207519531 | + * |18 | 0.0219726563 | 0.0103759766 | + * |19 | 0.0109863281 | 0.0051879883 | + * |20 | 0.0054931641 | 0.0025939941 | + * @param format Desired format of the response. Possible value: png. + * @param options The options parameters. + */ + getMapStaticImage( + format: RasterTileFormat, + options?: RenderGetMapStaticImageOptionalParams + ): Promise; + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Fetches map tiles in vector or raster format typically to be integrated into a new map control or + * SDK. By default, Azure uses vector map tiles for its web map control (see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid)) + * + * **Note**: Weather tiles are only available via [Get Map Tile V2 + * API](https://aka.ms/AzureMapsWeatherTiles). We recommend to start to use the new [Get Map Tile V2 + * API](https://aka.ms/GetMapTileV2). + * @param format Desired format of the response. Possible values are png & pbf. + * @param layer Map layer requested. Possible values are basic, hybrid, labels and terra. + * @param style Map style to be returned. Possible values are main, dark, and shaded_relief. + * @param zoom Zoom level for the desired tile. For _raster_ tiles, value must be in the range: 0-18 + * (inclusive). Terra raster tiles, values must be in the range 0-6 (inclusive). For _vector_ tiles, + * value must be in the range: 0-22 (inclusive). + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param options The options parameters. + */ + getMapTile( + format: TileFormat, + layer: MapTileLayer, + style: MapTileStyle, + zoom: number, + xTileIndex: number, + yTileIndex: number, + options?: RenderGetMapTileOptionalParams + ): Promise; + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Fetches state tiles in vector format typically to be integrated into indoor maps module of map + * control or SDK. The map control will call this API after user turns on dynamic styling (see [Zoom + * Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid)) + * @param zoom Zoom level for the desired tile. Zoom value must be in the range: 0-20 (inclusive). + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param statesetId The stateset id. + * @param options The options parameters. + */ + getMapStateTilePreview( + zoom: number, + xTileIndex: number, + yTileIndex: number, + statesetId: string, + options?: RenderGetMapStateTilePreviewOptionalParams + ): Promise; + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * + * Copyrights API is designed to serve copyright information for Render Tile + * service. In addition to basic copyright for the whole map, API is serving + * specific groups of copyrights for some countries. + * + * As an alternative to copyrights for map request, one can receive captions + * for displaying the map provider information on the map. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param options The options parameters. + */ + getCopyrightCaption( + format: TextFormat, + options?: RenderGetCopyrightCaptionOptionalParams + ): Promise; + /** + * **Applies to:** S1 pricing tier. + * + * + * This service returns a map image tile with size 256x256, given the x and y coordinates and zoom + * level. Zoom level ranges from 1 to 19. The current available style value is 'satellite' which + * provides satellite + * imagery alone. + * + * + * **Note**: We recommend to start to use the new [Get Map Tile V2 API](https://aka.ms/GetMapTileV2). + * @param format Desired format of the response. Possible value: png. + * @param style Map style to be returned. __Possible values:__ satellite. + * @param zoom Zoom level for the desired tile. Zoom value must be in the range: 1-19 (inclusive). + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param options The options parameters. + */ + getMapImageryTile( + format: RasterTileFormat, + style: MapImageryStyle, + zoom: number, + xTileIndex: number, + yTileIndex: number, + options?: RenderGetMapImageryTileOptionalParams + ): Promise; + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Returns copyright information for a given bounding box. Bounding-box requests should specify the + * minimum and maximum longitude and latitude (EPSG-3857) coordinates + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param mincoordinates Minimum coordinates of bounding box in latitude longitude coordinate system. + * E.g. 52.41064,4.84228 + * @param maxcoordinates Maximum coordinates of bounding box in latitude longitude coordinate system. + * E.g. 52.41064,4.84228 + * @param options The options parameters. + */ + getCopyrightFromBoundingBox( + format: TextFormat, + mincoordinates: string, + maxcoordinates: string, + options?: RenderGetCopyrightFromBoundingBoxOptionalParams + ): Promise; + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * + * Copyrights API is designed to serve copyright information for Render Tile service. In addition to + * basic copyright for the whole map, API is serving specific groups of copyrights for some countries. + * Returns the copyright information for a given tile. To obtain the copyright information for a + * particular tile, the request should specify the tile's zoom level and x and y coordinates (see: Zoom + * Levels and Tile Grid). + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param zoom Zoom level for the desired tile. Zoom value must be in the range: 0-18 (inclusive). + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param options The options parameters. + */ + getCopyrightForTile( + format: TextFormat, + zoom: number, + xTileIndex: number, + yTileIndex: number, + options?: RenderGetCopyrightForTileOptionalParams + ): Promise; + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Copyrights API is designed to serve copyright information for Render Tile service. In addition to + * basic copyright for the whole map, API is serving specific groups of copyrights for some countries. + * Returns the copyright information for the world. To obtain the default copyright information for the + * whole world, do not specify a tile or bounding box. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param options The options parameters. + */ + getCopyrightForWorld( + format: TextFormat, + options?: RenderGetCopyrightForWorldOptionalParams + ): Promise; +} diff --git a/sdk/maps/maps-render/src/operationsInterfaces/renderV2.ts b/sdk/maps/maps-render/src/operationsInterfaces/renderV2.ts new file mode 100644 index 000000000000..e3180fd984dc --- /dev/null +++ b/sdk/maps/maps-render/src/operationsInterfaces/renderV2.ts @@ -0,0 +1,57 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { + TilesetID, + RenderV2GetMapTilePreviewOptionalParams, + RenderV2GetMapTilePreviewResponse +} from "../models"; + +/** Interface representing a RenderV2. */ +export interface RenderV2 { + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * The Get Map Tiles API allows users to request map tiles in vector or raster formats typically to be + * integrated into a map control or SDK. Some example tiles that can be requested are Azure Maps road + * tiles, real-time Weather Radar tiles or the map tiles created using [Azure Maps + * Creator](https://aka.ms/amcreator). By default, Azure Maps uses vector tiles for its web map + * control (Web SDK) and Android SDK. + * @param tilesetId A tileset is a collection of raster or vector data broken up into a uniform grid of + * square tiles at preset zoom levels. Every tileset has a **tilesetId** to use when making requests. + * The **tilesetId** for tilesets created using [Azure Maps Creator](https://aka.ms/amcreator) are + * generated through the [Tileset Create API](https://docs.microsoft.com/en-us/rest/api/maps/tileset). + * The ready-to-use tilesets supplied by Azure Maps are listed below. For example, microsoft.base. + * @param zoom Zoom level for the desired tile. Please find TilesetID list below for more details on + * supported zoom level for each tilesetId.
+ * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param options The options parameters. + */ + getMapTilePreview( + tilesetId: TilesetID, + zoom: number, + xTileIndex: number, + yTileIndex: number, + options?: RenderV2GetMapTilePreviewOptionalParams + ): Promise; +} diff --git a/sdk/maps/maps-render/src/renderClient.ts b/sdk/maps/maps-render/src/renderClient.ts new file mode 100644 index 000000000000..af30456e1efd --- /dev/null +++ b/sdk/maps/maps-render/src/renderClient.ts @@ -0,0 +1,32 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreAuth from "@azure/core-auth"; +import { RenderImpl, RenderV2Impl } from "./operations"; +import { Render, RenderV2 } from "./operationsInterfaces"; +import { RenderClientContext } from "./renderClientContext"; +import { RenderClientOptionalParams } from "./models"; + +export class RenderClient extends RenderClientContext { + /** + * Initializes a new instance of the RenderClient class. + * @param credentials Subscription credentials which uniquely identify client subscription. + * @param options The parameter options + */ + constructor( + credentials: coreAuth.TokenCredential, + options?: RenderClientOptionalParams + ) { + super(credentials, options); + this.render = new RenderImpl(this); + this.renderV2 = new RenderV2Impl(this); + } + + render: Render; + renderV2: RenderV2; +} diff --git a/sdk/maps/maps-render/src/renderClientContext.ts b/sdk/maps/maps-render/src/renderClientContext.ts new file mode 100644 index 000000000000..9a1fea2a958a --- /dev/null +++ b/sdk/maps/maps-render/src/renderClientContext.ts @@ -0,0 +1,61 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; +import * as coreAuth from "@azure/core-auth"; +import { Geography, RenderClientOptionalParams } from "./models"; + +export class RenderClientContext extends coreClient.ServiceClient { + geography: Geography; + xMsClientId?: string; + + /** + * Initializes a new instance of the RenderClientContext class. + * @param credentials Subscription credentials which uniquely identify client subscription. + * @param options The parameter options + */ + constructor( + credentials: coreAuth.TokenCredential, + options?: RenderClientOptionalParams + ) { + if (credentials === undefined) { + throw new Error("'credentials' cannot be null"); + } + + // Initializing default values for options + if (!options) { + options = {}; + } + const defaults: RenderClientOptionalParams = { + requestContentType: "application/json; charset=utf-8", + credential: credentials + }; + + const packageDetails = `azsdk-js-maps-render/1.0.0-beta.1`; + const userAgentPrefix = + options.userAgentOptions && options.userAgentOptions.userAgentPrefix + ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` + : `${packageDetails}`; + + if (!options.credentialScopes) { + options.credentialScopes = ["https://atlas.microsoft.com/.default"]; + } + const optionsWithDefaults = { + ...defaults, + ...options, + userAgentOptions: { + userAgentPrefix + }, + baseUri: options.endpoint || "https://{geography}.atlas.microsoft.com" + }; + super(optionsWithDefaults); + + // Assigning values to Constant parameters + this.geography = options.geography || "us"; + } +} diff --git a/sdk/maps/maps-render/tsconfig.json b/sdk/maps/maps-render/tsconfig.json new file mode 100644 index 000000000000..0ec8659c8e83 --- /dev/null +++ b/sdk/maps/maps-render/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "module": "es6", + "moduleResolution": "node", + "strict": true, + "target": "es6", + "sourceMap": true, + "declarationMap": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "preserveConstEnums": true, + "lib": ["es6", "dom"], + "declaration": true, + "outDir": "./esm", + "importHelpers": true + }, + "include": ["./src/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/sdk/maps/maps-route/LICENSE.txt b/sdk/maps/maps-route/LICENSE.txt new file mode 100644 index 000000000000..ccb63b166732 --- /dev/null +++ b/sdk/maps/maps-route/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2021 Microsoft + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/sdk/maps/maps-route/README.md b/sdk/maps/maps-route/README.md new file mode 100644 index 000000000000..9342c4a84d13 --- /dev/null +++ b/sdk/maps/maps-route/README.md @@ -0,0 +1,91 @@ +# Azure Route client library for JavaScript + +This package contains an isomorphic SDK (runs both in Node.js and in browsers) for Azure Route client. + +Azure Maps Route REST APIs + +[Source code](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-route) | +[Package (NPM)](https://www.npmjs.com/package/@azure/maps-route) | +[API reference documentation](https://docs.microsoft.com/javascript/api/@azure/maps-route) | +[Samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-route/samples) + +## Getting started + +### Currently supported environments + +- [LTS versions of Node.js](https://nodejs.org/about/releases/) +- Latest versions of Safari, Chrome, Edge and Firefox. + +### Prerequisites + +- An [Azure subscription][azure_sub]. + +### Install the `@azure/maps-route` package + +Install the Azure Route client library for JavaScript with `npm`: + +```bash +npm install @azure/maps-route +``` + +### Create and authenticate a `RouteClient` + +To create a client object to access the Azure Route API, you will need the `endpoint` of your Azure Route resource and a `credential`. The Azure Route client can use Azure Active Directory credentials to authenticate. +You can find the endpoint for your Azure Route resource in the [Azure Portal][azure_portal]. + +#### Using an Azure Active Directory Credential + +You can authenticate with Azure Active Directory using the [Azure Identity library][azure_identity]. To use the [DefaultAzureCredential][defaultazurecredential] provider shown below, or other credential providers provided with the Azure SDK, please install the `@azure/identity` package: + +```bash +npm install @azure/identity +``` + +You will also need to register a new AAD application and grant access to Azure Route by assigning the suitable role to your service principal (note: roles such as `"Owner"` will not grant the necessary permissions). +Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`. + +```javascript +const { RouteClient } = require("@azure/maps-route"); +const { DefaultAzureCredential } = require("@azure/identity"); +const client = new RouteClient("", new DefaultAzureCredential()); +``` + +## Key concepts + +### RouteClient + +`RouteClient` is the primary interface for developers using the Azure Route client library. Explore the methods on this client object to understand the different features of the Azure Route service that you can access. + +## Troubleshooting + +### Logging + +Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: + +```javascript +import { setLogLevel } from "@azure/logger"; +setLogLevel("info"); +``` + +For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger). + +## Next steps + +Please take a look at the [samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-route/samples) directory for detailed examples on how to use this library. + +## Contributing + +If you'd like to contribute to this library, please read the [contributing guide](https://github.com/Azure/azure-sdk-for-js/blob/master/CONTRIBUTING.md) to learn more about how to build and test the code. + +## Related projects + +- [Microsoft Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) + +![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fmaps%2Fmaps-route%2FREADME.png) + +[azure_cli]: https://docs.microsoft.com/cli/azure +[azure_sub]: https://azure.microsoft.com/free/ +[azure_sub]: https://azure.microsoft.com/free/ +[azure_portal]: https://portal.azure.com +[azure_identity]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity +[defaultazurecredential]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity#defaultazurecredential diff --git a/sdk/maps/maps-route/api-extractor.json b/sdk/maps/maps-route/api-extractor.json new file mode 100644 index 000000000000..5fb5b21b56f2 --- /dev/null +++ b/sdk/maps/maps-route/api-extractor.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "mainEntryPointFilePath": "./esm/index.d.ts", + "docModel": { "enabled": true }, + "apiReport": { "enabled": true, "reportFolder": "./review" }, + "dtsRollup": { + "enabled": true, + "untrimmedFilePath": "", + "publicTrimmedFilePath": "./esm/index.d.ts" + }, + "messages": { + "tsdocMessageReporting": { "default": { "logLevel": "none" } }, + "extractorMessageReporting": { + "ae-missing-release-tag": { "logLevel": "none" }, + "ae-unresolved-link": { "logLevel": "none" } + } + } +} diff --git a/sdk/maps/maps-route/package.json b/sdk/maps/maps-route/package.json new file mode 100644 index 000000000000..16b264a37664 --- /dev/null +++ b/sdk/maps/maps-route/package.json @@ -0,0 +1,86 @@ +{ + "name": "@azure/maps-route", + "sdk-type": "client", + "author": "Microsoft Corporation", + "description": "A generated SDK for RouteClient.", + "version": "1.0.0-beta.1", + "engines": { "node": ">=12.0.0" }, + "dependencies": { + "@azure/core-lro": "^1.0.6", + "@azure/abort-controller": "^1.0.0", + "@azure/core-client": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-rest-pipeline": "^1.1.0", + "tslib": "^2.2.0" + }, + "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], + "license": "MIT", + "main": "./dist/index.js", + "module": "./esm/index.js", + "types": "./esm/index.d.ts", + "devDependencies": { + "@microsoft/api-extractor": "7.7.11", + "@rollup/plugin-commonjs": "11.0.2", + "@rollup/plugin-json": "^4.0.0", + "@rollup/plugin-multi-entry": "^3.0.0", + "@rollup/plugin-node-resolve": "^8.0.0", + "mkdirp": "^1.0.4", + "rollup": "^1.16.3", + "rollup-plugin-sourcemaps": "^0.4.2", + "rollup-plugin-node-resolve": "^3.4.0", + "typescript": "~4.2.0", + "uglify-js": "^3.4.9" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js", + "repository": { + "type": "git", + "url": "https://github.com/Azure/azure-sdk-for-js.git" + }, + "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, + "files": [ + "dist/**/*.js", + "dist/**/*.js.map", + "dist/**/*.d.ts", + "dist/**/*.d.ts.map", + "esm/**/*.js", + "esm/**/*.js.map", + "esm/**/*.d.ts", + "esm/**/*.d.ts.map", + "src/**/*.ts", + "README.md", + "rollup.config.js", + "tsconfig.json", + "review/*", + "CHANGELOG.md" + ], + "scripts": { + "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", + "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js", + "prepack": "npm install && npm run build", + "pack": "npm pack 2>&1", + "extract-api": "mkdirp ./review && api-extractor run --local", + "lint": "echo skipped", + "audit": "echo skipped", + "clean": "echo skipped", + "build:node": "echo skipped", + "build:browser": "echo skipped", + "build:test": "echo skipped", + "build:samples": "echo skipped.", + "check-format": "echo skipped", + "execute:samples": "echo skipped", + "format": "echo skipped", + "test": "echo skipped", + "prebuild": "echo skipped", + "test:node": "echo skipped", + "test:browser": "echo skipped", + "unit-test": "echo skipped", + "unit-test:node": "echo skipped", + "unit-test:browser": "echo skipped", + "integration-test:browser": "echo skipped", + "integration-test:node": "echo skipped", + "integration-test": "echo skipped", + "docs": "echo skipped" + }, + "sideEffects": false, + "autoPublish": true +} diff --git a/sdk/maps/maps-route/review/maps-route.api.md b/sdk/maps/maps-route/review/maps-route.api.md new file mode 100644 index 000000000000..112bebaf9259 --- /dev/null +++ b/sdk/maps/maps-route/review/maps-route.api.md @@ -0,0 +1,882 @@ +## API Report File for "@azure/maps-route" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import * as coreAuth from '@azure/core-auth'; +import * as coreClient from '@azure/core-client'; +import { PollerLike } from '@azure/core-lro'; +import { PollOperationState } from '@azure/core-lro'; + +// @public +export type AlternativeRouteType = string; + +// @public +export interface BatchItem { + readonly statusCode?: number; +} + +// @public +export interface BatchRequestBody { + batchItems?: BatchRequestBodyBatchItemsItem[]; +} + +// @public +export interface BatchRequestBodyBatchItemsItem { + query?: string; +} + +// @public +export interface BatchResponse { + readonly summary?: BatchResponseSummary; +} + +// @public +export interface BatchResponseSummary { + readonly successfulRequests?: number; + readonly totalRequests?: number; +} + +// @public +export type ComputeTravelTimeFor = string; + +// @public +export interface CoordinatesPair { + latitude?: number; + longitude?: number; +} + +// @public +export type DrivingSide = string; + +// @public +export interface ErrorAdditionalInfo { + readonly info?: Record; + readonly type?: string; +} + +// @public +export interface ErrorDetail { + readonly additionalInfo?: ErrorAdditionalInfo[]; + readonly code?: string; + readonly details?: ErrorDetail[]; + readonly message?: string; + readonly target?: string; +} + +// @public +export interface ErrorResponse { + error?: ErrorDetail; +} + +// @public +export type GeographicResourceLocation = string; + +// @public +export type Geography = string; + +// @public +export type GeoJsonFeature = GeoJsonObject & GeoJsonFeatureData & { + type: "Feature"; +}; + +// @public +export type GeoJsonFeatureCollection = GeoJsonObject & GeoJsonFeatureCollectionData & { + type: "FeatureCollection"; +}; + +// @public (undocumented) +export interface GeoJsonFeatureCollectionData { + features: GeoJsonFeature[]; +} + +// @public (undocumented) +export interface GeoJsonFeatureData { + featureType?: string; + geometry: GeoJsonGeometryUnion; + id?: string; + properties?: Record; +} + +// @public +export type GeoJsonGeometry = GeoJsonObject & { + type: "GeoJsonGeometry" | "MultiPoint" | "MultiPolygon" | "Point" | "LineString" | "MultiLineString" | "Polygon" | "GeometryCollection"; +}; + +// @public +export type GeoJsonGeometryCollection = GeoJsonGeometry & GeoJsonGeometryCollectionData & {}; + +// @public (undocumented) +export interface GeoJsonGeometryCollectionData { + geometries: GeoJsonGeometryUnion[]; +} + +// @public (undocumented) +export type GeoJsonGeometryUnion = GeoJsonGeometry | GeoJsonMultiPoint | GeoJsonMultiPolygon | GeoJsonPoint | GeoJsonLineString | GeoJsonMultiLineString | GeoJsonPolygon | GeoJsonGeometryCollection; + +// @public +export type GeoJsonLineString = GeoJsonGeometry & GeoJsonLineStringData & {}; + +// @public (undocumented) +export interface GeoJsonLineStringData { + coordinates: number[][]; +} + +// @public +export type GeoJsonMultiLineString = GeoJsonGeometry & GeoJsonMultiLineStringData & {}; + +// @public (undocumented) +export interface GeoJsonMultiLineStringData { + coordinates: number[][][]; +} + +// @public +export type GeoJsonMultiPoint = GeoJsonGeometry & GeoJsonMultiPointData & {}; + +// @public +export interface GeoJsonMultiPointData { + coordinates: number[][]; +} + +// @public +export type GeoJsonMultiPolygon = GeoJsonGeometry & GeoJsonMultiPolygonData & {}; + +// @public (undocumented) +export interface GeoJsonMultiPolygonData { + coordinates: number[][][][]; +} + +// @public +export interface GeoJsonObject { + type: "GeoJsonGeometry" | "MultiPoint" | "MultiPolygon" | "Point" | "LineString" | "MultiLineString" | "Polygon" | "GeometryCollection" | "Feature" | "FeatureCollection"; +} + +// @public +export type GeoJsonObjectType = string; + +// @public (undocumented) +export type GeoJsonObjectUnion = GeoJsonObject | GeoJsonGeometryUnion | GeoJsonFeature | GeoJsonFeatureCollection; + +// @public +export type GeoJsonPoint = GeoJsonGeometry & GeoJsonPointData & {}; + +// @public +export interface GeoJsonPointData { + coordinates: number[]; +} + +// @public +export type GeoJsonPolygon = GeoJsonGeometry & GeoJsonPolygonData & {}; + +// @public (undocumented) +export interface GeoJsonPolygonData { + coordinates: number[][][]; +} + +// @public +export interface GetRouteRangeResponse { + readonly formatVersion?: string; + reachableRange?: RouteRange; + report?: RouteResponseReport; +} + +// @public +export type GuidanceInstructionType = string; + +// @public +export type GuidanceManeuver = string; + +// @public +export type HillinessDegree = string; + +// @public +export type JunctionType = string; + +// @public +export const enum KnownAlternativeRouteType { + AnyRoute = "anyRoute", + BetterRoute = "betterRoute" +} + +// @public +export const enum KnownComputeTravelTimeFor { + All = "all", + None = "none" +} + +// @public +export const enum KnownDrivingSide { + Left = "LEFT", + Right = "RIGHT" +} + +// @public +export const enum KnownGeographicResourceLocation { + Eu = "eu", + Us = "us" +} + +// @public +export const enum KnownGeography { + // (undocumented) + Eu = "eu", + // (undocumented) + Us = "us" +} + +// @public +export const enum KnownGeoJsonObjectType { + GeoJsonFeature = "Feature", + GeoJsonFeatureCollection = "FeatureCollection", + GeoJsonGeometryCollection = "GeometryCollection", + GeoJsonLineString = "LineString", + GeoJsonMultiLineString = "MultiLineString", + GeoJsonMultiPoint = "MultiPoint", + GeoJsonMultiPolygon = "MultiPolygon", + GeoJsonPoint = "Point", + GeoJsonPolygon = "Polygon" +} + +// @public +export const enum KnownGuidanceInstructionType { + DirectionInfo = "DIRECTION_INFO", + LocationArrival = "LOCATION_ARRIVAL", + LocationDeparture = "LOCATION_DEPARTURE", + LocationWaypoint = "LOCATION_WAYPOINT", + RoadChange = "ROAD_CHANGE", + Turn = "TURN" +} + +// @public +export const enum KnownGuidanceManeuver { + Arrive = "ARRIVE", + ArriveLeft = "ARRIVE_LEFT", + ArriveRight = "ARRIVE_RIGHT", + BearLeft = "BEAR_LEFT", + BearRight = "BEAR_RIGHT", + Depart = "DEPART", + EnterFreeway = "ENTER_FREEWAY", + EnterHighway = "ENTER_HIGHWAY", + EnterMotorway = "ENTER_MOTORWAY", + EntranceRamp = "ENTRANCE_RAMP", + Follow = "FOLLOW", + KeepLeft = "KEEP_LEFT", + KeepRight = "KEEP_RIGHT", + MakeUturn = "MAKE_UTURN", + MotorwayExitLeft = "MOTORWAY_EXIT_LEFT", + MotorwayExitRight = "MOTORWAY_EXIT_RIGHT", + RoundaboutBack = "ROUNDABOUT_BACK", + RoundaboutCross = "ROUNDABOUT_CROSS", + RoundaboutLeft = "ROUNDABOUT_LEFT", + RoundaboutRight = "ROUNDABOUT_RIGHT", + SharpLeft = "SHARP_LEFT", + SharpRight = "SHARP_RIGHT", + Straight = "STRAIGHT", + SwitchMainRoad = "SWITCH_MAIN_ROAD", + SwitchParallelRoad = "SWITCH_PARALLEL_ROAD", + TakeExit = "TAKE_EXIT", + TakeFerry = "TAKE_FERRY", + TRYMakeUturn = "TRY_MAKE_UTURN", + TurnLeft = "TURN_LEFT", + TurnRight = "TURN_RIGHT", + WaypointLeft = "WAYPOINT_LEFT", + WaypointReached = "WAYPOINT_REACHED", + WaypointRight = "WAYPOINT_RIGHT" +} + +// @public +export const enum KnownHillinessDegree { + High = "high", + Low = "low", + Normal = "normal" +} + +// @public +export const enum KnownJunctionType { + Bifurcation = "BIFURCATION", + Regular = "REGULAR", + Roundabout = "ROUNDABOUT" +} + +// @public +export const enum KnownMagnitudeOfDelay { + Four = "4", + One = "1", + Three = "3", + Two = "2", + Zero = "0" +} + +// @public +export const enum KnownResponseFormat { + Json = "json" +} + +// @public +export const enum KnownRouteAvoidType { + AlreadyUsedRoads = "alreadyUsedRoads", + BorderCrossings = "borderCrossings", + Carpools = "carpools", + Ferries = "ferries", + Motorways = "motorways", + TollRoads = "tollRoads", + UnpavedRoads = "unpavedRoads" +} + +// @public +export const enum KnownRouteInstructionsType { + Coded = "coded", + Tagged = "tagged", + Text = "text" +} + +// @public +export const enum KnownRouteRepresentation { + None = "none", + Polyline = "polyline", + SummaryOnly = "summaryOnly" +} + +// @public +export const enum KnownRouteType { + Eco = "eco", + Fastest = "fastest", + Shortest = "shortest", + Thrilling = "thrilling" +} + +// @public +export const enum KnownSectionType { + CarTrain = "carTrain", + Country = "country", + Ferry = "ferry", + Motorway = "motorway", + Pedestrian = "pedestrian", + TollRoad = "tollRoad", + TollVignette = "tollVignette", + Traffic = "traffic", + TravelMode = "travelMode", + Tunnel = "tunnel" +} + +// @public +export const enum KnownTextFormat { + Json = "json", + Xml = "xml" +} + +// @public +export const enum KnownTravelMode { + Bicycle = "bicycle", + Bus = "bus", + Car = "car", + Motorcycle = "motorcycle", + Pedestrian = "pedestrian", + Taxi = "taxi", + Truck = "truck", + Van = "van" +} + +// @public +export const enum KnownVehicleEngineType { + Combustion = "combustion", + Electric = "electric" +} + +// @public +export const enum KnownVehicleLoadType { + OtherHazmatExplosive = "otherHazmatExplosive", + OtherHazmatGeneral = "otherHazmatGeneral", + OtherHazmatHarmfulToWater = "otherHazmatHarmfulToWater", + USHazmatClass1 = "USHazmatClass1", + USHazmatClass2 = "USHazmatClass2", + USHazmatClass3 = "USHazmatClass3", + USHazmatClass4 = "USHazmatClass4", + USHazmatClass5 = "USHazmatClass5", + USHazmatClass6 = "USHazmatClass6", + USHazmatClass7 = "USHazmatClass7", + USHazmatClass8 = "USHazmatClass8", + USHazmatClass9 = "USHazmatClass9" +} + +// @public +export const enum KnownWindingnessLevel { + High = "high", + Low = "low", + Normal = "normal" +} + +// @public +export type MagnitudeOfDelay = string; + +// @public +export interface PostRouteDirectionsRequestBody { + allowVignette?: string[]; + avoidAreas?: GeoJsonMultiPolygon; + avoidVignette?: string[]; + supportingPoints?: Record; +} + +// @public +export interface PostRouteMatrixRequestBody { + destinations?: GeoJsonMultiPoint; + origins?: GeoJsonMultiPoint; +} + +// @public +export type ResponseFormat = string; + +// @public +export interface Route { + beginPostRouteDirectionsBatch(format: ResponseFormat, postRouteDirectionsBatchRequestBody: BatchRequestBody, options?: RoutePostRouteDirectionsBatchOptionalParams): Promise, RoutePostRouteDirectionsBatchResponse>>; + beginPostRouteDirectionsBatchAndWait(format: ResponseFormat, postRouteDirectionsBatchRequestBody: BatchRequestBody, options?: RoutePostRouteDirectionsBatchOptionalParams): Promise; + beginPostRouteMatrix(format: ResponseFormat, postRouteMatrixRequestBody: PostRouteMatrixRequestBody, options?: RoutePostRouteMatrixOptionalParams): Promise, RoutePostRouteMatrixResponse>>; + beginPostRouteMatrixAndWait(format: ResponseFormat, postRouteMatrixRequestBody: PostRouteMatrixRequestBody, options?: RoutePostRouteMatrixOptionalParams): Promise; + getRouteDirections(format: TextFormat, query: string, options?: RouteGetRouteDirectionsOptionalParams): Promise; + getRouteRange(format: TextFormat, query: string, options?: RouteGetRouteRangeOptionalParams): Promise; + postRouteDirections(format: TextFormat, query: string, postRouteDirectionsRequestBody: PostRouteDirectionsRequestBody, options?: RoutePostRouteDirectionsOptionalParams): Promise; + postRouteDirectionsBatchSync(format: ResponseFormat, postRouteDirectionsBatchRequestBody: BatchRequestBody, options?: RoutePostRouteDirectionsBatchSyncOptionalParams): Promise; + postRouteMatrixSync(format: ResponseFormat, postRouteMatrixRequestBody: PostRouteMatrixRequestBody, options?: RoutePostRouteMatrixSyncOptionalParams): Promise; +} + +// @public +export type RouteAvoidType = string; + +// @public (undocumented) +export class RouteClient extends RouteClientContext { + constructor(credentials: coreAuth.TokenCredential, options?: RouteClientOptionalParams); + // (undocumented) + route: Route; +} + +// @public (undocumented) +export class RouteClientContext extends coreClient.ServiceClient { + constructor(credentials: coreAuth.TokenCredential, options?: RouteClientOptionalParams); + // (undocumented) + apiVersion: string; + // (undocumented) + geography: Geography; + // (undocumented) + xMsClientId?: string; +} + +// @public +export interface RouteClientOptionalParams extends coreClient.ServiceClientOptions { + apiVersion?: string; + endpoint?: string; + geography?: Geography; + xMsClientId?: string; +} + +// @public +export type RouteDirectionsBatchItem = BatchItem & { + readonly response?: RouteDirectionsBatchItemResponse; +}; + +// @public +export type RouteDirectionsBatchItemResponse = RouteDirectionsResponse & ErrorResponse & {}; + +// @public +export type RouteDirectionsBatchResponse = BatchResponse & { + readonly batchItems?: RouteDirectionsBatchItem[]; +}; + +// @public +export interface RouteDirectionsResponse { + readonly formatVersion?: string; + readonly optimizedWaypoints?: RouteOptimizedWaypoint[]; + report?: RouteResponseReport; + readonly routes?: RouteDirectionsResult[]; +} + +// @public (undocumented) +export interface RouteDirectionsResult { + readonly guidance?: RouteResultGuidance; + readonly legs?: RouteResultLeg[]; + readonly sections?: RouteResultSection[]; + readonly summary?: RouteDirectionsSummary; +} + +// @public +export interface RouteDirectionsSummary { + readonly arrivalTime?: string; + readonly departureTime?: string; + readonly lengthInMeters?: number; + readonly trafficDelayInSeconds?: number; + readonly travelTimeInSeconds?: number; +} + +// @public +export interface RouteGetRouteDirectionsOptionalParams extends coreClient.OperationOptions { + accelerationEfficiency?: number; + alternativeType?: AlternativeRouteType; + arriveAt?: Date; + auxiliaryPowerInkW?: string; + auxiliaryPowerInLitersPerHour?: number; + avoid?: RouteAvoidType[]; + computeBestOrder?: boolean; + computeTravelTimeFor?: ComputeTravelTimeFor; + constantSpeedConsumptionInkWhPerHundredkm?: string; + constantSpeedConsumptionInLitersPerHundredkm?: number; + currentChargeInkWh?: string; + currentFuelInLiters?: number; + decelerationEfficiency?: number; + departAt?: Date; + downhillEfficiency?: number; + fuelEnergyDensityInMJoulesPerLiter?: number; + hilliness?: HillinessDegree; + instructionsType?: RouteInstructionsType; + language?: string; + maxAlternatives?: number; + maxChargeInkWh?: string; + minDeviationDistance?: number; + minDeviationTime?: number; + report?: string; + routeRepresentation?: RouteRepresentation; + routeType?: RouteType; + sectionType?: SectionType; + traffic?: boolean; + travelMode?: TravelMode; + uphillEfficiency?: number; + vehicleAxleWeight?: number; + vehicleCommercial?: boolean; + vehicleEngineType?: VehicleEngineType; + vehicleHeading?: number; + vehicleHeight?: number; + vehicleLength?: number; + vehicleLoadType?: VehicleLoadType; + vehicleMaxSpeed?: number; + vehicleWeight?: number; + vehicleWidth?: number; + windingness?: WindingnessLevel; +} + +// @public +export type RouteGetRouteDirectionsResponse = RouteDirectionsResponse; + +// @public +export interface RouteGetRouteRangeOptionalParams extends coreClient.OperationOptions { + accelerationEfficiency?: number; + auxiliaryPowerInkW?: string; + auxiliaryPowerInLitersPerHour?: number; + avoid?: RouteAvoidType[]; + constantSpeedConsumptionInkWhPerHundredkm?: string; + constantSpeedConsumptionInLitersPerHundredkm?: number; + currentChargeInkWh?: string; + currentFuelInLiters?: number; + decelerationEfficiency?: number; + departAt?: Date; + distanceBudgetInMeters?: number; + downhillEfficiency?: number; + energyBudgetInkWh?: number; + fuelBudgetInLiters?: number; + fuelEnergyDensityInMJoulesPerLiter?: number; + hilliness?: HillinessDegree; + maxChargeInkWh?: string; + routeType?: RouteType; + timeBudgetInSec?: number; + traffic?: boolean; + travelMode?: TravelMode; + uphillEfficiency?: number; + vehicleAxleWeight?: number; + vehicleCommercial?: boolean; + vehicleEngineType?: VehicleEngineType; + vehicleHeight?: number; + vehicleLength?: number; + vehicleLoadType?: VehicleLoadType; + vehicleMaxSpeed?: number; + vehicleWeight?: number; + vehicleWidth?: number; + windingness?: WindingnessLevel; +} + +// @public +export type RouteGetRouteRangeResponse = GetRouteRangeResponse; + +// @public +export type RouteInstructionsType = string; + +// @public +export interface RouteMatrixResponse { + readonly formatVersion?: string; + readonly matrix?: RouteMatrixResult[][]; + readonly summary?: RouteMatrixSummary; +} + +// @public +export interface RouteMatrixResult { + readonly response?: RouteMatrixResultResponse; + readonly statusCode?: number; +} + +// @public +export interface RouteMatrixResultResponse { + readonly routeSummary?: RouteResultLegSummary; +} + +// @public +export interface RouteMatrixSummary { + readonly successfulRoutes?: number; + readonly totalRoutes?: number; +} + +// @public +export interface RouteOptimizedWaypoint { + readonly optimizedIndex?: number; + readonly providedIndex?: number; +} + +// @public +export interface RoutePostRouteDirectionsBatchHeaders { + location?: string; +} + +// @public +export interface RoutePostRouteDirectionsBatchOptionalParams extends coreClient.OperationOptions { + resumeFrom?: string; + updateIntervalInMs?: number; +} + +// @public +export type RoutePostRouteDirectionsBatchResponse = RouteDirectionsBatchResponse; + +// @public +export interface RoutePostRouteDirectionsBatchSyncOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type RoutePostRouteDirectionsBatchSyncResponse = RouteDirectionsBatchResponse; + +// @public +export interface RoutePostRouteDirectionsOptionalParams extends coreClient.OperationOptions { + accelerationEfficiency?: number; + alternativeType?: AlternativeRouteType; + arriveAt?: Date; + auxiliaryPowerInkW?: string; + auxiliaryPowerInLitersPerHour?: number; + avoid?: RouteAvoidType[]; + computeBestOrder?: boolean; + computeTravelTimeFor?: ComputeTravelTimeFor; + constantSpeedConsumptionInkWhPerHundredkm?: string; + constantSpeedConsumptionInLitersPerHundredkm?: number; + currentChargeInkWh?: string; + currentFuelInLiters?: number; + decelerationEfficiency?: number; + departAt?: Date; + downhillEfficiency?: number; + fuelEnergyDensityInMJoulesPerLiter?: number; + hilliness?: HillinessDegree; + instructionsType?: RouteInstructionsType; + language?: string; + maxAlternatives?: number; + maxChargeInkWh?: string; + minDeviationDistance?: number; + minDeviationTime?: number; + report?: string; + routeRepresentation?: RouteRepresentation; + routeType?: RouteType; + sectionType?: SectionType; + traffic?: boolean; + travelMode?: TravelMode; + uphillEfficiency?: number; + vehicleAxleWeight?: number; + vehicleCommercial?: boolean; + vehicleEngineType?: VehicleEngineType; + vehicleHeading?: number; + vehicleHeight?: number; + vehicleLength?: number; + vehicleLoadType?: VehicleLoadType; + vehicleMaxSpeed?: number; + vehicleWeight?: number; + vehicleWidth?: number; + windingness?: WindingnessLevel; +} + +// @public +export type RoutePostRouteDirectionsResponse = RouteDirectionsResponse; + +// @public +export interface RoutePostRouteMatrixHeaders { + location?: string; +} + +// @public +export interface RoutePostRouteMatrixOptionalParams extends coreClient.OperationOptions { + arriveAt?: Date; + avoid?: RouteAvoidType[]; + computeTravelTimeFor?: ComputeTravelTimeFor; + departAt?: Date; + hilliness?: HillinessDegree; + resumeFrom?: string; + routeType?: RouteType; + sectionType?: SectionType; + traffic?: boolean; + travelMode?: TravelMode; + updateIntervalInMs?: number; + vehicleAxleWeight?: number; + vehicleHeight?: number; + vehicleLength?: number; + vehicleLoadType?: VehicleLoadType; + vehicleMaxSpeed?: number; + vehicleWeight?: number; + vehicleWidth?: number; + waitForResults?: boolean; + windingness?: WindingnessLevel; +} + +// @public +export type RoutePostRouteMatrixResponse = RouteMatrixResponse; + +// @public +export interface RoutePostRouteMatrixSyncOptionalParams extends coreClient.OperationOptions { + arriveAt?: Date; + avoid?: RouteAvoidType[]; + computeTravelTimeFor?: ComputeTravelTimeFor; + departAt?: Date; + hilliness?: HillinessDegree; + routeType?: RouteType; + sectionType?: SectionType; + traffic?: boolean; + travelMode?: TravelMode; + vehicleAxleWeight?: number; + vehicleHeight?: number; + vehicleLength?: number; + vehicleLoadType?: VehicleLoadType; + vehicleMaxSpeed?: number; + vehicleWeight?: number; + vehicleWidth?: number; + waitForResults?: boolean; + windingness?: WindingnessLevel; +} + +// @public +export type RoutePostRouteMatrixSyncResponse = RouteMatrixResponse; + +// @public +export interface RouteRange { + readonly boundary?: CoordinatesPair[]; + center?: CoordinatesPair; +} + +// @public +export type RouteRepresentation = string; + +// @public +export interface RouteResponseReport { + readonly effectiveSettings?: RouteResponseReportEffectiveSetting[]; +} + +// @public +export interface RouteResponseReportEffectiveSetting { + readonly key?: string; + readonly value?: string; +} + +// @public +export interface RouteResultGuidance { + readonly instructionGroups?: RouteResultInstructionGroup[]; + readonly instructions?: RouteResultInstruction[]; +} + +// @public +export interface RouteResultInstruction { + readonly combinedMessage?: string; + readonly countryCode?: string; + readonly drivingSide?: DrivingSide; + readonly exitNumber?: string; + instructionType?: GuidanceInstructionType; + readonly junctionType?: JunctionType; + readonly maneuver?: GuidanceManeuver; + readonly message?: string; + point?: CoordinatesPair; + readonly pointIndex?: number; + readonly possibleCombineWithNext?: boolean; + readonly roadNumbers?: string[]; + readonly roundaboutExitNumber?: string; + readonly routeOffsetInMeters?: number; + readonly signpostText?: string; + readonly stateCode?: string; + readonly street?: string; + readonly travelTimeInSeconds?: number; + readonly turnAngleInDecimalDegrees?: number; +} + +// @public +export interface RouteResultInstructionGroup { + readonly firstInstructionIndex?: number; + readonly groupLengthInMeters?: number; + readonly groupMessage?: string; + readonly lastInstructionIndex?: number; +} + +// @public (undocumented) +export interface RouteResultLeg { + readonly points?: CoordinatesPair[]; + readonly summary?: RouteResultLegSummary; +} + +// @public +export interface RouteResultLegSummary { + readonly arrivalTime?: string; + readonly batteryConsumptionInkWh?: number; + readonly departureTime?: string; + readonly fuelConsumptionInLiters?: number; + readonly historicTrafficTravelTimeInSeconds?: number; + readonly lengthInMeters?: number; + readonly liveTrafficIncidentsTravelTimeInSeconds?: number; + readonly noTrafficTravelTimeInSeconds?: number; + readonly trafficDelayInSeconds?: number; + readonly travelTimeInSeconds?: number; +} + +// @public (undocumented) +export interface RouteResultSection { + readonly delayInSeconds?: number; + readonly effectiveSpeedInKmh?: number; + readonly endPointIndex?: number; + readonly magnitudeOfDelay?: MagnitudeOfDelay; + readonly sectionType?: string; + readonly simpleCategory?: string; + readonly startPointIndex?: number; + tec?: RouteResultSectionTec; + readonly travelMode?: string; +} + +// @public +export interface RouteResultSectionTec { + causes?: RouteResultSectionTecCause[]; + readonly effectCode?: number; +} + +// @public +export interface RouteResultSectionTecCause { + readonly mainCauseCode?: number; + readonly subCauseCode?: number; +} + +// @public +export type RouteType = string; + +// @public +export type SectionType = string; + +// @public +export type TextFormat = string; + +// @public +export type TravelMode = string; + +// @public +export type VehicleEngineType = string; + +// @public +export type VehicleLoadType = string; + +// @public +export type WindingnessLevel = string; + + +// (No @packageDocumentation comment for this package) + +``` diff --git a/sdk/maps/maps-route/rollup.config.js b/sdk/maps/maps-route/rollup.config.js new file mode 100644 index 000000000000..9be1955eb7f1 --- /dev/null +++ b/sdk/maps/maps-route/rollup.config.js @@ -0,0 +1,188 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import nodeResolve from "@rollup/plugin-node-resolve"; +import cjs from "@rollup/plugin-commonjs"; +import sourcemaps from "rollup-plugin-sourcemaps"; +import multiEntry from "@rollup/plugin-multi-entry"; +import json from "@rollup/plugin-json"; + +import nodeBuiltins from "builtin-modules"; + +/** + * Gets the proper configuration needed for rollup's commonJS plugin for @opentelemetry/api. + * + * NOTE: this manual configuration is only needed because OpenTelemetry uses an + * __exportStar downleveled helper function to declare its exports which confuses + * rollup's automatic discovery mechanism. + * + * @returns an object reference that can be `...`'d into your cjs() configuration. + */ +export function openTelemetryCommonJs() { + const namedExports = {}; + + for (const key of [ + "@opentelemetry/api", + "@azure/core-tracing/node_modules/@opentelemetry/api" + ]) { + namedExports[key] = [ + "SpanKind", + "TraceFlags", + "getSpan", + "setSpan", + "SpanStatusCode", + "getSpanContext", + "setSpanContext" + ]; + } + + const releasedOpenTelemetryVersions = ["0.10.2", "1.0.0-rc.0"]; + + for (const version of releasedOpenTelemetryVersions) { + namedExports[ + // working around a limitation in the rollup common.js plugin - it's not able to resolve these modules so the named exports listed above will not get applied. We have to drill down to the actual path. + `../../../common/temp/node_modules/.pnpm/@opentelemetry/api@${version}/node_modules/@opentelemetry/api/build/src/index.js` + ] = [ + "SpanKind", + "TraceFlags", + "getSpan", + "setSpan", + "StatusCode", + "CanonicalCode", + "getSpanContext", + "setSpanContext" + ]; + } + + return namedExports; +} + +// #region Warning Handler + +/** + * A function that can determine whether a rollupwarning should be ignored. If + * the function returns `true`, then the warning will not be displayed. + */ + +function ignoreNiseSinonEvalWarnings(warning) { + return ( + warning.code === "EVAL" && + warning.id && + (warning.id.includes("node_modules/nise") || + warning.id.includes("node_modules/sinon")) === true + ); +} + +function ignoreChaiCircularDependencyWarnings(warning) { + return ( + warning.code === "CIRCULAR_DEPENDENCY" && + warning.importer && warning.importer.includes("node_modules/chai") === true + ); +} + +const warningInhibitors = [ + ignoreChaiCircularDependencyWarnings, + ignoreNiseSinonEvalWarnings +]; + +/** + * Construct a warning handler for the shared rollup configuration + * that ignores certain warnings that are not relevant to testing. + */ +function makeOnWarnForTesting() { + return (warning, warn) => { + // If every inhibitor returns false (i.e. no inhibitors), then show the warning + if (warningInhibitors.every((inhib) => !inhib(warning))) { + warn(warning); + } + }; +} + +// #endregion + +function makeBrowserTestConfig() { + const config = { + input: { + include: ["dist-esm/test/**/*.spec.js"], + exclude: ["dist-esm/test/**/node/**"] + }, + output: { + file: `dist-test/index.browser.js`, + format: "umd", + sourcemap: true + }, + preserveSymlinks: false, + plugins: [ + multiEntry({ exports: false }), + nodeResolve({ + mainFields: ["module", "browser"] + }), + cjs({ + namedExports: { + // Chai's strange internal architecture makes it impossible to statically + // analyze its exports. + chai: [ + "version", + "use", + "util", + "config", + "expect", + "should", + "assert" + ], + ...openTelemetryCommonJs() + } + }), + json(), + sourcemaps() + //viz({ filename: "dist-test/browser-stats.html", sourcemap: true }) + ], + onwarn: makeOnWarnForTesting(), + // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, + // rollup started respecting the "sideEffects" field in package.json. Since + // our package.json sets "sideEffects=false", this also applies to test + // code, which causes all tests to be removed by tree-shaking. + treeshake: false + }; + + return config; +} + +const defaultConfigurationOptions = { + disableBrowserBundle: false +}; + +export function makeConfig(pkg, options) { + options = { + ...defaultConfigurationOptions, + ...(options || {}) + }; + + const baseConfig = { + // Use the package's module field if it has one + input: pkg["module"] || "dist-esm/src/index.js", + external: [ + ...nodeBuiltins, + ...Object.keys(pkg.dependencies), + ...Object.keys(pkg.devDependencies) + ], + output: { file: "dist/index.js", format: "cjs", sourcemap: true }, + preserveSymlinks: false, + plugins: [sourcemaps(), nodeResolve(), cjs()] + }; + + const config = [baseConfig]; + + if (!options.disableBrowserBundle) { + config.push(makeBrowserTestConfig()); + } + + return config; +} + +export default makeConfig(require("./package.json")); diff --git a/sdk/maps/maps-route/samples/resources/route_directions_batch_request_body.json b/sdk/maps/maps-route/samples/resources/route_directions_batch_request_body.json new file mode 100644 index 000000000000..ec9ae6ee3564 --- /dev/null +++ b/sdk/maps/maps-route/samples/resources/route_directions_batch_request_body.json @@ -0,0 +1,13 @@ +{ + "batchItems": [ + { + "query": "?query=47.639987,-122.128384:47.621252,-122.184408:47.596437,-122.332000&routeType=fastest&travelMode=car&maxAlternatives=99" + }, + { + "query": "?query=47.620659,-122.348934:47.610101,-122.342015&travelMode=bicycle&routeType=eco&traffic=false" + }, + { + "query": "?query=40.759856,-73.985108:40.771136,-73.973506&travelMode=pedestrian&routeType=shortest" + } + ] +} \ No newline at end of file diff --git a/sdk/maps/maps-route/samples/resources/route_directions_request_body.json b/sdk/maps/maps-route/samples/resources/route_directions_request_body.json new file mode 100644 index 000000000000..4465016f5e0e --- /dev/null +++ b/sdk/maps/maps-route/samples/resources/route_directions_request_body.json @@ -0,0 +1,78 @@ +{ + "supportingPoints": { + "type": "GeometryCollection", + "geometries": [ + { + "type": "Point", + "coordinates": [ + 13.42936, + 52.5093 + ] + }, + { + "type": "Point", + "coordinates": [ + 13.42859, + 52.50844 + ] + } + ] + }, + "avoidVignette": [ + "AUS", + "CHE" + ], + "avoidAreas": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + -122.39456176757811, + 47.489368981370724 + ], + [ + -122.00454711914061, + 47.489368981370724 + ], + [ + -122.00454711914061, + 47.65151268066222 + ], + [ + -122.39456176757811, + 47.65151268066222 + ], + [ + -122.39456176757811, + 47.489368981370724 + ] + ] + ], + [ + [ + [ + 100.0, + 0.0 + ], + [ + 101.0, + 0.0 + ], + [ + 101.0, + 1.0 + ], + [ + 100.0, + 1.0 + ], + [ + 100.0, + 0.0 + ] + ] + ] + ] + } +} \ No newline at end of file diff --git a/sdk/maps/maps-route/samples/resources/route_matrix_request_body.json b/sdk/maps/maps-route/samples/resources/route_matrix_request_body.json new file mode 100644 index 000000000000..275c401f728b --- /dev/null +++ b/sdk/maps/maps-route/samples/resources/route_matrix_request_body.json @@ -0,0 +1,28 @@ +{ + "origins": { + "type": "MultiPoint", + "coordinates": [ + [ + 4.85106, + 52.36006 + ], + [ + 4.85056, + 52.36187 + ] + ] + }, + "destinations": { + "type": "MultiPoint", + "coordinates": [ + [ + 4.85003, + 52.36241 + ], + [ + 13.42937, + 52.50931 + ] + ] + } +} \ No newline at end of file diff --git a/sdk/maps/maps-route/samples/v1/javascript/README.md b/sdk/maps/maps-route/samples/v1/javascript/README.md new file mode 100644 index 000000000000..d84e20c11acb --- /dev/null +++ b/sdk/maps/maps-route/samples/v1/javascript/README.md @@ -0,0 +1,54 @@ +--- +page_type: sample +languages: + - javascript +products: + - azure +urlFragment: maps-route-javascript +--- + +# Azure Maps Route client library samples for JavaScript + +These sample programs show how to use the JavaScript client libraries for Azure Maps Route in some common scenarios. + +| **File Name** | **Description** | +| ----------------- | ------------------------------------- | +| [route.js][route] | Operations useful for finding routes. | + +## Prerequisites + +The sample programs are compatible with Node.js >=12.0.0. + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +3. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node route.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx cross-env MAPS_SUBSCRIPTION_KEY="" node route.js +``` + +[route]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-route/samples/v1/javascript/src/route.js +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-route/README.md diff --git a/sdk/maps/maps-route/samples/v1/javascript/elevation.js b/sdk/maps/maps-route/samples/v1/javascript/elevation.js new file mode 100644 index 000000000000..422587aca96f --- /dev/null +++ b/sdk/maps/maps-route/samples/v1/javascript/elevation.js @@ -0,0 +1,70 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Elevation API usage. Simple CRUD operations are performed. + */ + +const { DefaultAzureCredential } = require("@azure/identity"); +const { ElevationClient } = require("@azure/maps-elevation"); +require("dotenv").config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + const elevation = new ElevationClient(credential).elevation; + + console.log(" --- Get Data For Bounding Box:"); + console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); + + console.log(" --- Get Data For Points:"); + console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Get Data For Polyline:"); + console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Post Data For Points:"); + console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + + console.log(" --- Post Data For Polyline:"); + console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-route/samples/v1/javascript/package.json b/sdk/maps/maps-route/samples/v1/javascript/package.json new file mode 100644 index 000000000000..8c28b2690703 --- /dev/null +++ b/sdk/maps/maps-route/samples/v1/javascript/package.json @@ -0,0 +1,28 @@ +{ + "name": "azure-maps-route-samples-js", + "private": true, + "version": "1.0.0", + "description": "Azure Maps Route client library samples for JavaScript", + "engine": { + "node": ">=12.0.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/maps/maps-route" + }, + "keywords": [ + "Azure", + "cloud" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-route", + "dependencies": { + "@azure/maps-route": "next", + "dotenv": "latest" + } +} diff --git a/sdk/maps/maps-route/samples/v1/javascript/sample.env b/sdk/maps/maps-route/samples/v1/javascript/sample.env new file mode 100644 index 000000000000..2259ae4da0ec --- /dev/null +++ b/sdk/maps/maps-route/samples/v1/javascript/sample.env @@ -0,0 +1,7 @@ +# Maps subscription key when using AzureKey authentication +MAPS_SUBSCRIPTION_KEY="" + +# Maps Azure AD authentication +AZURE_CLIENT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_TENANT_ID="" diff --git a/sdk/maps/maps-route/samples/v1/typescript/README.md b/sdk/maps/maps-route/samples/v1/typescript/README.md new file mode 100644 index 000000000000..524eee1af954 --- /dev/null +++ b/sdk/maps/maps-route/samples/v1/typescript/README.md @@ -0,0 +1,67 @@ +--- +page_type: sample +languages: + - typescript +products: + - azure +urlFragment: maps-route-typescript +--- + +# Azure Maps Route client library samples for TypeScript + +These sample programs show how to use the TypeScript client libraries for Azure Maps Route in some common scenarios. + +| **File Name** | **Description** | +| ----------------- | ------------------------------------- | +| [route.ts][route] | Operations useful for finding routes. | + +## Prerequisites + +The sample programs are compatible with Node.js >=12.0.0. + +Before running the samples in Node, they must be compiled to JavaScript using the TypeScript compiler. For more information on TypeScript, see the [TypeScript documentation][typescript]. Install the TypeScript compiler using: + +```bash +npm install -g typescript +``` + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Compile the samples: + +```bash +npm run build +``` + +3. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +4. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node dist/route.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx cross-env MAPS_SUBSCRIPTION_KEY="" node dist/route.js +``` + +[route]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-route/samples/v1/typescript/src/route.ts +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-route/README.md +[typescript]: https://www.typescriptlang.org/docs/home.html diff --git a/sdk/maps/maps-route/samples/v1/typescript/package.json b/sdk/maps/maps-route/samples/v1/typescript/package.json new file mode 100644 index 000000000000..22be83693d1e --- /dev/null +++ b/sdk/maps/maps-route/samples/v1/typescript/package.json @@ -0,0 +1,36 @@ +{ + "name": "azure-maps-route-samples-ts", + "private": true, + "version": "1.0.0", + "description": "Azure Maps Route client library samples for TypeScript", + "engine": { + "node": ">=12.0.0" + }, + "scripts": { + "build": "tsc", + "prebuild": "rimraf dist/" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/maps/maps-route" + }, + "keywords": [ + "Azure", + "cloud" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-route", + "dependencies": { + "@azure/maps-route": "next", + "dotenv": "latest" + }, + "devDependencies": { + "typescript": "~4.2.0", + "rimraf": "latest" + } +} diff --git a/sdk/maps/maps-route/samples/v1/typescript/sample.env b/sdk/maps/maps-route/samples/v1/typescript/sample.env new file mode 100644 index 000000000000..2259ae4da0ec --- /dev/null +++ b/sdk/maps/maps-route/samples/v1/typescript/sample.env @@ -0,0 +1,7 @@ +# Maps subscription key when using AzureKey authentication +MAPS_SUBSCRIPTION_KEY="" + +# Maps Azure AD authentication +AZURE_CLIENT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_TENANT_ID="" diff --git a/sdk/maps/maps-route/samples/v1/typescript/src/elevation.ts b/sdk/maps/maps-route/samples/v1/typescript/src/elevation.ts new file mode 100644 index 000000000000..5e1f91bd6989 --- /dev/null +++ b/sdk/maps/maps-route/samples/v1/typescript/src/elevation.ts @@ -0,0 +1,76 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Elevation API usage. Simple queries are performed. + */ + +import { getDefaultAzureCredential } from "@azure/identity"; +import * as coreAuth from "@azure/core-auth"; +import * as coreClient from "@azure/core-client"; +import { ElevationClient } from "@azure/maps-elevation"; +import * as dotenv from "dotenv"; +dotenv.config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential implements coreAuth.TokenCredential { + async getToken( + _scopes: string | string[], + _options?: coreAuth.GetTokenOptions + ): Promise { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential: coreAuth.TokenCredential; + let operationOptions: coreClient.OperationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = getDefaultAzureCredential(); + } + + const elevation = new ElevationClient(credential).elevation; + + console.log(" --- Get Data For Bounding Box:"); + console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); + + console.log(" --- Get Data For Points:"); + console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Get Data For Polyline:"); + console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Post Data For Points:"); + console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + + console.log(" --- Post Data For Polyline:"); + console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-route/samples/v1/typescript/tsconfig.json b/sdk/maps/maps-route/samples/v1/typescript/tsconfig.json new file mode 100644 index 000000000000..416c2dd82e00 --- /dev/null +++ b/sdk/maps/maps-route/samples/v1/typescript/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2018", + "module": "commonjs", + "moduleResolution": "node", + "resolveJsonModule": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "alwaysStrict": true, + "outDir": "dist", + "rootDir": "src" + }, + "include": [ + "src/**.ts" + ] +} diff --git a/sdk/maps/maps-route/src/index.ts b/sdk/maps/maps-route/src/index.ts new file mode 100644 index 000000000000..d688000ed82a --- /dev/null +++ b/sdk/maps/maps-route/src/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./models"; +export { RouteClient } from "./routeClient"; +export { RouteClientContext } from "./routeClientContext"; +export * from "./operationsInterfaces"; diff --git a/sdk/maps/maps-route/src/lro/azureAsyncPolling.ts b/sdk/maps/maps-route/src/lro/azureAsyncPolling.ts new file mode 100644 index 000000000000..0d63c54f6026 --- /dev/null +++ b/sdk/maps/maps-route/src/lro/azureAsyncPolling.ts @@ -0,0 +1,83 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { FullOperationResponse } from "@azure/core-client"; +import { FinalStateVia, LROResult } from "./models"; +import { failureStates, LROState, successStates } from "./stateMachine"; + +function getResponseStatus(rawResponse: FullOperationResponse): string { + const { status } = + rawResponse.parsedBody ?? + (rawResponse.bodyAsText ? JSON.parse(rawResponse.bodyAsText) : {}); + return status?.toLowerCase() ?? "succeeded"; +} + +function isAzureAsyncPollingDone(rawResponse: FullOperationResponse) { + const state = getResponseStatus(rawResponse); + if (failureStates.includes(state)) { + throw new Error(`Operation status: ${state}`); + } + return successStates.includes(state); +} + +export function processAzureAsyncOperationResult( + restrieveResource: (path?: string) => Promise>, + resourceLocation?: string, + finalStateVia?: FinalStateVia +): ( + rawResponse: FullOperationResponse, + flatResponse: TResult +) => LROState { + return ( + rawResponse: FullOperationResponse, + flatResponse: TResult + ): LROState => { + if (isAzureAsyncPollingDone(rawResponse)) { + if (resourceLocation === undefined) { + return { rawResponse, flatResponse, done: true }; + } else { + return { + rawResponse, + flatResponse, + done: false, + next: async () => { + async function sendFinalRequest(): Promise< + LROResult | undefined + > { + switch (finalStateVia) { + case "original-uri": + return restrieveResource(); + case "azure-async-operation": + return Promise.resolve(undefined); + case "location": + default: + return restrieveResource(resourceLocation); + } + } + const finalResponse = await sendFinalRequest(); + return { + ...(finalResponse ?? { + rawResponse, + flatResponse + }), + done: true + }; + } + }; + } + } + return { + rawResponse, + flatResponse, + done: false + }; + }; +} diff --git a/sdk/maps/maps-route/src/lro/bodyPolling.ts b/sdk/maps/maps-route/src/lro/bodyPolling.ts new file mode 100644 index 000000000000..269d8e6799a1 --- /dev/null +++ b/sdk/maps/maps-route/src/lro/bodyPolling.ts @@ -0,0 +1,45 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { FullOperationResponse } from "@azure/core-client"; +import { failureStates, LROState, successStates } from "./stateMachine"; + +function getProvisioningState(rawResponse: FullOperationResponse): string { + const { properties, provisioningState } = + rawResponse.parsedBody ?? + (rawResponse.bodyAsText ? JSON.parse(rawResponse.bodyAsText) : {}); + const state: string | undefined = + properties?.provisioningState ?? provisioningState; + return state?.toLowerCase() ?? "succeeded"; +} + +export function isBodyPollingDone(rawResponse: FullOperationResponse) { + const state = getProvisioningState(rawResponse); + if (failureStates.includes(state)) { + throw new Error(`Provisioning state: ${state}`); + } + return successStates.includes(state); +} + +/** + * Creates a polling strategy based on BodyPolling which uses the provisioning state + * from the result to determine the current operation state + */ +export function processBodyPollingOperationResult( + rawResponse: FullOperationResponse, + flatResponse: TResult +): LROState { + return { + rawResponse, + flatResponse, + done: isBodyPollingDone(rawResponse) + }; +} diff --git a/sdk/maps/maps-route/src/lro/index.ts b/sdk/maps/maps-route/src/lro/index.ts new file mode 100644 index 000000000000..85c2187669e7 --- /dev/null +++ b/sdk/maps/maps-route/src/lro/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export { shouldDeserializeLRO } from "./requestUtils"; +export { LROPoller } from "./lroPoller"; diff --git a/sdk/maps/maps-route/src/lro/locationPolling.ts b/sdk/maps/maps-route/src/lro/locationPolling.ts new file mode 100644 index 000000000000..6fef61938419 --- /dev/null +++ b/sdk/maps/maps-route/src/lro/locationPolling.ts @@ -0,0 +1,32 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { FullOperationResponse } from "@azure/core-client"; +import { LROState } from "./stateMachine"; + +function isLocationPollingDone(rawResponse: FullOperationResponse) { + const code = rawResponse.status; + if (![202, 200].includes(code)) { + throw new Error(`Operation failed`); + } + return code !== 202; +} + +export function processLocationPollingOperationResult( + rawResponse: FullOperationResponse, + flatResponse: TResult +): LROState { + return { + rawResponse, + flatResponse, + done: isLocationPollingDone(rawResponse) + }; +} diff --git a/sdk/maps/maps-route/src/lro/lroPoller.ts b/sdk/maps/maps-route/src/lro/lroPoller.ts new file mode 100644 index 000000000000..cd1cd64fe813 --- /dev/null +++ b/sdk/maps/maps-route/src/lro/lroPoller.ts @@ -0,0 +1,66 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { Poller, PollOperationState } from "@azure/core-lro"; +import { OperationArguments, OperationSpec } from "@azure/core-client"; +import { FinalStateVia, SendOperationFn } from "./models"; +import { GenericPollOperation } from "./operation"; + +export interface LROPollerOptions { + /** + * Defines how much time the poller is going to wait before making a new request to the service. + */ + intervalInMs?: number; + /** + * A serialized poller which can be used to resume an existing paused Long-Running-Operation. + */ + resumeFrom?: string; +} + +export class LROPoller extends Poller< + PollOperationState, + TResult +> { + private intervalInMs: number; + + constructor( + { intervalInMs = 2000, resumeFrom }: LROPollerOptions, + initialOperationArguments: OperationArguments, + initialOperationSpec: OperationSpec, + sendOperation: SendOperationFn, + finalStateVia?: FinalStateVia + ) { + const state: PollOperationState = resumeFrom + ? JSON.parse(resumeFrom).state + : {}; + + const operation = new GenericPollOperation( + state, + initialOperationArguments, + initialOperationSpec, + sendOperation, + finalStateVia + ); + super(operation); + + this.intervalInMs = intervalInMs; + operation.setPollerConfig(this as any); + } + + /** + * The method used by the poller to wait before attempting to update its operation. + */ + delay(): Promise { + return new Promise((resolve) => + setTimeout(() => resolve(), this.intervalInMs) + ); + } +} diff --git a/sdk/maps/maps-route/src/lro/models.ts b/sdk/maps/maps-route/src/lro/models.ts new file mode 100644 index 000000000000..a4a5a5abd6c2 --- /dev/null +++ b/sdk/maps/maps-route/src/lro/models.ts @@ -0,0 +1,52 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + FullOperationResponse, + OperationArguments, + OperationSpec +} from "@azure/core-client"; +import { PollOperationState } from "@azure/core-lro"; + +export type FinalStateVia = + | "azure-async-operation" + | "location" + | "original-uri"; + +export interface LROResult { + flatResponse: T; + rawResponse: FullOperationResponse; +} + +export type LROMode = "AzureAsync" | "Location" | "Body"; + +export interface LROConfig { + mode?: LROMode; + resourceLocation?: string; +} + +export type SendOperationFn = ( + args: OperationArguments, + spec: OperationSpec +) => Promise>; + +/** + * Type of a polling operation state that can actually be resumed. + */ +export type ResumablePollOperationState = PollOperationState & { + initialRawResponse?: FullOperationResponse; + config?: LROConfig; + pollingURL?: string; +}; + +export interface PollerConfig { + intervalInMs: number; +} diff --git a/sdk/maps/maps-route/src/lro/operation.ts b/sdk/maps/maps-route/src/lro/operation.ts new file mode 100644 index 000000000000..801d03e7203a --- /dev/null +++ b/sdk/maps/maps-route/src/lro/operation.ts @@ -0,0 +1,132 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { AbortSignalLike } from "@azure/abort-controller"; +import { OperationArguments, OperationSpec } from "@azure/core-client"; +import { PollOperation, PollOperationState } from "@azure/core-lro"; +import { + FinalStateVia, + PollerConfig, + ResumablePollOperationState, + SendOperationFn +} from "./models"; +import { getPollingURL } from "./requestUtils"; +import { createGetLROState, initializeState, LROState } from "./stateMachine"; + +export class GenericPollOperation + implements PollOperation, TResult> { + private getLROState?: ( + pollingURL: string, + pollerConfig: PollerConfig + ) => Promise>; + private pollerConfig?: PollerConfig; + constructor( + public state: PollOperationState, + private initialOperationArguments: OperationArguments, + private initialOperationSpec: OperationSpec, + private sendOperation: SendOperationFn, + private finalStateVia?: FinalStateVia + ) {} + + public setPollerConfig(pollerConfig: PollerConfig) { + this.pollerConfig = pollerConfig; + } + + /** + * General update function for LROPoller, the general process is as follows + * 1. Check initial operation result to determine the strategy to use + * - Strategies: Location, Azure-AsyncOperation, Original Uri + * 2. Check if the operation result has a terminal state + * - Terminal state will be determined by each strategy + * 2.1 If it is terminal state Check if a final GET request is required, if so + * send final GET request and return result from operation. If no final GET + * is required, just return the result from operation. + * - Determining what to call for final request is responsibility of each strategy + * 2.2 If it is not terminal state, call the polling operation and go to step 1 + * - Determining what to call for polling is responsibility of each strategy + * - Strategies will always use the latest URI for polling if provided otherwise + * the last known one + */ + async update(options?: { + abortSignal?: AbortSignalLike | undefined; + fireProgress?: ((state: PollOperationState) => void) | undefined; + }): Promise, TResult>> { + const state = this.state as ResumablePollOperationState; + const { onResponse, ...restOptions } = + this.initialOperationArguments.options || {}; + if (!state.isStarted) { + await this.sendOperation( + { + ...this.initialOperationArguments, + options: { + ...restOptions, + onResponse: initializeState( + state, + this.initialOperationSpec, + onResponse + ) + } + }, + this.initialOperationSpec + ); + } + + if (!state.isCompleted) { + if (this.getLROState === undefined) { + if (state.config === undefined) { + throw new Error("Bad state: LRO mode is undefined"); + } + this.getLROState = createGetLROState( + this.sendOperation, + this.initialOperationArguments, + this.initialOperationSpec, + state.config, + this.finalStateVia + ); + } + if (state.pollingURL === undefined) { + throw new Error("Bad state: polling URL is undefined"); + } + const currentState = await this.getLROState( + state.pollingURL, + this.pollerConfig! + ); + if (currentState.done) { + state.result = currentState.flatResponse; + state.isCompleted = true; + } else { + this.getLROState = currentState.next ?? this.getLROState; + state.pollingURL = getPollingURL( + currentState.rawResponse, + state.pollingURL + ); + } + } + if (options?.fireProgress !== undefined) { + options.fireProgress(state); + } + return this; + } + + async cancel(): Promise, TResult>> { + this.state.isCancelled = true; + return this; + } + + /** + * Serializes the Poller operation. + */ + public toString(): string { + return JSON.stringify({ + state: this.state + }); + } +} diff --git a/sdk/maps/maps-route/src/lro/passthrough.ts b/sdk/maps/maps-route/src/lro/passthrough.ts new file mode 100644 index 000000000000..64c10380c1b2 --- /dev/null +++ b/sdk/maps/maps-route/src/lro/passthrough.ts @@ -0,0 +1,24 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { FullOperationResponse } from "@azure/core-client"; +import { LROState } from "./stateMachine"; + +export function processPassthroughOperationResult( + rawResponse: FullOperationResponse, + flatResponse: TResult +): LROState { + return { + rawResponse, + flatResponse, + done: true + }; +} diff --git a/sdk/maps/maps-route/src/lro/pollingMethod.ts b/sdk/maps/maps-route/src/lro/pollingMethod.ts new file mode 100644 index 000000000000..cb6482bbdea9 --- /dev/null +++ b/sdk/maps/maps-route/src/lro/pollingMethod.ts @@ -0,0 +1,91 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + OperationArguments, + OperationSpec, + OperationResponseMap +} from "@azure/core-client"; +import { LROMode, LROResult, SendOperationFn } from "./models"; + +export function createPollingMethod( + sendOperationFn: SendOperationFn, + args: OperationArguments, + spec: OperationSpec, + mode?: LROMode +): (path?: string) => Promise> { + /** + * Polling calls will always return a status object i.e. {"status": "success"} + * these intermediate responses are not described in the swagger so we need to + * pass custom mappers at runtime. + * This function replaces all the existing mappers to be able to deserialize a status object + * @param responses Original set of responses defined in the operation + */ + function getCompositeMappers(responses: { + [responseCode: string]: OperationResponseMap; + }): { + [responseCode: string]: OperationResponseMap; + } { + return Object.keys(responses).reduce((acc, statusCode) => { + return { + ...acc, + [statusCode]: { + ...responses[statusCode], + bodyMapper: { + type: { + name: "Composite", + modelProperties: { + status: { + serializedName: "status", + type: { + name: "String" + } + } + } + } + } + } + }; + }, {} as { [responseCode: string]: OperationResponseMap }); + } + // Make sure we don't send any body to the get request + const { requestBody, responses, ...restSpec } = spec; + if (mode === "AzureAsync") { + return async (path?: string) => { + return sendOperationFn(args, { + ...restSpec, + responses: getCompositeMappers(responses), + httpMethod: "GET", + ...(path && { path }) + }); + }; + } + return async (path?: string) => { + return sendOperationFn(args, { + ...restSpec, + responses: responses, + httpMethod: "GET", + ...(path && { path }) + }); + }; +} + +export function createRetrieveAzureAsyncResource( + sendOperationFn: SendOperationFn, + args: OperationArguments, + spec: OperationSpec +): (path?: string) => Promise> { + const updatedArgs = { ...args }; + if (updatedArgs.options) { + (updatedArgs.options as any).shouldDeserialize = true; + } + return createPollingMethod(sendOperationFn, updatedArgs, spec); +} diff --git a/sdk/maps/maps-route/src/lro/requestUtils.ts b/sdk/maps/maps-route/src/lro/requestUtils.ts new file mode 100644 index 000000000000..9162f6633905 --- /dev/null +++ b/sdk/maps/maps-route/src/lro/requestUtils.ts @@ -0,0 +1,194 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { FullOperationResponse, OperationSpec } from "@azure/core-client"; +import { LROConfig } from "./models"; +import { terminalStates } from "./stateMachine"; + +/** + * We need to selectively deserialize our responses, only deserializing if we + * are in a final LRO response, not deserializing any polling non-terminal responses + */ +export function shouldDeserializeLRO(finalStateVia?: string) { + let initialOperationInfo: LROResponseInfo | undefined; + let isInitialRequest = true; + + return (response: FullOperationResponse) => { + if (response.status < 200 || response.status >= 300) { + return true; + } + + if (!initialOperationInfo) { + initialOperationInfo = getLROData(response); + } else { + isInitialRequest = false; + } + + if ( + initialOperationInfo.azureAsyncOperation || + initialOperationInfo.operationLocation + ) { + return ( + !isInitialRequest && + isAsyncOperationFinalResponse( + response, + initialOperationInfo, + finalStateVia + ) + ); + } + + if (initialOperationInfo.location) { + return isLocationFinalResponse(response); + } + + if (initialOperationInfo.requestMethod === "PUT") { + return isBodyPollingFinalResponse(response); + } + + return true; + }; +} + +function isAsyncOperationFinalResponse( + response: FullOperationResponse, + initialOperationInfo: LROResponseInfo, + finalStateVia?: string +): boolean { + const status: string = response.parsedBody?.status || "Succeeded"; + if (!terminalStates.includes(status.toLowerCase())) { + return false; + } + + if (initialOperationInfo.requestMethod === "DELETE") { + return true; + } + + if ( + initialOperationInfo.requestMethod === "PUT" && + finalStateVia && + finalStateVia.toLowerCase() === "azure-asyncoperation" + ) { + return true; + } + + if ( + initialOperationInfo.requestMethod !== "PUT" && + !initialOperationInfo.location + ) { + return true; + } + + return false; +} + +function isLocationFinalResponse(response: FullOperationResponse): boolean { + return response.status !== 202; +} + +function isBodyPollingFinalResponse(response: FullOperationResponse): boolean { + const provisioningState: string = + response.parsedBody?.properties?.provisioningState || "Succeeded"; + + if (terminalStates.includes(provisioningState.toLowerCase())) { + return true; + } + + return false; +} + +interface LROResponseInfo { + requestMethod: string; + azureAsyncOperation?: string; + operationLocation?: string; + location?: string; +} + +function getLROData(result: FullOperationResponse): LROResponseInfo { + return { + azureAsyncOperation: result.headers.get("azure-asyncoperation"), + operationLocation: result.headers.get("operation-location"), + location: result.headers.get("location"), + requestMethod: result.request.method + }; +} + +/** + * Detects where the continuation token is and returns it. Notice that azure-asyncoperation + * must be checked first before the other location headers because there are scenarios + * where both azure-asyncoperation and location could be present in the same response but + * azure-asyncoperation should be the one to use for polling. + */ +export function getPollingURL( + rawResponse: FullOperationResponse, + defaultPath: string +): string { + return ( + getAzureAsyncoperation(rawResponse) ?? + getLocation(rawResponse) ?? + getOperationLocation(rawResponse) ?? + defaultPath + ); +} + +function getLocation(rawResponse: FullOperationResponse): string | undefined { + return rawResponse.headers?.get("location"); +} + +function getOperationLocation( + rawResponse: FullOperationResponse +): string | undefined { + return rawResponse.headers?.get("operation-location"); +} + +function getAzureAsyncoperation( + rawResponse: FullOperationResponse +): string | undefined { + return rawResponse.headers?.get("azure-asyncoperation"); +} + +export function inferLROMode( + spec: OperationSpec, + rawResponse: FullOperationResponse +): LROConfig { + const requestMethod = spec.httpMethod; + if (getAzureAsyncoperation(rawResponse) !== undefined) { + return { + mode: "AzureAsync", + resourceLocation: + requestMethod === "PUT" + ? spec.path + : requestMethod === "POST" + ? getLocation(rawResponse) + : undefined + }; + } else if ( + getLocation(rawResponse) !== undefined || + getOperationLocation(rawResponse) !== undefined + ) { + return { + mode: "Location" + }; + } else if (["PUT", "PATCH"].includes(requestMethod)) { + return { + mode: "Body" + }; + } + return {}; +} + +export function getSpecPath(spec: OperationSpec): string { + if (spec.path) { + return spec.path; + } else { + throw Error("Bad spec: request path is not found!"); + } +} diff --git a/sdk/maps/maps-route/src/lro/stateMachine.ts b/sdk/maps/maps-route/src/lro/stateMachine.ts new file mode 100644 index 000000000000..b2a69b554601 --- /dev/null +++ b/sdk/maps/maps-route/src/lro/stateMachine.ts @@ -0,0 +1,216 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + FullOperationResponse, + OperationArguments, + OperationSpec, + RawResponseCallback +} from "@azure/core-client"; +import { processAzureAsyncOperationResult } from "./azureAsyncPolling"; +import { + isBodyPollingDone, + processBodyPollingOperationResult +} from "./bodyPolling"; +import { processLocationPollingOperationResult } from "./locationPolling"; +import { + FinalStateVia, + LROConfig, + LROResult, + PollerConfig, + ResumablePollOperationState, + SendOperationFn +} from "./models"; +import { processPassthroughOperationResult } from "./passthrough"; +import { + createPollingMethod, + createRetrieveAzureAsyncResource +} from "./pollingMethod"; +import { getPollingURL, getSpecPath, inferLROMode } from "./requestUtils"; + +export const successStates = ["succeeded"]; +export const failureStates = ["failed", "canceled", "cancelled"]; +export const terminalStates = successStates.concat(failureStates); + +/** + * The type of a terminal state of an LRO. + */ +interface LROTerminalState extends LROResult { + /** + * Whether the operation has finished. + */ + done: true; +} + +/** + * The type of an in-progress state of an LRO. + */ +interface LROInProgressState extends LROResult { + /** + * Whether the operation has finished. + */ + done: false; + /** + * The request to be sent next if it is different from the standard polling one. + * Notice that it will disregard any polling URLs provided to it. + */ + next?: () => Promise>; +} + +/** + * The type of an LRO state which is a tagged union of terminal and in-progress states. + */ +export type LROState = LROTerminalState | LROInProgressState; + +/** + * creates a stepping function that maps an LRO state to another. + */ +function createTransition( + sendOperationFn: SendOperationFn, + args: OperationArguments, + spec: OperationSpec, + config: LROConfig, + finalStateVia?: FinalStateVia +): ( + rawResponse: FullOperationResponse, + flatResponse: TResult +) => LROState { + switch (config.mode) { + case "AzureAsync": { + return processAzureAsyncOperationResult( + createRetrieveAzureAsyncResource(sendOperationFn, args, spec), + config.resourceLocation, + finalStateVia + ); + } + case "Location": { + return processLocationPollingOperationResult; + } + case "Body": { + return processBodyPollingOperationResult; + } + default: { + return processPassthroughOperationResult; + } + } +} + +/** + * Creates a polling operation that returns a LRO state. + */ +export function createGetLROState( + sendOperationFn: SendOperationFn, + args: OperationArguments, + spec: OperationSpec, + config: LROConfig, + finalStateVia?: FinalStateVia +): ( + pollingURL: string, + pollerConfig: PollerConfig +) => Promise> { + const step = createTransition( + sendOperationFn, + args, + spec, + config, + finalStateVia + ); + const customerCallback = args?.options?.onResponse; + let response: LROState | undefined = undefined; + let retryAfter: string | undefined = undefined; + const poll = createPollingMethod( + sendOperationFn, + { + ...args, + options: { + ...args.options, + onResponse: ( + rawResponse: FullOperationResponse, + flatResponse: unknown + ): void => { + response = step(rawResponse, flatResponse as TResult); + retryAfter = rawResponse.headers.get("Retry-After"); + if (response.done) { + customerCallback?.(rawResponse, flatResponse); + } + } + } + }, + spec, + config.mode + ); + return async ( + path: string, + pollerConfig: PollerConfig + ): Promise> => { + await poll(path); + if (retryAfter !== undefined) { + const retryAfterInMs = parseInt(retryAfter); + pollerConfig.intervalInMs = isNaN(retryAfterInMs) + ? calculatePollingIntervalFromDate( + new Date(retryAfter), + pollerConfig.intervalInMs + ) + : retryAfterInMs; + } + return response!; + }; +} + +function calculatePollingIntervalFromDate( + retryAfterDate: Date, + defaultIntervalInMs: number +): number { + const timeNow = Math.floor(new Date().getTime()); + const retryAfterTime = retryAfterDate.getTime(); + if (timeNow < retryAfterTime) { + return retryAfterTime - timeNow; + } + return defaultIntervalInMs; +} + +/** + * Creates a callback to be used to initialize the polling operation state. + * @param state of the polling operation + * @param operationSpec of the LRO + * @param callback callback to be called when the operation is done + * @returns callback that initializes the state of the polling operation + */ +export function initializeState( + state: ResumablePollOperationState, + operationSpec: OperationSpec, + callback?: RawResponseCallback +): (rawResponse: FullOperationResponse, flatResponse: unknown) => void { + return (rawResponse: FullOperationResponse, flatResponse: unknown) => { + state.initialRawResponse = rawResponse; + state.isStarted = true; + state.pollingURL = getPollingURL( + state.initialRawResponse, + getSpecPath(operationSpec) + ); + state.config = inferLROMode(operationSpec, state.initialRawResponse); + /** short circuit polling if body polling is done in the initial request */ + if ( + state.config.mode === undefined || + (state.config.mode === "Body" && + isBodyPollingDone(state.initialRawResponse)) + ) { + state.result = flatResponse as TResult; + state.isCompleted = true; + /** + * We need to check if the LRO operation is finished inside the + * call back so that we can call the customer-provided callback + * on that result. + */ + callback?.(rawResponse, flatResponse); + } + }; +} diff --git a/sdk/maps/maps-route/src/models/index.ts b/sdk/maps/maps-route/src/models/index.ts new file mode 100644 index 000000000000..c8916bdd526c --- /dev/null +++ b/sdk/maps/maps-route/src/models/index.ts @@ -0,0 +1,2287 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; + +export type GeoJsonObjectUnion = + | GeoJsonObject + | GeoJsonGeometryUnion + | GeoJsonFeature + | GeoJsonFeatureCollection; +export type GeoJsonGeometryUnion = + | GeoJsonGeometry + | GeoJsonMultiPoint + | GeoJsonMultiPolygon + | GeoJsonPoint + | GeoJsonLineString + | GeoJsonMultiLineString + | GeoJsonPolygon + | GeoJsonGeometryCollection; + +/** An object with a matrix of coordinates. */ +export interface PostRouteMatrixRequestBody { + /** A valid `GeoJSON MultiPoint` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.3) for details. */ + origins?: GeoJsonMultiPoint; + /** A valid `GeoJSON MultiPoint` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.3) for details. */ + destinations?: GeoJsonMultiPoint; +} + +/** A valid `GeoJSON` object. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3) for details. */ +export interface GeoJsonObject { + /** Polymorphic discriminator, which specifies the different types this object can be */ + type: + | "GeoJsonGeometry" + | "MultiPoint" + | "MultiPolygon" + | "Point" + | "LineString" + | "MultiLineString" + | "Polygon" + | "GeometryCollection" + | "Feature" + | "FeatureCollection"; +} + +/** Data contained by a `GeoJson MultiPoint`. */ +export interface GeoJsonMultiPointData { + /** Coordinates for the `GeoJson MultiPoint` geometry. */ + coordinates: number[][]; +} + +/** This object is returned from a successful Route Matrix call. For ex, if 2 origins and 3 destinations are provided, there are going to 2 arrays with 3 elements in each. Each element's content depends on the options provided in the query. */ +export interface RouteMatrixResponse { + /** + * Format Version property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly formatVersion?: string; + /** + * Results as a 2 dimensional array of route summaries. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly matrix?: RouteMatrixResult[][]; + /** + * Summary object + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly summary?: RouteMatrixSummary; +} + +/** Matrix result object */ +export interface RouteMatrixResult { + /** + * StatusCode property for the current cell in the input matrix. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly statusCode?: number; + /** + * Response object of the current cell in the input matrix. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly response?: RouteMatrixResultResponse; +} + +/** Response object of the current cell in the input matrix. */ +export interface RouteMatrixResultResponse { + /** + * Summary object for route section. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly routeSummary?: RouteResultLegSummary; +} + +/** Summary object for route section. */ +export interface RouteResultLegSummary { + /** + * Length In Meters property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly lengthInMeters?: number; + /** + * Estimated travel time in seconds property that includes the delay due to real-time traffic. Note that even when traffic=false travelTimeInSeconds still includes the delay due to traffic. If DepartAt is in the future, travel time is calculated using time-dependent historic traffic data. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly travelTimeInSeconds?: number; + /** + * Estimated delay in seconds caused by the real-time incident(s) according to traffic information. For routes planned with departure time in the future, delays is always 0. To return additional travel times using different types of traffic information, parameter computeTravelTimeFor=all needs to be added. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly trafficDelayInSeconds?: number; + /** + * Departure Time property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly departureTime?: string; + /** + * Arrival Time property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly arrivalTime?: string; + /** + * Estimated travel time calculated as if there are no delays on the route due to traffic conditions (e.g. congestion). Included only if computeTravelTimeFor = all is used in the query. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly noTrafficTravelTimeInSeconds?: number; + /** + * Estimated travel time calculated using time-dependent historic traffic data. Included only if computeTravelTimeFor = all is used in the query. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly historicTrafficTravelTimeInSeconds?: number; + /** + * Estimated travel time calculated using real-time speed data. Included only if computeTravelTimeFor = all is used in the query. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly liveTrafficIncidentsTravelTimeInSeconds?: number; + /** + * Estimated fuel consumption in liters using the Combustion Consumption Model. Included if vehicleEngineType is set to _combustion_ and constantSpeedConsumptionInLitersPerHundredkm is specified. The value will be non-negative. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly fuelConsumptionInLiters?: number; + /** + * Estimated electric energy consumption in kilowatt hours (kWh) using the Electric Consumption Model. Included if vehicleEngineType is set to electric and constantSpeedConsumptionInkWhPerHundredkm is specified. The value of batteryConsumptionInkWh includes the recuperated electric energy and can therefore be negative (which indicates gaining energy). If both maxChargeInkWh and currentChargeInkWh are specified, recuperation will be capped to ensure that the battery charge level never exceeds maxChargeInkWh. If neither maxChargeInkWh nor currentChargeInkWh are specified, unconstrained recuperation is assumed in the consumption calculation. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly batteryConsumptionInkWh?: number; +} + +/** Summary object */ +export interface RouteMatrixSummary { + /** + * Number of successful routes in the response. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly successfulRoutes?: number; + /** + * Total number of routes requested. Number of cells in the input matrix. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly totalRoutes?: number; +} + +/** Common error response for all Azure Resource Manager APIs to return error details for failed operations. (This also follows the OData error response format.). */ +export interface ErrorResponse { + /** The error object. */ + error?: ErrorDetail; +} + +/** The error detail. */ +export interface ErrorDetail { + /** + * The error code. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly code?: string; + /** + * The error message. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly message?: string; + /** + * The error target. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly target?: string; + /** + * The error details. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly details?: ErrorDetail[]; + /** + * The error additional info. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly additionalInfo?: ErrorAdditionalInfo[]; +} + +/** The resource management error additional info. */ +export interface ErrorAdditionalInfo { + /** + * The additional info type. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly type?: string; + /** + * The additional info. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly info?: Record; +} + +/** This object is returned from a successful Route Directions call */ +export interface RouteDirectionsResponse { + /** + * Format Version property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly formatVersion?: string; + /** + * Routes array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly routes?: RouteDirectionsResult[]; + /** + * Optimized sequence of waypoints. It shows the index from the user provided waypoint sequence for the original and optimized list. For instance, a response: + * + * ``` + * + * + * + * + * + * ``` + * + * means that the original sequence is [0, 1, 2] and optimized sequence is [1, 2, 0]. Since the index starts by 0 the original is "first, second, third" while the optimized is "second, third, first". + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly optimizedWaypoints?: RouteOptimizedWaypoint[]; + /** Reports the effective settings used in the current call. */ + report?: RouteResponseReport; +} + +export interface RouteDirectionsResult { + /** + * Summary object + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly summary?: RouteDirectionsSummary; + /** + * Legs array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly legs?: RouteResultLeg[]; + /** + * Sections array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly sections?: RouteResultSection[]; + /** + * Contains guidance related elements. This field is present only when guidance was requested and is available. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly guidance?: RouteResultGuidance; +} + +/** Summary object */ +export interface RouteDirectionsSummary { + /** + * Length In Meters property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly lengthInMeters?: number; + /** + * Estimated travel time in seconds property that includes the delay due to real-time traffic. Note that even when traffic=false travelTimeInSeconds still includes the delay due to traffic. If DepartAt is in the future, travel time is calculated using time-dependent historic traffic data. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly travelTimeInSeconds?: number; + /** + * Estimated delay in seconds caused by the real-time incident(s) according to traffic information. For routes planned with departure time in the future, delays is always 0. To return additional travel times using different types of traffic information, parameter computeTravelTimeFor=all needs to be added. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly trafficDelayInSeconds?: number; + /** + * Departure Time property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly departureTime?: string; + /** + * Arrival Time property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly arrivalTime?: string; +} + +export interface RouteResultLeg { + /** + * Summary object for route section. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly summary?: RouteResultLegSummary; + /** + * Points array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly points?: CoordinatesPair[]; +} + +/** A location represented as a latitude and longitude. */ +export interface CoordinatesPair { + /** Latitude property */ + latitude?: number; + /** Longitude property */ + longitude?: number; +} + +export interface RouteResultSection { + /** + * Start Point Index property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly startPointIndex?: number; + /** + * End Point Index property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly endPointIndex?: number; + /** + * Section Type property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly sectionType?: string; + /** + * Travel Mode property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly travelMode?: string; + /** + * Type of the incident. Can currently be JAM, ROAD_WORK, ROAD_CLOSURE, or OTHER. See "tec" for detailed information. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly simpleCategory?: string; + /** + * Effective speed of the incident in km/h, averaged over its entire length. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly effectiveSpeedInKmh?: number; + /** + * Delay in seconds caused by the incident. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly delayInSeconds?: number; + /** + * The magnitude of delay caused by the incident. These values correspond to the values of the response field ty of the [Get Traffic Incident Detail API](https://docs.microsoft.com/rest/api/maps/traffic/gettrafficincidentdetail). + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly magnitudeOfDelay?: MagnitudeOfDelay; + /** Details of the traffic event, using definitions in the [TPEG2-TEC](https://www.iso.org/standard/63116.html) standard. Can contain effectCode and causes elements. */ + tec?: RouteResultSectionTec; +} + +/** Details of the traffic event, using definitions in the [TPEG2-TEC](https://www.iso.org/standard/63116.html) standard. Can contain effectCode and causes elements. */ +export interface RouteResultSectionTec { + /** + * The effect on the traffic flow. Contains a value in the tec001:EffectCode table, as defined in the [TPEG2-TEC](https://www.iso.org/standard/63116.html) standard. Can be used to color-code traffic events according to severity. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly effectCode?: number; + /** Causes array */ + causes?: RouteResultSectionTecCause[]; +} + +/** The cause of the traffic event. Can contain mainCauseCode and subCauseCode elements. Can be used to define iconography and descriptions. */ +export interface RouteResultSectionTecCause { + /** + * The main cause of the traffic event. Contains a value in the tec002:CauseCode table, as defined in the [TPEG2-TEC](https://www.iso.org/standard/63116.html) standard. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly mainCauseCode?: number; + /** + * The subcause of the traffic event. Contains a value in the sub cause table defined by the mainCauseCode, as defined in the [TPEG2-TEC](https://www.iso.org/standard/63116.html) standard. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly subCauseCode?: number; +} + +/** Contains guidance related elements. This field is present only when guidance was requested and is available. */ +export interface RouteResultGuidance { + /** + * A list of instructions describing maneuvers. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly instructions?: RouteResultInstruction[]; + /** + * Groups a sequence of instruction elements which are related to each other. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly instructionGroups?: RouteResultInstructionGroup[]; +} + +/** A set of attributes describing a maneuver, e.g. 'Turn right', 'Keep left', 'Take the ferry', 'Take the motorway', 'Arrive'. */ +export interface RouteResultInstruction { + /** + * Distance from the start of the route to the point of the instruction. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly routeOffsetInMeters?: number; + /** + * Estimated travel time up to the point corresponding to routeOffsetInMeters. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly travelTimeInSeconds?: number; + /** A location represented as a latitude and longitude. */ + point?: CoordinatesPair; + /** + * The index of the point in the list of polyline "points" corresponding to the point of the instruction. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly pointIndex?: number; + /** Type of the instruction, e.g., turn or change of road form. */ + instructionType?: GuidanceInstructionType; + /** + * The road number(s) of the next significant road segment(s) after the maneuver, or of the road(s) to be followed. Example: ["E34", "N205"] + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly roadNumbers?: string[]; + /** + * The number(s) of a highway exit taken by the current maneuver. If an exit has multiple exit numbers, they will be separated by "," and possibly aggregated by "-", e.g., "10, 13-15". + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly exitNumber?: string; + /** + * Street name of the next significant road segment after the maneuver, or of the street that should be followed. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly street?: string; + /** + * The text on a signpost which is most relevant to the maneuver, or to the direction that should be followed. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly signpostText?: string; + /** + * 3-character [ISO 3166-1](https://www.iso.org/iso-3166-country-codes.html) alpha-3 country code. E.g. USA. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly countryCode?: string; + /** + * A subdivision (e.g., state) of the country, represented by the second part of an [ISO 3166-2](https://www.iso.org/standard/63546.html) code. This is only available for some countries like the US, Canada, and Mexico. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly stateCode?: string; + /** + * The type of the junction where the maneuver takes place. For larger roundabouts, two separate instructions are generated for entering and leaving the roundabout. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly junctionType?: JunctionType; + /** + * Indicates the direction of an instruction. If junctionType indicates a turn instruction: + * + * * 180 = U-turn + * * [-179, -1] = Left turn + * * 0 = Straight on (a '0 degree' turn) + * * [1, 179] = Right turn + * + * If junctionType indicates a bifurcation instruction: + * + * * <0 - keep left + * * \>0 - keep right + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly turnAngleInDecimalDegrees?: number; + /** + * This indicates which exit to take at a roundabout. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly roundaboutExitNumber?: string; + /** + * It is possible to optionally combine the instruction with the next one. This can be used to build messages like "Turn left and then turn right". + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly possibleCombineWithNext?: boolean; + /** + * Indicates left-hand vs. right-hand side driving at the point of the maneuver. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly drivingSide?: DrivingSide; + /** + * A code identifying the maneuver. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly maneuver?: GuidanceManeuver; + /** + * A human-readable message for the maneuver. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly message?: string; + /** + * A human-readable message for the maneuver combined with the message from the next instruction. Sometimes it is possible to combine two successive instructions into a single instruction making it easier to follow. When this is the case the possibleCombineWithNext flag will be true. For example: + * + * ``` + * 10. Turn left onto Einsteinweg/A10/E22 towards Ring Amsterdam + * 11. Follow Einsteinweg/A10/E22 towards Ring Amsterdam + * ``` + * + * The possibleCombineWithNext flag on instruction 10 is true. This indicates to the clients of coded guidance that it can be combined with instruction 11. The instructions will be combined automatically for clients requesting human-readable guidance. The combinedMessage field contains the combined message: + * + * ``` + * Turn left onto Einsteinweg/A10/E22 towards Ring Amsterdam + * then follow Einsteinweg/A10/E22 towards Ring Amsterdam. + * ``` + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly combinedMessage?: string; +} + +/** Groups a sequence of instruction elements which are related to each other. The sequence range is constrained with firstInstructionIndex and lastInstructionIndex. When human-readable text messages are requested for guidance (instructionType=text or tagged), then the instructionGroup has a summary message returned when available. */ +export interface RouteResultInstructionGroup { + /** + * Index of the first instruction. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly firstInstructionIndex?: number; + /** + * Index of the last instruction. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly lastInstructionIndex?: number; + /** + * Length of the group. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly groupLengthInMeters?: number; + /** + * Summary message when human-readable text messages are requested for guidance (instructionType=text or tagged). + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly groupMessage?: string; +} + +/** Optimized way point object. */ +export interface RouteOptimizedWaypoint { + /** + * Way point index provided by the user. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly providedIndex?: number; + /** + * Optimized way point index from the system. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly optimizedIndex?: number; +} + +/** Reports the effective settings used in the current call. */ +export interface RouteResponseReport { + /** + * Effective parameters or data used when calling this Route API. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly effectiveSettings?: RouteResponseReportEffectiveSetting[]; +} + +/** Effective parameter or data used when calling this Route API. */ +export interface RouteResponseReportEffectiveSetting { + /** + * Name of the parameter used. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly key?: string; + /** + * Value of the parameter used. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly value?: string; +} + +/** Post body parameters for Route directions. */ +export interface PostRouteDirectionsRequestBody { + /** + * A GeoJSON Geometry collection representing sequence of coordinates used as input for route reconstruction and for calculating zero or more alternative routes to this reference route. + * - The provided sequence of supporting points is used as input for route reconstruction. + * - The alternative routes are calculated between the origin and destination points specified in the base path parameter locations. + * - If both _minDeviationDistance_ and _minDeviationTime_ are set to zero, then these origin and destination points are + * expected to be at (or very near) the beginning and end of the reference route, respectively. + * - Intermediate locations (_waypoints_) are not supported when using <_supportingPoints_>. + * - The reference route may contain traffic incidents of type _ROAD_CLOSURE_, which are + * ignored for the calculation of the reference route's travel time and traffic delay. + */ + supportingPoints?: Record; + /** This is a list of 3-character, ISO 3166-1, alpha-3 country codes of countries in which all toll roads with vignettes are to be avoided, e.g. "AUS,CHE". Toll roads with vignettes in countries not in the list are unaffected. Note: It is an error to specify both **avoidVignette** and **allowVignette**. */ + avoidVignette?: string[]; + /** This is a list of 3-character, ISO 3166-1, alpha-3 country codes of countries in which toll roads with vignettes are allowed, e.g. "AUS,CHE". Specifying **allowVignette** with some countries X is equivalent to specifying **avoidVignette** with all countries but X. Specifying **allowVignette** with an empty list is the same as avoiding all toll roads with vignettes. Note: It is an error to specify both **avoidVignette** and **allowVignette**. */ + allowVignette?: string[]; + /** A GeoJSON MultiPolygon representing list of areas to avoid. Only rectangle polygons are supported. The maximum size of a rectangle is about 160x160 km. Maximum number of avoided areas is **10**. It cannot cross the 180th meridian. It must be between -80 and +80 degrees of latitude. */ + avoidAreas?: GeoJsonMultiPolygon; +} + +export interface GeoJsonMultiPolygonData { + /** Contains a list of valid `GeoJSON Polygon` objects. **Note** that coordinates in GeoJSON are in x, y order (longitude, latitude). */ + coordinates: number[][][][]; +} + +/** This object is returned from a successful Route Reachable Range call */ +export interface GetRouteRangeResponse { + /** + * Format Version property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly formatVersion?: string; + /** Reachable Range */ + reachableRange?: RouteRange; + /** Reports the effective settings used in the current call. */ + report?: RouteResponseReport; +} + +/** Reachable Range */ +export interface RouteRange { + /** Center point of the reachable range */ + center?: CoordinatesPair; + /** + * Polygon boundary of the reachable range represented as a list of points. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly boundary?: CoordinatesPair[]; +} + +/** This type represents the request body for the Batch service. */ +export interface BatchRequestBody { + /** The list of queries to process. */ + batchItems?: BatchRequestBodyBatchItemsItem[]; +} + +/** Batch Query object */ +export interface BatchRequestBodyBatchItemsItem { + /** Partial query string. */ + query?: string; +} + +/** This object is returned from a successful Batch service call. Extend with 'batchItems' property. */ +export interface BatchResponse { + /** + * Summary for the batch request + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly summary?: BatchResponseSummary; +} + +/** Summary for the batch request */ +export interface BatchResponseSummary { + /** + * Number of successful requests in the batch + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly successfulRequests?: number; + /** + * Total number of requests in the batch + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly totalRequests?: number; +} + +/** An item returned from Batch API. Extend with 'response' property. */ +export interface BatchItem { + /** + * HTTP request status code. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly statusCode?: number; +} + +/** Data contained by a `GeoJson Point`. */ +export interface GeoJsonPointData { + /** A `Position` is an array of numbers with two or more elements. The first two elements are _longitude_ and _latitude_, precisely in that order. _Altitude/Elevation_ is an optional third element. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.1) for details. */ + coordinates: number[]; +} + +export interface GeoJsonLineStringData { + /** Coordinates for the `GeoJson LineString` geometry. */ + coordinates: number[][]; +} + +export interface GeoJsonMultiLineStringData { + /** Coordinates for the `GeoJson MultiLineString` geometry. */ + coordinates: number[][][]; +} + +export interface GeoJsonPolygonData { + /** Coordinates for the `GeoJson Polygon` geometry type. */ + coordinates: number[][][]; +} + +export interface GeoJsonGeometryCollectionData { + /** Contains a list of valid `GeoJSON` geometry objects. **Note** that coordinates in GeoJSON are in x, y order (longitude, latitude). */ + geometries: GeoJsonGeometryUnion[]; +} + +export interface GeoJsonFeatureData { + /** A valid `GeoJSON` geometry object. The type must be one of the seven valid GeoJSON geometry types - Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon and GeometryCollection. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1) for details. */ + geometry: GeoJsonGeometryUnion; + /** Properties can contain any additional metadata about the `Feature`. Value can be any JSON object or a JSON null value */ + properties?: Record; + /** Identifier for the feature. */ + id?: string; + /** The type of the feature. The value depends on the data model the current feature is part of. Some data models may have an empty value. */ + featureType?: string; +} + +export interface GeoJsonFeatureCollectionData { + /** Contains a list of valid `GeoJSON Feature` objects. */ + features: GeoJsonFeature[]; +} + +/** A valid `GeoJSON` geometry object. The type must be one of the seven valid GeoJSON geometry types - Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon and GeometryCollection. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1) for details. */ +export type GeoJsonGeometry = GeoJsonObject & { + /** Polymorphic discriminator, which specifies the different types this object can be */ + type: + | "GeoJsonGeometry" + | "MultiPoint" + | "MultiPolygon" + | "Point" + | "LineString" + | "MultiLineString" + | "Polygon" + | "GeometryCollection"; +}; + +/** A valid `GeoJSON Feature` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.2) for details. */ +export type GeoJsonFeature = GeoJsonObject & + GeoJsonFeatureData & { + /** Polymorphic discriminator, which specifies the different types this object can be */ + type: "Feature"; + }; + +/** A valid `GeoJSON FeatureCollection` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. */ +export type GeoJsonFeatureCollection = GeoJsonObject & + GeoJsonFeatureCollectionData & { + /** Polymorphic discriminator, which specifies the different types this object can be */ + type: "FeatureCollection"; + }; + +/** A valid `GeoJSON MultiPoint` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.3) for details. */ +export type GeoJsonMultiPoint = GeoJsonGeometry & GeoJsonMultiPointData & {}; + +/** The result of the query. RouteDirectionsResponse if the query completed successfully, ErrorResponse otherwise. */ +export type RouteDirectionsBatchItemResponse = RouteDirectionsResponse & + ErrorResponse & {}; + +/** A valid `GeoJSON MultiPolygon` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.7) for details. */ +export type GeoJsonMultiPolygon = GeoJsonGeometry & + GeoJsonMultiPolygonData & {}; + +/** This object is returned from a successful Route Directions Batch service call. */ +export type RouteDirectionsBatchResponse = BatchResponse & { + /** + * Array containing the batch results. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly batchItems?: RouteDirectionsBatchItem[]; +}; + +/** An item returned from Route Directions Batch service call. */ +export type RouteDirectionsBatchItem = BatchItem & { + /** + * The result of the query. RouteDirectionsResponse if the query completed successfully, ErrorResponse otherwise. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly response?: RouteDirectionsBatchItemResponse; +}; + +/** A valid `GeoJSON Point` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.2) for details. */ +export type GeoJsonPoint = GeoJsonGeometry & GeoJsonPointData & {}; + +/** A valid `GeoJSON LineString` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.4) for details. */ +export type GeoJsonLineString = GeoJsonGeometry & GeoJsonLineStringData & {}; + +/** A valid `GeoJSON MultiLineString` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.5) for details. */ +export type GeoJsonMultiLineString = GeoJsonGeometry & + GeoJsonMultiLineStringData & {}; + +/** A valid `GeoJSON Polygon` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.6) for details. */ +export type GeoJsonPolygon = GeoJsonGeometry & GeoJsonPolygonData & {}; + +/** A valid `GeoJSON GeometryCollection` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.8) for details. */ +export type GeoJsonGeometryCollection = GeoJsonGeometry & + GeoJsonGeometryCollectionData & {}; + +/** Defines headers for Route_postRouteMatrix operation. */ +export interface RoutePostRouteMatrixHeaders { + /** New URL to check for the results of the long running process. */ + location?: string; +} + +/** Defines headers for Route_postRouteDirectionsBatch operation. */ +export interface RoutePostRouteDirectionsBatchHeaders { + /** New URL to check for the results of the long running process. */ + location?: string; +} + +/** Known values of {@link Geography} that the service accepts. */ +export const enum KnownGeography { + Us = "us", + Eu = "eu" +} + +/** + * Defines values for Geography. \ + * {@link KnownGeography} can be used interchangeably with Geography, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **us** \ + * **eu** + */ +export type Geography = string; + +/** Known values of {@link ResponseFormat} that the service accepts. */ +export const enum KnownResponseFormat { + /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ + Json = "json" +} + +/** + * Defines values for ResponseFormat. \ + * {@link KnownResponseFormat} can be used interchangeably with ResponseFormat, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) + */ +export type ResponseFormat = string; + +/** Known values of {@link ComputeTravelTimeFor} that the service accepts. */ +export const enum KnownComputeTravelTimeFor { + /** Does not compute additional travel times. */ + None = "none", + /** Computes travel times for all types of traffic information and specifies all results in the fields noTrafficTravelTimeInSeconds, historicTrafficTravelTimeInSeconds and liveTrafficIncidentsTravelTimeInSeconds being included in the summaries in the route response. */ + All = "all" +} + +/** + * Defines values for ComputeTravelTimeFor. \ + * {@link KnownComputeTravelTimeFor} can be used interchangeably with ComputeTravelTimeFor, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **none**: Does not compute additional travel times. \ + * **all**: Computes travel times for all types of traffic information and specifies all results in the fields noTrafficTravelTimeInSeconds, historicTrafficTravelTimeInSeconds and liveTrafficIncidentsTravelTimeInSeconds being included in the summaries in the route response. + */ +export type ComputeTravelTimeFor = string; + +/** Known values of {@link SectionType} that the service accepts. */ +export const enum KnownSectionType { + /** Get sections if the route includes car trains. */ + CarTrain = "carTrain", + /** Countries the route has parts in. */ + Country = "country", + /** Get sections if the route includes ferries. */ + Ferry = "ferry", + /** Get sections if the route includes motorways. */ + Motorway = "motorway", + /** Get sections which are suited for pedestrians. */ + Pedestrian = "pedestrian", + /** Get sections which require a toll to be payed. */ + TollRoad = "tollRoad", + /** Get sections which require a toll vignette to be present. */ + TollVignette = "tollVignette", + /** Get sections which contain traffic information. */ + Traffic = "traffic", + /** Get sections in relation to the request parameter `travelMode`. */ + TravelMode = "travelMode", + /** Get sections if the route includes tunnels. */ + Tunnel = "tunnel" +} + +/** + * Defines values for SectionType. \ + * {@link KnownSectionType} can be used interchangeably with SectionType, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **carTrain**: Get sections if the route includes car trains. \ + * **country**: Countries the route has parts in. \ + * **ferry**: Get sections if the route includes ferries. \ + * **motorway**: Get sections if the route includes motorways. \ + * **pedestrian**: Get sections which are suited for pedestrians. \ + * **tollRoad**: Get sections which require a toll to be payed. \ + * **tollVignette**: Get sections which require a toll vignette to be present. \ + * **traffic**: Get sections which contain traffic information. \ + * **travelMode**: Get sections in relation to the request parameter `travelMode`. \ + * **tunnel**: Get sections if the route includes tunnels. + */ +export type SectionType = string; + +/** Known values of {@link WindingnessLevel} that the service accepts. */ +export const enum KnownWindingnessLevel { + /** low */ + Low = "low", + /** normal */ + Normal = "normal", + /** high */ + High = "high" +} + +/** + * Defines values for WindingnessLevel. \ + * {@link KnownWindingnessLevel} can be used interchangeably with WindingnessLevel, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **low**: low \ + * **normal**: normal \ + * **high**: high + */ +export type WindingnessLevel = string; + +/** Known values of {@link HillinessDegree} that the service accepts. */ +export const enum KnownHillinessDegree { + /** low */ + Low = "low", + /** normal */ + Normal = "normal", + /** high */ + High = "high" +} + +/** + * Defines values for HillinessDegree. \ + * {@link KnownHillinessDegree} can be used interchangeably with HillinessDegree, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **low**: low \ + * **normal**: normal \ + * **high**: high + */ +export type HillinessDegree = string; + +/** Known values of {@link TravelMode} that the service accepts. */ +export const enum KnownTravelMode { + /** The returned routes are optimized for cars. */ + Car = "car", + /** The returned routes are optimized for commercial vehicles, like for trucks. */ + Truck = "truck", + /** The returned routes are optimized for taxis. BETA functionality. */ + Taxi = "taxi", + /** The returned routes are optimized for buses, including the use of bus only lanes. BETA functionality. */ + Bus = "bus", + /** The returned routes are optimized for vans. BETA functionality. */ + Van = "van", + /** The returned routes are optimized for motorcycles. BETA functionality. */ + Motorcycle = "motorcycle", + /** The returned routes are optimized for bicycles, including use of bicycle lanes. */ + Bicycle = "bicycle", + /** The returned routes are optimized for pedestrians, including the use of sidewalks. */ + Pedestrian = "pedestrian" +} + +/** + * Defines values for TravelMode. \ + * {@link KnownTravelMode} can be used interchangeably with TravelMode, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **car**: The returned routes are optimized for cars. \ + * **truck**: The returned routes are optimized for commercial vehicles, like for trucks. \ + * **taxi**: The returned routes are optimized for taxis. BETA functionality. \ + * **bus**: The returned routes are optimized for buses, including the use of bus only lanes. BETA functionality. \ + * **van**: The returned routes are optimized for vans. BETA functionality. \ + * **motorcycle**: The returned routes are optimized for motorcycles. BETA functionality. \ + * **bicycle**: The returned routes are optimized for bicycles, including use of bicycle lanes. \ + * **pedestrian**: The returned routes are optimized for pedestrians, including the use of sidewalks. + */ +export type TravelMode = string; + +/** Known values of {@link RouteAvoidType} that the service accepts. */ +export const enum KnownRouteAvoidType { + /** Avoids toll roads. */ + TollRoads = "tollRoads", + /** Avoids motorways */ + Motorways = "motorways", + /** Avoids ferries */ + Ferries = "ferries", + /** Avoids unpaved roads */ + UnpavedRoads = "unpavedRoads", + /** Avoids routes that require the use of carpool (HOV/High Occupancy Vehicle) lanes. */ + Carpools = "carpools", + /** Avoids using the same road multiple times. Most useful in conjunction with `routeType`=thrilling. */ + AlreadyUsedRoads = "alreadyUsedRoads", + /** Avoids border crossings in route calculation. */ + BorderCrossings = "borderCrossings" +} + +/** + * Defines values for RouteAvoidType. \ + * {@link KnownRouteAvoidType} can be used interchangeably with RouteAvoidType, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **tollRoads**: Avoids toll roads. \ + * **motorways**: Avoids motorways \ + * **ferries**: Avoids ferries \ + * **unpavedRoads**: Avoids unpaved roads \ + * **carpools**: Avoids routes that require the use of carpool (HOV\/High Occupancy Vehicle) lanes. \ + * **alreadyUsedRoads**: Avoids using the same road multiple times. Most useful in conjunction with `routeType`=thrilling. \ + * **borderCrossings**: Avoids border crossings in route calculation. + */ +export type RouteAvoidType = string; + +/** Known values of {@link RouteType} that the service accepts. */ +export const enum KnownRouteType { + /** The fastest route. */ + Fastest = "fastest", + /** The shortest route by distance. */ + Shortest = "shortest", + /** A route balanced by economy and speed. */ + Eco = "eco", + /** Includes interesting or challenging roads and uses as few motorways as possible. You can choose the level of turns included and also the degree of hilliness. See the hilliness and windingness parameters for how to set this. There is a limit of 900 km on routes planned with `routeType`=thrilling */ + Thrilling = "thrilling" +} + +/** + * Defines values for RouteType. \ + * {@link KnownRouteType} can be used interchangeably with RouteType, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **fastest**: The fastest route. \ + * **shortest**: The shortest route by distance. \ + * **eco**: A route balanced by economy and speed. \ + * **thrilling**: Includes interesting or challenging roads and uses as few motorways as possible. You can choose the level of turns included and also the degree of hilliness. See the hilliness and windingness parameters for how to set this. There is a limit of 900 km on routes planned with `routeType`=thrilling + */ +export type RouteType = string; + +/** Known values of {@link VehicleLoadType} that the service accepts. */ +export const enum KnownVehicleLoadType { + /** Explosives */ + USHazmatClass1 = "USHazmatClass1", + /** Compressed gas */ + USHazmatClass2 = "USHazmatClass2", + /** Flammable liquids */ + USHazmatClass3 = "USHazmatClass3", + /** Flammable solids */ + USHazmatClass4 = "USHazmatClass4", + /** Oxidizers */ + USHazmatClass5 = "USHazmatClass5", + /** Poisons */ + USHazmatClass6 = "USHazmatClass6", + /** Radioactive */ + USHazmatClass7 = "USHazmatClass7", + /** Corrosives */ + USHazmatClass8 = "USHazmatClass8", + /** Miscellaneous */ + USHazmatClass9 = "USHazmatClass9", + /** Explosives */ + OtherHazmatExplosive = "otherHazmatExplosive", + /** Miscellaneous */ + OtherHazmatGeneral = "otherHazmatGeneral", + /** Harmful to water */ + OtherHazmatHarmfulToWater = "otherHazmatHarmfulToWater" +} + +/** + * Defines values for VehicleLoadType. \ + * {@link KnownVehicleLoadType} can be used interchangeably with VehicleLoadType, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **USHazmatClass1**: Explosives \ + * **USHazmatClass2**: Compressed gas \ + * **USHazmatClass3**: Flammable liquids \ + * **USHazmatClass4**: Flammable solids \ + * **USHazmatClass5**: Oxidizers \ + * **USHazmatClass6**: Poisons \ + * **USHazmatClass7**: Radioactive \ + * **USHazmatClass8**: Corrosives \ + * **USHazmatClass9**: Miscellaneous \ + * **otherHazmatExplosive**: Explosives \ + * **otherHazmatGeneral**: Miscellaneous \ + * **otherHazmatHarmfulToWater**: Harmful to water + */ +export type VehicleLoadType = string; + +/** Known values of {@link GeoJsonObjectType} that the service accepts. */ +export const enum KnownGeoJsonObjectType { + /** `GeoJSON Point` geometry. */ + GeoJsonPoint = "Point", + /** `GeoJSON MultiPoint` geometry. */ + GeoJsonMultiPoint = "MultiPoint", + /** `GeoJSON LineString` geometry. */ + GeoJsonLineString = "LineString", + /** `GeoJSON MultiLineString` geometry. */ + GeoJsonMultiLineString = "MultiLineString", + /** `GeoJSON Polygon` geometry. */ + GeoJsonPolygon = "Polygon", + /** `GeoJSON MultiPolygon` geometry. */ + GeoJsonMultiPolygon = "MultiPolygon", + /** `GeoJSON GeometryCollection` geometry. */ + GeoJsonGeometryCollection = "GeometryCollection", + /** `GeoJSON Feature` object. */ + GeoJsonFeature = "Feature", + /** `GeoJSON FeatureCollection` object. */ + GeoJsonFeatureCollection = "FeatureCollection" +} + +/** + * Defines values for GeoJsonObjectType. \ + * {@link KnownGeoJsonObjectType} can be used interchangeably with GeoJsonObjectType, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **Point**: `GeoJSON Point` geometry. \ + * **MultiPoint**: `GeoJSON MultiPoint` geometry. \ + * **LineString**: `GeoJSON LineString` geometry. \ + * **MultiLineString**: `GeoJSON MultiLineString` geometry. \ + * **Polygon**: `GeoJSON Polygon` geometry. \ + * **MultiPolygon**: `GeoJSON MultiPolygon` geometry. \ + * **GeometryCollection**: `GeoJSON GeometryCollection` geometry. \ + * **Feature**: `GeoJSON Feature` object. \ + * **FeatureCollection**: `GeoJSON FeatureCollection` object. + */ +export type GeoJsonObjectType = string; + +/** Known values of {@link TextFormat} that the service accepts. */ +export const enum KnownTextFormat { + /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ + Json = "json", + /** [The Extensible Markup Language](https://www.w3.org/TR/xml/) */ + Xml = "xml" +} + +/** + * Defines values for TextFormat. \ + * {@link KnownTextFormat} can be used interchangeably with TextFormat, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) \ + * **xml**: [The Extensible Markup Language](https:\/\/www.w3.org\/TR\/xml\/) + */ +export type TextFormat = string; + +/** Known values of {@link AlternativeRouteType} that the service accepts. */ +export const enum KnownAlternativeRouteType { + /** Allow any alternative route to be returned irrespective of how it compares to the reference route in terms of optimality. */ + AnyRoute = "anyRoute", + /** Return an alternative route only if it is better than the reference route according to the given planning criteria. */ + BetterRoute = "betterRoute" +} + +/** + * Defines values for AlternativeRouteType. \ + * {@link KnownAlternativeRouteType} can be used interchangeably with AlternativeRouteType, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **anyRoute**: Allow any alternative route to be returned irrespective of how it compares to the reference route in terms of optimality. \ + * **betterRoute**: Return an alternative route only if it is better than the reference route according to the given planning criteria. + */ +export type AlternativeRouteType = string; + +/** Known values of {@link RouteInstructionsType} that the service accepts. */ +export const enum KnownRouteInstructionsType { + /** Returns raw instruction data without human-readable messages. */ + Coded = "coded", + /** Returns raw instructions data with human-readable messages in plain text. */ + Text = "text", + /** + * Returns raw instruction data with tagged human-readable messages to permit formatting. A human-readable message is built up from repeatable identified elements. These are tagged to allow client applications to format them correctly. The following message components are tagged when instructionsType=tagged: street, roadNumber, signpostText, exitNumber, roundaboutExitNumber. + * + * Example of tagged 'Turn left' message:​ + * + * ``` + * Turn left onto A4/E19 + * towards Den Haag + * ``` + */ + Tagged = "tagged" +} + +/** + * Defines values for RouteInstructionsType. \ + * {@link KnownRouteInstructionsType} can be used interchangeably with RouteInstructionsType, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **coded**: Returns raw instruction data without human-readable messages. \ + * **text**: Returns raw instructions data with human-readable messages in plain text. \ + * **tagged**: Returns raw instruction data with tagged human-readable messages to permit formatting. A human-readable message is built up from repeatable identified elements. These are tagged to allow client applications to format them correctly. The following message components are tagged when instructionsType=tagged: street, roadNumber, signpostText, exitNumber, roundaboutExitNumber. + * + * Example of tagged 'Turn left' message:​ + * + * ``` + * Turn left onto A4<\/roadNumber>\/E19<\/roadNumber> + * towards Den Haag<\/signpostText> + * ``` + */ +export type RouteInstructionsType = string; + +/** Known values of {@link RouteRepresentation} that the service accepts. */ +export const enum KnownRouteRepresentation { + /** Includes route geometry in the response. */ + Polyline = "polyline", + /** Summary as per polyline but excluding the point geometry elements for the routes in the response. */ + SummaryOnly = "summaryOnly", + /** Includes only the optimized waypoint indices but does not include the route geometry in the response. */ + None = "none" +} + +/** + * Defines values for RouteRepresentation. \ + * {@link KnownRouteRepresentation} can be used interchangeably with RouteRepresentation, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **polyline**: Includes route geometry in the response. \ + * **summaryOnly**: Summary as per polyline but excluding the point geometry elements for the routes in the response. \ + * **none**: Includes only the optimized waypoint indices but does not include the route geometry in the response. + */ +export type RouteRepresentation = string; + +/** Known values of {@link VehicleEngineType} that the service accepts. */ +export const enum KnownVehicleEngineType { + /** Internal combustion engine. */ + Combustion = "combustion", + /** Electric engine. */ + Electric = "electric" +} + +/** + * Defines values for VehicleEngineType. \ + * {@link KnownVehicleEngineType} can be used interchangeably with VehicleEngineType, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **combustion**: Internal combustion engine. \ + * **electric**: Electric engine. + */ +export type VehicleEngineType = string; + +/** Known values of {@link MagnitudeOfDelay} that the service accepts. */ +export const enum KnownMagnitudeOfDelay { + /** Unknown. */ + Zero = "0", + /** Minor. */ + One = "1", + /** Moderate. */ + Two = "2", + /** Major. */ + Three = "3", + /** Undefined, used for road closures and other indefinite delays. */ + Four = "4" +} + +/** + * Defines values for MagnitudeOfDelay. \ + * {@link KnownMagnitudeOfDelay} can be used interchangeably with MagnitudeOfDelay, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **0**: Unknown. \ + * **1**: Minor. \ + * **2**: Moderate. \ + * **3**: Major. \ + * **4**: Undefined, used for road closures and other indefinite delays. + */ +export type MagnitudeOfDelay = string; + +/** Known values of {@link GuidanceInstructionType} that the service accepts. */ +export const enum KnownGuidanceInstructionType { + /** Turn. */ + Turn = "TURN", + /** Road Change. */ + RoadChange = "ROAD_CHANGE", + /** Departure location. */ + LocationDeparture = "LOCATION_DEPARTURE", + /** Arrival location. */ + LocationArrival = "LOCATION_ARRIVAL", + /** Direction information. */ + DirectionInfo = "DIRECTION_INFO", + /** Way point location. */ + LocationWaypoint = "LOCATION_WAYPOINT" +} + +/** + * Defines values for GuidanceInstructionType. \ + * {@link KnownGuidanceInstructionType} can be used interchangeably with GuidanceInstructionType, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **TURN**: Turn. \ + * **ROAD_CHANGE**: Road Change. \ + * **LOCATION_DEPARTURE**: Departure location. \ + * **LOCATION_ARRIVAL**: Arrival location. \ + * **DIRECTION_INFO**: Direction information. \ + * **LOCATION_WAYPOINT**: Way point location. + */ +export type GuidanceInstructionType = string; + +/** Known values of {@link JunctionType} that the service accepts. */ +export const enum KnownJunctionType { + /** regular */ + Regular = "REGULAR", + /** roundabout */ + Roundabout = "ROUNDABOUT", + /** bifurcation */ + Bifurcation = "BIFURCATION" +} + +/** + * Defines values for JunctionType. \ + * {@link KnownJunctionType} can be used interchangeably with JunctionType, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **REGULAR**: regular \ + * **ROUNDABOUT**: roundabout \ + * **BIFURCATION**: bifurcation + */ +export type JunctionType = string; + +/** Known values of {@link DrivingSide} that the service accepts. */ +export const enum KnownDrivingSide { + /** Left side. */ + Left = "LEFT", + /** Right side. */ + Right = "RIGHT" +} + +/** + * Defines values for DrivingSide. \ + * {@link KnownDrivingSide} can be used interchangeably with DrivingSide, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **LEFT**: Left side. \ + * **RIGHT**: Right side. + */ +export type DrivingSide = string; + +/** Known values of {@link GuidanceManeuver} that the service accepts. */ +export const enum KnownGuidanceManeuver { + /** You have arrived. */ + Arrive = "ARRIVE", + /** You have arrived. Your destination is on the left. */ + ArriveLeft = "ARRIVE_LEFT", + /** You have arrived. Your destination is on the right. */ + ArriveRight = "ARRIVE_RIGHT", + /** Leave. */ + Depart = "DEPART", + /** Keep straight on. */ + Straight = "STRAIGHT", + /** Keep right. */ + KeepRight = "KEEP_RIGHT", + /** Bear right. */ + BearRight = "BEAR_RIGHT", + /** Turn right. */ + TurnRight = "TURN_RIGHT", + /** Turn sharp right. */ + SharpRight = "SHARP_RIGHT", + /** Keep left. */ + KeepLeft = "KEEP_LEFT", + /** Bear left. */ + BearLeft = "BEAR_LEFT", + /** Turn left. */ + TurnLeft = "TURN_LEFT", + /** Turn sharp left. */ + SharpLeft = "SHARP_LEFT", + /** Make a U-turn. */ + MakeUturn = "MAKE_UTURN", + /** Take the motorway. */ + EnterMotorway = "ENTER_MOTORWAY", + /** Take the freeway. */ + EnterFreeway = "ENTER_FREEWAY", + /** Take the highway. */ + EnterHighway = "ENTER_HIGHWAY", + /** Take the exit. */ + TakeExit = "TAKE_EXIT", + /** Take the left exit. */ + MotorwayExitLeft = "MOTORWAY_EXIT_LEFT", + /** Take the right exit. */ + MotorwayExitRight = "MOTORWAY_EXIT_RIGHT", + /** Take the ferry. */ + TakeFerry = "TAKE_FERRY", + /** Cross the roundabout. */ + RoundaboutCross = "ROUNDABOUT_CROSS", + /** At the roundabout take the exit on the right. */ + RoundaboutRight = "ROUNDABOUT_RIGHT", + /** At the roundabout take the exit on the left. */ + RoundaboutLeft = "ROUNDABOUT_LEFT", + /** Go around the roundabout. */ + RoundaboutBack = "ROUNDABOUT_BACK", + /** Try to make a U-turn. */ + TRYMakeUturn = "TRY_MAKE_UTURN", + /** Follow. */ + Follow = "FOLLOW", + /** Switch to the parallel road. */ + SwitchParallelRoad = "SWITCH_PARALLEL_ROAD", + /** Switch to the main road. */ + SwitchMainRoad = "SWITCH_MAIN_ROAD", + /** Take the ramp. */ + EntranceRamp = "ENTRANCE_RAMP", + /** You have reached the waypoint. It is on the left. */ + WaypointLeft = "WAYPOINT_LEFT", + /** You have reached the waypoint. It is on the right. */ + WaypointRight = "WAYPOINT_RIGHT", + /** You have reached the waypoint. */ + WaypointReached = "WAYPOINT_REACHED" +} + +/** + * Defines values for GuidanceManeuver. \ + * {@link KnownGuidanceManeuver} can be used interchangeably with GuidanceManeuver, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **ARRIVE**: You have arrived. \ + * **ARRIVE_LEFT**: You have arrived. Your destination is on the left. \ + * **ARRIVE_RIGHT**: You have arrived. Your destination is on the right. \ + * **DEPART**: Leave. \ + * **STRAIGHT**: Keep straight on. \ + * **KEEP_RIGHT**: Keep right. \ + * **BEAR_RIGHT**: Bear right. \ + * **TURN_RIGHT**: Turn right. \ + * **SHARP_RIGHT**: Turn sharp right. \ + * **KEEP_LEFT**: Keep left. \ + * **BEAR_LEFT**: Bear left. \ + * **TURN_LEFT**: Turn left. \ + * **SHARP_LEFT**: Turn sharp left. \ + * **MAKE_UTURN**: Make a U-turn. \ + * **ENTER_MOTORWAY**: Take the motorway. \ + * **ENTER_FREEWAY**: Take the freeway. \ + * **ENTER_HIGHWAY**: Take the highway. \ + * **TAKE_EXIT**: Take the exit. \ + * **MOTORWAY_EXIT_LEFT**: Take the left exit. \ + * **MOTORWAY_EXIT_RIGHT**: Take the right exit. \ + * **TAKE_FERRY**: Take the ferry. \ + * **ROUNDABOUT_CROSS**: Cross the roundabout. \ + * **ROUNDABOUT_RIGHT**: At the roundabout take the exit on the right. \ + * **ROUNDABOUT_LEFT**: At the roundabout take the exit on the left. \ + * **ROUNDABOUT_BACK**: Go around the roundabout. \ + * **TRY_MAKE_UTURN**: Try to make a U-turn. \ + * **FOLLOW**: Follow. \ + * **SWITCH_PARALLEL_ROAD**: Switch to the parallel road. \ + * **SWITCH_MAIN_ROAD**: Switch to the main road. \ + * **ENTRANCE_RAMP**: Take the ramp. \ + * **WAYPOINT_LEFT**: You have reached the waypoint. It is on the left. \ + * **WAYPOINT_RIGHT**: You have reached the waypoint. It is on the right. \ + * **WAYPOINT_REACHED**: You have reached the waypoint. + */ +export type GuidanceManeuver = string; + +/** Known values of {@link GeographicResourceLocation} that the service accepts. */ +export const enum KnownGeographicResourceLocation { + /** Used to access an Azure Maps Creator resource in the United States */ + Us = "us", + /** Used to access an Azure Maps Creator resource in Europe */ + Eu = "eu" +} + +/** + * Defines values for GeographicResourceLocation. \ + * {@link KnownGeographicResourceLocation} can be used interchangeably with GeographicResourceLocation, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **us**: Used to access an Azure Maps Creator resource in the United States \ + * **eu**: Used to access an Azure Maps Creator resource in Europe + */ +export type GeographicResourceLocation = string; + +/** Optional parameters. */ +export interface RoutePostRouteMatrixOptionalParams + extends coreClient.OperationOptions { + /** Boolean to indicate whether to execute the request synchronously. If set to true, user will get a 200 response if the request is finished under 120 seconds. Otherwise, user will get a 202 response right away. Please refer to the API description for more details on 202 response. **Supported only for async request**. */ + waitForResults?: boolean; + /** Specifies whether to return additional travel times using different types of traffic information (none, historic, live) as well as the default best-estimate travel time. */ + computeTravelTimeFor?: ComputeTravelTimeFor; + /** Specifies which of the section types is reported in the route response.

For example if sectionType = pedestrian the sections which are suited for pedestrians only are returned. Multiple types can be used. The default sectionType refers to the travelMode input. By default travelMode is set to car */ + sectionType?: SectionType; + /** The date and time of arrival at the destination point. It must be specified as a dateTime. When a time zone offset is not specified it will be assumed to be that of the destination point. The arriveAt value must be in the future. The arriveAt parameter cannot be used in conjunction with departAt, minDeviationDistance or minDeviationTime. */ + arriveAt?: Date; + /** The date and time of departure from the origin point. Departure times apart from now must be specified as a dateTime. When a time zone offset is not specified, it will be assumed to be that of the origin point. The departAt value must be in the future in the date-time format (1996-12-19T16:39:57-08:00). */ + departAt?: Date; + /** Weight per axle of the vehicle in kg. A value of 0 means that weight restrictions per axle are not considered. */ + vehicleAxleWeight?: number; + /** Length of the vehicle in meters. A value of 0 means that length restrictions are not considered. */ + vehicleLength?: number; + /** Height of the vehicle in meters. A value of 0 means that height restrictions are not considered. */ + vehicleHeight?: number; + /** Width of the vehicle in meters. A value of 0 means that width restrictions are not considered. */ + vehicleWidth?: number; + /** + * Maximum speed of the vehicle in km/hour. The max speed in the vehicle profile is used to check whether a vehicle is allowed on motorways. + * + * * A value of 0 means that an appropriate value for the vehicle will be determined and applied during route planning. + * + * * A non-zero value may be overridden during route planning. For example, the current traffic flow is 60 km/hour. If the vehicle maximum speed is set to 50 km/hour, the routing engine will consider 60 km/hour as this is the current situation. If the maximum speed of the vehicle is provided as 80 km/hour but the current traffic flow is 60 km/hour, then routing engine will again use 60 km/hour. + */ + vehicleMaxSpeed?: number; + /** Weight of the vehicle in kilograms. */ + vehicleWeight?: number; + /** Level of turns for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ + windingness?: WindingnessLevel; + /** Degree of hilliness for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ + hilliness?: HillinessDegree; + /** The mode of travel for the requested route. If not defined, default is 'car'. Note that the requested travelMode may not be available for the entire route. Where the requested travelMode is not available for a particular section, the travelMode element of the response for that section will be "other". Note that travel modes bus, motorcycle, taxi and van are BETA functionality. Full restriction data is not available in all areas. In **calculateReachableRange** requests, the values bicycle and pedestrian must not be used. */ + travelMode?: TravelMode; + /** Specifies something that the route calculation should try to avoid when determining the route. Can be specified multiple times in one request, for example, '&avoid=motorways&avoid=tollRoads&avoid=ferries'. In calculateReachableRange requests, the value alreadyUsedRoads must not be used. */ + avoid?: RouteAvoidType[]; + /** + * Possible values: + * * true - Do consider all available traffic information during routing + * * false - Ignore current traffic data during routing. Note that although the current traffic data is ignored + * during routing, the effect of historic traffic on effective road speeds is still incorporated. + */ + traffic?: boolean; + /** The type of route requested. */ + routeType?: RouteType; + /** Types of cargo that may be classified as hazardous materials and restricted from some roads. Available vehicleLoadType values are US Hazmat classes 1 through 9, plus generic classifications for use in other countries. Values beginning with USHazmat are for US routing while otherHazmat should be used for all other countries. vehicleLoadType can be specified multiple times. This parameter is currently only considered for travelMode=truck. */ + vehicleLoadType?: VehicleLoadType; + /** Delay to wait until next poll, in milliseconds. */ + updateIntervalInMs?: number; + /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ + resumeFrom?: string; +} + +/** Contains response data for the postRouteMatrix operation. */ +export type RoutePostRouteMatrixResponse = RouteMatrixResponse; + +/** Optional parameters. */ +export interface RoutePostRouteMatrixSyncOptionalParams + extends coreClient.OperationOptions { + /** Boolean to indicate whether to execute the request synchronously. If set to true, user will get a 200 response if the request is finished under 120 seconds. Otherwise, user will get a 202 response right away. Please refer to the API description for more details on 202 response. **Supported only for async request**. */ + waitForResults?: boolean; + /** Specifies whether to return additional travel times using different types of traffic information (none, historic, live) as well as the default best-estimate travel time. */ + computeTravelTimeFor?: ComputeTravelTimeFor; + /** Specifies which of the section types is reported in the route response.

For example if sectionType = pedestrian the sections which are suited for pedestrians only are returned. Multiple types can be used. The default sectionType refers to the travelMode input. By default travelMode is set to car */ + sectionType?: SectionType; + /** The date and time of arrival at the destination point. It must be specified as a dateTime. When a time zone offset is not specified it will be assumed to be that of the destination point. The arriveAt value must be in the future. The arriveAt parameter cannot be used in conjunction with departAt, minDeviationDistance or minDeviationTime. */ + arriveAt?: Date; + /** The date and time of departure from the origin point. Departure times apart from now must be specified as a dateTime. When a time zone offset is not specified, it will be assumed to be that of the origin point. The departAt value must be in the future in the date-time format (1996-12-19T16:39:57-08:00). */ + departAt?: Date; + /** Weight per axle of the vehicle in kg. A value of 0 means that weight restrictions per axle are not considered. */ + vehicleAxleWeight?: number; + /** Length of the vehicle in meters. A value of 0 means that length restrictions are not considered. */ + vehicleLength?: number; + /** Height of the vehicle in meters. A value of 0 means that height restrictions are not considered. */ + vehicleHeight?: number; + /** Width of the vehicle in meters. A value of 0 means that width restrictions are not considered. */ + vehicleWidth?: number; + /** + * Maximum speed of the vehicle in km/hour. The max speed in the vehicle profile is used to check whether a vehicle is allowed on motorways. + * + * * A value of 0 means that an appropriate value for the vehicle will be determined and applied during route planning. + * + * * A non-zero value may be overridden during route planning. For example, the current traffic flow is 60 km/hour. If the vehicle maximum speed is set to 50 km/hour, the routing engine will consider 60 km/hour as this is the current situation. If the maximum speed of the vehicle is provided as 80 km/hour but the current traffic flow is 60 km/hour, then routing engine will again use 60 km/hour. + */ + vehicleMaxSpeed?: number; + /** Weight of the vehicle in kilograms. */ + vehicleWeight?: number; + /** Level of turns for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ + windingness?: WindingnessLevel; + /** Degree of hilliness for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ + hilliness?: HillinessDegree; + /** The mode of travel for the requested route. If not defined, default is 'car'. Note that the requested travelMode may not be available for the entire route. Where the requested travelMode is not available for a particular section, the travelMode element of the response for that section will be "other". Note that travel modes bus, motorcycle, taxi and van are BETA functionality. Full restriction data is not available in all areas. In **calculateReachableRange** requests, the values bicycle and pedestrian must not be used. */ + travelMode?: TravelMode; + /** Specifies something that the route calculation should try to avoid when determining the route. Can be specified multiple times in one request, for example, '&avoid=motorways&avoid=tollRoads&avoid=ferries'. In calculateReachableRange requests, the value alreadyUsedRoads must not be used. */ + avoid?: RouteAvoidType[]; + /** + * Possible values: + * * true - Do consider all available traffic information during routing + * * false - Ignore current traffic data during routing. Note that although the current traffic data is ignored + * during routing, the effect of historic traffic on effective road speeds is still incorporated. + */ + traffic?: boolean; + /** The type of route requested. */ + routeType?: RouteType; + /** Types of cargo that may be classified as hazardous materials and restricted from some roads. Available vehicleLoadType values are US Hazmat classes 1 through 9, plus generic classifications for use in other countries. Values beginning with USHazmat are for US routing while otherHazmat should be used for all other countries. vehicleLoadType can be specified multiple times. This parameter is currently only considered for travelMode=truck. */ + vehicleLoadType?: VehicleLoadType; +} + +/** Contains response data for the postRouteMatrixSync operation. */ +export type RoutePostRouteMatrixSyncResponse = RouteMatrixResponse; + +/** Optional parameters. */ +export interface RouteGetRouteDirectionsOptionalParams + extends coreClient.OperationOptions { + /** Specifies whether to return additional travel times using different types of traffic information (none, historic, live) as well as the default best-estimate travel time. */ + computeTravelTimeFor?: ComputeTravelTimeFor; + /** Specifies which of the section types is reported in the route response.

For example if sectionType = pedestrian the sections which are suited for pedestrians only are returned. Multiple types can be used. The default sectionType refers to the travelMode input. By default travelMode is set to car */ + sectionType?: SectionType; + /** The date and time of arrival at the destination point. It must be specified as a dateTime. When a time zone offset is not specified it will be assumed to be that of the destination point. The arriveAt value must be in the future. The arriveAt parameter cannot be used in conjunction with departAt, minDeviationDistance or minDeviationTime. */ + arriveAt?: Date; + /** The date and time of departure from the origin point. Departure times apart from now must be specified as a dateTime. When a time zone offset is not specified, it will be assumed to be that of the origin point. The departAt value must be in the future in the date-time format (1996-12-19T16:39:57-08:00). */ + departAt?: Date; + /** Weight per axle of the vehicle in kg. A value of 0 means that weight restrictions per axle are not considered. */ + vehicleAxleWeight?: number; + /** Length of the vehicle in meters. A value of 0 means that length restrictions are not considered. */ + vehicleLength?: number; + /** Height of the vehicle in meters. A value of 0 means that height restrictions are not considered. */ + vehicleHeight?: number; + /** Width of the vehicle in meters. A value of 0 means that width restrictions are not considered. */ + vehicleWidth?: number; + /** + * Maximum speed of the vehicle in km/hour. The max speed in the vehicle profile is used to check whether a vehicle is allowed on motorways. + * + * * A value of 0 means that an appropriate value for the vehicle will be determined and applied during route planning. + * + * * A non-zero value may be overridden during route planning. For example, the current traffic flow is 60 km/hour. If the vehicle maximum speed is set to 50 km/hour, the routing engine will consider 60 km/hour as this is the current situation. If the maximum speed of the vehicle is provided as 80 km/hour but the current traffic flow is 60 km/hour, then routing engine will again use 60 km/hour. + */ + vehicleMaxSpeed?: number; + /** + * Weight of the vehicle in kilograms. + * + * * It is mandatory if any of the *Efficiency parameters are set. + * + * * It must be strictly positive when used in the context of the Consumption Model. Weight restrictions are considered. + * + * * If no detailed **Consumption Model** is specified and the value of **vehicleWeight** is non-zero, then weight restrictions are considered. + * + * * In all other cases, this parameter is ignored. + * + * Sensible Values : for **Combustion Model** : 1600, for **Electric Model** : 1900 + */ + vehicleWeight?: number; + /** Level of turns for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ + windingness?: WindingnessLevel; + /** Degree of hilliness for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ + hilliness?: HillinessDegree; + /** The mode of travel for the requested route. If not defined, default is 'car'. Note that the requested travelMode may not be available for the entire route. Where the requested travelMode is not available for a particular section, the travelMode element of the response for that section will be "other". Note that travel modes bus, motorcycle, taxi and van are BETA functionality. Full restriction data is not available in all areas. In **calculateReachableRange** requests, the values bicycle and pedestrian must not be used. */ + travelMode?: TravelMode; + /** Specifies something that the route calculation should try to avoid when determining the route. Can be specified multiple times in one request, for example, '&avoid=motorways&avoid=tollRoads&avoid=ferries'. In calculateReachableRange requests, the value alreadyUsedRoads must not be used. */ + avoid?: RouteAvoidType[]; + /** + * Possible values: + * * true - Do consider all available traffic information during routing + * * false - Ignore current traffic data during routing. Note that although the current traffic data is ignored + * during routing, the effect of historic traffic on effective road speeds is still incorporated. + */ + traffic?: boolean; + /** The type of route requested. */ + routeType?: RouteType; + /** Types of cargo that may be classified as hazardous materials and restricted from some roads. Available vehicleLoadType values are US Hazmat classes 1 through 9, plus generic classifications for use in other countries. Values beginning with USHazmat are for US routing while otherHazmat should be used for all other countries. vehicleLoadType can be specified multiple times. This parameter is currently only considered for travelMode=truck. */ + vehicleLoadType?: VehicleLoadType; + /** Number of desired alternative routes to be calculated. Default: 0, minimum: 0 and maximum: 5 */ + maxAlternatives?: number; + /** Controls the optimality, with respect to the given planning criteria, of the calculated alternatives compared to the reference route. */ + alternativeType?: AlternativeRouteType; + /** All alternative routes returned will follow the reference route (see section POST Requests) from the origin point of the calculateRoute request for at least this number of meters. Can only be used when reconstructing a route. The minDeviationDistance parameter cannot be used in conjunction with arriveAt */ + minDeviationDistance?: number; + /** + * All alternative routes returned will follow the reference route (see section POST Requests) from the origin point of the calculateRoute request for at least this number of seconds. Can only be used when reconstructing a route. The minDeviationTime parameter cannot be used in conjunction with arriveAt. Default value is 0. Setting )minDeviationTime_ to a value greater than zero has the following consequences: + * - The origin point of the _calculateRoute_ Request must be on + * (or very near) the input reference route. + * - If this is not the case, an error is returned. + * - However, the origin point does not need to be at the beginning + * of the input reference route (it can be thought of as the current + * vehicle position on the reference route). + * - The reference route, returned as the first route in the _calculateRoute_ + * Response, will start at the origin point specified in the _calculateRoute_ + * Request. The initial part of the input reference route up until the origin + * point will be excluded from the Response. + * - The values of _minDeviationDistance_ and _minDeviationTime_ determine + * how far alternative routes will be guaranteed to follow the reference + * route from the origin point onwards. + * - The route must use _departAt_. + * - The _vehicleHeading_ is ignored. + */ + minDeviationTime?: number; + /** If specified, guidance instructions will be returned. Note that the instructionsType parameter cannot be used in conjunction with routeRepresentation=none */ + instructionsType?: RouteInstructionsType; + /** + * The language parameter determines the language of the guidance messages. Proper nouns (the names of streets, plazas, etc.) are returned in the specified language, or if that is not available, they are returned in an available language that is close to it. Allowed values are (a subset of) the IETF language tags. The currently supported languages are listed in the [Supported languages section](https://docs.microsoft.com/azure/azure-maps/supported-languages). + * + * Default value: en-GB + */ + language?: string; + /** Re-order the route waypoints using a fast heuristic algorithm to reduce the route length. Yields best results when used in conjunction with routeType _shortest_. Notice that origin and destination are excluded from the optimized waypoint indices. To include origin and destination in the response, please increase all the indices by 1 to account for the origin, and then add the destination as the final index. Possible values are true or false. True computes a better order if possible, but is not allowed to be used in conjunction with maxAlternatives value greater than 0 or in conjunction with circle waypoints. False will use the locations in the given order and not allowed to be used in conjunction with routeRepresentation _none_. */ + computeBestOrder?: boolean; + /** Specifies the representation of the set of routes provided as response. This parameter value can only be used in conjunction with computeBestOrder=true. */ + routeRepresentation?: RouteRepresentation; + /** The directional heading of the vehicle in degrees starting at true North and continuing in clockwise direction. North is 0 degrees, east is 90 degrees, south is 180 degrees, west is 270 degrees. Possible values 0-359 */ + vehicleHeading?: number; + /** Specifies which data should be reported for diagnosis purposes. The only possible value is _effectiveSettings_. Reports the effective parameters or data used when calling the API. In the case of defaulted parameters the default will be reflected where the parameter was not specified by the caller. */ + report?: string; + /** Vehicle is used for commercial purposes and thus may not be allowed to drive on some roads. */ + vehicleCommercial?: boolean; + /** Engine type of the vehicle. When a detailed Consumption Model is specified, it must be consistent with the value of **vehicleEngineType**. */ + vehicleEngineType?: VehicleEngineType; + /** + * + * Specifies the speed-dependent component of consumption. + * + * Provided as an unordered list of colon-delimited speed & consumption-rate pairs. The list defines points on a consumption curve. Consumption rates for speeds not in the list are found as follows: + * + * * by linear interpolation, if the given speed lies in between two speeds in the list + * + * * by linear extrapolation otherwise, assuming a constant (ΔConsumption/ΔSpeed) determined by the nearest two points in the list + * + * The list must contain between 1 and 25 points (inclusive), and may not contain duplicate points for the same speed. If it only contains a single point, then the consumption rate of that point is used without further processing. + * + * Consumption specified for the largest speed must be greater than or equal to that of the penultimate largest speed. This ensures that extrapolation does not lead to negative consumption rates. + * + * Similarly, consumption values specified for the two smallest speeds in the list cannot lead to a negative consumption rate for any smaller speed. + * + * The valid range for the consumption values(expressed in l/100km) is between 0.01 and 100000.0. + * + * Sensible Values : 50,6.3:130,11.5 + * + * **Note** : This parameter is required for **The Combustion Consumption Model**. + */ + constantSpeedConsumptionInLitersPerHundredkm?: number; + /** + * Specifies the current supply of fuel in liters. + * + * Sensible Values : 55 + */ + currentFuelInLiters?: number; + /** + * Specifies the amount of fuel consumed for sustaining auxiliary systems of the vehicle, in liters per hour. + * + * It can be used to specify consumption due to devices and systems such as AC systems, radio, heating, etc. + * + * Sensible Values : 0.2 + */ + auxiliaryPowerInLitersPerHour?: number; + /** + * Specifies the amount of chemical energy stored in one liter of fuel in megajoules (MJ). It is used in conjunction with the ***Efficiency** parameters for conversions between saved or consumed energy and fuel. For example, energy density is 34.2 MJ/l for gasoline, and 35.8 MJ/l for Diesel fuel. + * + * This parameter is required if any ***Efficiency** parameter is set. + * + * Sensible Values : 34.2 + */ + fuelEnergyDensityInMJoulesPerLiter?: number; + /** + * Specifies the efficiency of converting chemical energy stored in fuel to kinetic energy when the vehicle accelerates _(i.e. KineticEnergyGained/ChemicalEnergyConsumed). ChemicalEnergyConsumed_ is obtained by converting consumed fuel to chemical energy using **fuelEnergyDensityInMJoulesPerLiter**. + * + * Must be paired with **decelerationEfficiency**. + * + * The range of values allowed are 0.0 to 1/**decelerationEfficiency**. + * + * Sensible Values : for **Combustion Model** : 0.33, for **Electric Model** : 0.66 + */ + accelerationEfficiency?: number; + /** + * Specifies the efficiency of converting kinetic energy to saved (not consumed) fuel when the vehicle decelerates _(i.e. ChemicalEnergySaved/KineticEnergyLost). ChemicalEnergySaved_ is obtained by converting saved (not consumed) fuel to energy using **fuelEnergyDensityInMJoulesPerLiter**. + * + * Must be paired with **accelerationEfficiency**. + * + * The range of values allowed are 0.0 to 1/**accelerationEfficiency**. + * + * Sensible Values : for **Combustion Model** : 0.83, for **Electric Model** : 0.91 + */ + decelerationEfficiency?: number; + /** + * Specifies the efficiency of converting chemical energy stored in fuel to potential energy when the vehicle gains elevation _(i.e. PotentialEnergyGained/ChemicalEnergyConsumed). ChemicalEnergyConsumed_ is obtained by converting consumed fuel to chemical energy using **fuelEnergyDensityInMJoulesPerLiter**. + * + * Must be paired with **downhillEfficiency**. + * + * The range of values allowed are 0.0 to 1/**downhillEfficiency**. + * + * Sensible Values : for **Combustion Model** : 0.27, for **Electric Model** : 0.74 + */ + uphillEfficiency?: number; + /** + * Specifies the efficiency of converting potential energy to saved (not consumed) fuel when the vehicle loses elevation _(i.e. ChemicalEnergySaved/PotentialEnergyLost). ChemicalEnergySaved_ is obtained by converting saved (not consumed) fuel to energy using **fuelEnergyDensityInMJoulesPerLiter**. + * + * Must be paired with **uphillEfficiency**. + * + * The range of values allowed are 0.0 to 1/**uphillEfficiency**. + * + * Sensible Values : for **Combustion Model** : 0.51, for **Electric Model** : 0.73 + */ + downhillEfficiency?: number; + /** + * Specifies the speed-dependent component of consumption. + * + * Provided as an unordered list of speed/consumption-rate pairs. The list defines points on a consumption curve. Consumption rates for speeds not in the list are found as follows: + * + * * by linear interpolation, if the given speed lies in between two speeds in the list + * + * * by linear extrapolation otherwise, assuming a constant (ΔConsumption/ΔSpeed) determined by the nearest two points in the list + * + * The list must contain between 1 and 25 points (inclusive), and may not contain duplicate points for the same speed. If it only contains a single point, then the consumption rate of that point is used without further processing. + * + * Consumption specified for the largest speed must be greater than or equal to that of the penultimate largest speed. This ensures that extrapolation does not lead to negative consumption rates. + * + * Similarly, consumption values specified for the two smallest speeds in the list cannot lead to a negative consumption rate for any smaller speed. + * + * The valid range for the consumption values(expressed in kWh/100km) is between 0.01 and 100000.0. + * + * Sensible Values : 50,8.2:130,21.3 + * + * This parameter is required for **Electric consumption model**. + */ + constantSpeedConsumptionInkWhPerHundredkm?: string; + /** + * Specifies the current electric energy supply in kilowatt hours (kWh). + * + * This parameter co-exists with **maxChargeInkWh** parameter. + * + * The range of values allowed are 0.0 to **maxChargeInkWh**. + * + * Sensible Values : 43 + */ + currentChargeInkWh?: string; + /** + * Specifies the maximum electric energy supply in kilowatt hours (kWh) that may be stored in the vehicle's battery. + * + * This parameter co-exists with **currentChargeInkWh** parameter. + * + * Minimum value has to be greater than or equal to **currentChargeInkWh**. + * + * Sensible Values : 85 + */ + maxChargeInkWh?: string; + /** + * Specifies the amount of power consumed for sustaining auxiliary systems, in kilowatts (kW). + * + * It can be used to specify consumption due to devices and systems such as AC systems, radio, heating, etc. + * + * Sensible Values : 1.7 + */ + auxiliaryPowerInkW?: string; +} + +/** Contains response data for the getRouteDirections operation. */ +export type RouteGetRouteDirectionsResponse = RouteDirectionsResponse; + +/** Optional parameters. */ +export interface RoutePostRouteDirectionsOptionalParams + extends coreClient.OperationOptions { + /** Specifies whether to return additional travel times using different types of traffic information (none, historic, live) as well as the default best-estimate travel time. */ + computeTravelTimeFor?: ComputeTravelTimeFor; + /** Specifies which of the section types is reported in the route response.

For example if sectionType = pedestrian the sections which are suited for pedestrians only are returned. Multiple types can be used. The default sectionType refers to the travelMode input. By default travelMode is set to car */ + sectionType?: SectionType; + /** The date and time of arrival at the destination point. It must be specified as a dateTime. When a time zone offset is not specified it will be assumed to be that of the destination point. The arriveAt value must be in the future. The arriveAt parameter cannot be used in conjunction with departAt, minDeviationDistance or minDeviationTime. */ + arriveAt?: Date; + /** The date and time of departure from the origin point. Departure times apart from now must be specified as a dateTime. When a time zone offset is not specified, it will be assumed to be that of the origin point. The departAt value must be in the future in the date-time format (1996-12-19T16:39:57-08:00). */ + departAt?: Date; + /** Weight per axle of the vehicle in kg. A value of 0 means that weight restrictions per axle are not considered. */ + vehicleAxleWeight?: number; + /** Length of the vehicle in meters. A value of 0 means that length restrictions are not considered. */ + vehicleLength?: number; + /** Height of the vehicle in meters. A value of 0 means that height restrictions are not considered. */ + vehicleHeight?: number; + /** Width of the vehicle in meters. A value of 0 means that width restrictions are not considered. */ + vehicleWidth?: number; + /** + * Maximum speed of the vehicle in km/hour. The max speed in the vehicle profile is used to check whether a vehicle is allowed on motorways. + * + * * A value of 0 means that an appropriate value for the vehicle will be determined and applied during route planning. + * + * * A non-zero value may be overridden during route planning. For example, the current traffic flow is 60 km/hour. If the vehicle maximum speed is set to 50 km/hour, the routing engine will consider 60 km/hour as this is the current situation. If the maximum speed of the vehicle is provided as 80 km/hour but the current traffic flow is 60 km/hour, then routing engine will again use 60 km/hour. + */ + vehicleMaxSpeed?: number; + /** + * Weight of the vehicle in kilograms. + * + * * It is mandatory if any of the *Efficiency parameters are set. + * + * * It must be strictly positive when used in the context of the Consumption Model. Weight restrictions are considered. + * + * * If no detailed **Consumption Model** is specified and the value of **vehicleWeight** is non-zero, then weight restrictions are considered. + * + * * In all other cases, this parameter is ignored. + * + * Sensible Values : for **Combustion Model** : 1600, for **Electric Model** : 1900 + */ + vehicleWeight?: number; + /** Level of turns for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ + windingness?: WindingnessLevel; + /** Degree of hilliness for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ + hilliness?: HillinessDegree; + /** The mode of travel for the requested route. If not defined, default is 'car'. Note that the requested travelMode may not be available for the entire route. Where the requested travelMode is not available for a particular section, the travelMode element of the response for that section will be "other". Note that travel modes bus, motorcycle, taxi and van are BETA functionality. Full restriction data is not available in all areas. In **calculateReachableRange** requests, the values bicycle and pedestrian must not be used. */ + travelMode?: TravelMode; + /** Specifies something that the route calculation should try to avoid when determining the route. Can be specified multiple times in one request, for example, '&avoid=motorways&avoid=tollRoads&avoid=ferries'. In calculateReachableRange requests, the value alreadyUsedRoads must not be used. */ + avoid?: RouteAvoidType[]; + /** + * Possible values: + * * true - Do consider all available traffic information during routing + * * false - Ignore current traffic data during routing. Note that although the current traffic data is ignored + * during routing, the effect of historic traffic on effective road speeds is still incorporated. + */ + traffic?: boolean; + /** The type of route requested. */ + routeType?: RouteType; + /** Types of cargo that may be classified as hazardous materials and restricted from some roads. Available vehicleLoadType values are US Hazmat classes 1 through 9, plus generic classifications for use in other countries. Values beginning with USHazmat are for US routing while otherHazmat should be used for all other countries. vehicleLoadType can be specified multiple times. This parameter is currently only considered for travelMode=truck. */ + vehicleLoadType?: VehicleLoadType; + /** Number of desired alternative routes to be calculated. Default: 0, minimum: 0 and maximum: 5 */ + maxAlternatives?: number; + /** Controls the optimality, with respect to the given planning criteria, of the calculated alternatives compared to the reference route. */ + alternativeType?: AlternativeRouteType; + /** All alternative routes returned will follow the reference route (see section POST Requests) from the origin point of the calculateRoute request for at least this number of meters. Can only be used when reconstructing a route. The minDeviationDistance parameter cannot be used in conjunction with arriveAt */ + minDeviationDistance?: number; + /** + * All alternative routes returned will follow the reference route (see section POST Requests) from the origin point of the calculateRoute request for at least this number of seconds. Can only be used when reconstructing a route. The minDeviationTime parameter cannot be used in conjunction with arriveAt. Default value is 0. Setting )minDeviationTime_ to a value greater than zero has the following consequences: + * - The origin point of the _calculateRoute_ Request must be on + * (or very near) the input reference route. + * - If this is not the case, an error is returned. + * - However, the origin point does not need to be at the beginning + * of the input reference route (it can be thought of as the current + * vehicle position on the reference route). + * - The reference route, returned as the first route in the _calculateRoute_ + * Response, will start at the origin point specified in the _calculateRoute_ + * Request. The initial part of the input reference route up until the origin + * point will be excluded from the Response. + * - The values of _minDeviationDistance_ and _minDeviationTime_ determine + * how far alternative routes will be guaranteed to follow the reference + * route from the origin point onwards. + * - The route must use _departAt_. + * - The _vehicleHeading_ is ignored. + */ + minDeviationTime?: number; + /** If specified, guidance instructions will be returned. Note that the instructionsType parameter cannot be used in conjunction with routeRepresentation=none */ + instructionsType?: RouteInstructionsType; + /** The language parameter determines the language of the guidance messages. It does not affect proper nouns (the names of streets, plazas, etc.) It has no effect when instructionsType=coded. Allowed values are (a subset of) the IETF language tags described */ + language?: string; + /** Re-order the route waypoints using a fast heuristic algorithm to reduce the route length. Yields best results when used in conjunction with routeType _shortest_. Notice that origin and destination are excluded from the optimized waypoint indices. To include origin and destination in the response, please increase all the indices by 1 to account for the origin, and then add the destination as the final index. Possible values are true or false. True computes a better order if possible, but is not allowed to be used in conjunction with maxAlternatives value greater than 0 or in conjunction with circle waypoints. False will use the locations in the given order and not allowed to be used in conjunction with routeRepresentation _none_. */ + computeBestOrder?: boolean; + /** Specifies the representation of the set of routes provided as response. This parameter value can only be used in conjunction with computeBestOrder=true. */ + routeRepresentation?: RouteRepresentation; + /** The directional heading of the vehicle in degrees starting at true North and continuing in clockwise direction. North is 0 degrees, east is 90 degrees, south is 180 degrees, west is 270 degrees. Possible values 0-359 */ + vehicleHeading?: number; + /** Specifies which data should be reported for diagnosis purposes. The only possible value is _effectiveSettings_. Reports the effective parameters or data used when calling the API. In the case of defaulted parameters the default will be reflected where the parameter was not specified by the caller. */ + report?: string; + /** Vehicle is used for commercial purposes and thus may not be allowed to drive on some roads. */ + vehicleCommercial?: boolean; + /** Engine type of the vehicle. When a detailed Consumption Model is specified, it must be consistent with the value of **vehicleEngineType**. */ + vehicleEngineType?: VehicleEngineType; + /** + * + * Specifies the speed-dependent component of consumption. + * + * Provided as an unordered list of colon-delimited speed & consumption-rate pairs. The list defines points on a consumption curve. Consumption rates for speeds not in the list are found as follows: + * + * * by linear interpolation, if the given speed lies in between two speeds in the list + * + * * by linear extrapolation otherwise, assuming a constant (ΔConsumption/ΔSpeed) determined by the nearest two points in the list + * + * The list must contain between 1 and 25 points (inclusive), and may not contain duplicate points for the same speed. If it only contains a single point, then the consumption rate of that point is used without further processing. + * + * Consumption specified for the largest speed must be greater than or equal to that of the penultimate largest speed. This ensures that extrapolation does not lead to negative consumption rates. + * + * Similarly, consumption values specified for the two smallest speeds in the list cannot lead to a negative consumption rate for any smaller speed. + * + * The valid range for the consumption values(expressed in l/100km) is between 0.01 and 100000.0. + * + * Sensible Values : 50,6.3:130,11.5 + * + * **Note** : This parameter is required for **The Combustion Consumption Model**. + */ + constantSpeedConsumptionInLitersPerHundredkm?: number; + /** + * Specifies the current supply of fuel in liters. + * + * Sensible Values : 55 + */ + currentFuelInLiters?: number; + /** + * Specifies the amount of fuel consumed for sustaining auxiliary systems of the vehicle, in liters per hour. + * + * It can be used to specify consumption due to devices and systems such as AC systems, radio, heating, etc. + * + * Sensible Values : 0.2 + */ + auxiliaryPowerInLitersPerHour?: number; + /** + * Specifies the amount of chemical energy stored in one liter of fuel in megajoules (MJ). It is used in conjunction with the ***Efficiency** parameters for conversions between saved or consumed energy and fuel. For example, energy density is 34.2 MJ/l for gasoline, and 35.8 MJ/l for Diesel fuel. + * + * This parameter is required if any ***Efficiency** parameter is set. + * + * Sensible Values : 34.2 + */ + fuelEnergyDensityInMJoulesPerLiter?: number; + /** + * Specifies the efficiency of converting chemical energy stored in fuel to kinetic energy when the vehicle accelerates _(i.e. KineticEnergyGained/ChemicalEnergyConsumed). ChemicalEnergyConsumed_ is obtained by converting consumed fuel to chemical energy using **fuelEnergyDensityInMJoulesPerLiter**. + * + * Must be paired with **decelerationEfficiency**. + * + * The range of values allowed are 0.0 to 1/**decelerationEfficiency**. + * + * Sensible Values : for **Combustion Model** : 0.33, for **Electric Model** : 0.66 + */ + accelerationEfficiency?: number; + /** + * Specifies the efficiency of converting kinetic energy to saved (not consumed) fuel when the vehicle decelerates _(i.e. ChemicalEnergySaved/KineticEnergyLost). ChemicalEnergySaved_ is obtained by converting saved (not consumed) fuel to energy using **fuelEnergyDensityInMJoulesPerLiter**. + * + * Must be paired with **accelerationEfficiency**. + * + * The range of values allowed are 0.0 to 1/**accelerationEfficiency**. + * + * Sensible Values : for **Combustion Model** : 0.83, for **Electric Model** : 0.91 + */ + decelerationEfficiency?: number; + /** + * Specifies the efficiency of converting chemical energy stored in fuel to potential energy when the vehicle gains elevation _(i.e. PotentialEnergyGained/ChemicalEnergyConsumed). ChemicalEnergyConsumed_ is obtained by converting consumed fuel to chemical energy using **fuelEnergyDensityInMJoulesPerLiter**. + * + * Must be paired with **downhillEfficiency**. + * + * The range of values allowed are 0.0 to 1/**downhillEfficiency**. + * + * Sensible Values : for **Combustion Model** : 0.27, for **Electric Model** : 0.74 + */ + uphillEfficiency?: number; + /** + * Specifies the efficiency of converting potential energy to saved (not consumed) fuel when the vehicle loses elevation _(i.e. ChemicalEnergySaved/PotentialEnergyLost). ChemicalEnergySaved_ is obtained by converting saved (not consumed) fuel to energy using **fuelEnergyDensityInMJoulesPerLiter**. + * + * Must be paired with **uphillEfficiency**. + * + * The range of values allowed are 0.0 to 1/**uphillEfficiency**. + * + * Sensible Values : for **Combustion Model** : 0.51, for **Electric Model** : 0.73 + */ + downhillEfficiency?: number; + /** + * Specifies the speed-dependent component of consumption. + * + * Provided as an unordered list of speed/consumption-rate pairs. The list defines points on a consumption curve. Consumption rates for speeds not in the list are found as follows: + * + * * by linear interpolation, if the given speed lies in between two speeds in the list + * + * * by linear extrapolation otherwise, assuming a constant (ΔConsumption/ΔSpeed) determined by the nearest two points in the list + * + * The list must contain between 1 and 25 points (inclusive), and may not contain duplicate points for the same speed. If it only contains a single point, then the consumption rate of that point is used without further processing. + * + * Consumption specified for the largest speed must be greater than or equal to that of the penultimate largest speed. This ensures that extrapolation does not lead to negative consumption rates. + * + * Similarly, consumption values specified for the two smallest speeds in the list cannot lead to a negative consumption rate for any smaller speed. + * + * The valid range for the consumption values(expressed in kWh/100km) is between 0.01 and 100000.0. + * + * Sensible Values : 50,8.2:130,21.3 + * + * This parameter is required for **Electric consumption model**. + */ + constantSpeedConsumptionInkWhPerHundredkm?: string; + /** + * Specifies the current electric energy supply in kilowatt hours (kWh). + * + * This parameter co-exists with **maxChargeInkWh** parameter. + * + * The range of values allowed are 0.0 to **maxChargeInkWh**. + * + * Sensible Values : 43 + */ + currentChargeInkWh?: string; + /** + * Specifies the maximum electric energy supply in kilowatt hours (kWh) that may be stored in the vehicle's battery. + * + * This parameter co-exists with **currentChargeInkWh** parameter. + * + * Minimum value has to be greater than or equal to **currentChargeInkWh**. + * + * Sensible Values : 85 + */ + maxChargeInkWh?: string; + /** + * Specifies the amount of power consumed for sustaining auxiliary systems, in kilowatts (kW). + * + * It can be used to specify consumption due to devices and systems such as AC systems, radio, heating, etc. + * + * Sensible Values : 1.7 + */ + auxiliaryPowerInkW?: string; +} + +/** Contains response data for the postRouteDirections operation. */ +export type RoutePostRouteDirectionsResponse = RouteDirectionsResponse; + +/** Optional parameters. */ +export interface RouteGetRouteRangeOptionalParams + extends coreClient.OperationOptions { + /** The date and time of departure from the origin point. Departure times apart from now must be specified as a dateTime. When a time zone offset is not specified, it will be assumed to be that of the origin point. The departAt value must be in the future in the date-time format (1996-12-19T16:39:57-08:00). */ + departAt?: Date; + /** Weight per axle of the vehicle in kg. A value of 0 means that weight restrictions per axle are not considered. */ + vehicleAxleWeight?: number; + /** Length of the vehicle in meters. A value of 0 means that length restrictions are not considered. */ + vehicleLength?: number; + /** Height of the vehicle in meters. A value of 0 means that height restrictions are not considered. */ + vehicleHeight?: number; + /** Width of the vehicle in meters. A value of 0 means that width restrictions are not considered. */ + vehicleWidth?: number; + /** + * Maximum speed of the vehicle in km/hour. The max speed in the vehicle profile is used to check whether a vehicle is allowed on motorways. + * + * * A value of 0 means that an appropriate value for the vehicle will be determined and applied during route planning. + * + * * A non-zero value may be overridden during route planning. For example, the current traffic flow is 60 km/hour. If the vehicle maximum speed is set to 50 km/hour, the routing engine will consider 60 km/hour as this is the current situation. If the maximum speed of the vehicle is provided as 80 km/hour but the current traffic flow is 60 km/hour, then routing engine will again use 60 km/hour. + */ + vehicleMaxSpeed?: number; + /** + * Weight of the vehicle in kilograms. + * + * * It is mandatory if any of the *Efficiency parameters are set. + * + * * It must be strictly positive when used in the context of the Consumption Model. Weight restrictions are considered. + * + * * If no detailed **Consumption Model** is specified and the value of **vehicleWeight** is non-zero, then weight restrictions are considered. + * + * * In all other cases, this parameter is ignored. + * + * Sensible Values : for **Combustion Model** : 1600, for **Electric Model** : 1900 + */ + vehicleWeight?: number; + /** Level of turns for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ + windingness?: WindingnessLevel; + /** Degree of hilliness for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ + hilliness?: HillinessDegree; + /** The mode of travel for the requested route. If not defined, default is 'car'. Note that the requested travelMode may not be available for the entire route. Where the requested travelMode is not available for a particular section, the travelMode element of the response for that section will be "other". Note that travel modes bus, motorcycle, taxi and van are BETA functionality. Full restriction data is not available in all areas. In **calculateReachableRange** requests, the values bicycle and pedestrian must not be used. */ + travelMode?: TravelMode; + /** Specifies something that the route calculation should try to avoid when determining the route. Can be specified multiple times in one request, for example, '&avoid=motorways&avoid=tollRoads&avoid=ferries'. In calculateReachableRange requests, the value alreadyUsedRoads must not be used. */ + avoid?: RouteAvoidType[]; + /** + * Possible values: + * * true - Do consider all available traffic information during routing + * * false - Ignore current traffic data during routing. Note that although the current traffic data is ignored + * during routing, the effect of historic traffic on effective road speeds is still incorporated. + */ + traffic?: boolean; + /** The type of route requested. */ + routeType?: RouteType; + /** Types of cargo that may be classified as hazardous materials and restricted from some roads. Available vehicleLoadType values are US Hazmat classes 1 through 9, plus generic classifications for use in other countries. Values beginning with USHazmat are for US routing while otherHazmat should be used for all other countries. vehicleLoadType can be specified multiple times. This parameter is currently only considered for travelMode=truck. */ + vehicleLoadType?: VehicleLoadType; + /** Vehicle is used for commercial purposes and thus may not be allowed to drive on some roads. */ + vehicleCommercial?: boolean; + /** Engine type of the vehicle. When a detailed Consumption Model is specified, it must be consistent with the value of **vehicleEngineType**. */ + vehicleEngineType?: VehicleEngineType; + /** + * + * Specifies the speed-dependent component of consumption. + * + * Provided as an unordered list of colon-delimited speed & consumption-rate pairs. The list defines points on a consumption curve. Consumption rates for speeds not in the list are found as follows: + * + * * by linear interpolation, if the given speed lies in between two speeds in the list + * + * * by linear extrapolation otherwise, assuming a constant (ΔConsumption/ΔSpeed) determined by the nearest two points in the list + * + * The list must contain between 1 and 25 points (inclusive), and may not contain duplicate points for the same speed. If it only contains a single point, then the consumption rate of that point is used without further processing. + * + * Consumption specified for the largest speed must be greater than or equal to that of the penultimate largest speed. This ensures that extrapolation does not lead to negative consumption rates. + * + * Similarly, consumption values specified for the two smallest speeds in the list cannot lead to a negative consumption rate for any smaller speed. + * + * The valid range for the consumption values(expressed in l/100km) is between 0.01 and 100000.0. + * + * Sensible Values : 50,6.3:130,11.5 + * + * **Note** : This parameter is required for **The Combustion Consumption Model**. + */ + constantSpeedConsumptionInLitersPerHundredkm?: number; + /** + * Specifies the current supply of fuel in liters. + * + * Sensible Values : 55 + */ + currentFuelInLiters?: number; + /** + * Specifies the amount of fuel consumed for sustaining auxiliary systems of the vehicle, in liters per hour. + * + * It can be used to specify consumption due to devices and systems such as AC systems, radio, heating, etc. + * + * Sensible Values : 0.2 + */ + auxiliaryPowerInLitersPerHour?: number; + /** + * Specifies the amount of chemical energy stored in one liter of fuel in megajoules (MJ). It is used in conjunction with the ***Efficiency** parameters for conversions between saved or consumed energy and fuel. For example, energy density is 34.2 MJ/l for gasoline, and 35.8 MJ/l for Diesel fuel. + * + * This parameter is required if any ***Efficiency** parameter is set. + * + * Sensible Values : 34.2 + */ + fuelEnergyDensityInMJoulesPerLiter?: number; + /** + * Specifies the efficiency of converting chemical energy stored in fuel to kinetic energy when the vehicle accelerates _(i.e. KineticEnergyGained/ChemicalEnergyConsumed). ChemicalEnergyConsumed_ is obtained by converting consumed fuel to chemical energy using **fuelEnergyDensityInMJoulesPerLiter**. + * + * Must be paired with **decelerationEfficiency**. + * + * The range of values allowed are 0.0 to 1/**decelerationEfficiency**. + * + * Sensible Values : for **Combustion Model** : 0.33, for **Electric Model** : 0.66 + */ + accelerationEfficiency?: number; + /** + * Specifies the efficiency of converting kinetic energy to saved (not consumed) fuel when the vehicle decelerates _(i.e. ChemicalEnergySaved/KineticEnergyLost). ChemicalEnergySaved_ is obtained by converting saved (not consumed) fuel to energy using **fuelEnergyDensityInMJoulesPerLiter**. + * + * Must be paired with **accelerationEfficiency**. + * + * The range of values allowed are 0.0 to 1/**accelerationEfficiency**. + * + * Sensible Values : for **Combustion Model** : 0.83, for **Electric Model** : 0.91 + */ + decelerationEfficiency?: number; + /** + * Specifies the efficiency of converting chemical energy stored in fuel to potential energy when the vehicle gains elevation _(i.e. PotentialEnergyGained/ChemicalEnergyConsumed). ChemicalEnergyConsumed_ is obtained by converting consumed fuel to chemical energy using **fuelEnergyDensityInMJoulesPerLiter**. + * + * Must be paired with **downhillEfficiency**. + * + * The range of values allowed are 0.0 to 1/**downhillEfficiency**. + * + * Sensible Values : for **Combustion Model** : 0.27, for **Electric Model** : 0.74 + */ + uphillEfficiency?: number; + /** + * Specifies the efficiency of converting potential energy to saved (not consumed) fuel when the vehicle loses elevation _(i.e. ChemicalEnergySaved/PotentialEnergyLost). ChemicalEnergySaved_ is obtained by converting saved (not consumed) fuel to energy using **fuelEnergyDensityInMJoulesPerLiter**. + * + * Must be paired with **uphillEfficiency**. + * + * The range of values allowed are 0.0 to 1/**uphillEfficiency**. + * + * Sensible Values : for **Combustion Model** : 0.51, for **Electric Model** : 0.73 + */ + downhillEfficiency?: number; + /** + * Specifies the speed-dependent component of consumption. + * + * Provided as an unordered list of speed/consumption-rate pairs. The list defines points on a consumption curve. Consumption rates for speeds not in the list are found as follows: + * + * * by linear interpolation, if the given speed lies in between two speeds in the list + * + * * by linear extrapolation otherwise, assuming a constant (ΔConsumption/ΔSpeed) determined by the nearest two points in the list + * + * The list must contain between 1 and 25 points (inclusive), and may not contain duplicate points for the same speed. If it only contains a single point, then the consumption rate of that point is used without further processing. + * + * Consumption specified for the largest speed must be greater than or equal to that of the penultimate largest speed. This ensures that extrapolation does not lead to negative consumption rates. + * + * Similarly, consumption values specified for the two smallest speeds in the list cannot lead to a negative consumption rate for any smaller speed. + * + * The valid range for the consumption values(expressed in kWh/100km) is between 0.01 and 100000.0. + * + * Sensible Values : 50,8.2:130,21.3 + * + * This parameter is required for **Electric consumption model**. + */ + constantSpeedConsumptionInkWhPerHundredkm?: string; + /** + * Specifies the current electric energy supply in kilowatt hours (kWh). + * + * This parameter co-exists with **maxChargeInkWh** parameter. + * + * The range of values allowed are 0.0 to **maxChargeInkWh**. + * + * Sensible Values : 43 + */ + currentChargeInkWh?: string; + /** + * Specifies the maximum electric energy supply in kilowatt hours (kWh) that may be stored in the vehicle's battery. + * + * This parameter co-exists with **currentChargeInkWh** parameter. + * + * Minimum value has to be greater than or equal to **currentChargeInkWh**. + * + * Sensible Values : 85 + */ + maxChargeInkWh?: string; + /** + * Specifies the amount of power consumed for sustaining auxiliary systems, in kilowatts (kW). + * + * It can be used to specify consumption due to devices and systems such as AC systems, radio, heating, etc. + * + * Sensible Values : 1.7 + */ + auxiliaryPowerInkW?: string; + /** Fuel budget in liters that determines maximal range which can be travelled using the specified Combustion Consumption Model.
When fuelBudgetInLiters is used, it is mandatory to specify a detailed Combustion Consumption Model.
Exactly one budget (fuelBudgetInLiters, energyBudgetInkWh, timeBudgetInSec, or distanceBudgetInMeters) must be used. */ + fuelBudgetInLiters?: number; + /** Electric energy budget in kilowatt hours (kWh) that determines maximal range which can be travelled using the specified Electric Consumption Model.
When energyBudgetInkWh is used, it is mandatory to specify a detailed Electric Consumption Model.
Exactly one budget (fuelBudgetInLiters, energyBudgetInkWh, timeBudgetInSec, or distanceBudgetInMeters) must be used. */ + energyBudgetInkWh?: number; + /** Time budget in seconds that determines maximal range which can be travelled using driving time. The Consumption Model will only affect the range when routeType is eco.
Exactly one budget (fuelBudgetInLiters, energyBudgetInkWh, timeBudgetInSec, or distanceBudgetInMeters) must be used. */ + timeBudgetInSec?: number; + /** Distance budget in meters that determines maximal range which can be travelled using driving distance. The Consumption Model will only affect the range when routeType is eco.
Exactly one budget (fuelBudgetInLiters, energyBudgetInkWh, timeBudgetInSec, or distanceBudgetInMeters) must be used. */ + distanceBudgetInMeters?: number; +} + +/** Contains response data for the getRouteRange operation. */ +export type RouteGetRouteRangeResponse = GetRouteRangeResponse; + +/** Optional parameters. */ +export interface RoutePostRouteDirectionsBatchOptionalParams + extends coreClient.OperationOptions { + /** Delay to wait until next poll, in milliseconds. */ + updateIntervalInMs?: number; + /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ + resumeFrom?: string; +} + +/** Contains response data for the postRouteDirectionsBatch operation. */ +export type RoutePostRouteDirectionsBatchResponse = RouteDirectionsBatchResponse; + +/** Optional parameters. */ +export interface RoutePostRouteDirectionsBatchSyncOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the postRouteDirectionsBatchSync operation. */ +export type RoutePostRouteDirectionsBatchSyncResponse = RouteDirectionsBatchResponse; + +/** Optional parameters. */ +export interface RouteClientOptionalParams + extends coreClient.ServiceClientOptions { + /** This parameter specifies where the Azure Maps Creator resource is located. Valid values are us and eu. */ + geography?: Geography; + /** Specifies which account is intended for usage in conjunction with the Azure AD security model. It represents a unique ID for the Azure Maps account and can be retrieved from the Azure Maps management plane Account API. To use Azure AD security in Azure Maps see the following [articles](https://aka.ms/amauthdetails) for guidance. */ + xMsClientId?: string; + /** Api Version */ + apiVersion?: string; + /** Overrides client endpoint. */ + endpoint?: string; +} diff --git a/sdk/maps/maps-route/src/models/mappers.ts b/sdk/maps/maps-route/src/models/mappers.ts new file mode 100644 index 000000000000..6e03ac2cf778 --- /dev/null +++ b/sdk/maps/maps-route/src/models/mappers.ts @@ -0,0 +1,1619 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; + +export const PostRouteMatrixRequestBody: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "PostRouteMatrixRequestBody", + modelProperties: { + origins: { + serializedName: "origins", + type: { + name: "Composite", + className: "GeoJsonMultiPoint" + } + }, + destinations: { + serializedName: "destinations", + type: { + name: "Composite", + className: "GeoJsonMultiPoint" + } + } + } + } +}; + +export const GeoJsonObject: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonObject", + uberParent: "GeoJsonObject", + polymorphicDiscriminator: { + serializedName: "type", + clientName: "type" + }, + modelProperties: { + type: { + serializedName: "type", + required: true, + type: { + name: "String" + } + } + } + } +}; + +export const GeoJsonMultiPointData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonMultiPointData", + modelProperties: { + coordinates: { + serializedName: "coordinates", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } + } + } +}; + +export const RouteMatrixResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteMatrixResponse", + modelProperties: { + formatVersion: { + serializedName: "formatVersion", + readOnly: true, + type: { + name: "String" + } + }, + matrix: { + serializedName: "matrix", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "RouteMatrixResult" + } + } + } + } + } + }, + summary: { + serializedName: "summary", + type: { + name: "Composite", + className: "RouteMatrixSummary" + } + } + } + } +}; + +export const RouteMatrixResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteMatrixResult", + modelProperties: { + statusCode: { + serializedName: "statusCode", + readOnly: true, + type: { + name: "Number" + } + }, + response: { + serializedName: "response", + type: { + name: "Composite", + className: "RouteMatrixResultResponse" + } + } + } + } +}; + +export const RouteMatrixResultResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteMatrixResultResponse", + modelProperties: { + routeSummary: { + serializedName: "routeSummary", + type: { + name: "Composite", + className: "RouteResultLegSummary" + } + } + } + } +}; + +export const RouteResultLegSummary: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteResultLegSummary", + modelProperties: { + lengthInMeters: { + serializedName: "lengthInMeters", + readOnly: true, + type: { + name: "Number" + } + }, + travelTimeInSeconds: { + serializedName: "travelTimeInSeconds", + readOnly: true, + type: { + name: "Number" + } + }, + trafficDelayInSeconds: { + serializedName: "trafficDelayInSeconds", + readOnly: true, + type: { + name: "Number" + } + }, + departureTime: { + serializedName: "departureTime", + readOnly: true, + type: { + name: "String" + } + }, + arrivalTime: { + serializedName: "arrivalTime", + readOnly: true, + type: { + name: "String" + } + }, + noTrafficTravelTimeInSeconds: { + serializedName: "noTrafficTravelTimeInSeconds", + readOnly: true, + type: { + name: "Number" + } + }, + historicTrafficTravelTimeInSeconds: { + serializedName: "historicTrafficTravelTimeInSeconds", + readOnly: true, + type: { + name: "Number" + } + }, + liveTrafficIncidentsTravelTimeInSeconds: { + serializedName: "liveTrafficIncidentsTravelTimeInSeconds", + readOnly: true, + type: { + name: "Number" + } + }, + fuelConsumptionInLiters: { + serializedName: "fuelConsumptionInLiters", + readOnly: true, + type: { + name: "Number" + } + }, + batteryConsumptionInkWh: { + serializedName: "batteryConsumptionInkWh", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const RouteMatrixSummary: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteMatrixSummary", + modelProperties: { + successfulRoutes: { + serializedName: "successfulRoutes", + readOnly: true, + type: { + name: "Number" + } + }, + totalRoutes: { + serializedName: "totalRoutes", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const ErrorResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorResponse", + modelProperties: { + error: { + serializedName: "error", + type: { + name: "Composite", + className: "ErrorDetail" + } + } + } + } +}; + +export const ErrorDetail: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorDetail", + modelProperties: { + code: { + serializedName: "code", + readOnly: true, + type: { + name: "String" + } + }, + message: { + serializedName: "message", + readOnly: true, + type: { + name: "String" + } + }, + target: { + serializedName: "target", + readOnly: true, + type: { + name: "String" + } + }, + details: { + serializedName: "details", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ErrorDetail" + } + } + } + }, + additionalInfo: { + serializedName: "additionalInfo", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ErrorAdditionalInfo" + } + } + } + } + } + } +}; + +export const ErrorAdditionalInfo: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorAdditionalInfo", + modelProperties: { + type: { + serializedName: "type", + readOnly: true, + type: { + name: "String" + } + }, + info: { + serializedName: "info", + readOnly: true, + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } + } + } +}; + +export const RouteDirectionsResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteDirectionsResponse", + modelProperties: { + formatVersion: { + serializedName: "formatVersion", + readOnly: true, + type: { + name: "String" + } + }, + routes: { + serializedName: "routes", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "RouteDirectionsResult" + } + } + } + }, + optimizedWaypoints: { + serializedName: "optimizedWaypoints", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "RouteOptimizedWaypoint" + } + } + } + }, + report: { + serializedName: "report", + type: { + name: "Composite", + className: "RouteResponseReport" + } + } + } + } +}; + +export const RouteDirectionsResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteDirectionsResult", + modelProperties: { + summary: { + serializedName: "summary", + type: { + name: "Composite", + className: "RouteDirectionsSummary" + } + }, + legs: { + serializedName: "legs", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "RouteResultLeg" + } + } + } + }, + sections: { + serializedName: "sections", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "RouteResultSection" + } + } + } + }, + guidance: { + serializedName: "guidance", + type: { + name: "Composite", + className: "RouteResultGuidance" + } + } + } + } +}; + +export const RouteDirectionsSummary: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteDirectionsSummary", + modelProperties: { + lengthInMeters: { + serializedName: "lengthInMeters", + readOnly: true, + type: { + name: "Number" + } + }, + travelTimeInSeconds: { + serializedName: "travelTimeInSeconds", + readOnly: true, + type: { + name: "Number" + } + }, + trafficDelayInSeconds: { + serializedName: "trafficDelayInSeconds", + readOnly: true, + type: { + name: "Number" + } + }, + departureTime: { + serializedName: "departureTime", + readOnly: true, + type: { + name: "String" + } + }, + arrivalTime: { + serializedName: "arrivalTime", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const RouteResultLeg: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteResultLeg", + modelProperties: { + summary: { + serializedName: "summary", + type: { + name: "Composite", + className: "RouteResultLegSummary" + } + }, + points: { + serializedName: "points", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "CoordinatesPair" + } + } + } + } + } + } +}; + +export const CoordinatesPair: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "CoordinatesPair", + modelProperties: { + latitude: { + serializedName: "latitude", + type: { + name: "Number" + } + }, + longitude: { + serializedName: "longitude", + type: { + name: "Number" + } + } + } + } +}; + +export const RouteResultSection: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteResultSection", + modelProperties: { + startPointIndex: { + serializedName: "startPointIndex", + readOnly: true, + type: { + name: "Number" + } + }, + endPointIndex: { + serializedName: "endPointIndex", + readOnly: true, + type: { + name: "Number" + } + }, + sectionType: { + serializedName: "sectionType", + readOnly: true, + type: { + name: "String" + } + }, + travelMode: { + serializedName: "travelMode", + readOnly: true, + type: { + name: "String" + } + }, + simpleCategory: { + serializedName: "simpleCategory", + readOnly: true, + type: { + name: "String" + } + }, + effectiveSpeedInKmh: { + serializedName: "effectiveSpeedInKmh", + readOnly: true, + type: { + name: "Number" + } + }, + delayInSeconds: { + serializedName: "delayInSeconds", + readOnly: true, + type: { + name: "Number" + } + }, + magnitudeOfDelay: { + serializedName: "magnitudeOfDelay", + readOnly: true, + type: { + name: "String" + } + }, + tec: { + serializedName: "tec", + type: { + name: "Composite", + className: "RouteResultSectionTec" + } + } + } + } +}; + +export const RouteResultSectionTec: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteResultSectionTec", + modelProperties: { + effectCode: { + serializedName: "effectCode", + readOnly: true, + type: { + name: "Number" + } + }, + causes: { + serializedName: "causes", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "RouteResultSectionTecCause" + } + } + } + } + } + } +}; + +export const RouteResultSectionTecCause: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteResultSectionTecCause", + modelProperties: { + mainCauseCode: { + serializedName: "mainCauseCode", + readOnly: true, + type: { + name: "Number" + } + }, + subCauseCode: { + serializedName: "subCauseCode", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const RouteResultGuidance: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteResultGuidance", + modelProperties: { + instructions: { + serializedName: "instructions", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "RouteResultInstruction" + } + } + } + }, + instructionGroups: { + serializedName: "instructionGroups", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "RouteResultInstructionGroup" + } + } + } + } + } + } +}; + +export const RouteResultInstruction: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteResultInstruction", + modelProperties: { + routeOffsetInMeters: { + serializedName: "routeOffsetInMeters", + readOnly: true, + type: { + name: "Number" + } + }, + travelTimeInSeconds: { + serializedName: "travelTimeInSeconds", + readOnly: true, + type: { + name: "Number" + } + }, + point: { + serializedName: "point", + type: { + name: "Composite", + className: "CoordinatesPair" + } + }, + pointIndex: { + serializedName: "pointIndex", + readOnly: true, + type: { + name: "Number" + } + }, + instructionType: { + serializedName: "instructionType", + type: { + name: "String" + } + }, + roadNumbers: { + serializedName: "roadNumbers", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + exitNumber: { + serializedName: "exitNumber", + readOnly: true, + type: { + name: "String" + } + }, + street: { + serializedName: "street", + readOnly: true, + type: { + name: "String" + } + }, + signpostText: { + serializedName: "signpostText", + readOnly: true, + type: { + name: "String" + } + }, + countryCode: { + serializedName: "countryCode", + readOnly: true, + type: { + name: "String" + } + }, + stateCode: { + serializedName: "stateCode", + readOnly: true, + type: { + name: "String" + } + }, + junctionType: { + serializedName: "junctionType", + readOnly: true, + type: { + name: "String" + } + }, + turnAngleInDecimalDegrees: { + serializedName: "turnAngleInDecimalDegrees", + readOnly: true, + type: { + name: "Number" + } + }, + roundaboutExitNumber: { + serializedName: "roundaboutExitNumber", + readOnly: true, + type: { + name: "String" + } + }, + possibleCombineWithNext: { + serializedName: "possibleCombineWithNext", + readOnly: true, + type: { + name: "Boolean" + } + }, + drivingSide: { + serializedName: "drivingSide", + readOnly: true, + type: { + name: "String" + } + }, + maneuver: { + serializedName: "maneuver", + readOnly: true, + type: { + name: "String" + } + }, + message: { + serializedName: "message", + readOnly: true, + type: { + name: "String" + } + }, + combinedMessage: { + serializedName: "combinedMessage", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const RouteResultInstructionGroup: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteResultInstructionGroup", + modelProperties: { + firstInstructionIndex: { + serializedName: "firstInstructionIndex", + readOnly: true, + type: { + name: "Number" + } + }, + lastInstructionIndex: { + serializedName: "lastInstructionIndex", + readOnly: true, + type: { + name: "Number" + } + }, + groupLengthInMeters: { + serializedName: "groupLengthInMeters", + readOnly: true, + type: { + name: "Number" + } + }, + groupMessage: { + serializedName: "groupMessage", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const RouteOptimizedWaypoint: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteOptimizedWaypoint", + modelProperties: { + providedIndex: { + serializedName: "providedIndex", + readOnly: true, + type: { + name: "Number" + } + }, + optimizedIndex: { + serializedName: "optimizedIndex", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const RouteResponseReport: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteResponseReport", + modelProperties: { + effectiveSettings: { + serializedName: "effectiveSettings", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "RouteResponseReportEffectiveSetting" + } + } + } + } + } + } +}; + +export const RouteResponseReportEffectiveSetting: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteResponseReportEffectiveSetting", + modelProperties: { + key: { + serializedName: "key", + readOnly: true, + type: { + name: "String" + } + }, + value: { + serializedName: "value", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const PostRouteDirectionsRequestBody: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "PostRouteDirectionsRequestBody", + modelProperties: { + supportingPoints: { + serializedName: "supportingPoints", + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + }, + avoidVignette: { + serializedName: "avoidVignette", + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + allowVignette: { + serializedName: "allowVignette", + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + avoidAreas: { + serializedName: "avoidAreas", + type: { + name: "Composite", + className: "GeoJsonMultiPolygon" + } + } + } + } +}; + +export const GeoJsonMultiPolygonData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonMultiPolygonData", + modelProperties: { + coordinates: { + serializedName: "coordinates", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } + } + } + } + } + } + } +}; + +export const GetRouteRangeResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GetRouteRangeResponse", + modelProperties: { + formatVersion: { + serializedName: "formatVersion", + readOnly: true, + type: { + name: "String" + } + }, + reachableRange: { + serializedName: "reachableRange", + type: { + name: "Composite", + className: "RouteRange" + } + }, + report: { + serializedName: "report", + type: { + name: "Composite", + className: "RouteResponseReport" + } + } + } + } +}; + +export const RouteRange: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteRange", + modelProperties: { + center: { + serializedName: "center", + type: { + name: "Composite", + className: "CoordinatesPair" + } + }, + boundary: { + serializedName: "boundary", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "CoordinatesPair" + } + } + } + } + } + } +}; + +export const BatchRequestBody: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "BatchRequestBody", + modelProperties: { + batchItems: { + serializedName: "batchItems", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "BatchRequestBodyBatchItemsItem" + } + } + } + } + } + } +}; + +export const BatchRequestBodyBatchItemsItem: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "BatchRequestBodyBatchItemsItem", + modelProperties: { + query: { + serializedName: "query", + type: { + name: "String" + } + } + } + } +}; + +export const BatchResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "BatchResponse", + modelProperties: { + summary: { + serializedName: "summary", + type: { + name: "Composite", + className: "BatchResponseSummary" + } + } + } + } +}; + +export const BatchResponseSummary: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "BatchResponseSummary", + modelProperties: { + successfulRequests: { + serializedName: "successfulRequests", + readOnly: true, + type: { + name: "Number" + } + }, + totalRequests: { + serializedName: "totalRequests", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const BatchItem: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "BatchItem", + modelProperties: { + statusCode: { + serializedName: "statusCode", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const GeoJsonPointData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonPointData", + modelProperties: { + coordinates: { + serializedName: "coordinates", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } +}; + +export const GeoJsonLineStringData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonLineStringData", + modelProperties: { + coordinates: { + serializedName: "coordinates", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } + } + } +}; + +export const GeoJsonMultiLineStringData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonMultiLineStringData", + modelProperties: { + coordinates: { + serializedName: "coordinates", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } + } + } + } + } +}; + +export const GeoJsonPolygonData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonPolygonData", + modelProperties: { + coordinates: { + serializedName: "coordinates", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } + } + } + } + } +}; + +export const GeoJsonGeometryCollectionData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonGeometryCollectionData", + modelProperties: { + geometries: { + serializedName: "geometries", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "GeoJsonGeometry" + } + } + } + } + } + } +}; + +export const GeoJsonFeatureData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonFeatureData", + modelProperties: { + geometry: { + serializedName: "geometry", + type: { + name: "Composite", + className: "GeoJsonGeometry" + } + }, + properties: { + serializedName: "properties", + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + }, + id: { + serializedName: "id", + type: { + name: "String" + } + }, + featureType: { + serializedName: "featureType", + type: { + name: "String" + } + } + } + } +}; + +export const GeoJsonFeatureCollectionData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonFeatureCollectionData", + modelProperties: { + features: { + serializedName: "features", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "GeoJsonFeature" + } + } + } + } + } + } +}; + +export const GeoJsonGeometry: coreClient.CompositeMapper = { + serializedName: "GeoJsonGeometry", + type: { + name: "Composite", + className: "GeoJsonGeometry", + uberParent: "GeoJsonObject", + polymorphicDiscriminator: { + serializedName: "type", + clientName: "type" + }, + modelProperties: { + ...GeoJsonObject.type.modelProperties + } + } +}; + +export const GeoJsonFeature: coreClient.CompositeMapper = { + serializedName: "Feature", + type: { + name: "Composite", + className: "GeoJsonFeature", + uberParent: "GeoJsonObject", + polymorphicDiscriminator: GeoJsonObject.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonObject.type.modelProperties, + ...GeoJsonFeatureData.type.modelProperties + } + } +}; + +export const GeoJsonFeatureCollection: coreClient.CompositeMapper = { + serializedName: "FeatureCollection", + type: { + name: "Composite", + className: "GeoJsonFeatureCollection", + uberParent: "GeoJsonObject", + polymorphicDiscriminator: GeoJsonObject.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonObject.type.modelProperties, + ...GeoJsonFeatureCollectionData.type.modelProperties + } + } +}; + +export const GeoJsonMultiPoint: coreClient.CompositeMapper = { + serializedName: "MultiPoint", + type: { + name: "Composite", + className: "GeoJsonMultiPoint", + uberParent: "GeoJsonMultiPointData", + polymorphicDiscriminator: + GeoJsonMultiPointData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonMultiPointData.type.modelProperties + } + } +}; + +export const RouteDirectionsBatchItemResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteDirectionsBatchItemResponse", + modelProperties: { + ...RouteDirectionsResponse.type.modelProperties, + ...ErrorResponse.type.modelProperties + } + } +}; + +export const GeoJsonMultiPolygon: coreClient.CompositeMapper = { + serializedName: "MultiPolygon", + type: { + name: "Composite", + className: "GeoJsonMultiPolygon", + uberParent: "GeoJsonMultiPolygonData", + polymorphicDiscriminator: + GeoJsonMultiPolygonData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonMultiPolygonData.type.modelProperties + } + } +}; + +export const RouteDirectionsBatchResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteDirectionsBatchResponse", + modelProperties: { + ...BatchResponse.type.modelProperties, + batchItems: { + serializedName: "batchItems", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "RouteDirectionsBatchItem" + } + } + } + } + } + } +}; + +export const RouteDirectionsBatchItem: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RouteDirectionsBatchItem", + modelProperties: { + ...BatchItem.type.modelProperties, + response: { + serializedName: "response", + type: { + name: "Composite", + className: "RouteDirectionsBatchItemResponse" + } + } + } + } +}; + +export const GeoJsonPoint: coreClient.CompositeMapper = { + serializedName: "Point", + type: { + name: "Composite", + className: "GeoJsonPoint", + uberParent: "GeoJsonPointData", + polymorphicDiscriminator: GeoJsonPointData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonPointData.type.modelProperties + } + } +}; + +export const GeoJsonLineString: coreClient.CompositeMapper = { + serializedName: "LineString", + type: { + name: "Composite", + className: "GeoJsonLineString", + uberParent: "GeoJsonLineStringData", + polymorphicDiscriminator: + GeoJsonLineStringData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonLineStringData.type.modelProperties + } + } +}; + +export const GeoJsonMultiLineString: coreClient.CompositeMapper = { + serializedName: "MultiLineString", + type: { + name: "Composite", + className: "GeoJsonMultiLineString", + uberParent: "GeoJsonMultiLineStringData", + polymorphicDiscriminator: + GeoJsonMultiLineStringData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonMultiLineStringData.type.modelProperties + } + } +}; + +export const GeoJsonPolygon: coreClient.CompositeMapper = { + serializedName: "Polygon", + type: { + name: "Composite", + className: "GeoJsonPolygon", + uberParent: "GeoJsonPolygonData", + polymorphicDiscriminator: GeoJsonPolygonData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonPolygonData.type.modelProperties + } + } +}; + +export const GeoJsonGeometryCollection: coreClient.CompositeMapper = { + serializedName: "GeometryCollection", + type: { + name: "Composite", + className: "GeoJsonGeometryCollection", + uberParent: "GeoJsonGeometryCollectionData", + polymorphicDiscriminator: + GeoJsonGeometryCollectionData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonGeometryCollectionData.type.modelProperties + } + } +}; + +export const RoutePostRouteMatrixHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RoutePostRouteMatrixHeaders", + modelProperties: { + location: { + serializedName: "location", + type: { + name: "String" + } + } + } + } +}; + +export const RoutePostRouteDirectionsBatchHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RoutePostRouteDirectionsBatchHeaders", + modelProperties: { + location: { + serializedName: "location", + type: { + name: "String" + } + } + } + } +}; + +export let discriminators = { + GeoJsonObject: GeoJsonObject, + "GeoJsonObject.GeoJsonGeometry": GeoJsonGeometry, + "GeoJsonObject.Feature": GeoJsonFeature, + "GeoJsonObject.FeatureCollection": GeoJsonFeatureCollection, + "GeoJsonMultiPointData.MultiPoint": GeoJsonMultiPoint, + "GeoJsonMultiPolygonData.MultiPolygon": GeoJsonMultiPolygon, + "GeoJsonPointData.Point": GeoJsonPoint, + "GeoJsonLineStringData.LineString": GeoJsonLineString, + "GeoJsonMultiLineStringData.MultiLineString": GeoJsonMultiLineString, + "GeoJsonPolygonData.Polygon": GeoJsonPolygon, + "GeoJsonGeometryCollectionData.GeometryCollection": GeoJsonGeometryCollection +}; diff --git a/sdk/maps/maps-route/src/models/parameters.ts b/sdk/maps/maps-route/src/models/parameters.ts new file mode 100644 index 000000000000..3fe77bf57e09 --- /dev/null +++ b/sdk/maps/maps-route/src/models/parameters.ts @@ -0,0 +1,597 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { + OperationParameter, + OperationURLParameter, + OperationQueryParameter +} from "@azure/core-client"; +import { + PostRouteMatrixRequestBody as PostRouteMatrixRequestBodyMapper, + PostRouteDirectionsRequestBody as PostRouteDirectionsRequestBodyMapper, + BatchRequestBody as BatchRequestBodyMapper +} from "../models/mappers"; + +export const contentType: OperationParameter = { + parameterPath: ["options", "contentType"], + mapper: { + defaultValue: "application/json", + isConstant: true, + serializedName: "Content-Type", + type: { + name: "String" + } + } +}; + +export const postRouteMatrixRequestBody: OperationParameter = { + parameterPath: "postRouteMatrixRequestBody", + mapper: PostRouteMatrixRequestBodyMapper +}; + +export const accept: OperationParameter = { + parameterPath: "accept", + mapper: { + defaultValue: "application/json", + isConstant: true, + serializedName: "Accept", + type: { + name: "String" + } + } +}; + +export const geography: OperationURLParameter = { + parameterPath: "geography", + mapper: { + serializedName: "geography", + required: true, + type: { + name: "String" + } + } +}; + +export const xMsClientId: OperationParameter = { + parameterPath: "xMsClientId", + mapper: { + serializedName: "x-ms-client-id", + type: { + name: "String" + } + } +}; + +export const apiVersion: OperationQueryParameter = { + parameterPath: "apiVersion", + mapper: { + defaultValue: "1.0", + isConstant: true, + serializedName: "api-version", + type: { + name: "String" + } + } +}; + +export const format: OperationURLParameter = { + parameterPath: "format", + mapper: { + serializedName: "format", + required: true, + type: { + name: "String" + } + } +}; + +export const waitForResults: OperationQueryParameter = { + parameterPath: ["options", "waitForResults"], + mapper: { + serializedName: "waitForResults", + type: { + name: "Boolean" + } + } +}; + +export const computeTravelTimeFor: OperationQueryParameter = { + parameterPath: ["options", "computeTravelTimeFor"], + mapper: { + serializedName: "computeTravelTimeFor", + type: { + name: "String" + } + } +}; + +export const sectionType: OperationQueryParameter = { + parameterPath: ["options", "sectionType"], + mapper: { + serializedName: "sectionType", + type: { + name: "String" + } + } +}; + +export const arriveAt: OperationQueryParameter = { + parameterPath: ["options", "arriveAt"], + mapper: { + serializedName: "arriveAt", + type: { + name: "DateTime" + } + } +}; + +export const departAt: OperationQueryParameter = { + parameterPath: ["options", "departAt"], + mapper: { + serializedName: "departAt", + type: { + name: "DateTime" + } + } +}; + +export const vehicleAxleWeight: OperationQueryParameter = { + parameterPath: ["options", "vehicleAxleWeight"], + mapper: { + serializedName: "vehicleAxleWeight", + type: { + name: "Number" + } + } +}; + +export const vehicleLength: OperationQueryParameter = { + parameterPath: ["options", "vehicleLength"], + mapper: { + serializedName: "vehicleLength", + type: { + name: "Number" + } + } +}; + +export const vehicleHeight: OperationQueryParameter = { + parameterPath: ["options", "vehicleHeight"], + mapper: { + serializedName: "vehicleHeight", + type: { + name: "Number" + } + } +}; + +export const vehicleWidth: OperationQueryParameter = { + parameterPath: ["options", "vehicleWidth"], + mapper: { + serializedName: "vehicleWidth", + type: { + name: "Number" + } + } +}; + +export const vehicleMaxSpeed: OperationQueryParameter = { + parameterPath: ["options", "vehicleMaxSpeed"], + mapper: { + serializedName: "vehicleMaxSpeed", + type: { + name: "Number" + } + } +}; + +export const vehicleWeight: OperationQueryParameter = { + parameterPath: ["options", "vehicleWeight"], + mapper: { + serializedName: "vehicleWeight", + type: { + name: "Number" + } + } +}; + +export const windingness: OperationQueryParameter = { + parameterPath: ["options", "windingness"], + mapper: { + serializedName: "windingness", + type: { + name: "String" + } + } +}; + +export const hilliness: OperationQueryParameter = { + parameterPath: ["options", "hilliness"], + mapper: { + serializedName: "hilliness", + type: { + name: "String" + } + } +}; + +export const travelMode: OperationQueryParameter = { + parameterPath: ["options", "travelMode"], + mapper: { + serializedName: "travelMode", + type: { + name: "String" + } + } +}; + +export const avoid: OperationQueryParameter = { + parameterPath: ["options", "avoid"], + mapper: { + serializedName: "avoid", + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + collectionFormat: "Multi" +}; + +export const traffic: OperationQueryParameter = { + parameterPath: ["options", "traffic"], + mapper: { + serializedName: "traffic", + type: { + name: "Boolean" + } + } +}; + +export const routeType: OperationQueryParameter = { + parameterPath: ["options", "routeType"], + mapper: { + serializedName: "routeType", + type: { + name: "String" + } + } +}; + +export const vehicleLoadType: OperationQueryParameter = { + parameterPath: ["options", "vehicleLoadType"], + mapper: { + serializedName: "vehicleLoadType", + type: { + name: "String" + } + } +}; + +export const format1: OperationURLParameter = { + parameterPath: "format", + mapper: { + serializedName: "format", + required: true, + type: { + name: "String" + } + } +}; + +export const query: OperationQueryParameter = { + parameterPath: "query", + mapper: { + serializedName: "query", + required: true, + type: { + name: "String" + } + } +}; + +export const maxAlternatives: OperationQueryParameter = { + parameterPath: ["options", "maxAlternatives"], + mapper: { + constraints: { + InclusiveMaximum: 5, + InclusiveMinimum: 0 + }, + serializedName: "maxAlternatives", + type: { + name: "Number" + } + } +}; + +export const alternativeType: OperationQueryParameter = { + parameterPath: ["options", "alternativeType"], + mapper: { + serializedName: "alternativeType", + type: { + name: "String" + } + } +}; + +export const minDeviationDistance: OperationQueryParameter = { + parameterPath: ["options", "minDeviationDistance"], + mapper: { + serializedName: "minDeviationDistance", + type: { + name: "Number" + } + } +}; + +export const minDeviationTime: OperationQueryParameter = { + parameterPath: ["options", "minDeviationTime"], + mapper: { + serializedName: "minDeviationTime", + type: { + name: "Number" + } + } +}; + +export const instructionsType: OperationQueryParameter = { + parameterPath: ["options", "instructionsType"], + mapper: { + serializedName: "instructionsType", + type: { + name: "String" + } + } +}; + +export const language: OperationQueryParameter = { + parameterPath: ["options", "language"], + mapper: { + serializedName: "language", + type: { + name: "String" + } + } +}; + +export const computeBestOrder: OperationQueryParameter = { + parameterPath: ["options", "computeBestOrder"], + mapper: { + serializedName: "computeBestOrder", + type: { + name: "Boolean" + } + } +}; + +export const routeRepresentation: OperationQueryParameter = { + parameterPath: ["options", "routeRepresentation"], + mapper: { + serializedName: "routeRepresentation", + type: { + name: "String" + } + } +}; + +export const vehicleHeading: OperationQueryParameter = { + parameterPath: ["options", "vehicleHeading"], + mapper: { + constraints: { + InclusiveMaximum: 359, + InclusiveMinimum: 0 + }, + serializedName: "vehicleHeading", + type: { + name: "Number" + } + } +}; + +export const report: OperationQueryParameter = { + parameterPath: ["options", "report"], + mapper: { + serializedName: "report", + type: { + name: "String" + } + } +}; + +export const vehicleCommercial: OperationQueryParameter = { + parameterPath: ["options", "vehicleCommercial"], + mapper: { + serializedName: "vehicleCommercial", + type: { + name: "Boolean" + } + } +}; + +export const vehicleEngineType: OperationQueryParameter = { + parameterPath: ["options", "vehicleEngineType"], + mapper: { + serializedName: "vehicleEngineType", + type: { + name: "String" + } + } +}; + +export const constantSpeedConsumptionInLitersPerHundredkm: OperationQueryParameter = { + parameterPath: ["options", "constantSpeedConsumptionInLitersPerHundredkm"], + mapper: { + serializedName: "constantSpeedConsumptionInLitersPerHundredkm", + type: { + name: "Number" + } + } +}; + +export const currentFuelInLiters: OperationQueryParameter = { + parameterPath: ["options", "currentFuelInLiters"], + mapper: { + serializedName: "currentFuelInLiters", + type: { + name: "Number" + } + } +}; + +export const auxiliaryPowerInLitersPerHour: OperationQueryParameter = { + parameterPath: ["options", "auxiliaryPowerInLitersPerHour"], + mapper: { + serializedName: "auxiliaryPowerInLitersPerHour", + type: { + name: "Number" + } + } +}; + +export const fuelEnergyDensityInMJoulesPerLiter: OperationQueryParameter = { + parameterPath: ["options", "fuelEnergyDensityInMJoulesPerLiter"], + mapper: { + serializedName: "fuelEnergyDensityInMJoulesPerLiter", + type: { + name: "Number" + } + } +}; + +export const accelerationEfficiency: OperationQueryParameter = { + parameterPath: ["options", "accelerationEfficiency"], + mapper: { + serializedName: "accelerationEfficiency", + type: { + name: "Number" + } + } +}; + +export const decelerationEfficiency: OperationQueryParameter = { + parameterPath: ["options", "decelerationEfficiency"], + mapper: { + serializedName: "decelerationEfficiency", + type: { + name: "Number" + } + } +}; + +export const uphillEfficiency: OperationQueryParameter = { + parameterPath: ["options", "uphillEfficiency"], + mapper: { + serializedName: "uphillEfficiency", + type: { + name: "Number" + } + } +}; + +export const downhillEfficiency: OperationQueryParameter = { + parameterPath: ["options", "downhillEfficiency"], + mapper: { + serializedName: "downhillEfficiency", + type: { + name: "Number" + } + } +}; + +export const constantSpeedConsumptionInkWhPerHundredkm: OperationQueryParameter = { + parameterPath: ["options", "constantSpeedConsumptionInkWhPerHundredkm"], + mapper: { + serializedName: "constantSpeedConsumptionInkWhPerHundredkm", + type: { + name: "String" + } + } +}; + +export const currentChargeInkWh: OperationQueryParameter = { + parameterPath: ["options", "currentChargeInkWh"], + mapper: { + serializedName: "currentChargeInkWh", + type: { + name: "String" + } + } +}; + +export const maxChargeInkWh: OperationQueryParameter = { + parameterPath: ["options", "maxChargeInkWh"], + mapper: { + serializedName: "maxChargeInkWh", + type: { + name: "String" + } + } +}; + +export const auxiliaryPowerInkW: OperationQueryParameter = { + parameterPath: ["options", "auxiliaryPowerInkW"], + mapper: { + serializedName: "auxiliaryPowerInkW", + type: { + name: "String" + } + } +}; + +export const postRouteDirectionsRequestBody: OperationParameter = { + parameterPath: "postRouteDirectionsRequestBody", + mapper: PostRouteDirectionsRequestBodyMapper +}; + +export const fuelBudgetInLiters: OperationQueryParameter = { + parameterPath: ["options", "fuelBudgetInLiters"], + mapper: { + serializedName: "fuelBudgetInLiters", + type: { + name: "Number" + } + } +}; + +export const energyBudgetInkWh: OperationQueryParameter = { + parameterPath: ["options", "energyBudgetInkWh"], + mapper: { + serializedName: "energyBudgetInkWh", + type: { + name: "Number" + } + } +}; + +export const timeBudgetInSec: OperationQueryParameter = { + parameterPath: ["options", "timeBudgetInSec"], + mapper: { + serializedName: "timeBudgetInSec", + type: { + name: "Number" + } + } +}; + +export const distanceBudgetInMeters: OperationQueryParameter = { + parameterPath: ["options", "distanceBudgetInMeters"], + mapper: { + serializedName: "distanceBudgetInMeters", + type: { + name: "Number" + } + } +}; + +export const postRouteDirectionsBatchRequestBody: OperationParameter = { + parameterPath: "postRouteDirectionsBatchRequestBody", + mapper: BatchRequestBodyMapper +}; diff --git a/sdk/maps/maps-route/src/operations/index.ts b/sdk/maps/maps-route/src/operations/index.ts new file mode 100644 index 000000000000..d08176bec180 --- /dev/null +++ b/sdk/maps/maps-route/src/operations/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./route"; diff --git a/sdk/maps/maps-route/src/operations/route.ts b/sdk/maps/maps-route/src/operations/route.ts new file mode 100644 index 000000000000..06192578bc78 --- /dev/null +++ b/sdk/maps/maps-route/src/operations/route.ts @@ -0,0 +1,1595 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { Route } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; +import * as Mappers from "../models/mappers"; +import * as Parameters from "../models/parameters"; +import { RouteClientContext } from "../routeClientContext"; +import { LROPoller, shouldDeserializeLRO } from "../lro"; +import { PollerLike, PollOperationState } from "@azure/core-lro"; +import { + PostRouteMatrixRequestBody, + ResponseFormat, + RoutePostRouteMatrixOptionalParams, + RoutePostRouteMatrixResponse, + RoutePostRouteMatrixSyncOptionalParams, + RoutePostRouteMatrixSyncResponse, + TextFormat, + RouteGetRouteDirectionsOptionalParams, + RouteGetRouteDirectionsResponse, + PostRouteDirectionsRequestBody, + RoutePostRouteDirectionsOptionalParams, + RoutePostRouteDirectionsResponse, + RouteGetRouteRangeOptionalParams, + RouteGetRouteRangeResponse, + BatchRequestBody, + RoutePostRouteDirectionsBatchOptionalParams, + RoutePostRouteDirectionsBatchResponse, + RoutePostRouteDirectionsBatchSyncOptionalParams, + RoutePostRouteDirectionsBatchSyncResponse +} from "../models"; + +/** Class representing a Route. */ +export class RouteImpl implements Route { + private readonly client: RouteClientContext; + + /** + * Initialize a new instance of the class Route class. + * @param client Reference to the service client + */ + constructor(client: RouteClientContext) { + this.client = client; + } + + /** + * + * **Applies to**: S1 pricing tier. + * + * The Matrix Routing service allows calculation of a matrix of route summaries for a set of routes + * defined by origin and destination locations by using an asynchronous (async) or synchronous (sync) + * POST request. For every given origin, the service calculates the cost of routing from that origin to + * every given destination. The set of origins and the set of destinations can be thought of as the + * column and row headers of a table and each cell in the table contains the costs of routing from the + * origin to the destination for that cell. As an example, let's say a food delivery company has 20 + * drivers and they need to find the closest driver to pick up the delivery from the restaurant. To + * solve this use case, they can call Matrix Route API. + * + * + * For each route, the travel times and distances are returned. You can use the computed costs to + * determine which detailed routes to calculate using the Route Directions API. + * + * + * The maximum size of a matrix for async request is **700** and for sync request it's **100** (the + * number of origins multiplied by the number of destinations). + * + * + * + * ### Submit Synchronous Route Matrix Request + * If your scenario requires synchronous requests and the maximum size of the matrix is less than or + * equal to 100, you might want to make synchronous request. The maximum size of a matrix for this API + * is **100** (the number of origins multiplied by the number of destinations). With that constraint in + * mind, examples of possible matrix dimensions are: 10x10, 6x8, 9x8 (it does not need to be square). + * + * ``` + * POST + * https://atlas.microsoft.com/route/matrix/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * + * ### Submit Asynchronous Route Matrix Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex routing + * requests. When you make a request by using async request, by default the service returns a 202 + * response code along a redirect URL in the Location field of the response header. This URL should be + * checked periodically until the response data or error information is available. If `waitForResults` + * parameter in the request is set to true, user will get a 200 response if the request is finished + * under 120 seconds. + * + * + * The maximum size of a matrix for this API is **700** (the number of origins multiplied by the number + * of destinations). With that constraint in mind, examples of possible matrix dimensions are: 50x10, + * 10x10, 28x25. 10x70 (it does not need to be square). + * + * + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * + * + * + * ``` + * POST + * https://atlas.microsoft.com/route/matrix/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * + * Here's a typical sequence of asynchronous operations: + * 1. Client sends a Route Matrix POST request to Azure Maps + * + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Route Matrix request has been accepted. + * + * > HTTP `Error` - There was an error processing your Route Matrix request. This could either be a + * 400 Bad Request or any other Error status code. + * + * + * 3. If the Matrix Route request was accepted successfully, the Location header in the response + * contains the URL to download the results of the request. This status URI looks like the following: + * + * ``` + * GET + * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} + * ``` + * + * + * 4. Client issues a GET request on the download URL obtained in Step 3 to download the results + * + * ### Download Sync Results + * When you make a POST request for Route Matrix Sync API, the service returns 200 response code for + * successful request and a response array. The response body will contain the data and there will be + * no possibility to retrieve the results later. + * + * ### Download Async Results + * When a request issues a `202 Accepted` response, the request is being processed using our async + * pipeline. You will be given a URL to check the progress of your async request in the location + * header of the response. This status URI looks like the following: + * ``` + * GET + * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} + * ``` + * + * The URL provided by the location header will return the following responses when a `GET` request is + * issued. + * + * > HTTP `202 Accepted` - Matrix request was accepted but is still being processed. Please try again + * in some time. + * + * > HTTP `200 OK` - Matrix request successfully processed. The response body contains all of the + * results. + * @param format Desired format of the response. Only `json` format is supported. + * @param postRouteMatrixRequestBody The matrix of origin and destination coordinates to compute the + * route distance, travel time and other summary for each cell of the matrix based on the input + * parameters. The minimum and the maximum cell count supported are 1 and **700** for async and **100** + * for sync respectively. For example, it can be 35 origins and 20 destinations or 25 origins and 25 + * destinations for async API. + * @param options The options parameters. + */ + async beginPostRouteMatrix( + format: ResponseFormat, + postRouteMatrixRequestBody: PostRouteMatrixRequestBody, + options?: RoutePostRouteMatrixOptionalParams + ): Promise< + PollerLike< + PollOperationState, + RoutePostRouteMatrixResponse + > + > { + const directSendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ): Promise => { + return this.client.sendOperationRequest(args, spec); + }; + const sendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ) => { + let currentRawResponse: + | coreClient.FullOperationResponse + | undefined = undefined; + const providedCallback = args.options?.onResponse; + const callback: coreClient.RawResponseCallback = ( + rawResponse: coreClient.FullOperationResponse, + flatResponse: unknown + ) => { + currentRawResponse = rawResponse; + providedCallback?.(rawResponse, flatResponse); + }; + const updatedArgs = { + ...args, + options: { + ...args.options, + onResponse: callback + } + }; + const flatResponse = await directSendOperation(updatedArgs, spec); + return { flatResponse, rawResponse: currentRawResponse! }; + }; + + return new LROPoller( + { intervalInMs: options?.updateIntervalInMs }, + { format, postRouteMatrixRequestBody, options }, + postRouteMatrixOperationSpec, + sendOperation, + "location" + ); + } + + /** + * + * **Applies to**: S1 pricing tier. + * + * The Matrix Routing service allows calculation of a matrix of route summaries for a set of routes + * defined by origin and destination locations by using an asynchronous (async) or synchronous (sync) + * POST request. For every given origin, the service calculates the cost of routing from that origin to + * every given destination. The set of origins and the set of destinations can be thought of as the + * column and row headers of a table and each cell in the table contains the costs of routing from the + * origin to the destination for that cell. As an example, let's say a food delivery company has 20 + * drivers and they need to find the closest driver to pick up the delivery from the restaurant. To + * solve this use case, they can call Matrix Route API. + * + * + * For each route, the travel times and distances are returned. You can use the computed costs to + * determine which detailed routes to calculate using the Route Directions API. + * + * + * The maximum size of a matrix for async request is **700** and for sync request it's **100** (the + * number of origins multiplied by the number of destinations). + * + * + * + * ### Submit Synchronous Route Matrix Request + * If your scenario requires synchronous requests and the maximum size of the matrix is less than or + * equal to 100, you might want to make synchronous request. The maximum size of a matrix for this API + * is **100** (the number of origins multiplied by the number of destinations). With that constraint in + * mind, examples of possible matrix dimensions are: 10x10, 6x8, 9x8 (it does not need to be square). + * + * ``` + * POST + * https://atlas.microsoft.com/route/matrix/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * + * ### Submit Asynchronous Route Matrix Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex routing + * requests. When you make a request by using async request, by default the service returns a 202 + * response code along a redirect URL in the Location field of the response header. This URL should be + * checked periodically until the response data or error information is available. If `waitForResults` + * parameter in the request is set to true, user will get a 200 response if the request is finished + * under 120 seconds. + * + * + * The maximum size of a matrix for this API is **700** (the number of origins multiplied by the number + * of destinations). With that constraint in mind, examples of possible matrix dimensions are: 50x10, + * 10x10, 28x25. 10x70 (it does not need to be square). + * + * + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * + * + * + * ``` + * POST + * https://atlas.microsoft.com/route/matrix/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * + * Here's a typical sequence of asynchronous operations: + * 1. Client sends a Route Matrix POST request to Azure Maps + * + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Route Matrix request has been accepted. + * + * > HTTP `Error` - There was an error processing your Route Matrix request. This could either be a + * 400 Bad Request or any other Error status code. + * + * + * 3. If the Matrix Route request was accepted successfully, the Location header in the response + * contains the URL to download the results of the request. This status URI looks like the following: + * + * ``` + * GET + * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} + * ``` + * + * + * 4. Client issues a GET request on the download URL obtained in Step 3 to download the results + * + * ### Download Sync Results + * When you make a POST request for Route Matrix Sync API, the service returns 200 response code for + * successful request and a response array. The response body will contain the data and there will be + * no possibility to retrieve the results later. + * + * ### Download Async Results + * When a request issues a `202 Accepted` response, the request is being processed using our async + * pipeline. You will be given a URL to check the progress of your async request in the location + * header of the response. This status URI looks like the following: + * ``` + * GET + * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} + * ``` + * + * The URL provided by the location header will return the following responses when a `GET` request is + * issued. + * + * > HTTP `202 Accepted` - Matrix request was accepted but is still being processed. Please try again + * in some time. + * + * > HTTP `200 OK` - Matrix request successfully processed. The response body contains all of the + * results. + * @param format Desired format of the response. Only `json` format is supported. + * @param postRouteMatrixRequestBody The matrix of origin and destination coordinates to compute the + * route distance, travel time and other summary for each cell of the matrix based on the input + * parameters. The minimum and the maximum cell count supported are 1 and **700** for async and **100** + * for sync respectively. For example, it can be 35 origins and 20 destinations or 25 origins and 25 + * destinations for async API. + * @param options The options parameters. + */ + async beginPostRouteMatrixAndWait( + format: ResponseFormat, + postRouteMatrixRequestBody: PostRouteMatrixRequestBody, + options?: RoutePostRouteMatrixOptionalParams + ): Promise { + const poller = await this.beginPostRouteMatrix( + format, + postRouteMatrixRequestBody, + options + ); + return poller.pollUntilDone(); + } + + /** + * + * **Applies to**: S1 pricing tier. + * + * The Matrix Routing service allows calculation of a matrix of route summaries for a set of routes + * defined by origin and destination locations by using an asynchronous (async) or synchronous (sync) + * POST request. For every given origin, the service calculates the cost of routing from that origin to + * every given destination. The set of origins and the set of destinations can be thought of as the + * column and row headers of a table and each cell in the table contains the costs of routing from the + * origin to the destination for that cell. As an example, let's say a food delivery company has 20 + * drivers and they need to find the closest driver to pick up the delivery from the restaurant. To + * solve this use case, they can call Matrix Route API. + * + * + * For each route, the travel times and distances are returned. You can use the computed costs to + * determine which detailed routes to calculate using the Route Directions API. + * + * + * The maximum size of a matrix for async request is **700** and for sync request it's **100** (the + * number of origins multiplied by the number of destinations). + * + * + * + * ### Submit Synchronous Route Matrix Request + * If your scenario requires synchronous requests and the maximum size of the matrix is less than or + * equal to 100, you might want to make synchronous request. The maximum size of a matrix for this API + * is **100** (the number of origins multiplied by the number of destinations). With that constraint in + * mind, examples of possible matrix dimensions are: 10x10, 6x8, 9x8 (it does not need to be square). + * + * ``` + * POST + * https://atlas.microsoft.com/route/matrix/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * + * ### Submit Asynchronous Route Matrix Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex routing + * requests. When you make a request by using async request, by default the service returns a 202 + * response code along a redirect URL in the Location field of the response header. This URL should be + * checked periodically until the response data or error information is available. If `waitForResults` + * parameter in the request is set to true, user will get a 200 response if the request is finished + * under 120 seconds. + * + * + * The maximum size of a matrix for this API is **700** (the number of origins multiplied by the number + * of destinations). With that constraint in mind, examples of possible matrix dimensions are: 50x10, + * 10x10, 28x25. 10x70 (it does not need to be square). + * + * + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * + * + * + * ``` + * POST + * https://atlas.microsoft.com/route/matrix/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * + * Here's a typical sequence of asynchronous operations: + * 1. Client sends a Route Matrix POST request to Azure Maps + * + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Route Matrix request has been accepted. + * + * > HTTP `Error` - There was an error processing your Route Matrix request. This could either be a + * 400 Bad Request or any other Error status code. + * + * + * 3. If the Matrix Route request was accepted successfully, the Location header in the response + * contains the URL to download the results of the request. This status URI looks like the following: + * + * ``` + * GET + * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} + * ``` + * + * + * 4. Client issues a GET request on the download URL obtained in Step 3 to download the results + * + * ### Download Sync Results + * When you make a POST request for Route Matrix Sync API, the service returns 200 response code for + * successful request and a response array. The response body will contain the data and there will be + * no possibility to retrieve the results later. + * + * ### Download Async Results + * When a request issues a `202 Accepted` response, the request is being processed using our async + * pipeline. You will be given a URL to check the progress of your async request in the location + * header of the response. This status URI looks like the following: + * ``` + * GET + * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} + * ``` + * + * The URL provided by the location header will return the following responses when a `GET` request is + * issued. + * + * > HTTP `202 Accepted` - Matrix request was accepted but is still being processed. Please try again + * in some time. + * + * > HTTP `200 OK` - Matrix request successfully processed. The response body contains all of the + * results. + * @param format Desired format of the response. Only `json` format is supported. + * @param postRouteMatrixRequestBody The matrix of origin and destination coordinates to compute the + * route distance, travel time and other summary for each cell of the matrix based on the input + * parameters. The minimum and the maximum cell count supported are 1 and **700** for async and **100** + * for sync respectively. For example, it can be 35 origins and 20 destinations or 25 origins and 25 + * destinations for async API. + * @param options The options parameters. + */ + postRouteMatrixSync( + format: ResponseFormat, + postRouteMatrixRequestBody: PostRouteMatrixRequestBody, + options?: RoutePostRouteMatrixSyncOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, postRouteMatrixRequestBody, options }, + postRouteMatrixSyncOperationSpec + ); + } + + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Returns a route between an origin and a destination, passing through waypoints if they are + * specified. The route will take into account factors such as current traffic and the typical road + * speeds on the requested day of the week and time of day. + * + * Information returned includes the distance, estimated travel time, and a representation of the route + * geometry. Additional routing information such as optimized waypoint order or turn by turn + * instructions is also available, depending on the options selected. + * + * Routing service provides a set of parameters for a detailed description of vehicle-specific + * Consumption Model. Please check [Consumption + * Model](https://docs.microsoft.com/azure/azure-maps/consumption-model) for detailed explanation of + * the concepts and parameters involved. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The Coordinates through which the route is calculated, delimited by a colon. A minimum + * of two coordinates is required. The first one is the origin and the last is the destination of the + * route. Optional coordinates in-between act as WayPoints in the route. You can pass up to 150 + * WayPoints. + * @param options The options parameters. + */ + getRouteDirections( + format: TextFormat, + query: string, + options?: RouteGetRouteDirectionsOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getRouteDirectionsOperationSpec + ); + } + + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Returns a route between an origin and a destination, passing through waypoints if they are + * specified. The route will take into account factors such as current traffic and the typical road + * speeds on the requested day of the week and time of day. + * + * Information returned includes the distance, estimated travel time, and a representation of the route + * geometry. Additional routing information such as optimized waypoint order or turn by turn + * instructions is also available, depending on the options selected. + * + * Routing service provides a set of parameters for a detailed description of a vehicle-specific + * Consumption Model. Please check [Consumption + * Model](https://docs.microsoft.com/azure/azure-maps/consumption-model) for detailed explanation of + * the concepts and parameters involved. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The Coordinates through which the route is calculated. Needs two coordinates at least. + * Delimited by colon. First one is the origin and the last is the destination of the route. The + * coordinates are in a lat,long format. Optional coordinates in between act as WayPoints in the + * route. + * @param postRouteDirectionsRequestBody Used for reconstructing a route and for calculating zero or + * more alternative routes to this reference route. The provided sequence of coordinates is used as + * input for route reconstruction. The alternative routes are calculated between the origin and + * destination points specified in the base path parameter locations. If both minDeviationDistance and + * minDeviationTime are set to zero, then these origin and destination points are expected to be at + * (or very near) the beginning and end of the reference route, respectively. Intermediate locations + * (waypoints) are not supported when using supportingPoints. + * + * Setting at least one of minDeviationDistance or minDeviationTime to a value greater than zero has + * the following consequences: + * + * * The origin point of the calculateRoute request must be on (or very near) the input reference + * route. If this is not the case, an error is returned. However, the origin point does not need to be + * at the beginning of the input reference route (it can be thought of as the current vehicle position + * on the reference route). + * * The reference route, returned as the first route in the calculateRoute response, will start at + * the origin point specified in the calculateRoute request. The initial part of the input reference + * route up until the origin point will be excluded from the response. + * * The values of minDeviationDistance and minDeviationTime determine how far alternative routes will + * be guaranteed to follow the reference route from the origin point onwards. + * * The route must use departAt. + * * The vehicleHeading is ignored. + * @param options The options parameters. + */ + postRouteDirections( + format: TextFormat, + query: string, + postRouteDirectionsRequestBody: PostRouteDirectionsRequestBody, + options?: RoutePostRouteDirectionsOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, postRouteDirectionsRequestBody, options }, + postRouteDirectionsOperationSpec + ); + } + + /** + * __Route Range (Isochrone) API__ + * + * + * **Applies to**: S1 pricing tier. + * + * This service will calculate a set of locations that can be reached from the origin point based on + * fuel, energy, time or distance budget that is specified. A polygon boundary (or Isochrone) is + * returned in a counterclockwise orientation as well as the precise polygon center which was the + * result of the origin point. + * + * The returned polygon can be used for further processing such as [Search Inside + * Geometry](https://docs.microsoft.com/rest/api/maps/search/postsearchinsidegeometry) to search for + * POIs within the provided Isochrone. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The Coordinate from which the range calculation should start. + * @param options The options parameters. + */ + getRouteRange( + format: TextFormat, + query: string, + options?: RouteGetRouteRangeOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getRouteRangeOperationSpec + ); + } + + /** + * **Route Directions Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Route Directions Batch API sends batches of queries to [Route Directions + * API](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections) using just a single + * API call. You can call Route Directions Batch API to run either asynchronously (async) or + * synchronously (sync). The async API allows caller to batch up to **700** queries and sync API up to + * **100** queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/route/directions/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex route requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **700** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Route Directions Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` GET https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0 ``` + * Note:- Please remember to add AUTH information (subscription-key/azure_auth - See + * [Security](#security)) to the _status URI_ before running it.
+ * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _route directions_ queries you will use a `POST` request where the request body will + * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 3 _route directions_ queries: + * + * + * ```json + * { + * "batchItems": [ + * { "query": + * "?query=47.620659,-122.348934:47.610101,-122.342015&travelMode=bicycle&routeType=eco&traffic=false" + * }, + * { "query": + * "?query=40.759856,-73.985108:40.771136,-73.973506&travelMode=pedestrian&routeType=shortest" }, + * { "query": "?query=48.923159,-122.557362:32.621279,-116.840362" } + * ] + * } + * ``` + * + * A _route directions_ query in a batch is just a partial URL _without_ the protocol, base URL, path, + * api-version and subscription-key. It can accept any of the supported _route directions_ [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#uri-parameters). + * The string values in the _route directions_ query must be properly escaped (e.g. " character should + * be escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **700** queries and sync API up to **100** queries, and + * the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`RouteDirectionsResponse`](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#routedirectionsresponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 1 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 1, + * "totalRequests": 2 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": { + * "routes": [ + * { + * "summary": { + * "lengthInMeters": 1758, + * "travelTimeInSeconds": 387, + * "trafficDelayInSeconds": 0, + * "departureTime": "2018-07-17T00:49:56+00:00", + * "arrivalTime": "2018-07-17T00:56:22+00:00" + * }, + * "legs": [ + * { + * "summary": { + * "lengthInMeters": 1758, + * "travelTimeInSeconds": 387, + * "trafficDelayInSeconds": 0, + * "departureTime": "2018-07-17T00:49:56+00:00", + * "arrivalTime": "2018-07-17T00:56:22+00:00" + * }, + * "points": [ + * { + * "latitude": 47.62094, + * "longitude": -122.34892 + * }, + * { + * "latitude": 47.62094, + * "longitude": -122.3485 + * }, + * { + * "latitude": 47.62095, + * "longitude": -122.3476 + * } + * ] + * } + * ], + * "sections": [ + * { + * "startPointIndex": 0, + * "endPointIndex": 40, + * "sectionType": "TRAVEL_MODE", + * "travelMode": "bicycle" + * } + * ] + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param postRouteDirectionsBatchRequestBody The list of route directions queries/requests to process. + * The list can contain a max of 700 queries for async and 100 queries for sync version and must + * contain at least 1 query. + * @param options The options parameters. + */ + async beginPostRouteDirectionsBatch( + format: ResponseFormat, + postRouteDirectionsBatchRequestBody: BatchRequestBody, + options?: RoutePostRouteDirectionsBatchOptionalParams + ): Promise< + PollerLike< + PollOperationState, + RoutePostRouteDirectionsBatchResponse + > + > { + const directSendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ): Promise => { + return this.client.sendOperationRequest(args, spec); + }; + const sendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ) => { + let currentRawResponse: + | coreClient.FullOperationResponse + | undefined = undefined; + const providedCallback = args.options?.onResponse; + const callback: coreClient.RawResponseCallback = ( + rawResponse: coreClient.FullOperationResponse, + flatResponse: unknown + ) => { + currentRawResponse = rawResponse; + providedCallback?.(rawResponse, flatResponse); + }; + const updatedArgs = { + ...args, + options: { + ...args.options, + onResponse: callback + } + }; + const flatResponse = await directSendOperation(updatedArgs, spec); + return { flatResponse, rawResponse: currentRawResponse! }; + }; + + return new LROPoller( + { intervalInMs: options?.updateIntervalInMs }, + { format, postRouteDirectionsBatchRequestBody, options }, + postRouteDirectionsBatchOperationSpec, + sendOperation, + "location" + ); + } + + /** + * **Route Directions Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Route Directions Batch API sends batches of queries to [Route Directions + * API](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections) using just a single + * API call. You can call Route Directions Batch API to run either asynchronously (async) or + * synchronously (sync). The async API allows caller to batch up to **700** queries and sync API up to + * **100** queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/route/directions/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex route requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **700** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Route Directions Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` GET https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0 ``` + * Note:- Please remember to add AUTH information (subscription-key/azure_auth - See + * [Security](#security)) to the _status URI_ before running it.
+ * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _route directions_ queries you will use a `POST` request where the request body will + * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 3 _route directions_ queries: + * + * + * ```json + * { + * "batchItems": [ + * { "query": + * "?query=47.620659,-122.348934:47.610101,-122.342015&travelMode=bicycle&routeType=eco&traffic=false" + * }, + * { "query": + * "?query=40.759856,-73.985108:40.771136,-73.973506&travelMode=pedestrian&routeType=shortest" }, + * { "query": "?query=48.923159,-122.557362:32.621279,-116.840362" } + * ] + * } + * ``` + * + * A _route directions_ query in a batch is just a partial URL _without_ the protocol, base URL, path, + * api-version and subscription-key. It can accept any of the supported _route directions_ [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#uri-parameters). + * The string values in the _route directions_ query must be properly escaped (e.g. " character should + * be escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **700** queries and sync API up to **100** queries, and + * the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`RouteDirectionsResponse`](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#routedirectionsresponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 1 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 1, + * "totalRequests": 2 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": { + * "routes": [ + * { + * "summary": { + * "lengthInMeters": 1758, + * "travelTimeInSeconds": 387, + * "trafficDelayInSeconds": 0, + * "departureTime": "2018-07-17T00:49:56+00:00", + * "arrivalTime": "2018-07-17T00:56:22+00:00" + * }, + * "legs": [ + * { + * "summary": { + * "lengthInMeters": 1758, + * "travelTimeInSeconds": 387, + * "trafficDelayInSeconds": 0, + * "departureTime": "2018-07-17T00:49:56+00:00", + * "arrivalTime": "2018-07-17T00:56:22+00:00" + * }, + * "points": [ + * { + * "latitude": 47.62094, + * "longitude": -122.34892 + * }, + * { + * "latitude": 47.62094, + * "longitude": -122.3485 + * }, + * { + * "latitude": 47.62095, + * "longitude": -122.3476 + * } + * ] + * } + * ], + * "sections": [ + * { + * "startPointIndex": 0, + * "endPointIndex": 40, + * "sectionType": "TRAVEL_MODE", + * "travelMode": "bicycle" + * } + * ] + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param postRouteDirectionsBatchRequestBody The list of route directions queries/requests to process. + * The list can contain a max of 700 queries for async and 100 queries for sync version and must + * contain at least 1 query. + * @param options The options parameters. + */ + async beginPostRouteDirectionsBatchAndWait( + format: ResponseFormat, + postRouteDirectionsBatchRequestBody: BatchRequestBody, + options?: RoutePostRouteDirectionsBatchOptionalParams + ): Promise { + const poller = await this.beginPostRouteDirectionsBatch( + format, + postRouteDirectionsBatchRequestBody, + options + ); + return poller.pollUntilDone(); + } + + /** + * **Route Directions Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Route Directions Batch API sends batches of queries to [Route Directions + * API](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections) using just a single + * API call. You can call Route Directions Batch API to run either asynchronously (async) or + * synchronously (sync). The async API allows caller to batch up to **700** queries and sync API up to + * **100** queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/route/directions/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex route requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **700** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Route Directions Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` GET https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0 ``` + * Note:- Please remember to add AUTH information (subscription-key/azure_auth - See + * [Security](#security)) to the _status URI_ before running it.
+ * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _route directions_ queries you will use a `POST` request where the request body will + * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 3 _route directions_ queries: + * + * + * ```json + * { + * "batchItems": [ + * { "query": + * "?query=47.620659,-122.348934:47.610101,-122.342015&travelMode=bicycle&routeType=eco&traffic=false" + * }, + * { "query": + * "?query=40.759856,-73.985108:40.771136,-73.973506&travelMode=pedestrian&routeType=shortest" }, + * { "query": "?query=48.923159,-122.557362:32.621279,-116.840362" } + * ] + * } + * ``` + * + * A _route directions_ query in a batch is just a partial URL _without_ the protocol, base URL, path, + * api-version and subscription-key. It can accept any of the supported _route directions_ [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#uri-parameters). + * The string values in the _route directions_ query must be properly escaped (e.g. " character should + * be escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **700** queries and sync API up to **100** queries, and + * the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`RouteDirectionsResponse`](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#routedirectionsresponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 1 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 1, + * "totalRequests": 2 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": { + * "routes": [ + * { + * "summary": { + * "lengthInMeters": 1758, + * "travelTimeInSeconds": 387, + * "trafficDelayInSeconds": 0, + * "departureTime": "2018-07-17T00:49:56+00:00", + * "arrivalTime": "2018-07-17T00:56:22+00:00" + * }, + * "legs": [ + * { + * "summary": { + * "lengthInMeters": 1758, + * "travelTimeInSeconds": 387, + * "trafficDelayInSeconds": 0, + * "departureTime": "2018-07-17T00:49:56+00:00", + * "arrivalTime": "2018-07-17T00:56:22+00:00" + * }, + * "points": [ + * { + * "latitude": 47.62094, + * "longitude": -122.34892 + * }, + * { + * "latitude": 47.62094, + * "longitude": -122.3485 + * }, + * { + * "latitude": 47.62095, + * "longitude": -122.3476 + * } + * ] + * } + * ], + * "sections": [ + * { + * "startPointIndex": 0, + * "endPointIndex": 40, + * "sectionType": "TRAVEL_MODE", + * "travelMode": "bicycle" + * } + * ] + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param postRouteDirectionsBatchRequestBody The list of route directions queries/requests to process. + * The list can contain a max of 700 queries for async and 100 queries for sync version and must + * contain at least 1 query. + * @param options The options parameters. + */ + postRouteDirectionsBatchSync( + format: ResponseFormat, + postRouteDirectionsBatchRequestBody: BatchRequestBody, + options?: RoutePostRouteDirectionsBatchSyncOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, postRouteDirectionsBatchRequestBody, options }, + postRouteDirectionsBatchSyncOperationSpec + ); + } +} +// Operation Specifications +const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); + +const postRouteMatrixOperationSpec: coreClient.OperationSpec = { + path: "/route/matrix/{format}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.RouteMatrixResponse + }, + 201: { + bodyMapper: Mappers.RouteMatrixResponse + }, + 202: { + bodyMapper: Mappers.RouteMatrixResponse + }, + 204: { + bodyMapper: Mappers.RouteMatrixResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.postRouteMatrixRequestBody, + queryParameters: [ + Parameters.apiVersion, + Parameters.waitForResults, + Parameters.computeTravelTimeFor, + Parameters.sectionType, + Parameters.arriveAt, + Parameters.departAt, + Parameters.vehicleAxleWeight, + Parameters.vehicleLength, + Parameters.vehicleHeight, + Parameters.vehicleWidth, + Parameters.vehicleMaxSpeed, + Parameters.vehicleWeight, + Parameters.windingness, + Parameters.hilliness, + Parameters.travelMode, + Parameters.avoid, + Parameters.traffic, + Parameters.routeType, + Parameters.vehicleLoadType + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [ + Parameters.contentType, + Parameters.accept, + Parameters.xMsClientId + ], + mediaType: "json", + serializer +}; +const postRouteMatrixSyncOperationSpec: coreClient.OperationSpec = { + path: "/route/matrix/sync/{format}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.RouteMatrixResponse + }, + 408: { + bodyMapper: Mappers.ErrorResponse, + isError: true + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.postRouteMatrixRequestBody, + queryParameters: [ + Parameters.apiVersion, + Parameters.waitForResults, + Parameters.computeTravelTimeFor, + Parameters.sectionType, + Parameters.arriveAt, + Parameters.departAt, + Parameters.vehicleAxleWeight, + Parameters.vehicleLength, + Parameters.vehicleHeight, + Parameters.vehicleWidth, + Parameters.vehicleMaxSpeed, + Parameters.vehicleWeight, + Parameters.windingness, + Parameters.hilliness, + Parameters.travelMode, + Parameters.avoid, + Parameters.traffic, + Parameters.routeType, + Parameters.vehicleLoadType + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [ + Parameters.contentType, + Parameters.accept, + Parameters.xMsClientId + ], + mediaType: "json", + serializer +}; +const getRouteDirectionsOperationSpec: coreClient.OperationSpec = { + path: "/route/directions/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.RouteDirectionsResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.computeTravelTimeFor, + Parameters.sectionType, + Parameters.arriveAt, + Parameters.departAt, + Parameters.vehicleAxleWeight, + Parameters.vehicleLength, + Parameters.vehicleHeight, + Parameters.vehicleWidth, + Parameters.vehicleMaxSpeed, + Parameters.vehicleWeight, + Parameters.windingness, + Parameters.hilliness, + Parameters.travelMode, + Parameters.avoid, + Parameters.traffic, + Parameters.routeType, + Parameters.vehicleLoadType, + Parameters.query, + Parameters.maxAlternatives, + Parameters.alternativeType, + Parameters.minDeviationDistance, + Parameters.minDeviationTime, + Parameters.instructionsType, + Parameters.language, + Parameters.computeBestOrder, + Parameters.routeRepresentation, + Parameters.vehicleHeading, + Parameters.report, + Parameters.vehicleCommercial, + Parameters.vehicleEngineType, + Parameters.constantSpeedConsumptionInLitersPerHundredkm, + Parameters.currentFuelInLiters, + Parameters.auxiliaryPowerInLitersPerHour, + Parameters.fuelEnergyDensityInMJoulesPerLiter, + Parameters.accelerationEfficiency, + Parameters.decelerationEfficiency, + Parameters.uphillEfficiency, + Parameters.downhillEfficiency, + Parameters.constantSpeedConsumptionInkWhPerHundredkm, + Parameters.currentChargeInkWh, + Parameters.maxChargeInkWh, + Parameters.auxiliaryPowerInkW + ], + urlParameters: [Parameters.geography, Parameters.format1], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const postRouteDirectionsOperationSpec: coreClient.OperationSpec = { + path: "/route/directions/{format}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.RouteDirectionsResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.postRouteDirectionsRequestBody, + queryParameters: [ + Parameters.apiVersion, + Parameters.computeTravelTimeFor, + Parameters.sectionType, + Parameters.arriveAt, + Parameters.departAt, + Parameters.vehicleAxleWeight, + Parameters.vehicleLength, + Parameters.vehicleHeight, + Parameters.vehicleWidth, + Parameters.vehicleMaxSpeed, + Parameters.vehicleWeight, + Parameters.windingness, + Parameters.hilliness, + Parameters.travelMode, + Parameters.avoid, + Parameters.traffic, + Parameters.routeType, + Parameters.vehicleLoadType, + Parameters.query, + Parameters.maxAlternatives, + Parameters.alternativeType, + Parameters.minDeviationDistance, + Parameters.minDeviationTime, + Parameters.instructionsType, + Parameters.language, + Parameters.computeBestOrder, + Parameters.routeRepresentation, + Parameters.vehicleHeading, + Parameters.report, + Parameters.vehicleCommercial, + Parameters.vehicleEngineType, + Parameters.constantSpeedConsumptionInLitersPerHundredkm, + Parameters.currentFuelInLiters, + Parameters.auxiliaryPowerInLitersPerHour, + Parameters.fuelEnergyDensityInMJoulesPerLiter, + Parameters.accelerationEfficiency, + Parameters.decelerationEfficiency, + Parameters.uphillEfficiency, + Parameters.downhillEfficiency, + Parameters.constantSpeedConsumptionInkWhPerHundredkm, + Parameters.currentChargeInkWh, + Parameters.maxChargeInkWh, + Parameters.auxiliaryPowerInkW + ], + urlParameters: [Parameters.geography, Parameters.format1], + headerParameters: [ + Parameters.contentType, + Parameters.accept, + Parameters.xMsClientId + ], + mediaType: "json", + serializer +}; +const getRouteRangeOperationSpec: coreClient.OperationSpec = { + path: "/route/range/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.GetRouteRangeResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.departAt, + Parameters.vehicleAxleWeight, + Parameters.vehicleLength, + Parameters.vehicleHeight, + Parameters.vehicleWidth, + Parameters.vehicleMaxSpeed, + Parameters.vehicleWeight, + Parameters.windingness, + Parameters.hilliness, + Parameters.travelMode, + Parameters.avoid, + Parameters.traffic, + Parameters.routeType, + Parameters.vehicleLoadType, + Parameters.query, + Parameters.vehicleCommercial, + Parameters.vehicleEngineType, + Parameters.constantSpeedConsumptionInLitersPerHundredkm, + Parameters.currentFuelInLiters, + Parameters.auxiliaryPowerInLitersPerHour, + Parameters.fuelEnergyDensityInMJoulesPerLiter, + Parameters.accelerationEfficiency, + Parameters.decelerationEfficiency, + Parameters.uphillEfficiency, + Parameters.downhillEfficiency, + Parameters.constantSpeedConsumptionInkWhPerHundredkm, + Parameters.currentChargeInkWh, + Parameters.maxChargeInkWh, + Parameters.auxiliaryPowerInkW, + Parameters.fuelBudgetInLiters, + Parameters.energyBudgetInkWh, + Parameters.timeBudgetInSec, + Parameters.distanceBudgetInMeters + ], + urlParameters: [Parameters.geography, Parameters.format1], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const postRouteDirectionsBatchOperationSpec: coreClient.OperationSpec = { + path: "/route/directions/batch/{format}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.RouteDirectionsBatchResponse + }, + 201: { + bodyMapper: Mappers.RouteDirectionsBatchResponse + }, + 202: { + bodyMapper: Mappers.RouteDirectionsBatchResponse + }, + 204: { + bodyMapper: Mappers.RouteDirectionsBatchResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.postRouteDirectionsBatchRequestBody, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [ + Parameters.contentType, + Parameters.accept, + Parameters.xMsClientId + ], + mediaType: "json", + serializer +}; +const postRouteDirectionsBatchSyncOperationSpec: coreClient.OperationSpec = { + path: "/route/directions/batch/sync/{format}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.RouteDirectionsBatchResponse + }, + 408: { + bodyMapper: Mappers.ErrorResponse, + isError: true + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.postRouteDirectionsBatchRequestBody, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [ + Parameters.contentType, + Parameters.accept, + Parameters.xMsClientId + ], + mediaType: "json", + serializer +}; diff --git a/sdk/maps/maps-route/src/operationsInterfaces/index.ts b/sdk/maps/maps-route/src/operationsInterfaces/index.ts new file mode 100644 index 000000000000..d08176bec180 --- /dev/null +++ b/sdk/maps/maps-route/src/operationsInterfaces/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./route"; diff --git a/sdk/maps/maps-route/src/operationsInterfaces/route.ts b/sdk/maps/maps-route/src/operationsInterfaces/route.ts new file mode 100644 index 000000000000..f367eb1e9a59 --- /dev/null +++ b/sdk/maps/maps-route/src/operationsInterfaces/route.ts @@ -0,0 +1,1118 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { PollerLike, PollOperationState } from "@azure/core-lro"; +import { + PostRouteMatrixRequestBody, + ResponseFormat, + RoutePostRouteMatrixOptionalParams, + RoutePostRouteMatrixResponse, + RoutePostRouteMatrixSyncOptionalParams, + RoutePostRouteMatrixSyncResponse, + TextFormat, + RouteGetRouteDirectionsOptionalParams, + RouteGetRouteDirectionsResponse, + PostRouteDirectionsRequestBody, + RoutePostRouteDirectionsOptionalParams, + RoutePostRouteDirectionsResponse, + RouteGetRouteRangeOptionalParams, + RouteGetRouteRangeResponse, + BatchRequestBody, + RoutePostRouteDirectionsBatchOptionalParams, + RoutePostRouteDirectionsBatchResponse, + RoutePostRouteDirectionsBatchSyncOptionalParams, + RoutePostRouteDirectionsBatchSyncResponse +} from "../models"; + +/** Interface representing a Route. */ +export interface Route { + /** + * + * **Applies to**: S1 pricing tier. + * + * The Matrix Routing service allows calculation of a matrix of route summaries for a set of routes + * defined by origin and destination locations by using an asynchronous (async) or synchronous (sync) + * POST request. For every given origin, the service calculates the cost of routing from that origin to + * every given destination. The set of origins and the set of destinations can be thought of as the + * column and row headers of a table and each cell in the table contains the costs of routing from the + * origin to the destination for that cell. As an example, let's say a food delivery company has 20 + * drivers and they need to find the closest driver to pick up the delivery from the restaurant. To + * solve this use case, they can call Matrix Route API. + * + * + * For each route, the travel times and distances are returned. You can use the computed costs to + * determine which detailed routes to calculate using the Route Directions API. + * + * + * The maximum size of a matrix for async request is **700** and for sync request it's **100** (the + * number of origins multiplied by the number of destinations). + * + * + * + * ### Submit Synchronous Route Matrix Request + * If your scenario requires synchronous requests and the maximum size of the matrix is less than or + * equal to 100, you might want to make synchronous request. The maximum size of a matrix for this API + * is **100** (the number of origins multiplied by the number of destinations). With that constraint in + * mind, examples of possible matrix dimensions are: 10x10, 6x8, 9x8 (it does not need to be square). + * + * ``` + * POST + * https://atlas.microsoft.com/route/matrix/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * + * ### Submit Asynchronous Route Matrix Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex routing + * requests. When you make a request by using async request, by default the service returns a 202 + * response code along a redirect URL in the Location field of the response header. This URL should be + * checked periodically until the response data or error information is available. If `waitForResults` + * parameter in the request is set to true, user will get a 200 response if the request is finished + * under 120 seconds. + * + * + * The maximum size of a matrix for this API is **700** (the number of origins multiplied by the number + * of destinations). With that constraint in mind, examples of possible matrix dimensions are: 50x10, + * 10x10, 28x25. 10x70 (it does not need to be square). + * + * + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * + * + * + * ``` + * POST + * https://atlas.microsoft.com/route/matrix/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * + * Here's a typical sequence of asynchronous operations: + * 1. Client sends a Route Matrix POST request to Azure Maps + * + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Route Matrix request has been accepted. + * + * > HTTP `Error` - There was an error processing your Route Matrix request. This could either be a + * 400 Bad Request or any other Error status code. + * + * + * 3. If the Matrix Route request was accepted successfully, the Location header in the response + * contains the URL to download the results of the request. This status URI looks like the following: + * + * ``` + * GET + * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} + * ``` + * + * + * 4. Client issues a GET request on the download URL obtained in Step 3 to download the results + * + * ### Download Sync Results + * When you make a POST request for Route Matrix Sync API, the service returns 200 response code for + * successful request and a response array. The response body will contain the data and there will be + * no possibility to retrieve the results later. + * + * ### Download Async Results + * When a request issues a `202 Accepted` response, the request is being processed using our async + * pipeline. You will be given a URL to check the progress of your async request in the location + * header of the response. This status URI looks like the following: + * ``` + * GET + * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} + * ``` + * + * The URL provided by the location header will return the following responses when a `GET` request is + * issued. + * + * > HTTP `202 Accepted` - Matrix request was accepted but is still being processed. Please try again + * in some time. + * + * > HTTP `200 OK` - Matrix request successfully processed. The response body contains all of the + * results. + * @param format Desired format of the response. Only `json` format is supported. + * @param postRouteMatrixRequestBody The matrix of origin and destination coordinates to compute the + * route distance, travel time and other summary for each cell of the matrix based on the input + * parameters. The minimum and the maximum cell count supported are 1 and **700** for async and **100** + * for sync respectively. For example, it can be 35 origins and 20 destinations or 25 origins and 25 + * destinations for async API. + * @param options The options parameters. + */ + beginPostRouteMatrix( + format: ResponseFormat, + postRouteMatrixRequestBody: PostRouteMatrixRequestBody, + options?: RoutePostRouteMatrixOptionalParams + ): Promise< + PollerLike< + PollOperationState, + RoutePostRouteMatrixResponse + > + >; + /** + * + * **Applies to**: S1 pricing tier. + * + * The Matrix Routing service allows calculation of a matrix of route summaries for a set of routes + * defined by origin and destination locations by using an asynchronous (async) or synchronous (sync) + * POST request. For every given origin, the service calculates the cost of routing from that origin to + * every given destination. The set of origins and the set of destinations can be thought of as the + * column and row headers of a table and each cell in the table contains the costs of routing from the + * origin to the destination for that cell. As an example, let's say a food delivery company has 20 + * drivers and they need to find the closest driver to pick up the delivery from the restaurant. To + * solve this use case, they can call Matrix Route API. + * + * + * For each route, the travel times and distances are returned. You can use the computed costs to + * determine which detailed routes to calculate using the Route Directions API. + * + * + * The maximum size of a matrix for async request is **700** and for sync request it's **100** (the + * number of origins multiplied by the number of destinations). + * + * + * + * ### Submit Synchronous Route Matrix Request + * If your scenario requires synchronous requests and the maximum size of the matrix is less than or + * equal to 100, you might want to make synchronous request. The maximum size of a matrix for this API + * is **100** (the number of origins multiplied by the number of destinations). With that constraint in + * mind, examples of possible matrix dimensions are: 10x10, 6x8, 9x8 (it does not need to be square). + * + * ``` + * POST + * https://atlas.microsoft.com/route/matrix/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * + * ### Submit Asynchronous Route Matrix Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex routing + * requests. When you make a request by using async request, by default the service returns a 202 + * response code along a redirect URL in the Location field of the response header. This URL should be + * checked periodically until the response data or error information is available. If `waitForResults` + * parameter in the request is set to true, user will get a 200 response if the request is finished + * under 120 seconds. + * + * + * The maximum size of a matrix for this API is **700** (the number of origins multiplied by the number + * of destinations). With that constraint in mind, examples of possible matrix dimensions are: 50x10, + * 10x10, 28x25. 10x70 (it does not need to be square). + * + * + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * + * + * + * ``` + * POST + * https://atlas.microsoft.com/route/matrix/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * + * Here's a typical sequence of asynchronous operations: + * 1. Client sends a Route Matrix POST request to Azure Maps + * + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Route Matrix request has been accepted. + * + * > HTTP `Error` - There was an error processing your Route Matrix request. This could either be a + * 400 Bad Request or any other Error status code. + * + * + * 3. If the Matrix Route request was accepted successfully, the Location header in the response + * contains the URL to download the results of the request. This status URI looks like the following: + * + * ``` + * GET + * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} + * ``` + * + * + * 4. Client issues a GET request on the download URL obtained in Step 3 to download the results + * + * ### Download Sync Results + * When you make a POST request for Route Matrix Sync API, the service returns 200 response code for + * successful request and a response array. The response body will contain the data and there will be + * no possibility to retrieve the results later. + * + * ### Download Async Results + * When a request issues a `202 Accepted` response, the request is being processed using our async + * pipeline. You will be given a URL to check the progress of your async request in the location + * header of the response. This status URI looks like the following: + * ``` + * GET + * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} + * ``` + * + * The URL provided by the location header will return the following responses when a `GET` request is + * issued. + * + * > HTTP `202 Accepted` - Matrix request was accepted but is still being processed. Please try again + * in some time. + * + * > HTTP `200 OK` - Matrix request successfully processed. The response body contains all of the + * results. + * @param format Desired format of the response. Only `json` format is supported. + * @param postRouteMatrixRequestBody The matrix of origin and destination coordinates to compute the + * route distance, travel time and other summary for each cell of the matrix based on the input + * parameters. The minimum and the maximum cell count supported are 1 and **700** for async and **100** + * for sync respectively. For example, it can be 35 origins and 20 destinations or 25 origins and 25 + * destinations for async API. + * @param options The options parameters. + */ + beginPostRouteMatrixAndWait( + format: ResponseFormat, + postRouteMatrixRequestBody: PostRouteMatrixRequestBody, + options?: RoutePostRouteMatrixOptionalParams + ): Promise; + /** + * + * **Applies to**: S1 pricing tier. + * + * The Matrix Routing service allows calculation of a matrix of route summaries for a set of routes + * defined by origin and destination locations by using an asynchronous (async) or synchronous (sync) + * POST request. For every given origin, the service calculates the cost of routing from that origin to + * every given destination. The set of origins and the set of destinations can be thought of as the + * column and row headers of a table and each cell in the table contains the costs of routing from the + * origin to the destination for that cell. As an example, let's say a food delivery company has 20 + * drivers and they need to find the closest driver to pick up the delivery from the restaurant. To + * solve this use case, they can call Matrix Route API. + * + * + * For each route, the travel times and distances are returned. You can use the computed costs to + * determine which detailed routes to calculate using the Route Directions API. + * + * + * The maximum size of a matrix for async request is **700** and for sync request it's **100** (the + * number of origins multiplied by the number of destinations). + * + * + * + * ### Submit Synchronous Route Matrix Request + * If your scenario requires synchronous requests and the maximum size of the matrix is less than or + * equal to 100, you might want to make synchronous request. The maximum size of a matrix for this API + * is **100** (the number of origins multiplied by the number of destinations). With that constraint in + * mind, examples of possible matrix dimensions are: 10x10, 6x8, 9x8 (it does not need to be square). + * + * ``` + * POST + * https://atlas.microsoft.com/route/matrix/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * + * ### Submit Asynchronous Route Matrix Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex routing + * requests. When you make a request by using async request, by default the service returns a 202 + * response code along a redirect URL in the Location field of the response header. This URL should be + * checked periodically until the response data or error information is available. If `waitForResults` + * parameter in the request is set to true, user will get a 200 response if the request is finished + * under 120 seconds. + * + * + * The maximum size of a matrix for this API is **700** (the number of origins multiplied by the number + * of destinations). With that constraint in mind, examples of possible matrix dimensions are: 50x10, + * 10x10, 28x25. 10x70 (it does not need to be square). + * + * + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * + * + * + * ``` + * POST + * https://atlas.microsoft.com/route/matrix/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * + * Here's a typical sequence of asynchronous operations: + * 1. Client sends a Route Matrix POST request to Azure Maps + * + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Route Matrix request has been accepted. + * + * > HTTP `Error` - There was an error processing your Route Matrix request. This could either be a + * 400 Bad Request or any other Error status code. + * + * + * 3. If the Matrix Route request was accepted successfully, the Location header in the response + * contains the URL to download the results of the request. This status URI looks like the following: + * + * ``` + * GET + * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} + * ``` + * + * + * 4. Client issues a GET request on the download URL obtained in Step 3 to download the results + * + * ### Download Sync Results + * When you make a POST request for Route Matrix Sync API, the service returns 200 response code for + * successful request and a response array. The response body will contain the data and there will be + * no possibility to retrieve the results later. + * + * ### Download Async Results + * When a request issues a `202 Accepted` response, the request is being processed using our async + * pipeline. You will be given a URL to check the progress of your async request in the location + * header of the response. This status URI looks like the following: + * ``` + * GET + * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} + * ``` + * + * The URL provided by the location header will return the following responses when a `GET` request is + * issued. + * + * > HTTP `202 Accepted` - Matrix request was accepted but is still being processed. Please try again + * in some time. + * + * > HTTP `200 OK` - Matrix request successfully processed. The response body contains all of the + * results. + * @param format Desired format of the response. Only `json` format is supported. + * @param postRouteMatrixRequestBody The matrix of origin and destination coordinates to compute the + * route distance, travel time and other summary for each cell of the matrix based on the input + * parameters. The minimum and the maximum cell count supported are 1 and **700** for async and **100** + * for sync respectively. For example, it can be 35 origins and 20 destinations or 25 origins and 25 + * destinations for async API. + * @param options The options parameters. + */ + postRouteMatrixSync( + format: ResponseFormat, + postRouteMatrixRequestBody: PostRouteMatrixRequestBody, + options?: RoutePostRouteMatrixSyncOptionalParams + ): Promise; + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Returns a route between an origin and a destination, passing through waypoints if they are + * specified. The route will take into account factors such as current traffic and the typical road + * speeds on the requested day of the week and time of day. + * + * Information returned includes the distance, estimated travel time, and a representation of the route + * geometry. Additional routing information such as optimized waypoint order or turn by turn + * instructions is also available, depending on the options selected. + * + * Routing service provides a set of parameters for a detailed description of vehicle-specific + * Consumption Model. Please check [Consumption + * Model](https://docs.microsoft.com/azure/azure-maps/consumption-model) for detailed explanation of + * the concepts and parameters involved. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The Coordinates through which the route is calculated, delimited by a colon. A minimum + * of two coordinates is required. The first one is the origin and the last is the destination of the + * route. Optional coordinates in-between act as WayPoints in the route. You can pass up to 150 + * WayPoints. + * @param options The options parameters. + */ + getRouteDirections( + format: TextFormat, + query: string, + options?: RouteGetRouteDirectionsOptionalParams + ): Promise; + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Returns a route between an origin and a destination, passing through waypoints if they are + * specified. The route will take into account factors such as current traffic and the typical road + * speeds on the requested day of the week and time of day. + * + * Information returned includes the distance, estimated travel time, and a representation of the route + * geometry. Additional routing information such as optimized waypoint order or turn by turn + * instructions is also available, depending on the options selected. + * + * Routing service provides a set of parameters for a detailed description of a vehicle-specific + * Consumption Model. Please check [Consumption + * Model](https://docs.microsoft.com/azure/azure-maps/consumption-model) for detailed explanation of + * the concepts and parameters involved. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The Coordinates through which the route is calculated. Needs two coordinates at least. + * Delimited by colon. First one is the origin and the last is the destination of the route. The + * coordinates are in a lat,long format. Optional coordinates in between act as WayPoints in the + * route. + * @param postRouteDirectionsRequestBody Used for reconstructing a route and for calculating zero or + * more alternative routes to this reference route. The provided sequence of coordinates is used as + * input for route reconstruction. The alternative routes are calculated between the origin and + * destination points specified in the base path parameter locations. If both minDeviationDistance and + * minDeviationTime are set to zero, then these origin and destination points are expected to be at + * (or very near) the beginning and end of the reference route, respectively. Intermediate locations + * (waypoints) are not supported when using supportingPoints. + * + * Setting at least one of minDeviationDistance or minDeviationTime to a value greater than zero has + * the following consequences: + * + * * The origin point of the calculateRoute request must be on (or very near) the input reference + * route. If this is not the case, an error is returned. However, the origin point does not need to be + * at the beginning of the input reference route (it can be thought of as the current vehicle position + * on the reference route). + * * The reference route, returned as the first route in the calculateRoute response, will start at + * the origin point specified in the calculateRoute request. The initial part of the input reference + * route up until the origin point will be excluded from the response. + * * The values of minDeviationDistance and minDeviationTime determine how far alternative routes will + * be guaranteed to follow the reference route from the origin point onwards. + * * The route must use departAt. + * * The vehicleHeading is ignored. + * @param options The options parameters. + */ + postRouteDirections( + format: TextFormat, + query: string, + postRouteDirectionsRequestBody: PostRouteDirectionsRequestBody, + options?: RoutePostRouteDirectionsOptionalParams + ): Promise; + /** + * __Route Range (Isochrone) API__ + * + * + * **Applies to**: S1 pricing tier. + * + * This service will calculate a set of locations that can be reached from the origin point based on + * fuel, energy, time or distance budget that is specified. A polygon boundary (or Isochrone) is + * returned in a counterclockwise orientation as well as the precise polygon center which was the + * result of the origin point. + * + * The returned polygon can be used for further processing such as [Search Inside + * Geometry](https://docs.microsoft.com/rest/api/maps/search/postsearchinsidegeometry) to search for + * POIs within the provided Isochrone. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The Coordinate from which the range calculation should start. + * @param options The options parameters. + */ + getRouteRange( + format: TextFormat, + query: string, + options?: RouteGetRouteRangeOptionalParams + ): Promise; + /** + * **Route Directions Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Route Directions Batch API sends batches of queries to [Route Directions + * API](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections) using just a single + * API call. You can call Route Directions Batch API to run either asynchronously (async) or + * synchronously (sync). The async API allows caller to batch up to **700** queries and sync API up to + * **100** queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/route/directions/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex route requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **700** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Route Directions Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` GET https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0 ``` + * Note:- Please remember to add AUTH information (subscription-key/azure_auth - See + * [Security](#security)) to the _status URI_ before running it.
+ * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _route directions_ queries you will use a `POST` request where the request body will + * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 3 _route directions_ queries: + * + * + * ```json + * { + * "batchItems": [ + * { "query": + * "?query=47.620659,-122.348934:47.610101,-122.342015&travelMode=bicycle&routeType=eco&traffic=false" + * }, + * { "query": + * "?query=40.759856,-73.985108:40.771136,-73.973506&travelMode=pedestrian&routeType=shortest" }, + * { "query": "?query=48.923159,-122.557362:32.621279,-116.840362" } + * ] + * } + * ``` + * + * A _route directions_ query in a batch is just a partial URL _without_ the protocol, base URL, path, + * api-version and subscription-key. It can accept any of the supported _route directions_ [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#uri-parameters). + * The string values in the _route directions_ query must be properly escaped (e.g. " character should + * be escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **700** queries and sync API up to **100** queries, and + * the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`RouteDirectionsResponse`](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#routedirectionsresponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 1 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 1, + * "totalRequests": 2 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": { + * "routes": [ + * { + * "summary": { + * "lengthInMeters": 1758, + * "travelTimeInSeconds": 387, + * "trafficDelayInSeconds": 0, + * "departureTime": "2018-07-17T00:49:56+00:00", + * "arrivalTime": "2018-07-17T00:56:22+00:00" + * }, + * "legs": [ + * { + * "summary": { + * "lengthInMeters": 1758, + * "travelTimeInSeconds": 387, + * "trafficDelayInSeconds": 0, + * "departureTime": "2018-07-17T00:49:56+00:00", + * "arrivalTime": "2018-07-17T00:56:22+00:00" + * }, + * "points": [ + * { + * "latitude": 47.62094, + * "longitude": -122.34892 + * }, + * { + * "latitude": 47.62094, + * "longitude": -122.3485 + * }, + * { + * "latitude": 47.62095, + * "longitude": -122.3476 + * } + * ] + * } + * ], + * "sections": [ + * { + * "startPointIndex": 0, + * "endPointIndex": 40, + * "sectionType": "TRAVEL_MODE", + * "travelMode": "bicycle" + * } + * ] + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param postRouteDirectionsBatchRequestBody The list of route directions queries/requests to process. + * The list can contain a max of 700 queries for async and 100 queries for sync version and must + * contain at least 1 query. + * @param options The options parameters. + */ + beginPostRouteDirectionsBatch( + format: ResponseFormat, + postRouteDirectionsBatchRequestBody: BatchRequestBody, + options?: RoutePostRouteDirectionsBatchOptionalParams + ): Promise< + PollerLike< + PollOperationState, + RoutePostRouteDirectionsBatchResponse + > + >; + /** + * **Route Directions Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Route Directions Batch API sends batches of queries to [Route Directions + * API](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections) using just a single + * API call. You can call Route Directions Batch API to run either asynchronously (async) or + * synchronously (sync). The async API allows caller to batch up to **700** queries and sync API up to + * **100** queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/route/directions/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex route requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **700** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Route Directions Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` GET https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0 ``` + * Note:- Please remember to add AUTH information (subscription-key/azure_auth - See + * [Security](#security)) to the _status URI_ before running it.
+ * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _route directions_ queries you will use a `POST` request where the request body will + * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 3 _route directions_ queries: + * + * + * ```json + * { + * "batchItems": [ + * { "query": + * "?query=47.620659,-122.348934:47.610101,-122.342015&travelMode=bicycle&routeType=eco&traffic=false" + * }, + * { "query": + * "?query=40.759856,-73.985108:40.771136,-73.973506&travelMode=pedestrian&routeType=shortest" }, + * { "query": "?query=48.923159,-122.557362:32.621279,-116.840362" } + * ] + * } + * ``` + * + * A _route directions_ query in a batch is just a partial URL _without_ the protocol, base URL, path, + * api-version and subscription-key. It can accept any of the supported _route directions_ [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#uri-parameters). + * The string values in the _route directions_ query must be properly escaped (e.g. " character should + * be escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **700** queries and sync API up to **100** queries, and + * the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`RouteDirectionsResponse`](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#routedirectionsresponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 1 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 1, + * "totalRequests": 2 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": { + * "routes": [ + * { + * "summary": { + * "lengthInMeters": 1758, + * "travelTimeInSeconds": 387, + * "trafficDelayInSeconds": 0, + * "departureTime": "2018-07-17T00:49:56+00:00", + * "arrivalTime": "2018-07-17T00:56:22+00:00" + * }, + * "legs": [ + * { + * "summary": { + * "lengthInMeters": 1758, + * "travelTimeInSeconds": 387, + * "trafficDelayInSeconds": 0, + * "departureTime": "2018-07-17T00:49:56+00:00", + * "arrivalTime": "2018-07-17T00:56:22+00:00" + * }, + * "points": [ + * { + * "latitude": 47.62094, + * "longitude": -122.34892 + * }, + * { + * "latitude": 47.62094, + * "longitude": -122.3485 + * }, + * { + * "latitude": 47.62095, + * "longitude": -122.3476 + * } + * ] + * } + * ], + * "sections": [ + * { + * "startPointIndex": 0, + * "endPointIndex": 40, + * "sectionType": "TRAVEL_MODE", + * "travelMode": "bicycle" + * } + * ] + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param postRouteDirectionsBatchRequestBody The list of route directions queries/requests to process. + * The list can contain a max of 700 queries for async and 100 queries for sync version and must + * contain at least 1 query. + * @param options The options parameters. + */ + beginPostRouteDirectionsBatchAndWait( + format: ResponseFormat, + postRouteDirectionsBatchRequestBody: BatchRequestBody, + options?: RoutePostRouteDirectionsBatchOptionalParams + ): Promise; + /** + * **Route Directions Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Route Directions Batch API sends batches of queries to [Route Directions + * API](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections) using just a single + * API call. You can call Route Directions Batch API to run either asynchronously (async) or + * synchronously (sync). The async API allows caller to batch up to **700** queries and sync API up to + * **100** queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/route/directions/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex route requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **700** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Route Directions Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` GET https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0 ``` + * Note:- Please remember to add AUTH information (subscription-key/azure_auth - See + * [Security](#security)) to the _status URI_ before running it.
+ * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _route directions_ queries you will use a `POST` request where the request body will + * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 3 _route directions_ queries: + * + * + * ```json + * { + * "batchItems": [ + * { "query": + * "?query=47.620659,-122.348934:47.610101,-122.342015&travelMode=bicycle&routeType=eco&traffic=false" + * }, + * { "query": + * "?query=40.759856,-73.985108:40.771136,-73.973506&travelMode=pedestrian&routeType=shortest" }, + * { "query": "?query=48.923159,-122.557362:32.621279,-116.840362" } + * ] + * } + * ``` + * + * A _route directions_ query in a batch is just a partial URL _without_ the protocol, base URL, path, + * api-version and subscription-key. It can accept any of the supported _route directions_ [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#uri-parameters). + * The string values in the _route directions_ query must be properly escaped (e.g. " character should + * be escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **700** queries and sync API up to **100** queries, and + * the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`RouteDirectionsResponse`](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#routedirectionsresponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 1 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 1, + * "totalRequests": 2 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": { + * "routes": [ + * { + * "summary": { + * "lengthInMeters": 1758, + * "travelTimeInSeconds": 387, + * "trafficDelayInSeconds": 0, + * "departureTime": "2018-07-17T00:49:56+00:00", + * "arrivalTime": "2018-07-17T00:56:22+00:00" + * }, + * "legs": [ + * { + * "summary": { + * "lengthInMeters": 1758, + * "travelTimeInSeconds": 387, + * "trafficDelayInSeconds": 0, + * "departureTime": "2018-07-17T00:49:56+00:00", + * "arrivalTime": "2018-07-17T00:56:22+00:00" + * }, + * "points": [ + * { + * "latitude": 47.62094, + * "longitude": -122.34892 + * }, + * { + * "latitude": 47.62094, + * "longitude": -122.3485 + * }, + * { + * "latitude": 47.62095, + * "longitude": -122.3476 + * } + * ] + * } + * ], + * "sections": [ + * { + * "startPointIndex": 0, + * "endPointIndex": 40, + * "sectionType": "TRAVEL_MODE", + * "travelMode": "bicycle" + * } + * ] + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param postRouteDirectionsBatchRequestBody The list of route directions queries/requests to process. + * The list can contain a max of 700 queries for async and 100 queries for sync version and must + * contain at least 1 query. + * @param options The options parameters. + */ + postRouteDirectionsBatchSync( + format: ResponseFormat, + postRouteDirectionsBatchRequestBody: BatchRequestBody, + options?: RoutePostRouteDirectionsBatchSyncOptionalParams + ): Promise; +} diff --git a/sdk/maps/maps-route/src/routeClient.ts b/sdk/maps/maps-route/src/routeClient.ts new file mode 100644 index 000000000000..0df8eb7bd22e --- /dev/null +++ b/sdk/maps/maps-route/src/routeClient.ts @@ -0,0 +1,30 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreAuth from "@azure/core-auth"; +import { RouteImpl } from "./operations"; +import { Route } from "./operationsInterfaces"; +import { RouteClientContext } from "./routeClientContext"; +import { RouteClientOptionalParams } from "./models"; + +export class RouteClient extends RouteClientContext { + /** + * Initializes a new instance of the RouteClient class. + * @param credentials Subscription credentials which uniquely identify client subscription. + * @param options The parameter options + */ + constructor( + credentials: coreAuth.TokenCredential, + options?: RouteClientOptionalParams + ) { + super(credentials, options); + this.route = new RouteImpl(this); + } + + route: Route; +} diff --git a/sdk/maps/maps-route/src/routeClientContext.ts b/sdk/maps/maps-route/src/routeClientContext.ts new file mode 100644 index 000000000000..399437f978eb --- /dev/null +++ b/sdk/maps/maps-route/src/routeClientContext.ts @@ -0,0 +1,63 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; +import * as coreAuth from "@azure/core-auth"; +import { Geography, RouteClientOptionalParams } from "./models"; + +export class RouteClientContext extends coreClient.ServiceClient { + geography: Geography; + xMsClientId?: string; + apiVersion: string; + + /** + * Initializes a new instance of the RouteClientContext class. + * @param credentials Subscription credentials which uniquely identify client subscription. + * @param options The parameter options + */ + constructor( + credentials: coreAuth.TokenCredential, + options?: RouteClientOptionalParams + ) { + if (credentials === undefined) { + throw new Error("'credentials' cannot be null"); + } + + // Initializing default values for options + if (!options) { + options = {}; + } + const defaults: RouteClientOptionalParams = { + requestContentType: "application/json; charset=utf-8", + credential: credentials + }; + + const packageDetails = `azsdk-js-maps-route/1.0.0-beta.1`; + const userAgentPrefix = + options.userAgentOptions && options.userAgentOptions.userAgentPrefix + ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` + : `${packageDetails}`; + + if (!options.credentialScopes) { + options.credentialScopes = ["https://atlas.microsoft.com/.default"]; + } + const optionsWithDefaults = { + ...defaults, + ...options, + userAgentOptions: { + userAgentPrefix + }, + baseUri: options.endpoint || "https://{geography}.atlas.microsoft.com" + }; + super(optionsWithDefaults); + + // Assigning values to Constant parameters + this.geography = options.geography || "us"; + this.apiVersion = options.apiVersion || "1.0"; + } +} diff --git a/sdk/maps/maps-route/tsconfig.json b/sdk/maps/maps-route/tsconfig.json new file mode 100644 index 000000000000..0ec8659c8e83 --- /dev/null +++ b/sdk/maps/maps-route/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "module": "es6", + "moduleResolution": "node", + "strict": true, + "target": "es6", + "sourceMap": true, + "declarationMap": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "preserveConstEnums": true, + "lib": ["es6", "dom"], + "declaration": true, + "outDir": "./esm", + "importHelpers": true + }, + "include": ["./src/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/sdk/maps/maps-search/LICENSE.txt b/sdk/maps/maps-search/LICENSE.txt new file mode 100644 index 000000000000..ccb63b166732 --- /dev/null +++ b/sdk/maps/maps-search/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2021 Microsoft + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/sdk/maps/maps-search/README.md b/sdk/maps/maps-search/README.md new file mode 100644 index 000000000000..00ee1e5fc6ea --- /dev/null +++ b/sdk/maps/maps-search/README.md @@ -0,0 +1,91 @@ +# Azure Search client library for JavaScript + +This package contains an isomorphic SDK (runs both in Node.js and in browsers) for Azure Search client. + +Azure Maps Search REST APIs + +[Source code](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-search) | +[Package (NPM)](https://www.npmjs.com/package/@azure/maps-search) | +[API reference documentation](https://docs.microsoft.com/javascript/api/@azure/maps-search) | +[Samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-search/samples) + +## Getting started + +### Currently supported environments + +- [LTS versions of Node.js](https://nodejs.org/about/releases/) +- Latest versions of Safari, Chrome, Edge and Firefox. + +### Prerequisites + +- An [Azure subscription][azure_sub]. + +### Install the `@azure/maps-search` package + +Install the Azure Search client library for JavaScript with `npm`: + +```bash +npm install @azure/maps-search +``` + +### Create and authenticate a `SearchClient` + +To create a client object to access the Azure Search API, you will need the `endpoint` of your Azure Search resource and a `credential`. The Azure Search client can use Azure Active Directory credentials to authenticate. +You can find the endpoint for your Azure Search resource in the [Azure Portal][azure_portal]. + +#### Using an Azure Active Directory Credential + +You can authenticate with Azure Active Directory using the [Azure Identity library][azure_identity]. To use the [DefaultAzureCredential][defaultazurecredential] provider shown below, or other credential providers provided with the Azure SDK, please install the `@azure/identity` package: + +```bash +npm install @azure/identity +``` + +You will also need to register a new AAD application and grant access to Azure Search by assigning the suitable role to your service principal (note: roles such as `"Owner"` will not grant the necessary permissions). +Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`. + +```javascript +const { SearchClient } = require("@azure/maps-search"); +const { DefaultAzureCredential } = require("@azure/identity"); +const client = new SearchClient("", new DefaultAzureCredential()); +``` + +## Key concepts + +### SearchClient + +`SearchClient` is the primary interface for developers using the Azure Search client library. Explore the methods on this client object to understand the different features of the Azure Search service that you can access. + +## Troubleshooting + +### Logging + +Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: + +```javascript +import { setLogLevel } from "@azure/logger"; +setLogLevel("info"); +``` + +For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger). + +## Next steps + +Please take a look at the [samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-search/samples) directory for detailed examples on how to use this library. + +## Contributing + +If you'd like to contribute to this library, please read the [contributing guide](https://github.com/Azure/azure-sdk-for-js/blob/master/CONTRIBUTING.md) to learn more about how to build and test the code. + +## Related projects + +- [Microsoft Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) + +![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fmaps%2Fmaps-search%2FREADME.png) + +[azure_cli]: https://docs.microsoft.com/cli/azure +[azure_sub]: https://azure.microsoft.com/free/ +[azure_sub]: https://azure.microsoft.com/free/ +[azure_portal]: https://portal.azure.com +[azure_identity]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity +[defaultazurecredential]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity#defaultazurecredential diff --git a/sdk/maps/maps-search/api-extractor.json b/sdk/maps/maps-search/api-extractor.json new file mode 100644 index 000000000000..5fb5b21b56f2 --- /dev/null +++ b/sdk/maps/maps-search/api-extractor.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "mainEntryPointFilePath": "./esm/index.d.ts", + "docModel": { "enabled": true }, + "apiReport": { "enabled": true, "reportFolder": "./review" }, + "dtsRollup": { + "enabled": true, + "untrimmedFilePath": "", + "publicTrimmedFilePath": "./esm/index.d.ts" + }, + "messages": { + "tsdocMessageReporting": { "default": { "logLevel": "none" } }, + "extractorMessageReporting": { + "ae-missing-release-tag": { "logLevel": "none" }, + "ae-unresolved-link": { "logLevel": "none" } + } + } +} diff --git a/sdk/maps/maps-search/package.json b/sdk/maps/maps-search/package.json new file mode 100644 index 000000000000..c5bdc9fb4a47 --- /dev/null +++ b/sdk/maps/maps-search/package.json @@ -0,0 +1,86 @@ +{ + "name": "@azure/maps-search", + "sdk-type": "client", + "author": "Microsoft Corporation", + "description": "A generated SDK for SearchClient.", + "version": "1.0.0-beta.1", + "engines": { "node": ">=12.0.0" }, + "dependencies": { + "@azure/core-lro": "^1.0.6", + "@azure/abort-controller": "^1.0.0", + "@azure/core-client": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-rest-pipeline": "^1.1.0", + "tslib": "^2.2.0" + }, + "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], + "license": "MIT", + "main": "./dist/index.js", + "module": "./esm/index.js", + "types": "./esm/index.d.ts", + "devDependencies": { + "@microsoft/api-extractor": "7.7.11", + "@rollup/plugin-commonjs": "11.0.2", + "@rollup/plugin-json": "^4.0.0", + "@rollup/plugin-multi-entry": "^3.0.0", + "@rollup/plugin-node-resolve": "^8.0.0", + "mkdirp": "^1.0.4", + "rollup": "^1.16.3", + "rollup-plugin-sourcemaps": "^0.4.2", + "rollup-plugin-node-resolve": "^3.4.0", + "typescript": "~4.2.0", + "uglify-js": "^3.4.9" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js", + "repository": { + "type": "git", + "url": "https://github.com/Azure/azure-sdk-for-js.git" + }, + "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, + "files": [ + "dist/**/*.js", + "dist/**/*.js.map", + "dist/**/*.d.ts", + "dist/**/*.d.ts.map", + "esm/**/*.js", + "esm/**/*.js.map", + "esm/**/*.d.ts", + "esm/**/*.d.ts.map", + "src/**/*.ts", + "README.md", + "rollup.config.js", + "tsconfig.json", + "review/*", + "CHANGELOG.md" + ], + "scripts": { + "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", + "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js", + "prepack": "npm install && npm run build", + "pack": "npm pack 2>&1", + "extract-api": "mkdirp ./review && api-extractor run --local", + "lint": "echo skipped", + "audit": "echo skipped", + "clean": "echo skipped", + "build:node": "echo skipped", + "build:browser": "echo skipped", + "build:test": "echo skipped", + "build:samples": "echo skipped.", + "check-format": "echo skipped", + "execute:samples": "echo skipped", + "format": "echo skipped", + "test": "echo skipped", + "prebuild": "echo skipped", + "test:node": "echo skipped", + "test:browser": "echo skipped", + "unit-test": "echo skipped", + "unit-test:node": "echo skipped", + "unit-test:browser": "echo skipped", + "integration-test:browser": "echo skipped", + "integration-test:node": "echo skipped", + "integration-test": "echo skipped", + "docs": "echo skipped" + }, + "sideEffects": false, + "autoPublish": true +} diff --git a/sdk/maps/maps-search/review/maps-search.api.md b/sdk/maps/maps-search/review/maps-search.api.md new file mode 100644 index 000000000000..9a413fb69e21 --- /dev/null +++ b/sdk/maps/maps-search/review/maps-search.api.md @@ -0,0 +1,850 @@ +## API Report File for "@azure/maps-search" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import * as coreAuth from '@azure/core-auth'; +import * as coreClient from '@azure/core-client'; +import { PollerLike } from '@azure/core-lro'; +import { PollOperationState } from '@azure/core-lro'; + +// @public +export interface BatchItem { + readonly statusCode?: number; +} + +// @public +export interface BatchRequestBody { + batchItems?: BatchRequestBodyBatchItemsItem[]; +} + +// @public +export interface BatchRequestBodyBatchItemsItem { + query?: string; +} + +// @public +export interface BatchResponse { + readonly summary?: BatchResponseSummary; +} + +// @public +export interface BatchResponseSummary { + readonly successfulRequests?: number; + readonly totalRequests?: number; +} + +// @public +export type ConnectorSet = string; + +// @public +export interface CoordinatesPairAbbreviated { + lat?: number; + lon?: number; +} + +// @public +export interface DataSources { + geometry?: DataSourcesGeometry; +} + +// @public +export interface DataSourcesGeometry { + readonly id?: string; +} + +// @public +export type EntityType = string; + +// @public +export type EntryPointType = string; + +// @public +export interface ErrorAdditionalInfo { + readonly info?: Record; + readonly type?: string; +} + +// @public +export interface ErrorDetail { + readonly additionalInfo?: ErrorAdditionalInfo[]; + readonly code?: string; + readonly details?: ErrorDetail[]; + readonly message?: string; + readonly target?: string; +} + +// @public +export interface ErrorResponse { + error?: ErrorDetail; +} + +// @public +export type GeographicResourceLocation = string; + +// @public +export type Geography = string; + +// @public +export type GeoJsonFeature = GeoJsonObject & GeoJsonFeatureData & { + type: "Feature"; +}; + +// @public +export type GeoJsonFeatureCollection = GeoJsonObject & GeoJsonFeatureCollectionData & { + type: "FeatureCollection"; +}; + +// @public (undocumented) +export interface GeoJsonFeatureCollectionData { + features: GeoJsonFeature[]; +} + +// @public (undocumented) +export interface GeoJsonFeatureData { + featureType?: string; + geometry: GeoJsonGeometryUnion; + id?: string; + properties?: Record; +} + +// @public +export type GeoJsonGeometry = GeoJsonObject & { + type: "GeoJsonGeometry" | "LineString" | "Point" | "MultiPoint" | "MultiLineString" | "Polygon" | "MultiPolygon" | "GeometryCollection"; +}; + +// @public +export type GeoJsonGeometryCollection = GeoJsonGeometry & GeoJsonGeometryCollectionData & {}; + +// @public (undocumented) +export interface GeoJsonGeometryCollectionData { + geometries: GeoJsonGeometryUnion[]; +} + +// @public (undocumented) +export type GeoJsonGeometryUnion = GeoJsonGeometry | GeoJsonLineString | GeoJsonPoint | GeoJsonMultiPoint | GeoJsonMultiLineString | GeoJsonPolygon | GeoJsonMultiPolygon | GeoJsonGeometryCollection; + +// @public +export type GeoJsonLineString = GeoJsonGeometry & GeoJsonLineStringData & {}; + +// @public (undocumented) +export interface GeoJsonLineStringData { + coordinates: number[][]; +} + +// @public +export type GeoJsonMultiLineString = GeoJsonGeometry & GeoJsonMultiLineStringData & {}; + +// @public (undocumented) +export interface GeoJsonMultiLineStringData { + coordinates: number[][][]; +} + +// @public +export type GeoJsonMultiPoint = GeoJsonGeometry & GeoJsonMultiPointData & {}; + +// @public +export interface GeoJsonMultiPointData { + coordinates: number[][]; +} + +// @public +export type GeoJsonMultiPolygon = GeoJsonGeometry & GeoJsonMultiPolygonData & {}; + +// @public (undocumented) +export interface GeoJsonMultiPolygonData { + coordinates: number[][][][]; +} + +// @public +export interface GeoJsonObject { + type: "GeoJsonGeometry" | "LineString" | "Point" | "MultiPoint" | "MultiLineString" | "Polygon" | "MultiPolygon" | "GeometryCollection" | "Feature" | "FeatureCollection"; +} + +// @public +export type GeoJsonObjectType = string; + +// @public (undocumented) +export type GeoJsonObjectUnion = GeoJsonObject | GeoJsonGeometryUnion | GeoJsonFeature | GeoJsonFeatureCollection; + +// @public +export type GeoJsonPoint = GeoJsonGeometry & GeoJsonPointData & {}; + +// @public +export interface GeoJsonPointData { + coordinates: number[]; +} + +// @public +export type GeoJsonPolygon = GeoJsonGeometry & GeoJsonPolygonData & {}; + +// @public (undocumented) +export interface GeoJsonPolygonData { + coordinates: number[][][]; +} + +// @public +export const enum KnownConnectorSet { + Chademo = "Chademo", + IEC60309AC1PhaseBlue = "IEC60309AC1PhaseBlue", + IEC60309DCWhite = "IEC60309DCWhite", + IEC62196Type1 = "IEC62196Type1", + IEC62196Type1CCS = "IEC62196Type1CCS", + IEC62196Type2CableAttached = "IEC62196Type2CableAttached", + IEC62196Type2CCS = "IEC62196Type2CCS", + IEC62196Type2Outlet = "IEC62196Type2Outlet", + IEC62196Type3 = "IEC62196Type3", + StandardHouseholdCountrySpecific = "StandardHouseholdCountrySpecific", + Tesla = "Tesla" +} + +// @public +export const enum KnownEntityType { + Country = "Country", + CountrySecondarySubdivision = "CountrySecondarySubdivision", + CountrySubdivision = "CountrySubdivision", + CountryTertiarySubdivision = "CountryTertiarySubdivision", + Municipality = "Municipality", + MunicipalitySubdivision = "MunicipalitySubdivision", + Neighbourhood = "Neighbourhood", + PostalCodeArea = "PostalCodeArea" +} + +// @public +export const enum KnownEntryPointType { + // (undocumented) + Main = "main", + // (undocumented) + Minor = "minor" +} + +// @public +export const enum KnownGeographicResourceLocation { + Eu = "eu", + Us = "us" +} + +// @public +export const enum KnownGeography { + // (undocumented) + Eu = "eu", + // (undocumented) + Us = "us" +} + +// @public +export const enum KnownGeoJsonObjectType { + GeoJsonFeature = "Feature", + GeoJsonFeatureCollection = "FeatureCollection", + GeoJsonGeometryCollection = "GeometryCollection", + GeoJsonLineString = "LineString", + GeoJsonMultiLineString = "MultiLineString", + GeoJsonMultiPoint = "MultiPoint", + GeoJsonMultiPolygon = "MultiPolygon", + GeoJsonPoint = "Point", + GeoJsonPolygon = "Polygon" +} + +// @public +export const enum KnownOpeningHours { + NextSevenDays = "nextSevenDays" +} + +// @public +export const enum KnownResponseFormat { + Json = "json" +} + +// @public +export const enum KnownSearchIndexSet { + Addr = "Addr", + Geo = "Geo", + PAD = "PAD", + POI = "POI", + Str = "Str", + Xstr = "Xstr" +} + +// @public +export const enum KnownTextFormat { + Json = "json", + Xml = "xml" +} + +// @public +export type OpeningHours = string; + +// @public +export interface PoiCategoryResult { + readonly childCategoryIds?: number[]; + readonly id?: number; + readonly name?: string; + readonly synonyms?: string[]; +} + +// @public +export type ResponseFormat = string; + +// @public +export interface Search { + beginPostSearchAddressBatch(format: ResponseFormat, searchAddressBatchRequestBody: BatchRequestBody, options?: SearchPostSearchAddressBatchOptionalParams): Promise, SearchPostSearchAddressBatchResponse>>; + beginPostSearchAddressBatchAndWait(format: ResponseFormat, searchAddressBatchRequestBody: BatchRequestBody, options?: SearchPostSearchAddressBatchOptionalParams): Promise; + beginPostSearchAddressReverseBatch(format: ResponseFormat, searchAddressReverseBatchRequestBody: BatchRequestBody, options?: SearchPostSearchAddressReverseBatchOptionalParams): Promise, SearchPostSearchAddressReverseBatchResponse>>; + beginPostSearchAddressReverseBatchAndWait(format: ResponseFormat, searchAddressReverseBatchRequestBody: BatchRequestBody, options?: SearchPostSearchAddressReverseBatchOptionalParams): Promise; + beginPostSearchFuzzyBatch(format: ResponseFormat, searchFuzzyBatchRequestBody: BatchRequestBody, options?: SearchPostSearchFuzzyBatchOptionalParams): Promise, SearchPostSearchFuzzyBatchResponse>>; + beginPostSearchFuzzyBatchAndWait(format: ResponseFormat, searchFuzzyBatchRequestBody: BatchRequestBody, options?: SearchPostSearchFuzzyBatchOptionalParams): Promise; + getSearchAddress(format: TextFormat, query: string, options?: SearchGetSearchAddressOptionalParams): Promise; + getSearchAddressReverse(format: TextFormat, query: string, options?: SearchGetSearchAddressReverseOptionalParams): Promise; + getSearchAddressReverseCrossStreet(format: TextFormat, query: string, options?: SearchGetSearchAddressReverseCrossStreetOptionalParams): Promise; + getSearchAddressStructured(format: TextFormat, options?: SearchGetSearchAddressStructuredOptionalParams): Promise; + getSearchFuzzy(format: TextFormat, query: string, options?: SearchGetSearchFuzzyOptionalParams): Promise; + getSearchNearby(format: TextFormat, lat: number, lon: number, options?: SearchGetSearchNearbyOptionalParams): Promise; + getSearchPOI(format: TextFormat, query: string, options?: SearchGetSearchPOIOptionalParams): Promise; + getSearchPOICategory(format: TextFormat, query: string, options?: SearchGetSearchPOICategoryOptionalParams): Promise; + getSearchPOICategoryTreePreview(format: ResponseFormat, options?: SearchGetSearchPOICategoryTreePreviewOptionalParams): Promise; + getSearchPolygon(format: ResponseFormat, geometries: string[], options?: SearchGetSearchPolygonOptionalParams): Promise; + postSearchAddressBatchSync(format: ResponseFormat, searchAddressBatchRequestBody: BatchRequestBody, options?: SearchPostSearchAddressBatchSyncOptionalParams): Promise; + postSearchAddressReverseBatchSync(format: ResponseFormat, searchAddressReverseBatchRequestBody: BatchRequestBody, options?: SearchPostSearchAddressReverseBatchSyncOptionalParams): Promise; + postSearchAlongRoute(format: TextFormat, query: string, maxDetourTime: number, searchAlongRouteRequestBody: SearchAlongRouteRequestBody, options?: SearchPostSearchAlongRouteOptionalParams): Promise; + postSearchFuzzyBatchSync(format: ResponseFormat, searchFuzzyBatchRequestBody: BatchRequestBody, options?: SearchPostSearchFuzzyBatchSyncOptionalParams): Promise; + postSearchInsideGeometry(format: TextFormat, query: string, searchInsideGeometryRequestBody: SearchInsideGeometryRequestBody, options?: SearchPostSearchInsideGeometryOptionalParams): Promise; +} + +// @public +export type SearchAddressBatchItem = BatchItem & { + readonly response?: SearchAddressBatchItemResponse; +}; + +// @public +export type SearchAddressBatchItemResponse = SearchCommonResponse & ErrorResponse & {}; + +// @public +export type SearchAddressBatchResponse = BatchResponse & { + readonly batchItems?: SearchAddressBatchItem[]; +}; + +// @public +export type SearchAddressReverseBatchItem = BatchItem & { + readonly response?: SearchAddressReverseBatchItemResponse; +}; + +// @public +export type SearchAddressReverseBatchItemResponse = SearchAddressReverseResponse & ErrorResponse & {}; + +// @public +export type SearchAddressReverseBatchResponse = BatchResponse & { + readonly batchItems?: SearchAddressReverseBatchItem[]; +}; + +// @public +export interface SearchAddressReverseCrossStreetResponse { + readonly addresses?: SearchAddressReverseCrossStreetResult[]; + readonly summary?: SearchCommonSummary; +} + +// @public +export interface SearchAddressReverseCrossStreetResult { + readonly address?: SearchResultAddress; + readonly position?: string; +} + +// @public +export interface SearchAddressReverseResponse { + readonly addresses?: SearchAddressReverseResult[]; + readonly summary?: SearchCommonSummary; +} + +// @public +export interface SearchAddressReverseResult { + readonly address?: SearchResultAddress; + readonly matchType?: string; + readonly position?: string; +} + +// @public +export interface SearchAlongRouteRequestBody { + route?: GeoJsonLineString; +} + +// @public (undocumented) +export class SearchClient extends SearchClientContext { + constructor(credentials: coreAuth.TokenCredential, options?: SearchClientOptionalParams); + // (undocumented) + search: Search; +} + +// @public (undocumented) +export class SearchClientContext extends coreClient.ServiceClient { + constructor(credentials: coreAuth.TokenCredential, options?: SearchClientOptionalParams); + // (undocumented) + apiVersion: string; + // (undocumented) + geography: Geography; + // (undocumented) + xMsClientId?: string; +} + +// @public +export interface SearchClientOptionalParams extends coreClient.ServiceClientOptions { + apiVersion?: string; + endpoint?: string; + geography?: Geography; + xMsClientId?: string; +} + +// @public +export interface SearchCommonResponse { + readonly results?: SearchCommonResult[]; + readonly summary?: SearchCommonSummary; +} + +// @public +export interface SearchCommonResult { + readonly address?: SearchResultAddress; + readonly addressRanges?: SearchResultAddressRanges; + readonly dataSources?: DataSources; + readonly detourTime?: number; + readonly dist?: number; + entityType?: EntityType; + readonly entryPoints?: SearchResultEntryPoint[]; + readonly id?: string; + readonly info?: string; + readonly matchType?: string; + readonly poi?: SearchResultPoi; + position?: CoordinatesPairAbbreviated; + readonly score?: number; + readonly type?: string; + readonly viewport?: SearchResultViewport; +} + +// @public +export interface SearchCommonSummary { + readonly fuzzyLevel?: number; + readonly geoBias?: SearchCommonSummaryGeoBias; + readonly limit?: number; + readonly numResults?: number; + readonly offset?: number; + readonly query?: string; + readonly queryTime?: number; + readonly queryType?: string; + readonly totalResults?: number; +} + +// @public +export type SearchCommonSummaryGeoBias = CoordinatesPairAbbreviated & {}; + +// @public +export type SearchFuzzyBatchItem = BatchItem & { + readonly response?: SearchFuzzyBatchItemResponse; +}; + +// @public +export type SearchFuzzyBatchItemResponse = SearchCommonResponse & ErrorResponse & {}; + +// @public +export type SearchFuzzyBatchResponse = BatchResponse & { + readonly batchItems?: SearchFuzzyBatchItem[]; +}; + +// @public +export interface SearchGetSearchAddressOptionalParams extends coreClient.OperationOptions { + btmRight?: string; + countrySet?: string[]; + extendedPostalCodesFor?: string; + language?: string; + lat?: number; + limit?: number; + lon?: number; + ofs?: number; + radius?: number; + topLeft?: string; + typeahead?: boolean; + view?: string; +} + +// @public +export type SearchGetSearchAddressResponse = SearchCommonResponse; + +// @public +export interface SearchGetSearchAddressReverseCrossStreetOptionalParams extends coreClient.OperationOptions { + heading?: number; + language?: string; + limit?: number; + radius?: number; + view?: string; +} + +// @public +export type SearchGetSearchAddressReverseCrossStreetResponse = SearchAddressReverseCrossStreetResponse; + +// @public +export interface SearchGetSearchAddressReverseOptionalParams extends coreClient.OperationOptions { + allowFreeformNewline?: boolean; + entityType?: EntityType; + heading?: number; + language?: string; + numberParam?: string; + radius?: number; + returnMatchType?: boolean; + returnRoadUse?: boolean; + returnSpeedLimit?: boolean; + roadUse?: string; + view?: string; +} + +// @public +export type SearchGetSearchAddressReverseResponse = SearchAddressReverseResponse; + +// @public +export interface SearchGetSearchAddressStructuredOptionalParams extends coreClient.OperationOptions { + countryCode?: string; + countrySecondarySubdivision?: string; + countrySubdivision?: string; + countryTertiarySubdivision?: string; + crossStreet?: string; + extendedPostalCodesFor?: string; + language?: string; + limit?: number; + municipality?: string; + municipalitySubdivision?: string; + ofs?: number; + postalCode?: string; + streetName?: string; + streetNumber?: string; + view?: string; +} + +// @public +export type SearchGetSearchAddressStructuredResponse = SearchCommonResponse; + +// @public +export interface SearchGetSearchFuzzyOptionalParams extends coreClient.OperationOptions { + brandSet?: string[]; + btmRight?: string; + categorySet?: number[]; + connectorSet?: ConnectorSet[]; + countrySet?: string[]; + extendedPostalCodesFor?: string; + idxSet?: SearchIndexSet[]; + language?: string; + lat?: number; + limit?: number; + lon?: number; + maxFuzzyLevel?: number; + minFuzzyLevel?: number; + ofs?: number; + openingHours?: OpeningHours; + radius?: number; + topLeft?: string; + typeahead?: boolean; + view?: string; +} + +// @public +export type SearchGetSearchFuzzyResponse = SearchCommonResponse; + +// @public +export interface SearchGetSearchNearbyOptionalParams extends coreClient.OperationOptions { + brandSet?: string[]; + categorySet?: number[]; + connectorSet?: ConnectorSet[]; + countrySet?: string[]; + extendedPostalCodesFor?: string; + language?: string; + limit?: number; + ofs?: number; + radius?: number; + view?: string; +} + +// @public +export type SearchGetSearchNearbyResponse = SearchCommonResponse; + +// @public +export interface SearchGetSearchPOICategoryOptionalParams extends coreClient.OperationOptions { + brandSet?: string[]; + btmRight?: string; + categorySet?: number[]; + connectorSet?: ConnectorSet[]; + countrySet?: string[]; + extendedPostalCodesFor?: string; + language?: string; + lat?: number; + limit?: number; + lon?: number; + ofs?: number; + openingHours?: OpeningHours; + radius?: number; + topLeft?: string; + typeahead?: boolean; + view?: string; +} + +// @public +export type SearchGetSearchPOICategoryResponse = SearchCommonResponse; + +// @public +export interface SearchGetSearchPOICategoryTreePreviewOptionalParams extends coreClient.OperationOptions { + language?: string; +} + +// @public +export type SearchGetSearchPOICategoryTreePreviewResponse = SearchPoiCategoryTreeResponse; + +// @public +export interface SearchGetSearchPOIOptionalParams extends coreClient.OperationOptions { + brandSet?: string[]; + btmRight?: string; + categorySet?: number[]; + connectorSet?: ConnectorSet[]; + countrySet?: string[]; + extendedPostalCodesFor?: string; + language?: string; + lat?: number; + limit?: number; + lon?: number; + ofs?: number; + openingHours?: OpeningHours; + radius?: number; + topLeft?: string; + typeahead?: boolean; + view?: string; +} + +// @public +export type SearchGetSearchPOIResponse = SearchCommonResponse; + +// @public +export interface SearchGetSearchPolygonOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type SearchGetSearchPolygonResponse = SearchPolygonResponse; + +// @public +export type SearchIndexSet = string; + +// @public +export interface SearchInsideGeometryRequestBody { + geometry?: Record; +} + +// @public +export interface SearchPoiCategoryTreeResponse { + readonly poiCategories?: PoiCategoryResult[]; +} + +// @public +export interface SearchPolygonResponse { + readonly additionalData?: SearchPolygonResult[]; +} + +// @public (undocumented) +export interface SearchPolygonResult { + readonly error?: string; + geometryData?: GeoJsonObjectUnion; + readonly providerID?: string; +} + +// @public +export interface SearchPostSearchAddressBatchHeaders { + location?: string; +} + +// @public +export interface SearchPostSearchAddressBatchOptionalParams extends coreClient.OperationOptions { + resumeFrom?: string; + updateIntervalInMs?: number; +} + +// @public +export type SearchPostSearchAddressBatchResponse = SearchAddressBatchResponse; + +// @public +export interface SearchPostSearchAddressBatchSyncOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type SearchPostSearchAddressBatchSyncResponse = SearchAddressBatchResponse; + +// @public +export interface SearchPostSearchAddressReverseBatchHeaders { + location?: string; +} + +// @public +export interface SearchPostSearchAddressReverseBatchOptionalParams extends coreClient.OperationOptions { + resumeFrom?: string; + updateIntervalInMs?: number; +} + +// @public +export type SearchPostSearchAddressReverseBatchResponse = SearchAddressReverseBatchResponse; + +// @public +export interface SearchPostSearchAddressReverseBatchSyncOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type SearchPostSearchAddressReverseBatchSyncResponse = SearchAddressReverseBatchResponse; + +// @public +export interface SearchPostSearchAlongRouteOptionalParams extends coreClient.OperationOptions { + brandSet?: string[]; + categorySet?: number[]; + connectorSet?: ConnectorSet[]; + limit?: number; + openingHours?: OpeningHours; + view?: string; +} + +// @public +export type SearchPostSearchAlongRouteResponse = SearchCommonResponse; + +// @public +export interface SearchPostSearchFuzzyBatchHeaders { + location?: string; +} + +// @public +export interface SearchPostSearchFuzzyBatchOptionalParams extends coreClient.OperationOptions { + resumeFrom?: string; + updateIntervalInMs?: number; +} + +// @public +export type SearchPostSearchFuzzyBatchResponse = SearchFuzzyBatchResponse; + +// @public +export interface SearchPostSearchFuzzyBatchSyncOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type SearchPostSearchFuzzyBatchSyncResponse = SearchFuzzyBatchResponse; + +// @public +export interface SearchPostSearchInsideGeometryOptionalParams extends coreClient.OperationOptions { + categorySet?: number[]; + extendedPostalCodesFor?: string; + idxSet?: SearchIndexSet[]; + language?: string; + limit?: number; + openingHours?: OpeningHours; + view?: string; +} + +// @public +export type SearchPostSearchInsideGeometryResponse = SearchCommonResponse; + +// @public +export interface SearchResultAddress { + readonly boundingBox?: Record; + readonly buildingNumber?: string; + readonly country?: string; + readonly countryCode?: string; + readonly countryCodeISO3?: string; + readonly countrySecondarySubdivision?: string; + readonly countrySubdivision?: string; + readonly countrySubdivisionName?: string; + readonly countryTertiarySubdivision?: string; + readonly crossStreet?: string; + readonly extendedPostalCode?: string; + readonly freeformAddress?: string; + readonly localName?: string; + readonly municipality?: string; + readonly municipalitySubdivision?: string; + readonly postalCode?: string; + readonly routeNumbers?: number[]; + readonly street?: string; + readonly streetName?: string; + readonly streetNameAndNumber?: string; + readonly streetNumber?: string; +} + +// @public +export interface SearchResultAddressRanges { + from?: CoordinatesPairAbbreviated; + rangeLeft?: string; + rangeRight?: string; + to?: CoordinatesPairAbbreviated; +} + +// @public +export interface SearchResultEntryPoint { + position?: CoordinatesPairAbbreviated; + readonly type?: EntryPointType; +} + +// @public +export interface SearchResultPoi { + readonly brands?: SearchResultPoiBrand[]; + readonly categories?: string[]; + readonly categorySet?: SearchResultPoiCategorySet[]; + readonly classifications?: SearchResultPoiClassification[]; + readonly name?: string; + openingHours?: SearchResultPoiOpeningHours; + readonly phone?: string; + readonly url?: string; +} + +// @public +export interface SearchResultPoiBrand { + readonly name?: string; +} + +// @public +export interface SearchResultPoiCategorySet { + readonly id?: number; +} + +// @public +export interface SearchResultPoiClassification { + readonly code?: string; + readonly names?: SearchResultPoiClassificationName[]; +} + +// @public +export interface SearchResultPoiClassificationName { + readonly name?: string; + readonly nameLocale?: string; +} + +// @public +export interface SearchResultPoiOpeningHours { + readonly mode?: string; + readonly timeRanges?: SearchResultPoiOpeningHoursTimeRange[]; +} + +// @public +export interface SearchResultPoiOpeningHoursTimeRange { + endTime?: SearchResultPoiOpeningHoursTimeRangeTime; + startTime?: SearchResultPoiOpeningHoursTimeRangeTime; +} + +// @public +export interface SearchResultPoiOpeningHoursTimeRangeTime { + readonly date?: string; + readonly hour?: number; + readonly minute?: number; +} + +// @public +export interface SearchResultViewport { + btmRightPoint?: CoordinatesPairAbbreviated; + topLeftPoint?: CoordinatesPairAbbreviated; +} + +// @public +export interface SearchSummaryGeoBias { + readonly lat?: number; + readonly lon?: number; +} + +// @public +export type TextFormat = string; + + +// (No @packageDocumentation comment for this package) + +``` diff --git a/sdk/maps/maps-search/rollup.config.js b/sdk/maps/maps-search/rollup.config.js new file mode 100644 index 000000000000..9be1955eb7f1 --- /dev/null +++ b/sdk/maps/maps-search/rollup.config.js @@ -0,0 +1,188 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import nodeResolve from "@rollup/plugin-node-resolve"; +import cjs from "@rollup/plugin-commonjs"; +import sourcemaps from "rollup-plugin-sourcemaps"; +import multiEntry from "@rollup/plugin-multi-entry"; +import json from "@rollup/plugin-json"; + +import nodeBuiltins from "builtin-modules"; + +/** + * Gets the proper configuration needed for rollup's commonJS plugin for @opentelemetry/api. + * + * NOTE: this manual configuration is only needed because OpenTelemetry uses an + * __exportStar downleveled helper function to declare its exports which confuses + * rollup's automatic discovery mechanism. + * + * @returns an object reference that can be `...`'d into your cjs() configuration. + */ +export function openTelemetryCommonJs() { + const namedExports = {}; + + for (const key of [ + "@opentelemetry/api", + "@azure/core-tracing/node_modules/@opentelemetry/api" + ]) { + namedExports[key] = [ + "SpanKind", + "TraceFlags", + "getSpan", + "setSpan", + "SpanStatusCode", + "getSpanContext", + "setSpanContext" + ]; + } + + const releasedOpenTelemetryVersions = ["0.10.2", "1.0.0-rc.0"]; + + for (const version of releasedOpenTelemetryVersions) { + namedExports[ + // working around a limitation in the rollup common.js plugin - it's not able to resolve these modules so the named exports listed above will not get applied. We have to drill down to the actual path. + `../../../common/temp/node_modules/.pnpm/@opentelemetry/api@${version}/node_modules/@opentelemetry/api/build/src/index.js` + ] = [ + "SpanKind", + "TraceFlags", + "getSpan", + "setSpan", + "StatusCode", + "CanonicalCode", + "getSpanContext", + "setSpanContext" + ]; + } + + return namedExports; +} + +// #region Warning Handler + +/** + * A function that can determine whether a rollupwarning should be ignored. If + * the function returns `true`, then the warning will not be displayed. + */ + +function ignoreNiseSinonEvalWarnings(warning) { + return ( + warning.code === "EVAL" && + warning.id && + (warning.id.includes("node_modules/nise") || + warning.id.includes("node_modules/sinon")) === true + ); +} + +function ignoreChaiCircularDependencyWarnings(warning) { + return ( + warning.code === "CIRCULAR_DEPENDENCY" && + warning.importer && warning.importer.includes("node_modules/chai") === true + ); +} + +const warningInhibitors = [ + ignoreChaiCircularDependencyWarnings, + ignoreNiseSinonEvalWarnings +]; + +/** + * Construct a warning handler for the shared rollup configuration + * that ignores certain warnings that are not relevant to testing. + */ +function makeOnWarnForTesting() { + return (warning, warn) => { + // If every inhibitor returns false (i.e. no inhibitors), then show the warning + if (warningInhibitors.every((inhib) => !inhib(warning))) { + warn(warning); + } + }; +} + +// #endregion + +function makeBrowserTestConfig() { + const config = { + input: { + include: ["dist-esm/test/**/*.spec.js"], + exclude: ["dist-esm/test/**/node/**"] + }, + output: { + file: `dist-test/index.browser.js`, + format: "umd", + sourcemap: true + }, + preserveSymlinks: false, + plugins: [ + multiEntry({ exports: false }), + nodeResolve({ + mainFields: ["module", "browser"] + }), + cjs({ + namedExports: { + // Chai's strange internal architecture makes it impossible to statically + // analyze its exports. + chai: [ + "version", + "use", + "util", + "config", + "expect", + "should", + "assert" + ], + ...openTelemetryCommonJs() + } + }), + json(), + sourcemaps() + //viz({ filename: "dist-test/browser-stats.html", sourcemap: true }) + ], + onwarn: makeOnWarnForTesting(), + // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, + // rollup started respecting the "sideEffects" field in package.json. Since + // our package.json sets "sideEffects=false", this also applies to test + // code, which causes all tests to be removed by tree-shaking. + treeshake: false + }; + + return config; +} + +const defaultConfigurationOptions = { + disableBrowserBundle: false +}; + +export function makeConfig(pkg, options) { + options = { + ...defaultConfigurationOptions, + ...(options || {}) + }; + + const baseConfig = { + // Use the package's module field if it has one + input: pkg["module"] || "dist-esm/src/index.js", + external: [ + ...nodeBuiltins, + ...Object.keys(pkg.dependencies), + ...Object.keys(pkg.devDependencies) + ], + output: { file: "dist/index.js", format: "cjs", sourcemap: true }, + preserveSymlinks: false, + plugins: [sourcemaps(), nodeResolve(), cjs()] + }; + + const config = [baseConfig]; + + if (!options.disableBrowserBundle) { + config.push(makeBrowserTestConfig()); + } + + return config; +} + +export default makeConfig(require("./package.json")); diff --git a/sdk/maps/maps-search/samples/resources/search_address_batch_request_body.json b/sdk/maps/maps-search/samples/resources/search_address_batch_request_body.json new file mode 100644 index 000000000000..6bbbd5929635 --- /dev/null +++ b/sdk/maps/maps-search/samples/resources/search_address_batch_request_body.json @@ -0,0 +1,13 @@ +{ + "batchItems": [ + { + "query": "?query=400 Broad St, Seattle, WA 98109&limit=3" + }, + { + "query": "?query=One, Microsoft Way, Redmond, WA 98052&limit=3" + }, + { + "query": "?query=350 5th Ave, New York, NY 10118&limit=1" + } + ] +} \ No newline at end of file diff --git a/sdk/maps/maps-search/samples/resources/search_address_reverse_batch_request_body.json b/sdk/maps/maps-search/samples/resources/search_address_reverse_batch_request_body.json new file mode 100644 index 000000000000..020afeeb065b --- /dev/null +++ b/sdk/maps/maps-search/samples/resources/search_address_reverse_batch_request_body.json @@ -0,0 +1,13 @@ +{ + "batchItems": [ + { + "query": "?query=48.858561,2.294911" + }, + { + "query": "?query=47.639765,-122.127896&radius=5000&limit=2" + }, + { + "query": "?query=47.621028,-122.348170" + } + ] +} \ No newline at end of file diff --git a/sdk/maps/maps-search/samples/resources/search_along_route_request_body.json b/sdk/maps/maps-search/samples/resources/search_along_route_request_body.json new file mode 100644 index 000000000000..ecabbee8d138 --- /dev/null +++ b/sdk/maps/maps-search/samples/resources/search_along_route_request_body.json @@ -0,0 +1,23 @@ +{ + "route": { + "type": "LineString", + "coordinates": [ + [ + -122.143035, + 47.653536 + ], + [ + -122.187164, + 47.617556 + ], + [ + -122.114981, + 47.570599 + ], + [ + -122.132756, + 47.654009 + ] + ] + } +} \ No newline at end of file diff --git a/sdk/maps/maps-search/samples/resources/search_fuzzy_batch_request_body.json b/sdk/maps/maps-search/samples/resources/search_fuzzy_batch_request_body.json new file mode 100644 index 000000000000..61833b751d76 --- /dev/null +++ b/sdk/maps/maps-search/samples/resources/search_fuzzy_batch_request_body.json @@ -0,0 +1,13 @@ +{ + "batchItems": [ + { + "query": "?query=atm&lat=47.639769&lon=-122.128362&radius=5000&limit=5" + }, + { + "query": "?query=Statue Of Liberty&limit=2" + }, + { + "query": "?query=Starbucks&lat=47.639769&lon=-122.128362&radius=5000" + } + ] +} \ No newline at end of file diff --git a/sdk/maps/maps-search/samples/resources/search_inside_geometry_request_body.json b/sdk/maps/maps-search/samples/resources/search_inside_geometry_request_body.json new file mode 100644 index 000000000000..aa4bd70e0a16 --- /dev/null +++ b/sdk/maps/maps-search/samples/resources/search_inside_geometry_request_body.json @@ -0,0 +1,25 @@ +{ + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -122.43576049804686, + 37.7524152343544 + ], + [ + -122.43301391601562, + 37.70660472542312 + ], + [ + -122.36434936523438, + 37.712059855877314 + ], + [ + -122.43576049804686, + 37.7524152343544 + ] + ] + ] + } +} \ No newline at end of file diff --git a/sdk/maps/maps-search/samples/v1/javascript/README.md b/sdk/maps/maps-search/samples/v1/javascript/README.md new file mode 100644 index 000000000000..c14592fa778e --- /dev/null +++ b/sdk/maps/maps-search/samples/v1/javascript/README.md @@ -0,0 +1,54 @@ +--- +page_type: sample +languages: + - javascript +products: + - azure +urlFragment: maps-search-javascript +--- + +# Azure Maps Search client library samples for JavaScript + +These sample programs show how to use the JavaScript client libraries for Azure Maps Search in some common scenarios. + +| **File Name** | **Description** | +| ------------------- | --------------------------------------------------------------- | +| [search.js][search] | Operations useful for finding objects, locations and addresses. | + +## Prerequisites + +The sample programs are compatible with Node.js >=12.0.0. + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +3. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node search.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx cross-env MAPS_SUBSCRIPTION_KEY="" node search.js +``` + +[search]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-search/samples/v1/javascript/src/search.js +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-search/README.md diff --git a/sdk/maps/maps-search/samples/v1/javascript/elevation.js b/sdk/maps/maps-search/samples/v1/javascript/elevation.js new file mode 100644 index 000000000000..422587aca96f --- /dev/null +++ b/sdk/maps/maps-search/samples/v1/javascript/elevation.js @@ -0,0 +1,70 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Elevation API usage. Simple CRUD operations are performed. + */ + +const { DefaultAzureCredential } = require("@azure/identity"); +const { ElevationClient } = require("@azure/maps-elevation"); +require("dotenv").config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + const elevation = new ElevationClient(credential).elevation; + + console.log(" --- Get Data For Bounding Box:"); + console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); + + console.log(" --- Get Data For Points:"); + console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Get Data For Polyline:"); + console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Post Data For Points:"); + console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + + console.log(" --- Post Data For Polyline:"); + console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-search/samples/v1/javascript/package.json b/sdk/maps/maps-search/samples/v1/javascript/package.json new file mode 100644 index 000000000000..a36bd49b6ef0 --- /dev/null +++ b/sdk/maps/maps-search/samples/v1/javascript/package.json @@ -0,0 +1,28 @@ +{ + "name": "azure-maps-search-samples-js", + "private": true, + "version": "1.0.0", + "description": "Azure Maps Search client library samples for JavaScript", + "engine": { + "node": ">=12.0.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/maps/maps-search" + }, + "keywords": [ + "Azure", + "cloud" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-search", + "dependencies": { + "@azure/maps-search": "next", + "dotenv": "latest" + } +} diff --git a/sdk/maps/maps-search/samples/v1/javascript/sample.env b/sdk/maps/maps-search/samples/v1/javascript/sample.env new file mode 100644 index 000000000000..2259ae4da0ec --- /dev/null +++ b/sdk/maps/maps-search/samples/v1/javascript/sample.env @@ -0,0 +1,7 @@ +# Maps subscription key when using AzureKey authentication +MAPS_SUBSCRIPTION_KEY="" + +# Maps Azure AD authentication +AZURE_CLIENT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_TENANT_ID="" diff --git a/sdk/maps/maps-search/samples/v1/typescript/README.md b/sdk/maps/maps-search/samples/v1/typescript/README.md new file mode 100644 index 000000000000..3336c4971d01 --- /dev/null +++ b/sdk/maps/maps-search/samples/v1/typescript/README.md @@ -0,0 +1,67 @@ +--- +page_type: sample +languages: + - typescript +products: + - azure +urlFragment: maps-search-typescript +--- + +# Azure Maps Search client library samples for TypeScript + +These sample programs show how to use the TypeScript client libraries for Azure Maps Search in some common scenarios. + +| **File Name** | **Description** | +| ------------------- | --------------------------------------------------------------- | +| [search.ts][search] | Operations useful for finding objects, locations and addresses. | + +## Prerequisites + +The sample programs are compatible with Node.js >=12.0.0. + +Before running the samples in Node, they must be compiled to JavaScript using the TypeScript compiler. For more information on TypeScript, see the [TypeScript documentation][typescript]. Install the TypeScript compiler using: + +```bash +npm install -g typescript +``` + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Compile the samples: + +```bash +npm run build +``` + +3. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +4. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node dist/search.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx cross-env MAPS_SUBSCRIPTION_KEY="" node dist/search.js +``` + +[search]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-search/samples/v1/typescript/src/search.ts +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-search/README.md +[typescript]: https://www.typescriptlang.org/docs/home.html diff --git a/sdk/maps/maps-search/samples/v1/typescript/package.json b/sdk/maps/maps-search/samples/v1/typescript/package.json new file mode 100644 index 000000000000..d23625e29e5a --- /dev/null +++ b/sdk/maps/maps-search/samples/v1/typescript/package.json @@ -0,0 +1,36 @@ +{ + "name": "azure-maps-search-samples-ts", + "private": true, + "version": "1.0.0", + "description": "Azure Maps Search client library samples for TypeScript", + "engine": { + "node": ">=12.0.0" + }, + "scripts": { + "build": "tsc", + "prebuild": "rimraf dist/" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/maps/maps-search" + }, + "keywords": [ + "Azure", + "cloud" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-search", + "dependencies": { + "@azure/maps-search": "next", + "dotenv": "latest" + }, + "devDependencies": { + "typescript": "~4.2.0", + "rimraf": "latest" + } +} diff --git a/sdk/maps/maps-search/samples/v1/typescript/sample.env b/sdk/maps/maps-search/samples/v1/typescript/sample.env new file mode 100644 index 000000000000..2259ae4da0ec --- /dev/null +++ b/sdk/maps/maps-search/samples/v1/typescript/sample.env @@ -0,0 +1,7 @@ +# Maps subscription key when using AzureKey authentication +MAPS_SUBSCRIPTION_KEY="" + +# Maps Azure AD authentication +AZURE_CLIENT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_TENANT_ID="" diff --git a/sdk/maps/maps-search/samples/v1/typescript/src/elevation.ts b/sdk/maps/maps-search/samples/v1/typescript/src/elevation.ts new file mode 100644 index 000000000000..5e1f91bd6989 --- /dev/null +++ b/sdk/maps/maps-search/samples/v1/typescript/src/elevation.ts @@ -0,0 +1,76 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Elevation API usage. Simple queries are performed. + */ + +import { getDefaultAzureCredential } from "@azure/identity"; +import * as coreAuth from "@azure/core-auth"; +import * as coreClient from "@azure/core-client"; +import { ElevationClient } from "@azure/maps-elevation"; +import * as dotenv from "dotenv"; +dotenv.config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential implements coreAuth.TokenCredential { + async getToken( + _scopes: string | string[], + _options?: coreAuth.GetTokenOptions + ): Promise { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential: coreAuth.TokenCredential; + let operationOptions: coreClient.OperationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = getDefaultAzureCredential(); + } + + const elevation = new ElevationClient(credential).elevation; + + console.log(" --- Get Data For Bounding Box:"); + console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); + + console.log(" --- Get Data For Points:"); + console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Get Data For Polyline:"); + console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Post Data For Points:"); + console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + + console.log(" --- Post Data For Polyline:"); + console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-search/samples/v1/typescript/tsconfig.json b/sdk/maps/maps-search/samples/v1/typescript/tsconfig.json new file mode 100644 index 000000000000..416c2dd82e00 --- /dev/null +++ b/sdk/maps/maps-search/samples/v1/typescript/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2018", + "module": "commonjs", + "moduleResolution": "node", + "resolveJsonModule": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "alwaysStrict": true, + "outDir": "dist", + "rootDir": "src" + }, + "include": [ + "src/**.ts" + ] +} diff --git a/sdk/maps/maps-search/src/index.ts b/sdk/maps/maps-search/src/index.ts new file mode 100644 index 000000000000..315fa97e7e45 --- /dev/null +++ b/sdk/maps/maps-search/src/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./models"; +export { SearchClient } from "./searchClient"; +export { SearchClientContext } from "./searchClientContext"; +export * from "./operationsInterfaces"; diff --git a/sdk/maps/maps-search/src/lro/azureAsyncPolling.ts b/sdk/maps/maps-search/src/lro/azureAsyncPolling.ts new file mode 100644 index 000000000000..0d63c54f6026 --- /dev/null +++ b/sdk/maps/maps-search/src/lro/azureAsyncPolling.ts @@ -0,0 +1,83 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { FullOperationResponse } from "@azure/core-client"; +import { FinalStateVia, LROResult } from "./models"; +import { failureStates, LROState, successStates } from "./stateMachine"; + +function getResponseStatus(rawResponse: FullOperationResponse): string { + const { status } = + rawResponse.parsedBody ?? + (rawResponse.bodyAsText ? JSON.parse(rawResponse.bodyAsText) : {}); + return status?.toLowerCase() ?? "succeeded"; +} + +function isAzureAsyncPollingDone(rawResponse: FullOperationResponse) { + const state = getResponseStatus(rawResponse); + if (failureStates.includes(state)) { + throw new Error(`Operation status: ${state}`); + } + return successStates.includes(state); +} + +export function processAzureAsyncOperationResult( + restrieveResource: (path?: string) => Promise>, + resourceLocation?: string, + finalStateVia?: FinalStateVia +): ( + rawResponse: FullOperationResponse, + flatResponse: TResult +) => LROState { + return ( + rawResponse: FullOperationResponse, + flatResponse: TResult + ): LROState => { + if (isAzureAsyncPollingDone(rawResponse)) { + if (resourceLocation === undefined) { + return { rawResponse, flatResponse, done: true }; + } else { + return { + rawResponse, + flatResponse, + done: false, + next: async () => { + async function sendFinalRequest(): Promise< + LROResult | undefined + > { + switch (finalStateVia) { + case "original-uri": + return restrieveResource(); + case "azure-async-operation": + return Promise.resolve(undefined); + case "location": + default: + return restrieveResource(resourceLocation); + } + } + const finalResponse = await sendFinalRequest(); + return { + ...(finalResponse ?? { + rawResponse, + flatResponse + }), + done: true + }; + } + }; + } + } + return { + rawResponse, + flatResponse, + done: false + }; + }; +} diff --git a/sdk/maps/maps-search/src/lro/bodyPolling.ts b/sdk/maps/maps-search/src/lro/bodyPolling.ts new file mode 100644 index 000000000000..269d8e6799a1 --- /dev/null +++ b/sdk/maps/maps-search/src/lro/bodyPolling.ts @@ -0,0 +1,45 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { FullOperationResponse } from "@azure/core-client"; +import { failureStates, LROState, successStates } from "./stateMachine"; + +function getProvisioningState(rawResponse: FullOperationResponse): string { + const { properties, provisioningState } = + rawResponse.parsedBody ?? + (rawResponse.bodyAsText ? JSON.parse(rawResponse.bodyAsText) : {}); + const state: string | undefined = + properties?.provisioningState ?? provisioningState; + return state?.toLowerCase() ?? "succeeded"; +} + +export function isBodyPollingDone(rawResponse: FullOperationResponse) { + const state = getProvisioningState(rawResponse); + if (failureStates.includes(state)) { + throw new Error(`Provisioning state: ${state}`); + } + return successStates.includes(state); +} + +/** + * Creates a polling strategy based on BodyPolling which uses the provisioning state + * from the result to determine the current operation state + */ +export function processBodyPollingOperationResult( + rawResponse: FullOperationResponse, + flatResponse: TResult +): LROState { + return { + rawResponse, + flatResponse, + done: isBodyPollingDone(rawResponse) + }; +} diff --git a/sdk/maps/maps-search/src/lro/index.ts b/sdk/maps/maps-search/src/lro/index.ts new file mode 100644 index 000000000000..85c2187669e7 --- /dev/null +++ b/sdk/maps/maps-search/src/lro/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export { shouldDeserializeLRO } from "./requestUtils"; +export { LROPoller } from "./lroPoller"; diff --git a/sdk/maps/maps-search/src/lro/locationPolling.ts b/sdk/maps/maps-search/src/lro/locationPolling.ts new file mode 100644 index 000000000000..6fef61938419 --- /dev/null +++ b/sdk/maps/maps-search/src/lro/locationPolling.ts @@ -0,0 +1,32 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { FullOperationResponse } from "@azure/core-client"; +import { LROState } from "./stateMachine"; + +function isLocationPollingDone(rawResponse: FullOperationResponse) { + const code = rawResponse.status; + if (![202, 200].includes(code)) { + throw new Error(`Operation failed`); + } + return code !== 202; +} + +export function processLocationPollingOperationResult( + rawResponse: FullOperationResponse, + flatResponse: TResult +): LROState { + return { + rawResponse, + flatResponse, + done: isLocationPollingDone(rawResponse) + }; +} diff --git a/sdk/maps/maps-search/src/lro/lroPoller.ts b/sdk/maps/maps-search/src/lro/lroPoller.ts new file mode 100644 index 000000000000..cd1cd64fe813 --- /dev/null +++ b/sdk/maps/maps-search/src/lro/lroPoller.ts @@ -0,0 +1,66 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { Poller, PollOperationState } from "@azure/core-lro"; +import { OperationArguments, OperationSpec } from "@azure/core-client"; +import { FinalStateVia, SendOperationFn } from "./models"; +import { GenericPollOperation } from "./operation"; + +export interface LROPollerOptions { + /** + * Defines how much time the poller is going to wait before making a new request to the service. + */ + intervalInMs?: number; + /** + * A serialized poller which can be used to resume an existing paused Long-Running-Operation. + */ + resumeFrom?: string; +} + +export class LROPoller extends Poller< + PollOperationState, + TResult +> { + private intervalInMs: number; + + constructor( + { intervalInMs = 2000, resumeFrom }: LROPollerOptions, + initialOperationArguments: OperationArguments, + initialOperationSpec: OperationSpec, + sendOperation: SendOperationFn, + finalStateVia?: FinalStateVia + ) { + const state: PollOperationState = resumeFrom + ? JSON.parse(resumeFrom).state + : {}; + + const operation = new GenericPollOperation( + state, + initialOperationArguments, + initialOperationSpec, + sendOperation, + finalStateVia + ); + super(operation); + + this.intervalInMs = intervalInMs; + operation.setPollerConfig(this as any); + } + + /** + * The method used by the poller to wait before attempting to update its operation. + */ + delay(): Promise { + return new Promise((resolve) => + setTimeout(() => resolve(), this.intervalInMs) + ); + } +} diff --git a/sdk/maps/maps-search/src/lro/models.ts b/sdk/maps/maps-search/src/lro/models.ts new file mode 100644 index 000000000000..a4a5a5abd6c2 --- /dev/null +++ b/sdk/maps/maps-search/src/lro/models.ts @@ -0,0 +1,52 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + FullOperationResponse, + OperationArguments, + OperationSpec +} from "@azure/core-client"; +import { PollOperationState } from "@azure/core-lro"; + +export type FinalStateVia = + | "azure-async-operation" + | "location" + | "original-uri"; + +export interface LROResult { + flatResponse: T; + rawResponse: FullOperationResponse; +} + +export type LROMode = "AzureAsync" | "Location" | "Body"; + +export interface LROConfig { + mode?: LROMode; + resourceLocation?: string; +} + +export type SendOperationFn = ( + args: OperationArguments, + spec: OperationSpec +) => Promise>; + +/** + * Type of a polling operation state that can actually be resumed. + */ +export type ResumablePollOperationState = PollOperationState & { + initialRawResponse?: FullOperationResponse; + config?: LROConfig; + pollingURL?: string; +}; + +export interface PollerConfig { + intervalInMs: number; +} diff --git a/sdk/maps/maps-search/src/lro/operation.ts b/sdk/maps/maps-search/src/lro/operation.ts new file mode 100644 index 000000000000..801d03e7203a --- /dev/null +++ b/sdk/maps/maps-search/src/lro/operation.ts @@ -0,0 +1,132 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { AbortSignalLike } from "@azure/abort-controller"; +import { OperationArguments, OperationSpec } from "@azure/core-client"; +import { PollOperation, PollOperationState } from "@azure/core-lro"; +import { + FinalStateVia, + PollerConfig, + ResumablePollOperationState, + SendOperationFn +} from "./models"; +import { getPollingURL } from "./requestUtils"; +import { createGetLROState, initializeState, LROState } from "./stateMachine"; + +export class GenericPollOperation + implements PollOperation, TResult> { + private getLROState?: ( + pollingURL: string, + pollerConfig: PollerConfig + ) => Promise>; + private pollerConfig?: PollerConfig; + constructor( + public state: PollOperationState, + private initialOperationArguments: OperationArguments, + private initialOperationSpec: OperationSpec, + private sendOperation: SendOperationFn, + private finalStateVia?: FinalStateVia + ) {} + + public setPollerConfig(pollerConfig: PollerConfig) { + this.pollerConfig = pollerConfig; + } + + /** + * General update function for LROPoller, the general process is as follows + * 1. Check initial operation result to determine the strategy to use + * - Strategies: Location, Azure-AsyncOperation, Original Uri + * 2. Check if the operation result has a terminal state + * - Terminal state will be determined by each strategy + * 2.1 If it is terminal state Check if a final GET request is required, if so + * send final GET request and return result from operation. If no final GET + * is required, just return the result from operation. + * - Determining what to call for final request is responsibility of each strategy + * 2.2 If it is not terminal state, call the polling operation and go to step 1 + * - Determining what to call for polling is responsibility of each strategy + * - Strategies will always use the latest URI for polling if provided otherwise + * the last known one + */ + async update(options?: { + abortSignal?: AbortSignalLike | undefined; + fireProgress?: ((state: PollOperationState) => void) | undefined; + }): Promise, TResult>> { + const state = this.state as ResumablePollOperationState; + const { onResponse, ...restOptions } = + this.initialOperationArguments.options || {}; + if (!state.isStarted) { + await this.sendOperation( + { + ...this.initialOperationArguments, + options: { + ...restOptions, + onResponse: initializeState( + state, + this.initialOperationSpec, + onResponse + ) + } + }, + this.initialOperationSpec + ); + } + + if (!state.isCompleted) { + if (this.getLROState === undefined) { + if (state.config === undefined) { + throw new Error("Bad state: LRO mode is undefined"); + } + this.getLROState = createGetLROState( + this.sendOperation, + this.initialOperationArguments, + this.initialOperationSpec, + state.config, + this.finalStateVia + ); + } + if (state.pollingURL === undefined) { + throw new Error("Bad state: polling URL is undefined"); + } + const currentState = await this.getLROState( + state.pollingURL, + this.pollerConfig! + ); + if (currentState.done) { + state.result = currentState.flatResponse; + state.isCompleted = true; + } else { + this.getLROState = currentState.next ?? this.getLROState; + state.pollingURL = getPollingURL( + currentState.rawResponse, + state.pollingURL + ); + } + } + if (options?.fireProgress !== undefined) { + options.fireProgress(state); + } + return this; + } + + async cancel(): Promise, TResult>> { + this.state.isCancelled = true; + return this; + } + + /** + * Serializes the Poller operation. + */ + public toString(): string { + return JSON.stringify({ + state: this.state + }); + } +} diff --git a/sdk/maps/maps-search/src/lro/passthrough.ts b/sdk/maps/maps-search/src/lro/passthrough.ts new file mode 100644 index 000000000000..64c10380c1b2 --- /dev/null +++ b/sdk/maps/maps-search/src/lro/passthrough.ts @@ -0,0 +1,24 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { FullOperationResponse } from "@azure/core-client"; +import { LROState } from "./stateMachine"; + +export function processPassthroughOperationResult( + rawResponse: FullOperationResponse, + flatResponse: TResult +): LROState { + return { + rawResponse, + flatResponse, + done: true + }; +} diff --git a/sdk/maps/maps-search/src/lro/pollingMethod.ts b/sdk/maps/maps-search/src/lro/pollingMethod.ts new file mode 100644 index 000000000000..cb6482bbdea9 --- /dev/null +++ b/sdk/maps/maps-search/src/lro/pollingMethod.ts @@ -0,0 +1,91 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + OperationArguments, + OperationSpec, + OperationResponseMap +} from "@azure/core-client"; +import { LROMode, LROResult, SendOperationFn } from "./models"; + +export function createPollingMethod( + sendOperationFn: SendOperationFn, + args: OperationArguments, + spec: OperationSpec, + mode?: LROMode +): (path?: string) => Promise> { + /** + * Polling calls will always return a status object i.e. {"status": "success"} + * these intermediate responses are not described in the swagger so we need to + * pass custom mappers at runtime. + * This function replaces all the existing mappers to be able to deserialize a status object + * @param responses Original set of responses defined in the operation + */ + function getCompositeMappers(responses: { + [responseCode: string]: OperationResponseMap; + }): { + [responseCode: string]: OperationResponseMap; + } { + return Object.keys(responses).reduce((acc, statusCode) => { + return { + ...acc, + [statusCode]: { + ...responses[statusCode], + bodyMapper: { + type: { + name: "Composite", + modelProperties: { + status: { + serializedName: "status", + type: { + name: "String" + } + } + } + } + } + } + }; + }, {} as { [responseCode: string]: OperationResponseMap }); + } + // Make sure we don't send any body to the get request + const { requestBody, responses, ...restSpec } = spec; + if (mode === "AzureAsync") { + return async (path?: string) => { + return sendOperationFn(args, { + ...restSpec, + responses: getCompositeMappers(responses), + httpMethod: "GET", + ...(path && { path }) + }); + }; + } + return async (path?: string) => { + return sendOperationFn(args, { + ...restSpec, + responses: responses, + httpMethod: "GET", + ...(path && { path }) + }); + }; +} + +export function createRetrieveAzureAsyncResource( + sendOperationFn: SendOperationFn, + args: OperationArguments, + spec: OperationSpec +): (path?: string) => Promise> { + const updatedArgs = { ...args }; + if (updatedArgs.options) { + (updatedArgs.options as any).shouldDeserialize = true; + } + return createPollingMethod(sendOperationFn, updatedArgs, spec); +} diff --git a/sdk/maps/maps-search/src/lro/requestUtils.ts b/sdk/maps/maps-search/src/lro/requestUtils.ts new file mode 100644 index 000000000000..9162f6633905 --- /dev/null +++ b/sdk/maps/maps-search/src/lro/requestUtils.ts @@ -0,0 +1,194 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { FullOperationResponse, OperationSpec } from "@azure/core-client"; +import { LROConfig } from "./models"; +import { terminalStates } from "./stateMachine"; + +/** + * We need to selectively deserialize our responses, only deserializing if we + * are in a final LRO response, not deserializing any polling non-terminal responses + */ +export function shouldDeserializeLRO(finalStateVia?: string) { + let initialOperationInfo: LROResponseInfo | undefined; + let isInitialRequest = true; + + return (response: FullOperationResponse) => { + if (response.status < 200 || response.status >= 300) { + return true; + } + + if (!initialOperationInfo) { + initialOperationInfo = getLROData(response); + } else { + isInitialRequest = false; + } + + if ( + initialOperationInfo.azureAsyncOperation || + initialOperationInfo.operationLocation + ) { + return ( + !isInitialRequest && + isAsyncOperationFinalResponse( + response, + initialOperationInfo, + finalStateVia + ) + ); + } + + if (initialOperationInfo.location) { + return isLocationFinalResponse(response); + } + + if (initialOperationInfo.requestMethod === "PUT") { + return isBodyPollingFinalResponse(response); + } + + return true; + }; +} + +function isAsyncOperationFinalResponse( + response: FullOperationResponse, + initialOperationInfo: LROResponseInfo, + finalStateVia?: string +): boolean { + const status: string = response.parsedBody?.status || "Succeeded"; + if (!terminalStates.includes(status.toLowerCase())) { + return false; + } + + if (initialOperationInfo.requestMethod === "DELETE") { + return true; + } + + if ( + initialOperationInfo.requestMethod === "PUT" && + finalStateVia && + finalStateVia.toLowerCase() === "azure-asyncoperation" + ) { + return true; + } + + if ( + initialOperationInfo.requestMethod !== "PUT" && + !initialOperationInfo.location + ) { + return true; + } + + return false; +} + +function isLocationFinalResponse(response: FullOperationResponse): boolean { + return response.status !== 202; +} + +function isBodyPollingFinalResponse(response: FullOperationResponse): boolean { + const provisioningState: string = + response.parsedBody?.properties?.provisioningState || "Succeeded"; + + if (terminalStates.includes(provisioningState.toLowerCase())) { + return true; + } + + return false; +} + +interface LROResponseInfo { + requestMethod: string; + azureAsyncOperation?: string; + operationLocation?: string; + location?: string; +} + +function getLROData(result: FullOperationResponse): LROResponseInfo { + return { + azureAsyncOperation: result.headers.get("azure-asyncoperation"), + operationLocation: result.headers.get("operation-location"), + location: result.headers.get("location"), + requestMethod: result.request.method + }; +} + +/** + * Detects where the continuation token is and returns it. Notice that azure-asyncoperation + * must be checked first before the other location headers because there are scenarios + * where both azure-asyncoperation and location could be present in the same response but + * azure-asyncoperation should be the one to use for polling. + */ +export function getPollingURL( + rawResponse: FullOperationResponse, + defaultPath: string +): string { + return ( + getAzureAsyncoperation(rawResponse) ?? + getLocation(rawResponse) ?? + getOperationLocation(rawResponse) ?? + defaultPath + ); +} + +function getLocation(rawResponse: FullOperationResponse): string | undefined { + return rawResponse.headers?.get("location"); +} + +function getOperationLocation( + rawResponse: FullOperationResponse +): string | undefined { + return rawResponse.headers?.get("operation-location"); +} + +function getAzureAsyncoperation( + rawResponse: FullOperationResponse +): string | undefined { + return rawResponse.headers?.get("azure-asyncoperation"); +} + +export function inferLROMode( + spec: OperationSpec, + rawResponse: FullOperationResponse +): LROConfig { + const requestMethod = spec.httpMethod; + if (getAzureAsyncoperation(rawResponse) !== undefined) { + return { + mode: "AzureAsync", + resourceLocation: + requestMethod === "PUT" + ? spec.path + : requestMethod === "POST" + ? getLocation(rawResponse) + : undefined + }; + } else if ( + getLocation(rawResponse) !== undefined || + getOperationLocation(rawResponse) !== undefined + ) { + return { + mode: "Location" + }; + } else if (["PUT", "PATCH"].includes(requestMethod)) { + return { + mode: "Body" + }; + } + return {}; +} + +export function getSpecPath(spec: OperationSpec): string { + if (spec.path) { + return spec.path; + } else { + throw Error("Bad spec: request path is not found!"); + } +} diff --git a/sdk/maps/maps-search/src/lro/stateMachine.ts b/sdk/maps/maps-search/src/lro/stateMachine.ts new file mode 100644 index 000000000000..b2a69b554601 --- /dev/null +++ b/sdk/maps/maps-search/src/lro/stateMachine.ts @@ -0,0 +1,216 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { + FullOperationResponse, + OperationArguments, + OperationSpec, + RawResponseCallback +} from "@azure/core-client"; +import { processAzureAsyncOperationResult } from "./azureAsyncPolling"; +import { + isBodyPollingDone, + processBodyPollingOperationResult +} from "./bodyPolling"; +import { processLocationPollingOperationResult } from "./locationPolling"; +import { + FinalStateVia, + LROConfig, + LROResult, + PollerConfig, + ResumablePollOperationState, + SendOperationFn +} from "./models"; +import { processPassthroughOperationResult } from "./passthrough"; +import { + createPollingMethod, + createRetrieveAzureAsyncResource +} from "./pollingMethod"; +import { getPollingURL, getSpecPath, inferLROMode } from "./requestUtils"; + +export const successStates = ["succeeded"]; +export const failureStates = ["failed", "canceled", "cancelled"]; +export const terminalStates = successStates.concat(failureStates); + +/** + * The type of a terminal state of an LRO. + */ +interface LROTerminalState extends LROResult { + /** + * Whether the operation has finished. + */ + done: true; +} + +/** + * The type of an in-progress state of an LRO. + */ +interface LROInProgressState extends LROResult { + /** + * Whether the operation has finished. + */ + done: false; + /** + * The request to be sent next if it is different from the standard polling one. + * Notice that it will disregard any polling URLs provided to it. + */ + next?: () => Promise>; +} + +/** + * The type of an LRO state which is a tagged union of terminal and in-progress states. + */ +export type LROState = LROTerminalState | LROInProgressState; + +/** + * creates a stepping function that maps an LRO state to another. + */ +function createTransition( + sendOperationFn: SendOperationFn, + args: OperationArguments, + spec: OperationSpec, + config: LROConfig, + finalStateVia?: FinalStateVia +): ( + rawResponse: FullOperationResponse, + flatResponse: TResult +) => LROState { + switch (config.mode) { + case "AzureAsync": { + return processAzureAsyncOperationResult( + createRetrieveAzureAsyncResource(sendOperationFn, args, spec), + config.resourceLocation, + finalStateVia + ); + } + case "Location": { + return processLocationPollingOperationResult; + } + case "Body": { + return processBodyPollingOperationResult; + } + default: { + return processPassthroughOperationResult; + } + } +} + +/** + * Creates a polling operation that returns a LRO state. + */ +export function createGetLROState( + sendOperationFn: SendOperationFn, + args: OperationArguments, + spec: OperationSpec, + config: LROConfig, + finalStateVia?: FinalStateVia +): ( + pollingURL: string, + pollerConfig: PollerConfig +) => Promise> { + const step = createTransition( + sendOperationFn, + args, + spec, + config, + finalStateVia + ); + const customerCallback = args?.options?.onResponse; + let response: LROState | undefined = undefined; + let retryAfter: string | undefined = undefined; + const poll = createPollingMethod( + sendOperationFn, + { + ...args, + options: { + ...args.options, + onResponse: ( + rawResponse: FullOperationResponse, + flatResponse: unknown + ): void => { + response = step(rawResponse, flatResponse as TResult); + retryAfter = rawResponse.headers.get("Retry-After"); + if (response.done) { + customerCallback?.(rawResponse, flatResponse); + } + } + } + }, + spec, + config.mode + ); + return async ( + path: string, + pollerConfig: PollerConfig + ): Promise> => { + await poll(path); + if (retryAfter !== undefined) { + const retryAfterInMs = parseInt(retryAfter); + pollerConfig.intervalInMs = isNaN(retryAfterInMs) + ? calculatePollingIntervalFromDate( + new Date(retryAfter), + pollerConfig.intervalInMs + ) + : retryAfterInMs; + } + return response!; + }; +} + +function calculatePollingIntervalFromDate( + retryAfterDate: Date, + defaultIntervalInMs: number +): number { + const timeNow = Math.floor(new Date().getTime()); + const retryAfterTime = retryAfterDate.getTime(); + if (timeNow < retryAfterTime) { + return retryAfterTime - timeNow; + } + return defaultIntervalInMs; +} + +/** + * Creates a callback to be used to initialize the polling operation state. + * @param state of the polling operation + * @param operationSpec of the LRO + * @param callback callback to be called when the operation is done + * @returns callback that initializes the state of the polling operation + */ +export function initializeState( + state: ResumablePollOperationState, + operationSpec: OperationSpec, + callback?: RawResponseCallback +): (rawResponse: FullOperationResponse, flatResponse: unknown) => void { + return (rawResponse: FullOperationResponse, flatResponse: unknown) => { + state.initialRawResponse = rawResponse; + state.isStarted = true; + state.pollingURL = getPollingURL( + state.initialRawResponse, + getSpecPath(operationSpec) + ); + state.config = inferLROMode(operationSpec, state.initialRawResponse); + /** short circuit polling if body polling is done in the initial request */ + if ( + state.config.mode === undefined || + (state.config.mode === "Body" && + isBodyPollingDone(state.initialRawResponse)) + ) { + state.result = flatResponse as TResult; + state.isCompleted = true; + /** + * We need to check if the LRO operation is finished inside the + * call back so that we can call the customer-provided callback + * on that result. + */ + callback?.(rawResponse, flatResponse); + } + }; +} diff --git a/sdk/maps/maps-search/src/models/index.ts b/sdk/maps/maps-search/src/models/index.ts new file mode 100644 index 000000000000..c3b67f11bdc4 --- /dev/null +++ b/sdk/maps/maps-search/src/models/index.ts @@ -0,0 +1,2088 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; + +export type GeoJsonObjectUnion = + | GeoJsonObject + | GeoJsonGeometryUnion + | GeoJsonFeature + | GeoJsonFeatureCollection; +export type GeoJsonGeometryUnion = + | GeoJsonGeometry + | GeoJsonLineString + | GeoJsonPoint + | GeoJsonMultiPoint + | GeoJsonMultiLineString + | GeoJsonPolygon + | GeoJsonMultiPolygon + | GeoJsonGeometryCollection; + +/** This object is returned from a successful Search Polygon call */ +export interface SearchPolygonResponse { + /** + * Results array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly additionalData?: SearchPolygonResult[]; +} + +export interface SearchPolygonResult { + /** + * ID of the returned entity + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly providerID?: string; + /** + * Reason for the failure to obtain data for this provider. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly error?: string; + /** Geometry data in GeoJSON format. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946) for details. Present only if "error" is not present. */ + geometryData?: GeoJsonObjectUnion; +} + +/** A valid `GeoJSON` object. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3) for details. */ +export interface GeoJsonObject { + /** Polymorphic discriminator, which specifies the different types this object can be */ + type: + | "GeoJsonGeometry" + | "LineString" + | "Point" + | "MultiPoint" + | "MultiLineString" + | "Polygon" + | "MultiPolygon" + | "GeometryCollection" + | "Feature" + | "FeatureCollection"; +} + +/** Common error response for all Azure Resource Manager APIs to return error details for failed operations. (This also follows the OData error response format.). */ +export interface ErrorResponse { + /** The error object. */ + error?: ErrorDetail; +} + +/** The error detail. */ +export interface ErrorDetail { + /** + * The error code. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly code?: string; + /** + * The error message. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly message?: string; + /** + * The error target. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly target?: string; + /** + * The error details. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly details?: ErrorDetail[]; + /** + * The error additional info. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly additionalInfo?: ErrorAdditionalInfo[]; +} + +/** The resource management error additional info. */ +export interface ErrorAdditionalInfo { + /** + * The additional info type. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly type?: string; + /** + * The additional info. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly info?: Record; +} + +/** This object is returned from a successful Search calls. */ +export interface SearchCommonResponse { + /** + * Summary object for a Search API response + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly summary?: SearchCommonSummary; + /** + * A list of Search API results. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly results?: SearchCommonResult[]; +} + +/** Summary object for a Search API response. */ +export interface SearchCommonSummary { + /** + * Query property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly query?: string; + /** + * QueryType property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly queryType?: string; + /** + * QueryTime property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly queryTime?: number; + /** + * NumResults property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly numResults?: number; + /** + * Maximum number of responses that will be returned + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly limit?: number; + /** + * Offset property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly offset?: number; + /** + * TotalResults property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly totalResults?: number; + /** + * FuzzyLevel property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly fuzzyLevel?: number; + /** + * Indication when the internal search engine has applied a geospatial bias to improve the ranking of results. In some methods, this can be affected by setting the lat and lon parameters where available. In other cases it is purely internal. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly geoBias?: SearchCommonSummaryGeoBias; +} + +/** A location represented as a latitude and longitude using short names 'lat' & 'lon'. */ +export interface CoordinatesPairAbbreviated { + /** Latitude property */ + lat?: number; + /** Longitude property */ + lon?: number; +} + +/** Result object for a Search API response. */ +export interface SearchCommonResult { + /** + * One of: + * * POI + * * Street + * * Geography + * * Point Address + * * Address Range + * * Cross Street + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly type?: string; + /** + * Id property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly id?: string; + /** + * The value within a result set to indicate the relative matching score between results. You can use this to determine that result x is twice as likely to be as relevant as result y if the value of x is 2x the value of y. The values vary between queries and is only meant as a relative value for one result set. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly score?: number; + /** + * Straight line distance between the result and geobias location in meters. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly dist?: number; + /** + * Info property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly info?: string; + /** Geography entity type. Present only when entityType was requested and is available. */ + entityType?: EntityType; + /** + * Details of the returned POI including information such as the name, phone, url address, and classifications. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly poi?: SearchResultPoi; + /** + * The address of the result + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly address?: SearchResultAddress; + /** A location represented as a latitude and longitude using short names 'lat' & 'lon'. */ + position?: CoordinatesPairAbbreviated; + /** + * The viewport that covers the result represented by the top-left and bottom-right coordinates of the viewport. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly viewport?: SearchResultViewport; + /** + * Entry Points array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly entryPoints?: SearchResultEntryPoint[]; + /** + * Describes the address range on both sides of the street for a search result. Coordinates for the start and end locations of the address range are included. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly addressRanges?: SearchResultAddressRanges; + /** + * Optional section. Reference ids for use with the [Get Search Polygon](https://docs.microsoft.com/rest/api/maps/search/getsearchpolygon) API. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly dataSources?: DataSources; + /** + * Information on the type of match. + * + * One of: + * * AddressPoint + * * HouseNumberRange + * * Street + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly matchType?: string; + /** + * Detour time in seconds + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly detourTime?: number; +} + +/** Details of the returned POI including information such as the name, phone, url address, and classifications. */ +export interface SearchResultPoi { + /** + * Name of the POI property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly name?: string; + /** + * Telephone number property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly phone?: string; + /** + * Website URL property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly url?: string; + /** + * The list of the most specific POI categories + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly categorySet?: SearchResultPoiCategorySet[]; + /** + * __[Deprecated]__ Use classifications instead. Categories array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly categories?: string[]; + /** + * Classification array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly classifications?: SearchResultPoiClassification[]; + /** + * Brands array. The name of the brand for the POI being returned. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly brands?: SearchResultPoiBrand[]; + /** Opening hours for a POI (Points of Interest). */ + openingHours?: SearchResultPoiOpeningHours; +} + +/** POI category */ +export interface SearchResultPoiCategorySet { + /** + * Category ID + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly id?: number; +} + +/** The classification for the POI being returned */ +export interface SearchResultPoiClassification { + /** + * Code property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly code?: string; + /** + * Names array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly names?: SearchResultPoiClassificationName[]; +} + +/** Name for the classification */ +export interface SearchResultPoiClassificationName { + /** + * Name Locale property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly nameLocale?: string; + /** + * Name property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly name?: string; +} + +/** The name of the brand for the POI being returned */ +export interface SearchResultPoiBrand { + /** + * Name of the brand + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly name?: string; +} + +/** Opening hours for a POI (Points of Interest). */ +export interface SearchResultPoiOpeningHours { + /** + * Value used in the Request + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly mode?: string; + /** + * List of time ranges for the next 7 days + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly timeRanges?: SearchResultPoiOpeningHoursTimeRange[]; +} + +/** Open time range for a day */ +export interface SearchResultPoiOpeningHoursTimeRange { + /** The point in the next 7 days range when a given POI is being opened, or the beginning of the range if it was opened before the range. */ + startTime?: SearchResultPoiOpeningHoursTimeRangeTime; + /** The point in the next 7 days range when a given POI is being closed, or the beginning of the range if it was closed before the range. */ + endTime?: SearchResultPoiOpeningHoursTimeRangeTime; +} + +/** Represents a date and time */ +export interface SearchResultPoiOpeningHoursTimeRangeTime { + /** + * Represents current day in calendar year in POI time zone. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly date?: string; + /** + * Hours are in the 24 hour format in the local time of a POI; possible values are 0 - 23. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly hour?: number; + /** + * Minutes are in the local time of a POI; possible values are 0 - 59. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly minute?: number; +} + +/** The address of the result */ +export interface SearchResultAddress { + /** + * Building Number property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly buildingNumber?: string; + /** + * Street property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly street?: string; + /** + * Cross Street property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly crossStreet?: string; + /** + * Street Number property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly streetNumber?: string; + /** + * number of routes + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly routeNumbers?: number[]; + /** + * Street Name property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly streetName?: string; + /** + * Street Name and Number property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly streetNameAndNumber?: string; + /** + * Municipality property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly municipality?: string; + /** + * Municipality Subdivision property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly municipalitySubdivision?: string; + /** + * Country Tertiary Subdivision property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly countryTertiarySubdivision?: string; + /** + * Country Secondary Subdivision property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly countrySecondarySubdivision?: string; + /** + * Country Subdivision property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly countrySubdivision?: string; + /** + * Postal Code property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly postalCode?: string; + /** + * Extended Postal Code property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly extendedPostalCode?: string; + /** + * Country Code property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly countryCode?: string; + /** + * Country property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly country?: string; + /** + * Country Code ISO3 property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly countryCodeISO3?: string; + /** + * Free form Address property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly freeformAddress?: string; + /** + * Country Subdivision Name property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly countrySubdivisionName?: string; + /** + * An address component which represents the name of a geographic area or locality that groups a number of addressable objects for addressing purposes, without being an administrative unit. This field is used to build the `freeformAddress` property. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly localName?: string; + /** + * Bounding box coordinates. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly boundingBox?: Record; +} + +/** The viewport that covers the result represented by the top-left and bottom-right coordinates of the viewport. */ +export interface SearchResultViewport { + /** A location represented as a latitude and longitude using short names 'lat' & 'lon'. */ + topLeftPoint?: CoordinatesPairAbbreviated; + /** A location represented as a latitude and longitude using short names 'lat' & 'lon'. */ + btmRightPoint?: CoordinatesPairAbbreviated; +} + +/** The entry point for the POI being returned. */ +export interface SearchResultEntryPoint { + /** + * The type of entry point. Value can be either _main_ or _minor_. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly type?: EntryPointType; + /** A location represented as a latitude and longitude using short names 'lat' & 'lon'. */ + position?: CoordinatesPairAbbreviated; +} + +/** Describes the address range on both sides of the street for a search result. Coordinates for the start and end locations of the address range are included. */ +export interface SearchResultAddressRanges { + /** Address range on the left side of the street. */ + rangeLeft?: string; + /** Address range on the right side of the street. */ + rangeRight?: string; + /** A location represented as a latitude and longitude using short names 'lat' & 'lon'. */ + from?: CoordinatesPairAbbreviated; + /** A location represented as a latitude and longitude using short names 'lat' & 'lon'. */ + to?: CoordinatesPairAbbreviated; +} + +/** Optional section. Reference ids for use with the [Get Search Polygon](https://docs.microsoft.com/rest/api/maps/search/getsearchpolygon) API. */ +export interface DataSources { + /** Information about the geometric shape of the result. Only present if type == Geography. */ + geometry?: DataSourcesGeometry; +} + +/** Information about the geometric shape of the result. Only present if type == Geography. */ +export interface DataSourcesGeometry { + /** + * Pass this as geometryId to the [Get Search Polygon](https://docs.microsoft.com/rest/api/maps/search/getsearchpolygon) API to fetch geometry information for this result. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly id?: string; +} + +/** This object is returned from a successful POI Category Tree call */ +export interface SearchPoiCategoryTreeResponse { + /** + * Categories array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly poiCategories?: PoiCategoryResult[]; +} + +/** POI category result */ +export interface PoiCategoryResult { + /** + * Unique ID for the category. ID can be used to restrict search results to specific categories through other Search Service APIs, like [Get Search POI](https://docs.microsoft.com/rest/api/maps/search/getsearchpoi). + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly id?: number; + /** + * Name of the category + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly name?: string; + /** + * Array of child category ids + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly childCategoryIds?: number[]; + /** + * Array of alternative names of the category + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly synonyms?: string[]; +} + +/** This object is returned from a successful Search Address Reverse call */ +export interface SearchAddressReverseResponse { + /** + * Summary object for a Search Address Reverse response + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly summary?: SearchCommonSummary; + /** + * Addresses array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly addresses?: SearchAddressReverseResult[]; +} + +/** Result object for a Search Address Reverse response */ +export interface SearchAddressReverseResult { + /** + * The address of the result + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly address?: SearchResultAddress; + /** + * Position property in the form of "{latitude},{longitude}" + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly position?: string; + /** + * Information on the type of match. + * + * One of: + * * AddressPoint + * * HouseNumberRange + * * Street + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly matchType?: string; +} + +/** This object is returned from a successful Search Address Reverse CrossStreet call */ +export interface SearchAddressReverseCrossStreetResponse { + /** + * Summary object for a Search Address Reverse Cross Street response + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly summary?: SearchCommonSummary; + /** + * Addresses array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly addresses?: SearchAddressReverseCrossStreetResult[]; +} + +/** Result object for a Search Address Reverse Cross Street response */ +export interface SearchAddressReverseCrossStreetResult { + /** + * The address of the result + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly address?: SearchResultAddress; + /** + * Position property in the form of "{latitude},{longitude}" + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly position?: string; +} + +/** This type represents the request body for the Search Inside Geometry service. */ +export interface SearchInsideGeometryRequestBody { + /** A valid `GeoJSON` object. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3) for details. */ + geometry?: Record; +} + +/** This type represents the request body for the Search Along Route service. */ +export interface SearchAlongRouteRequestBody { + /** A valid `GeoJSON LineString` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.4) for details. */ + route?: GeoJsonLineString; +} + +export interface GeoJsonLineStringData { + /** Coordinates for the `GeoJson LineString` geometry. */ + coordinates: number[][]; +} + +/** This type represents the request body for the Batch service. */ +export interface BatchRequestBody { + /** The list of queries to process. */ + batchItems?: BatchRequestBodyBatchItemsItem[]; +} + +/** Batch Query object */ +export interface BatchRequestBodyBatchItemsItem { + /** Partial query string. */ + query?: string; +} + +/** This object is returned from a successful Batch service call. Extend with 'batchItems' property. */ +export interface BatchResponse { + /** + * Summary for the batch request + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly summary?: BatchResponseSummary; +} + +/** Summary for the batch request */ +export interface BatchResponseSummary { + /** + * Number of successful requests in the batch + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly successfulRequests?: number; + /** + * Total number of requests in the batch + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly totalRequests?: number; +} + +/** An item returned from Batch API. Extend with 'response' property. */ +export interface BatchItem { + /** + * HTTP request status code. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly statusCode?: number; +} + +/** Indication when the internal search engine has applied a geospatial bias to improve the ranking of results. In some methods, this can be affected by setting the lat and lon parameters where available. In other cases it is purely internal. */ +export interface SearchSummaryGeoBias { + /** + * Latitude property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly lat?: number; + /** + * Longitude property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly lon?: number; +} + +/** Data contained by a `GeoJson Point`. */ +export interface GeoJsonPointData { + /** A `Position` is an array of numbers with two or more elements. The first two elements are _longitude_ and _latitude_, precisely in that order. _Altitude/Elevation_ is an optional third element. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.1) for details. */ + coordinates: number[]; +} + +/** Data contained by a `GeoJson MultiPoint`. */ +export interface GeoJsonMultiPointData { + /** Coordinates for the `GeoJson MultiPoint` geometry. */ + coordinates: number[][]; +} + +export interface GeoJsonMultiLineStringData { + /** Coordinates for the `GeoJson MultiLineString` geometry. */ + coordinates: number[][][]; +} + +export interface GeoJsonPolygonData { + /** Coordinates for the `GeoJson Polygon` geometry type. */ + coordinates: number[][][]; +} + +export interface GeoJsonMultiPolygonData { + /** Contains a list of valid `GeoJSON Polygon` objects. **Note** that coordinates in GeoJSON are in x, y order (longitude, latitude). */ + coordinates: number[][][][]; +} + +export interface GeoJsonGeometryCollectionData { + /** Contains a list of valid `GeoJSON` geometry objects. **Note** that coordinates in GeoJSON are in x, y order (longitude, latitude). */ + geometries: GeoJsonGeometryUnion[]; +} + +export interface GeoJsonFeatureData { + /** A valid `GeoJSON` geometry object. The type must be one of the seven valid GeoJSON geometry types - Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon and GeometryCollection. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1) for details. */ + geometry: GeoJsonGeometryUnion; + /** Properties can contain any additional metadata about the `Feature`. Value can be any JSON object or a JSON null value */ + properties?: Record; + /** Identifier for the feature. */ + id?: string; + /** The type of the feature. The value depends on the data model the current feature is part of. Some data models may have an empty value. */ + featureType?: string; +} + +export interface GeoJsonFeatureCollectionData { + /** Contains a list of valid `GeoJSON Feature` objects. */ + features: GeoJsonFeature[]; +} + +/** A valid `GeoJSON` geometry object. The type must be one of the seven valid GeoJSON geometry types - Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon and GeometryCollection. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1) for details. */ +export type GeoJsonGeometry = GeoJsonObject & { + /** Polymorphic discriminator, which specifies the different types this object can be */ + type: + | "GeoJsonGeometry" + | "LineString" + | "Point" + | "MultiPoint" + | "MultiLineString" + | "Polygon" + | "MultiPolygon" + | "GeometryCollection"; +}; + +/** A valid `GeoJSON Feature` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.2) for details. */ +export type GeoJsonFeature = GeoJsonObject & + GeoJsonFeatureData & { + /** Polymorphic discriminator, which specifies the different types this object can be */ + type: "Feature"; + }; + +/** A valid `GeoJSON FeatureCollection` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. */ +export type GeoJsonFeatureCollection = GeoJsonObject & + GeoJsonFeatureCollectionData & { + /** Polymorphic discriminator, which specifies the different types this object can be */ + type: "FeatureCollection"; + }; + +/** The result of the query. SearchCommonResponse if the query completed successfully, ErrorResponse otherwise. */ +export type SearchFuzzyBatchItemResponse = SearchCommonResponse & + ErrorResponse & {}; + +/** The result of the query. SearchCommonResponse if the query completed successfully, ErrorResponse otherwise. */ +export type SearchAddressBatchItemResponse = SearchCommonResponse & + ErrorResponse & {}; + +/** The result of the query. SearchAddressReverseResponse if the query completed successfully, ErrorResponse otherwise. */ +export type SearchAddressReverseBatchItemResponse = SearchAddressReverseResponse & + ErrorResponse & {}; + +/** Indication when the internal search engine has applied a geospatial bias to improve the ranking of results. In some methods, this can be affected by setting the lat and lon parameters where available. In other cases it is purely internal. */ +export type SearchCommonSummaryGeoBias = CoordinatesPairAbbreviated & {}; + +/** A valid `GeoJSON LineString` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.4) for details. */ +export type GeoJsonLineString = GeoJsonGeometry & GeoJsonLineStringData & {}; + +/** This object is returned from a successful Search Fuzzy Batch service call. */ +export type SearchFuzzyBatchResponse = BatchResponse & { + /** + * Array containing the batch results. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly batchItems?: SearchFuzzyBatchItem[]; +}; + +/** This object is returned from a successful Search Address Batch service call. */ +export type SearchAddressBatchResponse = BatchResponse & { + /** + * Array containing the batch results. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly batchItems?: SearchAddressBatchItem[]; +}; + +/** This object is returned from a successful Search Address Reverse Batch service call. */ +export type SearchAddressReverseBatchResponse = BatchResponse & { + /** + * Array containing the batch results. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly batchItems?: SearchAddressReverseBatchItem[]; +}; + +/** An item returned from Search Fuzzy Batch service call. */ +export type SearchFuzzyBatchItem = BatchItem & { + /** + * The result of the query. SearchCommonResponse if the query completed successfully, ErrorResponse otherwise. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly response?: SearchFuzzyBatchItemResponse; +}; + +/** An item returned from Search Address Batch service call. */ +export type SearchAddressBatchItem = BatchItem & { + /** + * The result of the query. SearchCommonResponse if the query completed successfully, ErrorResponse otherwise. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly response?: SearchAddressBatchItemResponse; +}; + +/** An item returned from Search Address Reverse Batch service call. */ +export type SearchAddressReverseBatchItem = BatchItem & { + /** + * The result of the query. SearchAddressReverseResponse if the query completed successfully, ErrorResponse otherwise. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly response?: SearchAddressReverseBatchItemResponse; +}; + +/** A valid `GeoJSON Point` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.2) for details. */ +export type GeoJsonPoint = GeoJsonGeometry & GeoJsonPointData & {}; + +/** A valid `GeoJSON MultiPoint` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.3) for details. */ +export type GeoJsonMultiPoint = GeoJsonGeometry & GeoJsonMultiPointData & {}; + +/** A valid `GeoJSON MultiLineString` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.5) for details. */ +export type GeoJsonMultiLineString = GeoJsonGeometry & + GeoJsonMultiLineStringData & {}; + +/** A valid `GeoJSON Polygon` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.6) for details. */ +export type GeoJsonPolygon = GeoJsonGeometry & GeoJsonPolygonData & {}; + +/** A valid `GeoJSON MultiPolygon` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.7) for details. */ +export type GeoJsonMultiPolygon = GeoJsonGeometry & + GeoJsonMultiPolygonData & {}; + +/** A valid `GeoJSON GeometryCollection` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.8) for details. */ +export type GeoJsonGeometryCollection = GeoJsonGeometry & + GeoJsonGeometryCollectionData & {}; + +/** Defines headers for Search_postSearchFuzzyBatch operation. */ +export interface SearchPostSearchFuzzyBatchHeaders { + /** New URL to check for the results of the long running process. */ + location?: string; +} + +/** Defines headers for Search_postSearchAddressBatch operation. */ +export interface SearchPostSearchAddressBatchHeaders { + /** New URL to check for the results of the long running process. */ + location?: string; +} + +/** Defines headers for Search_postSearchAddressReverseBatch operation. */ +export interface SearchPostSearchAddressReverseBatchHeaders { + /** New URL to check for the results of the long running process. */ + location?: string; +} + +/** Known values of {@link Geography} that the service accepts. */ +export const enum KnownGeography { + Us = "us", + Eu = "eu" +} + +/** + * Defines values for Geography. \ + * {@link KnownGeography} can be used interchangeably with Geography, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **us** \ + * **eu** + */ +export type Geography = string; + +/** Known values of {@link ResponseFormat} that the service accepts. */ +export const enum KnownResponseFormat { + /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ + Json = "json" +} + +/** + * Defines values for ResponseFormat. \ + * {@link KnownResponseFormat} can be used interchangeably with ResponseFormat, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) + */ +export type ResponseFormat = string; + +/** Known values of {@link GeoJsonObjectType} that the service accepts. */ +export const enum KnownGeoJsonObjectType { + /** `GeoJSON Point` geometry. */ + GeoJsonPoint = "Point", + /** `GeoJSON MultiPoint` geometry. */ + GeoJsonMultiPoint = "MultiPoint", + /** `GeoJSON LineString` geometry. */ + GeoJsonLineString = "LineString", + /** `GeoJSON MultiLineString` geometry. */ + GeoJsonMultiLineString = "MultiLineString", + /** `GeoJSON Polygon` geometry. */ + GeoJsonPolygon = "Polygon", + /** `GeoJSON MultiPolygon` geometry. */ + GeoJsonMultiPolygon = "MultiPolygon", + /** `GeoJSON GeometryCollection` geometry. */ + GeoJsonGeometryCollection = "GeometryCollection", + /** `GeoJSON Feature` object. */ + GeoJsonFeature = "Feature", + /** `GeoJSON FeatureCollection` object. */ + GeoJsonFeatureCollection = "FeatureCollection" +} + +/** + * Defines values for GeoJsonObjectType. \ + * {@link KnownGeoJsonObjectType} can be used interchangeably with GeoJsonObjectType, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **Point**: `GeoJSON Point` geometry. \ + * **MultiPoint**: `GeoJSON MultiPoint` geometry. \ + * **LineString**: `GeoJSON LineString` geometry. \ + * **MultiLineString**: `GeoJSON MultiLineString` geometry. \ + * **Polygon**: `GeoJSON Polygon` geometry. \ + * **MultiPolygon**: `GeoJSON MultiPolygon` geometry. \ + * **GeometryCollection**: `GeoJSON GeometryCollection` geometry. \ + * **Feature**: `GeoJSON Feature` object. \ + * **FeatureCollection**: `GeoJSON FeatureCollection` object. + */ +export type GeoJsonObjectType = string; + +/** Known values of {@link TextFormat} that the service accepts. */ +export const enum KnownTextFormat { + /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ + Json = "json", + /** [The Extensible Markup Language](https://www.w3.org/TR/xml/) */ + Xml = "xml" +} + +/** + * Defines values for TextFormat. \ + * {@link KnownTextFormat} can be used interchangeably with TextFormat, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) \ + * **xml**: [The Extensible Markup Language](https:\/\/www.w3.org\/TR\/xml\/) + */ +export type TextFormat = string; + +/** Known values of {@link SearchIndexSet} that the service accepts. */ +export const enum KnownSearchIndexSet { + /** Address range interpolation */ + Addr = "Addr", + /** Geographies */ + Geo = "Geo", + /** Point Addresses */ + PAD = "PAD", + /** Points of interest */ + POI = "POI", + /** Streets */ + Str = "Str", + /** Cross Streets (Intersections) */ + Xstr = "Xstr" +} + +/** + * Defines values for SearchIndexSet. \ + * {@link KnownSearchIndexSet} can be used interchangeably with SearchIndexSet, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **Addr**: Address range interpolation \ + * **Geo**: Geographies \ + * **PAD**: Point Addresses \ + * **POI**: Points of interest \ + * **Str**: Streets \ + * **Xstr**: Cross Streets (Intersections) + */ +export type SearchIndexSet = string; + +/** Known values of {@link ConnectorSet} that the service accepts. */ +export const enum KnownConnectorSet { + /** + * These are the standard household connectors for a certain region. They are all AC single phase and the standard Voltage and standard Amperage. + * + * See also: [Plug & socket types - World Standards](https://www.worldstandards.eu/electricity/plugs-and-sockets) + */ + StandardHouseholdCountrySpecific = "StandardHouseholdCountrySpecific", + /** Type 1 connector as defined in the IEC 62196-2 standard. Also called Yazaki after the original manufacturer or SAE J1772 after the standard that first published it. Mostly used in combination with 120V single phase or up to 240V single phase infrastructure. */ + IEC62196Type1 = "IEC62196Type1", + /** Type 1 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 1 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. */ + IEC62196Type1CCS = "IEC62196Type1CCS", + /** Type 2 connector as defined in the IEC 62196-2 standard. Provided as a cable and plug attached to the charging point */ + IEC62196Type2CableAttached = "IEC62196Type2CableAttached", + /** Type 2 connector as defined in the IEC 62196-2 standard. Provided as a socket set into the charging point. */ + IEC62196Type2Outlet = "IEC62196Type2Outlet", + /** Type 2 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 2 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. */ + IEC62196Type2CCS = "IEC62196Type2CCS", + /** Type 3 connector as defined in the IEC 62196-2 standard. Also called Scame after the original manufacturer. Mostly used in combination with up to 240V single phase or up to 420V three phase infrastructure. */ + IEC62196Type3 = "IEC62196Type3", + /** CHAdeMO connector named after an association formed by the Tokyo Electric Power Company and industrial partners. Because of this is is also known as the TEPCO's connector. It supports fast DC charging. */ + Chademo = "Chademo", + /** Industrial Blue connector is a connector defined in the IEC 60309 standard. It is sometime referred to as by some combination of the standard, the color and the fact that is a single phase connector. The connector usually has the "P+N+E, 6h" configuration. */ + IEC60309AC1PhaseBlue = "IEC60309AC1PhaseBlue", + /** Industrial White connector is a DC connector defined in the IEC 60309 standard. */ + IEC60309DCWhite = "IEC60309DCWhite", + /** The Tesla connector is the regionally specific Tesla Supercharger connector. I.e. it refers to either Tesla's proprietary connector, sometimes referred to as Tesla Port mostly limited to North America or the modified Type 2 (DC over Type 2) in Europe. */ + Tesla = "Tesla" +} + +/** + * Defines values for ConnectorSet. \ + * {@link KnownConnectorSet} can be used interchangeably with ConnectorSet, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **StandardHouseholdCountrySpecific**: These are the standard household connectors for a certain region. They are all AC single phase and the standard Voltage and standard Amperage. + * + * See also: [Plug & socket types - World Standards](https:\/\/www.worldstandards.eu\/electricity\/plugs-and-sockets) \ + * **IEC62196Type1**: Type 1 connector as defined in the IEC 62196-2 standard. Also called Yazaki after the original manufacturer or SAE J1772 after the standard that first published it. Mostly used in combination with 120V single phase or up to 240V single phase infrastructure. \ + * **IEC62196Type1CCS**: Type 1 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 1 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. \ + * **IEC62196Type2CableAttached**: Type 2 connector as defined in the IEC 62196-2 standard. Provided as a cable and plug attached to the charging point \ + * **IEC62196Type2Outlet**: Type 2 connector as defined in the IEC 62196-2 standard. Provided as a socket set into the charging point. \ + * **IEC62196Type2CCS**: Type 2 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 2 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. \ + * **IEC62196Type3**: Type 3 connector as defined in the IEC 62196-2 standard. Also called Scame after the original manufacturer. Mostly used in combination with up to 240V single phase or up to 420V three phase infrastructure. \ + * **Chademo**: CHAdeMO connector named after an association formed by the Tokyo Electric Power Company and industrial partners. Because of this is is also known as the TEPCO's connector. It supports fast DC charging. \ + * **IEC60309AC1PhaseBlue**: Industrial Blue connector is a connector defined in the IEC 60309 standard. It is sometime referred to as by some combination of the standard, the color and the fact that is a single phase connector. The connector usually has the "P+N+E, 6h" configuration. \ + * **IEC60309DCWhite**: Industrial White connector is a DC connector defined in the IEC 60309 standard. \ + * **Tesla**: The Tesla connector is the regionally specific Tesla Supercharger connector. I.e. it refers to either Tesla's proprietary connector, sometimes referred to as Tesla Port mostly limited to North America or the modified Type 2 (DC over Type 2) in Europe. + */ +export type ConnectorSet = string; + +/** Known values of {@link OpeningHours} that the service accepts. */ +export const enum KnownOpeningHours { + /** Shows the hours of operation for the next week, starting with the current day in the local time of the POI. */ + NextSevenDays = "nextSevenDays" +} + +/** + * Defines values for OpeningHours. \ + * {@link KnownOpeningHours} can be used interchangeably with OpeningHours, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **nextSevenDays**: Shows the hours of operation for the next week, starting with the current day in the local time of the POI. + */ +export type OpeningHours = string; + +/** Known values of {@link EntityType} that the service accepts. */ +export const enum KnownEntityType { + /** Country name */ + Country = "Country", + /** State or Province */ + CountrySubdivision = "CountrySubdivision", + /** County */ + CountrySecondarySubdivision = "CountrySecondarySubdivision", + /** Named Area */ + CountryTertiarySubdivision = "CountryTertiarySubdivision", + /** City / Town */ + Municipality = "Municipality", + /** Sub / Super City */ + MunicipalitySubdivision = "MunicipalitySubdivision", + /** Neighbourhood */ + Neighbourhood = "Neighbourhood", + /** Postal Code / Zip Code */ + PostalCodeArea = "PostalCodeArea" +} + +/** + * Defines values for EntityType. \ + * {@link KnownEntityType} can be used interchangeably with EntityType, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **Country**: Country name \ + * **CountrySubdivision**: State or Province \ + * **CountrySecondarySubdivision**: County \ + * **CountryTertiarySubdivision**: Named Area \ + * **Municipality**: City \/ Town \ + * **MunicipalitySubdivision**: Sub \/ Super City \ + * **Neighbourhood**: Neighbourhood \ + * **PostalCodeArea**: Postal Code \/ Zip Code + */ +export type EntityType = string; + +/** Known values of {@link EntryPointType} that the service accepts. */ +export const enum KnownEntryPointType { + Main = "main", + Minor = "minor" +} + +/** + * Defines values for EntryPointType. \ + * {@link KnownEntryPointType} can be used interchangeably with EntryPointType, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **main** \ + * **minor** + */ +export type EntryPointType = string; + +/** Known values of {@link GeographicResourceLocation} that the service accepts. */ +export const enum KnownGeographicResourceLocation { + /** Used to access an Azure Maps Creator resource in the United States */ + Us = "us", + /** Used to access an Azure Maps Creator resource in Europe */ + Eu = "eu" +} + +/** + * Defines values for GeographicResourceLocation. \ + * {@link KnownGeographicResourceLocation} can be used interchangeably with GeographicResourceLocation, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **us**: Used to access an Azure Maps Creator resource in the United States \ + * **eu**: Used to access an Azure Maps Creator resource in Europe + */ +export type GeographicResourceLocation = string; + +/** Optional parameters. */ +export interface SearchGetSearchPolygonOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getSearchPolygon operation. */ +export type SearchGetSearchPolygonResponse = SearchPolygonResponse; + +/** Optional parameters. */ +export interface SearchGetSearchFuzzyOptionalParams + extends coreClient.OperationOptions { + /** Boolean. If the typeahead flag is set, the query will be interpreted as a partial input and the search will enter predictive mode */ + typeahead?: boolean; + /** Maximum number of responses that will be returned. Default: 10, minimum: 1 and maximum: 100 */ + limit?: number; + /** Starting offset of the returned results within the full result set. Default: 0, minimum: 0 and maximum: 1900 */ + ofs?: number; + /** + * A comma-separated list of category set IDs which could be used to restrict the result to specific Points of Interest categories. ID order does not matter. When multiple category identifiers are provided, only POIs that belong to (at least) one of the categories from the provided list will be returned. The list of supported categories can be discovered using  [POI Categories API](https://aka.ms/AzureMapsPOICategoryTree). Usage examples: + * + * * **categorySet=7315** (Search Points of Interest from category Restaurant) + * + * * **categorySet=7315025,7315017** (Search Points of Interest of category either Italian or French Restaurant) + */ + categorySet?: number[]; + /** Comma separated string of country codes, e.g. FR,ES. This will limit the search to the specified countries */ + countrySet?: string[]; + /** Latitude where results should be biased. E.g. 37.337 */ + lat?: number; + /** Longitude where results should be biased. E.g. -121.89 */ + lon?: number; + /** The radius in meters to for the results to be constrained to the defined area */ + radius?: number; + /** Top left position of the bounding box. E.g. 37.553,-122.453 */ + topLeft?: string; + /** Bottom right position of the bounding box. E.g. 37.553,-122.453 */ + btmRight?: string; + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. + * + * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. + */ + language?: string; + /** + * Indexes for which extended postal codes should be included in the results. + * + * Available indexes are: + * + * **Addr** = Address ranges + * + * **Geo** = Geographies + * + * **PAD** = Point Addresses + * + * **POI** = Points of Interest + * + * **Str** = Streets + * + * **XStr** = Cross Streets (intersections) + * + * Value should be a comma separated list of index types (in any order) or **None** for no indexes. + * + * By default extended postal codes are included for all indexes except Geo. Extended postal code lists for geographies can be quite long so they have to be explicitly requested when needed. + * + * Usage examples: + * + * extendedPostalCodesFor=POI + * + * extendedPostalCodesFor=PAD,Addr,POI + * + * extendedPostalCodesFor=None + * + * Extended postal code is returned as an **extendedPostalCode** property of an address. Availability is region-dependent. + */ + extendedPostalCodesFor?: string; + /** + * Minimum fuzziness level to be used. Default: 1, minimum: 1 and maximum: 4 + * + * * Level 1 has no spell checking. + * + * * Level 2 uses normal n-gram spell checking. For example, query "restrant" can be matched to "restaurant." + * + * * Level 3 uses sound-like spell checking, and shingle spell checking. Sound-like spell checking is for "rstrnt" to "restaurant" matching. Shingle spell checking is for "mountainview" to "mountain view" matching. + * + * * Level 4 doesn’t add any more spell checking functions. + * + * + * + * The search engine will start looking for a match on the level defined by minFuzzyLevel, and will stop searching at the level specified by maxFuzzyLevel. + */ + minFuzzyLevel?: number; + /** + * Maximum fuzziness level to be used. Default: 2, minimum: 1 and maximum: 4 + * + * * Level 1 has no spell checking. + * + * * Level 2 uses normal n-gram spell checking. For example, query "restrant" can be matched to "restaurant." + * + * * Level 3 uses sound-like spell checking, and shingle spell checking. Sound-like spell checking is for "rstrnt" to "restaurant" matching. Shingle spell checking is for "mountainview" to "mountain view" matching. + * + * * Level 4 doesn’t add any more spell checking functions. + * + * + * + * The search engine will start looking for a match on the level defined by minFuzzyLevel, and will stop searching at the level specified by maxFuzzyLevel. + */ + maxFuzzyLevel?: number; + /** A comma separated list of indexes which should be utilized for the search. Item order does not matter. Available indexes are: Addr = Address range interpolation, Geo = Geographies, PAD = Point Addresses, POI = Points of interest, Str = Streets, Xstr = Cross Streets (intersections) */ + idxSet?: SearchIndexSet[]; + /** + * A comma-separated list of brand names which could be used to restrict the result to specific brands. Item order does not matter. When multiple brands are provided, only results that belong to (at least) one of the provided list will be returned. Brands that contain a "," in their name should be put into quotes. + * + * Usage examples: + * + * brandSet=Foo + * + * brandSet=Foo,Bar + * + * brandSet="A,B,C Comma",Bar + */ + brandSet?: string[]; + /** + * A comma-separated list of connector types which could be used to restrict the result to Electric Vehicle Station supporting specific connector types. Item order does not matter. When multiple connector types are provided, only results that belong to (at least) one of the provided list will be returned. + * + * Available connector types are: + * * `StandardHouseholdCountrySpecific` - These are the standard household connectors for a certain region. They are all AC single phase and the standard Voltage and standard Amperage. See also: [Plug & socket types - World Standards](https://www.worldstandards.eu/electricity/plugs-and-sockets). + * * `IEC62196Type1` - Type 1 connector as defined in the IEC 62196-2 standard. Also called Yazaki after the original manufacturer or SAE J1772 after the standard that first published it. Mostly used in combination with 120V single phase or up to 240V single phase infrastructure. + * * `IEC62196Type1CCS` - Type 1 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 1 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. + * * `IEC62196Type2CableAttached` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a cable and plug attached to the charging point. + * * `IEC62196Type2Outlet` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a socket set into the charging point. + * * `IEC62196Type2CCS` - Type 2 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 2 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. + * * `IEC62196Type3` - Type 3 connector as defined in the IEC 62196-2 standard. Also called Scame after the original manufacturer. Mostly used in combination with up to 240V single phase or up to 420V three phase infrastructure. + * * `Chademo` - CHAdeMO connector named after an association formed by the Tokyo Electric Power Company and industrial partners. Because of this is is also known as the TEPCO's connector. It supports fast DC charging. + * * `IEC60309AC1PhaseBlue` - Industrial Blue connector is a connector defined in the IEC 60309 standard. It is sometime referred to as by some combination of the standard, the color and the fact that is a single phase connector. The connector usually has the "P+N+E, 6h" configuration. + * * `IEC60309DCWhite` - Industrial White connector is a DC connector defined in the IEC 60309 standard. + * * `Tesla` - The Tesla connector is the regionally specific Tesla Supercharger connector. I.e. it refers to either Tesla's proprietary connector, sometimes referred to as Tesla Port mostly limited to North America or the modified Type 2 (DC over Type 2) in Europe. + * + * Usage examples: + * + * connectorSet=IEC62196Type2CableAttached + * connectorSet=IEC62196Type2Outlet,IEC62196Type2CableAttached + */ + connectorSet?: ConnectorSet[]; + /** + * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. + * + * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. + */ + view?: string; + /** + * Hours of operation for a POI (Points of Interest). The availability of hours of operation will vary based on the data available. + * Supported value: nextSevenDays + */ + openingHours?: OpeningHours; +} + +/** Contains response data for the getSearchFuzzy operation. */ +export type SearchGetSearchFuzzyResponse = SearchCommonResponse; + +/** Optional parameters. */ +export interface SearchGetSearchPOIOptionalParams + extends coreClient.OperationOptions { + /** Boolean. If the typeahead flag is set, the query will be interpreted as a partial input and the search will enter predictive mode */ + typeahead?: boolean; + /** Maximum number of responses that will be returned. Default: 10, minimum: 1 and maximum: 100 */ + limit?: number; + /** Starting offset of the returned results within the full result set. Default: 0, minimum: 0 and maximum: 1900 */ + ofs?: number; + /** + * A comma-separated list of category set IDs which could be used to restrict the result to specific Points of Interest categories. ID order does not matter. When multiple category identifiers are provided, only POIs that belong to (at least) one of the categories from the provided list will be returned. The list of supported categories can be discovered using  [POI Categories API](https://aka.ms/AzureMapsPOICategoryTree). Usage examples: + * + * * **categorySet=7315** (Search Points of Interest from category Restaurant) + * + * * **categorySet=7315025,7315017** (Search Points of Interest of category either Italian or French Restaurant) + */ + categorySet?: number[]; + /** Comma separated string of country codes, e.g. FR,ES. This will limit the search to the specified countries */ + countrySet?: string[]; + /** Latitude where results should be biased. E.g. 37.337 */ + lat?: number; + /** Longitude where results should be biased. E.g. -121.89 */ + lon?: number; + /** The radius in meters to for the results to be constrained to the defined area */ + radius?: number; + /** Top left position of the bounding box. E.g. 37.553,-122.453 */ + topLeft?: string; + /** Bottom right position of the bounding box. E.g. 37.553,-122.453 */ + btmRight?: string; + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. + * + * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. + */ + language?: string; + /** + * Indexes for which extended postal codes should be included in the results. + * + * Available indexes are: + * + * **POI** = Points of Interest + * + * Value should be **POI** or **None** to disable extended postal codes. + * + * By default extended postal codes are included. + * + * Usage examples: + * + * extendedPostalCodesFor=POI + * + * extendedPostalCodesFor=None + * + * Extended postal code is returned as an **extendedPostalCode** property of an address. Availability is region-dependent. + */ + extendedPostalCodesFor?: string; + /** + * A comma-separated list of brand names which could be used to restrict the result to specific brands. Item order does not matter. When multiple brands are provided, only results that belong to (at least) one of the provided list will be returned. Brands that contain a "," in their name should be put into quotes. + * + * Usage examples: + * + * brandSet=Foo + * + * brandSet=Foo,Bar + * + * brandSet="A,B,C Comma",Bar + */ + brandSet?: string[]; + /** + * A comma-separated list of connector types which could be used to restrict the result to Electric Vehicle Station supporting specific connector types. Item order does not matter. When multiple connector types are provided, only results that belong to (at least) one of the provided list will be returned. + * + * Available connector types are: + * * `StandardHouseholdCountrySpecific` - These are the standard household connectors for a certain region. They are all AC single phase and the standard Voltage and standard Amperage. See also: [Plug & socket types - World Standards](https://www.worldstandards.eu/electricity/plugs-and-sockets). + * * `IEC62196Type1` - Type 1 connector as defined in the IEC 62196-2 standard. Also called Yazaki after the original manufacturer or SAE J1772 after the standard that first published it. Mostly used in combination with 120V single phase or up to 240V single phase infrastructure. + * * `IEC62196Type1CCS` - Type 1 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 1 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. + * * `IEC62196Type2CableAttached` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a cable and plug attached to the charging point. + * * `IEC62196Type2Outlet` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a socket set into the charging point. + * * `IEC62196Type2CCS` - Type 2 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 2 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. + * * `IEC62196Type3` - Type 3 connector as defined in the IEC 62196-2 standard. Also called Scame after the original manufacturer. Mostly used in combination with up to 240V single phase or up to 420V three phase infrastructure. + * * `Chademo` - CHAdeMO connector named after an association formed by the Tokyo Electric Power Company and industrial partners. Because of this is is also known as the TEPCO's connector. It supports fast DC charging. + * * `IEC60309AC1PhaseBlue` - Industrial Blue connector is a connector defined in the IEC 60309 standard. It is sometime referred to as by some combination of the standard, the color and the fact that is a single phase connector. The connector usually has the "P+N+E, 6h" configuration. + * * `IEC60309DCWhite` - Industrial White connector is a DC connector defined in the IEC 60309 standard. + * * `Tesla` - The Tesla connector is the regionally specific Tesla Supercharger connector. I.e. it refers to either Tesla's proprietary connector, sometimes referred to as Tesla Port mostly limited to North America or the modified Type 2 (DC over Type 2) in Europe. + * + * Usage examples: + * + * connectorSet=IEC62196Type2CableAttached + * connectorSet=IEC62196Type2Outlet,IEC62196Type2CableAttached + */ + connectorSet?: ConnectorSet[]; + /** + * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. + * + * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. + */ + view?: string; + /** + * Hours of operation for a POI (Points of Interest). The availability of hours of operation will vary based on the data available. + * Supported value: nextSevenDays + */ + openingHours?: OpeningHours; +} + +/** Contains response data for the getSearchPOI operation. */ +export type SearchGetSearchPOIResponse = SearchCommonResponse; + +/** Optional parameters. */ +export interface SearchGetSearchNearbyOptionalParams + extends coreClient.OperationOptions { + /** Maximum number of responses that will be returned. Default: 10, minimum: 1 and maximum: 100 */ + limit?: number; + /** Starting offset of the returned results within the full result set. Default: 0, minimum: 0 and maximum: 1900 */ + ofs?: number; + /** + * A comma-separated list of category set IDs which could be used to restrict the result to specific Points of Interest categories. ID order does not matter. When multiple category identifiers are provided, only POIs that belong to (at least) one of the categories from the provided list will be returned. The list of supported categories can be discovered using  [POI Categories API](https://aka.ms/AzureMapsPOICategoryTree). Usage examples: + * + * * **categorySet=7315** (Search Points of Interest from category Restaurant) + * + * * **categorySet=7315025,7315017** (Search Points of Interest of category either Italian or French Restaurant) + */ + categorySet?: number[]; + /** Comma separated string of country codes, e.g. FR,ES. This will limit the search to the specified countries */ + countrySet?: string[]; + /** The radius in meters to for the results to be constrained to the defined area, Min value is 1, Max Value is 50000. */ + radius?: number; + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. + * + * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. + */ + language?: string; + /** + * Indexes for which extended postal codes should be included in the results. + * + * Available indexes are: + * + * **Addr** = Address ranges + * + * **Geo** = Geographies + * + * **PAD** = Point Addresses + * + * **POI** = Points of Interest + * + * **Str** = Streets + * + * **XStr** = Cross Streets (intersections) + * + * Value should be a comma separated list of index types (in any order) or **None** for no indexes. + * + * By default extended postal codes are included for all indexes except Geo. Extended postal code lists for geographies can be quite long so they have to be explicitly requested when needed. + * + * Usage examples: + * + * extendedPostalCodesFor=POI + * + * extendedPostalCodesFor=PAD,Addr,POI + * + * extendedPostalCodesFor=None + * + * Extended postal code is returned as an **extendedPostalCode** property of an address. Availability is region-dependent. + */ + extendedPostalCodesFor?: string; + /** + * A comma-separated list of brand names which could be used to restrict the result to specific brands. Item order does not matter. When multiple brands are provided, only results that belong to (at least) one of the provided list will be returned. Brands that contain a "," in their name should be put into quotes. + * + * Usage examples: + * + * brandSet=Foo + * + * brandSet=Foo,Bar + * + * brandSet="A,B,C Comma",Bar + */ + brandSet?: string[]; + /** + * A comma-separated list of connector types which could be used to restrict the result to Electric Vehicle Station supporting specific connector types. Item order does not matter. When multiple connector types are provided, only results that belong to (at least) one of the provided list will be returned. + * + * Available connector types are: + * * `StandardHouseholdCountrySpecific` - These are the standard household connectors for a certain region. They are all AC single phase and the standard Voltage and standard Amperage. See also: [Plug & socket types - World Standards](https://www.worldstandards.eu/electricity/plugs-and-sockets). + * * `IEC62196Type1` - Type 1 connector as defined in the IEC 62196-2 standard. Also called Yazaki after the original manufacturer or SAE J1772 after the standard that first published it. Mostly used in combination with 120V single phase or up to 240V single phase infrastructure. + * * `IEC62196Type1CCS` - Type 1 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 1 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. + * * `IEC62196Type2CableAttached` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a cable and plug attached to the charging point. + * * `IEC62196Type2Outlet` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a socket set into the charging point. + * * `IEC62196Type2CCS` - Type 2 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 2 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. + * * `IEC62196Type3` - Type 3 connector as defined in the IEC 62196-2 standard. Also called Scame after the original manufacturer. Mostly used in combination with up to 240V single phase or up to 420V three phase infrastructure. + * * `Chademo` - CHAdeMO connector named after an association formed by the Tokyo Electric Power Company and industrial partners. Because of this is is also known as the TEPCO's connector. It supports fast DC charging. + * * `IEC60309AC1PhaseBlue` - Industrial Blue connector is a connector defined in the IEC 60309 standard. It is sometime referred to as by some combination of the standard, the color and the fact that is a single phase connector. The connector usually has the "P+N+E, 6h" configuration. + * * `IEC60309DCWhite` - Industrial White connector is a DC connector defined in the IEC 60309 standard. + * * `Tesla` - The Tesla connector is the regionally specific Tesla Supercharger connector. I.e. it refers to either Tesla's proprietary connector, sometimes referred to as Tesla Port mostly limited to North America or the modified Type 2 (DC over Type 2) in Europe. + * + * Usage examples: + * + * connectorSet=IEC62196Type2CableAttached + * connectorSet=IEC62196Type2Outlet,IEC62196Type2CableAttached + */ + connectorSet?: ConnectorSet[]; + /** + * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. + * + * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. + */ + view?: string; +} + +/** Contains response data for the getSearchNearby operation. */ +export type SearchGetSearchNearbyResponse = SearchCommonResponse; + +/** Optional parameters. */ +export interface SearchGetSearchPOICategoryOptionalParams + extends coreClient.OperationOptions { + /** Boolean. If the typeahead flag is set, the query will be interpreted as a partial input and the search will enter predictive mode */ + typeahead?: boolean; + /** Maximum number of responses that will be returned. Default: 10, minimum: 1 and maximum: 100 */ + limit?: number; + /** Starting offset of the returned results within the full result set. Default: 0, minimum: 0 and maximum: 1900 */ + ofs?: number; + /** + * A comma-separated list of category set IDs which could be used to restrict the result to specific Points of Interest categories. ID order does not matter. When multiple category identifiers are provided, only POIs that belong to (at least) one of the categories from the provided list will be returned. The list of supported categories can be discovered using  [POI Categories API](https://aka.ms/AzureMapsPOICategoryTree). Usage examples: + * + * * **categorySet=7315** (Search Points of Interest from category Restaurant) + * + * * **categorySet=7315025,7315017** (Search Points of Interest of category either Italian or French Restaurant) + */ + categorySet?: number[]; + /** Comma separated string of country codes, e.g. FR,ES. This will limit the search to the specified countries */ + countrySet?: string[]; + /** Latitude where results should be biased. E.g. 37.337 */ + lat?: number; + /** Longitude where results should be biased. E.g. -121.89 */ + lon?: number; + /** The radius in meters to for the results to be constrained to the defined area */ + radius?: number; + /** Top left position of the bounding box. E.g. 37.553,-122.453 */ + topLeft?: string; + /** Bottom right position of the bounding box. E.g. 37.553,-122.453 */ + btmRight?: string; + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. + * + * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. + */ + language?: string; + /** + * Indexes for which extended postal codes should be included in the results. + * + * Available indexes are: + * + * **Addr** = Address ranges + * + * **Geo** = Geographies + * + * **PAD** = Point Addresses + * + * **POI** = Points of Interest + * + * **Str** = Streets + * + * **XStr** = Cross Streets (intersections) + * + * Value should be a comma separated list of index types (in any order) or **None** for no indexes. + * + * By default extended postal codes are included for all indexes except Geo. Extended postal code lists for geographies can be quite long so they have to be explicitly requested when needed. + * + * Usage examples: + * + * extendedPostalCodesFor=POI + * + * extendedPostalCodesFor=PAD,Addr,POI + * + * extendedPostalCodesFor=None + * + * Extended postal code is returned as an **extendedPostalCode** property of an address. Availability is region-dependent. + */ + extendedPostalCodesFor?: string; + /** + * A comma-separated list of brand names which could be used to restrict the result to specific brands. Item order does not matter. When multiple brands are provided, only results that belong to (at least) one of the provided list will be returned. Brands that contain a "," in their name should be put into quotes. + * + * Usage examples: + * + * brandSet=Foo + * + * brandSet=Foo,Bar + * + * brandSet="A,B,C Comma",Bar + */ + brandSet?: string[]; + /** + * A comma-separated list of connector types which could be used to restrict the result to Electric Vehicle Station supporting specific connector types. Item order does not matter. When multiple connector types are provided, only results that belong to (at least) one of the provided list will be returned. + * + * Available connector types are: + * * `StandardHouseholdCountrySpecific` - These are the standard household connectors for a certain region. They are all AC single phase and the standard Voltage and standard Amperage. See also: [Plug & socket types - World Standards](https://www.worldstandards.eu/electricity/plugs-and-sockets). + * * `IEC62196Type1` - Type 1 connector as defined in the IEC 62196-2 standard. Also called Yazaki after the original manufacturer or SAE J1772 after the standard that first published it. Mostly used in combination with 120V single phase or up to 240V single phase infrastructure. + * * `IEC62196Type1CCS` - Type 1 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 1 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. + * * `IEC62196Type2CableAttached` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a cable and plug attached to the charging point. + * * `IEC62196Type2Outlet` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a socket set into the charging point. + * * `IEC62196Type2CCS` - Type 2 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 2 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. + * * `IEC62196Type3` - Type 3 connector as defined in the IEC 62196-2 standard. Also called Scame after the original manufacturer. Mostly used in combination with up to 240V single phase or up to 420V three phase infrastructure. + * * `Chademo` - CHAdeMO connector named after an association formed by the Tokyo Electric Power Company and industrial partners. Because of this is is also known as the TEPCO's connector. It supports fast DC charging. + * * `IEC60309AC1PhaseBlue` - Industrial Blue connector is a connector defined in the IEC 60309 standard. It is sometime referred to as by some combination of the standard, the color and the fact that is a single phase connector. The connector usually has the "P+N+E, 6h" configuration. + * * `IEC60309DCWhite` - Industrial White connector is a DC connector defined in the IEC 60309 standard. + * * `Tesla` - The Tesla connector is the regionally specific Tesla Supercharger connector. I.e. it refers to either Tesla's proprietary connector, sometimes referred to as Tesla Port mostly limited to North America or the modified Type 2 (DC over Type 2) in Europe. + * + * Usage examples: + * + * connectorSet=IEC62196Type2CableAttached + * connectorSet=IEC62196Type2Outlet,IEC62196Type2CableAttached + */ + connectorSet?: ConnectorSet[]; + /** + * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. + * + * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. + */ + view?: string; + /** + * Hours of operation for a POI (Points of Interest). The availability of hours of operation will vary based on the data available. + * Supported value: nextSevenDays + */ + openingHours?: OpeningHours; +} + +/** Contains response data for the getSearchPOICategory operation. */ +export type SearchGetSearchPOICategoryResponse = SearchCommonResponse; + +/** Optional parameters. */ +export interface SearchGetSearchPOICategoryTreePreviewOptionalParams + extends coreClient.OperationOptions { + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, except NGT and NGT-Latn. Language tag is case insensitive. When data in specified language is not available for a specific field, default language is used (English). + * + * Please refer to [Supported Languages](https://docs.microsoft.com/azure/azure-maps/supported-languages) for details. + */ + language?: string; +} + +/** Contains response data for the getSearchPOICategoryTreePreview operation. */ +export type SearchGetSearchPOICategoryTreePreviewResponse = SearchPoiCategoryTreeResponse; + +/** Optional parameters. */ +export interface SearchGetSearchAddressOptionalParams + extends coreClient.OperationOptions { + /** Boolean. If the typeahead flag is set, the query will be interpreted as a partial input and the search will enter predictive mode */ + typeahead?: boolean; + /** Maximum number of responses that will be returned. Default: 10, minimum: 1 and maximum: 100 */ + limit?: number; + /** Starting offset of the returned results within the full result set. Default: 0, minimum: 0 and maximum: 1900 */ + ofs?: number; + /** Comma separated string of country codes, e.g. FR,ES. This will limit the search to the specified countries */ + countrySet?: string[]; + /** Latitude where results should be biased. E.g. 37.337 */ + lat?: number; + /** Longitude where results should be biased. E.g. -121.89 */ + lon?: number; + /** The radius in meters to for the results to be constrained to the defined area */ + radius?: number; + /** Top left position of the bounding box. E.g. 37.553,-122.453 */ + topLeft?: string; + /** Bottom right position of the bounding box. E.g. 37.553,-122.453 */ + btmRight?: string; + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. + * + * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. + */ + language?: string; + /** + * Indexes for which extended postal codes should be included in the results. + * + * Available indexes are: + * + * **Addr** = Address ranges + * + * **Geo** = Geographies + * + * **PAD** = Point Addresses + * + * **POI** = Points of Interest + * + * **Str** = Streets + * + * **XStr** = Cross Streets (intersections) + * + * Value should be a comma separated list of index types (in any order) or **None** for no indexes. + * + * By default extended postal codes are included for all indexes except Geo. Extended postal code lists for geographies can be quite long so they have to be explicitly requested when needed. + * + * Usage examples: + * + * extendedPostalCodesFor=POI + * + * extendedPostalCodesFor=PAD,Addr,POI + * + * extendedPostalCodesFor=None + * + * Extended postal code is returned as an **extendedPostalCode** property of an address. Availability is region-dependent. + */ + extendedPostalCodesFor?: string; + /** + * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. + * + * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. + */ + view?: string; +} + +/** Contains response data for the getSearchAddress operation. */ +export type SearchGetSearchAddressResponse = SearchCommonResponse; + +/** Optional parameters. */ +export interface SearchGetSearchAddressReverseOptionalParams + extends coreClient.OperationOptions { + /** The radius in meters to for the results to be constrained to the defined area */ + radius?: number; + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. + * + * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. + */ + language?: string; + /** + * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. + * + * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. + */ + view?: string; + /** Boolean. To enable return of the posted speed limit */ + returnSpeedLimit?: boolean; + /** The directional heading of the vehicle in degrees, for travel along a segment of roadway. 0 is North, 90 is East and so on, values range from -360 to 360. The precision can include upto one decimal place */ + heading?: number; + /** If a number is sent in along with the request, the response may include the side of the street (Left/Right) and also an offset position for that number */ + numberParam?: string; + /** Boolean. To enable return of the road use array for reverse geocodes at street level */ + returnRoadUse?: boolean; + /** To restrict reverse geocodes to a certain type of road use. The road use array for reverse geocodes can be one or more of LimitedAccess, Arterial, Terminal, Ramp, Rotary, LocalStreet */ + roadUse?: string; + /** + * Format of newlines in the formatted address. + * + * If true, the address will contain newlines. + * If false, newlines will be converted to commas. + */ + allowFreeformNewline?: boolean; + /** Include information on the type of match the geocoder achieved in the response. */ + returnMatchType?: boolean; + /** + * Specifies the level of filtering performed on geographies. Narrows the search for specified geography entity types, e.g. return only municipality. The resulting response will contain the geography ID as well as the entity type matched. If you provide more than one entity as a comma separated list, endpoint will return the 'smallest entity available'. Returned Geometry ID can be used to get the geometry of that geography via [Get Search Polygon](https://docs.microsoft.com/rest/api/maps/search/getsearchpolygon) API. The following parameters are ignored when entityType is set: + * + * * heading + * * number + * * returnRoadUse + * * returnSpeedLimit + * * roadUse + * * returnMatchType + */ + entityType?: EntityType; +} + +/** Contains response data for the getSearchAddressReverse operation. */ +export type SearchGetSearchAddressReverseResponse = SearchAddressReverseResponse; + +/** Optional parameters. */ +export interface SearchGetSearchAddressReverseCrossStreetOptionalParams + extends coreClient.OperationOptions { + /** Maximum number of responses that will be returned. Default: 10, minimum: 1 and maximum: 100 */ + limit?: number; + /** The radius in meters to for the results to be constrained to the defined area */ + radius?: number; + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. + * + * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. + */ + language?: string; + /** + * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. + * + * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. + */ + view?: string; + /** The directional heading of the vehicle in degrees, for travel along a segment of roadway. 0 is North, 90 is East and so on, values range from -360 to 360. The precision can include upto one decimal place */ + heading?: number; +} + +/** Contains response data for the getSearchAddressReverseCrossStreet operation. */ +export type SearchGetSearchAddressReverseCrossStreetResponse = SearchAddressReverseCrossStreetResponse; + +/** Optional parameters. */ +export interface SearchGetSearchAddressStructuredOptionalParams + extends coreClient.OperationOptions { + /** Maximum number of responses that will be returned. Default: 10, minimum: 1 and maximum: 100 */ + limit?: number; + /** Starting offset of the returned results within the full result set. Default: 0, minimum: 0 and maximum: 1900 */ + ofs?: number; + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. + * + * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. + */ + language?: string; + /** + * Indexes for which extended postal codes should be included in the results. + * + * Available indexes are: + * + * **Addr** = Address ranges + * + * **Geo** = Geographies + * + * **PAD** = Point Addresses + * + * **POI** = Points of Interest + * + * **Str** = Streets + * + * **XStr** = Cross Streets (intersections) + * + * Value should be a comma separated list of index types (in any order) or **None** for no indexes. + * + * By default extended postal codes are included for all indexes except Geo. Extended postal code lists for geographies can be quite long so they have to be explicitly requested when needed. + * + * Usage examples: + * + * extendedPostalCodesFor=POI + * + * extendedPostalCodesFor=PAD,Addr,POI + * + * extendedPostalCodesFor=None + * + * Extended postal code is returned as an **extendedPostalCode** property of an address. Availability is region-dependent. + */ + extendedPostalCodesFor?: string; + /** + * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. + * + * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. + */ + view?: string; + /** The 2 or 3 letter [ISO3166-1](https://www.iso.org/iso-3166-country-codes.html) country code portion of an address. E.g. US. */ + countryCode?: string; + /** The street number portion of an address */ + streetNumber?: string; + /** The street name portion of an address */ + streetName?: string; + /** The cross street name for the structured address */ + crossStreet?: string; + /** The municipality portion of an address */ + municipality?: string; + /** The municipality subdivision (sub/super city) for the structured address */ + municipalitySubdivision?: string; + /** The named area for the structured address */ + countryTertiarySubdivision?: string; + /** The county for the structured address */ + countrySecondarySubdivision?: string; + /** The country subdivision portion of an address */ + countrySubdivision?: string; + /** The postal code portion of an address */ + postalCode?: string; +} + +/** Contains response data for the getSearchAddressStructured operation. */ +export type SearchGetSearchAddressStructuredResponse = SearchCommonResponse; + +/** Optional parameters. */ +export interface SearchPostSearchInsideGeometryOptionalParams + extends coreClient.OperationOptions { + /** Maximum number of responses that will be returned. Default: 10, minimum: 1 and maximum: 100 */ + limit?: number; + /** + * A comma-separated list of category set IDs which could be used to restrict the result to specific Points of Interest categories. ID order does not matter. When multiple category identifiers are provided, only POIs that belong to (at least) one of the categories from the provided list will be returned. The list of supported categories can be discovered using  [POI Categories API](https://aka.ms/AzureMapsPOICategoryTree). Usage examples: + * + * * **categorySet=7315** (Search Points of Interest from category Restaurant) + * + * * **categorySet=7315025,7315017** (Search Points of Interest of category either Italian or French Restaurant) + */ + categorySet?: number[]; + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. + * + * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. + */ + language?: string; + /** + * Indexes for which extended postal codes should be included in the results. + * + * Available indexes are: + * + * **Addr** = Address ranges + * + * **Geo** = Geographies + * + * **PAD** = Point Addresses + * + * **POI** = Points of Interest + * + * **Str** = Streets + * + * **XStr** = Cross Streets (intersections) + * + * Value should be a comma separated list of index types (in any order) or **None** for no indexes. + * + * By default extended postal codes are included for all indexes except Geo. Extended postal code lists for geographies can be quite long so they have to be explicitly requested when needed. + * + * Usage examples: + * + * extendedPostalCodesFor=POI + * + * extendedPostalCodesFor=PAD,Addr,POI + * + * extendedPostalCodesFor=None + * + * Extended postal code is returned as an **extendedPostalCode** property of an address. Availability is region-dependent. + */ + extendedPostalCodesFor?: string; + /** A comma separated list of indexes which should be utilized for the search. Item order does not matter. Available indexes are: Addr = Address range interpolation, Geo = Geographies, PAD = Point Addresses, POI = Points of interest, Str = Streets, Xstr = Cross Streets (intersections) */ + idxSet?: SearchIndexSet[]; + /** + * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. + * + * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. + */ + view?: string; + /** + * Hours of operation for a POI (Points of Interest). The availability of hours of operation will vary based on the data available. + * Supported value: nextSevenDays + */ + openingHours?: OpeningHours; +} + +/** Contains response data for the postSearchInsideGeometry operation. */ +export type SearchPostSearchInsideGeometryResponse = SearchCommonResponse; + +/** Optional parameters. */ +export interface SearchPostSearchAlongRouteOptionalParams + extends coreClient.OperationOptions { + /** + * A comma-separated list of category set IDs which could be used to restrict the result to specific Points of Interest categories. ID order does not matter. When multiple category identifiers are provided, only POIs that belong to (at least) one of the categories from the provided list will be returned. The list of supported categories can be discovered using  [POI Categories API](https://aka.ms/AzureMapsPOICategoryTree). Usage examples: + * + * * **categorySet=7315** (Search Points of Interest from category Restaurant) + * + * * **categorySet=7315025,7315017** (Search Points of Interest of category either Italian or French Restaurant) + */ + categorySet?: number[]; + /** + * A comma-separated list of brand names which could be used to restrict the result to specific brands. Item order does not matter. When multiple brands are provided, only results that belong to (at least) one of the provided list will be returned. Brands that contain a "," in their name should be put into quotes. + * + * Usage examples: + * + * brandSet=Foo + * + * brandSet=Foo,Bar + * + * brandSet="A,B,C Comma",Bar + */ + brandSet?: string[]; + /** + * A comma-separated list of connector types which could be used to restrict the result to Electric Vehicle Station supporting specific connector types. Item order does not matter. When multiple connector types are provided, only results that belong to (at least) one of the provided list will be returned. + * + * Available connector types are: + * * `StandardHouseholdCountrySpecific` - These are the standard household connectors for a certain region. They are all AC single phase and the standard Voltage and standard Amperage. See also: [Plug & socket types - World Standards](https://www.worldstandards.eu/electricity/plugs-and-sockets). + * * `IEC62196Type1` - Type 1 connector as defined in the IEC 62196-2 standard. Also called Yazaki after the original manufacturer or SAE J1772 after the standard that first published it. Mostly used in combination with 120V single phase or up to 240V single phase infrastructure. + * * `IEC62196Type1CCS` - Type 1 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 1 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. + * * `IEC62196Type2CableAttached` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a cable and plug attached to the charging point. + * * `IEC62196Type2Outlet` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a socket set into the charging point. + * * `IEC62196Type2CCS` - Type 2 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 2 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. + * * `IEC62196Type3` - Type 3 connector as defined in the IEC 62196-2 standard. Also called Scame after the original manufacturer. Mostly used in combination with up to 240V single phase or up to 420V three phase infrastructure. + * * `Chademo` - CHAdeMO connector named after an association formed by the Tokyo Electric Power Company and industrial partners. Because of this is is also known as the TEPCO's connector. It supports fast DC charging. + * * `IEC60309AC1PhaseBlue` - Industrial Blue connector is a connector defined in the IEC 60309 standard. It is sometime referred to as by some combination of the standard, the color and the fact that is a single phase connector. The connector usually has the "P+N+E, 6h" configuration. + * * `IEC60309DCWhite` - Industrial White connector is a DC connector defined in the IEC 60309 standard. + * * `Tesla` - The Tesla connector is the regionally specific Tesla Supercharger connector. I.e. it refers to either Tesla's proprietary connector, sometimes referred to as Tesla Port mostly limited to North America or the modified Type 2 (DC over Type 2) in Europe. + * + * Usage examples: + * + * connectorSet=IEC62196Type2CableAttached + * connectorSet=IEC62196Type2Outlet,IEC62196Type2CableAttached + */ + connectorSet?: ConnectorSet[]; + /** + * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. + * + * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. + */ + view?: string; + /** + * Hours of operation for a POI (Points of Interest). The availability of hours of operation will vary based on the data available. + * Supported value: nextSevenDays + */ + openingHours?: OpeningHours; + /** Maximum number of responses that will be returned. Default value is 10. Max value is 20 */ + limit?: number; +} + +/** Contains response data for the postSearchAlongRoute operation. */ +export type SearchPostSearchAlongRouteResponse = SearchCommonResponse; + +/** Optional parameters. */ +export interface SearchPostSearchFuzzyBatchSyncOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the postSearchFuzzyBatchSync operation. */ +export type SearchPostSearchFuzzyBatchSyncResponse = SearchFuzzyBatchResponse; + +/** Optional parameters. */ +export interface SearchPostSearchFuzzyBatchOptionalParams + extends coreClient.OperationOptions { + /** Delay to wait until next poll, in milliseconds. */ + updateIntervalInMs?: number; + /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ + resumeFrom?: string; +} + +/** Contains response data for the postSearchFuzzyBatch operation. */ +export type SearchPostSearchFuzzyBatchResponse = SearchFuzzyBatchResponse; + +/** Optional parameters. */ +export interface SearchPostSearchAddressBatchSyncOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the postSearchAddressBatchSync operation. */ +export type SearchPostSearchAddressBatchSyncResponse = SearchAddressBatchResponse; + +/** Optional parameters. */ +export interface SearchPostSearchAddressBatchOptionalParams + extends coreClient.OperationOptions { + /** Delay to wait until next poll, in milliseconds. */ + updateIntervalInMs?: number; + /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ + resumeFrom?: string; +} + +/** Contains response data for the postSearchAddressBatch operation. */ +export type SearchPostSearchAddressBatchResponse = SearchAddressBatchResponse; + +/** Optional parameters. */ +export interface SearchPostSearchAddressReverseBatchSyncOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the postSearchAddressReverseBatchSync operation. */ +export type SearchPostSearchAddressReverseBatchSyncResponse = SearchAddressReverseBatchResponse; + +/** Optional parameters. */ +export interface SearchPostSearchAddressReverseBatchOptionalParams + extends coreClient.OperationOptions { + /** Delay to wait until next poll, in milliseconds. */ + updateIntervalInMs?: number; + /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ + resumeFrom?: string; +} + +/** Contains response data for the postSearchAddressReverseBatch operation. */ +export type SearchPostSearchAddressReverseBatchResponse = SearchAddressReverseBatchResponse; + +/** Optional parameters. */ +export interface SearchClientOptionalParams + extends coreClient.ServiceClientOptions { + /** This parameter specifies where the Azure Maps Creator resource is located. Valid values are us and eu. */ + geography?: Geography; + /** Specifies which account is intended for usage in conjunction with the Azure AD security model. It represents a unique ID for the Azure Maps account and can be retrieved from the Azure Maps management plane Account API. To use Azure AD security in Azure Maps see the following [articles](https://aka.ms/amauthdetails) for guidance. */ + xMsClientId?: string; + /** Api Version */ + apiVersion?: string; + /** Overrides client endpoint. */ + endpoint?: string; +} diff --git a/sdk/maps/maps-search/src/models/mappers.ts b/sdk/maps/maps-search/src/models/mappers.ts new file mode 100644 index 000000000000..f0620fd60902 --- /dev/null +++ b/sdk/maps/maps-search/src/models/mappers.ts @@ -0,0 +1,1893 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; + +export const SearchPolygonResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchPolygonResponse", + modelProperties: { + additionalData: { + serializedName: "additionalData", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "SearchPolygonResult" + } + } + } + } + } + } +}; + +export const SearchPolygonResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchPolygonResult", + modelProperties: { + providerID: { + serializedName: "providerID", + readOnly: true, + type: { + name: "String" + } + }, + error: { + serializedName: "error", + readOnly: true, + type: { + name: "String" + } + }, + geometryData: { + serializedName: "geometryData", + type: { + name: "Composite", + className: "GeoJsonObject" + } + } + } + } +}; + +export const GeoJsonObject: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonObject", + uberParent: "GeoJsonObject", + polymorphicDiscriminator: { + serializedName: "type", + clientName: "type" + }, + modelProperties: { + type: { + serializedName: "type", + required: true, + type: { + name: "String" + } + } + } + } +}; + +export const ErrorResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorResponse", + modelProperties: { + error: { + serializedName: "error", + type: { + name: "Composite", + className: "ErrorDetail" + } + } + } + } +}; + +export const ErrorDetail: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorDetail", + modelProperties: { + code: { + serializedName: "code", + readOnly: true, + type: { + name: "String" + } + }, + message: { + serializedName: "message", + readOnly: true, + type: { + name: "String" + } + }, + target: { + serializedName: "target", + readOnly: true, + type: { + name: "String" + } + }, + details: { + serializedName: "details", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ErrorDetail" + } + } + } + }, + additionalInfo: { + serializedName: "additionalInfo", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ErrorAdditionalInfo" + } + } + } + } + } + } +}; + +export const ErrorAdditionalInfo: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorAdditionalInfo", + modelProperties: { + type: { + serializedName: "type", + readOnly: true, + type: { + name: "String" + } + }, + info: { + serializedName: "info", + readOnly: true, + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } + } + } +}; + +export const SearchCommonResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchCommonResponse", + modelProperties: { + summary: { + serializedName: "summary", + type: { + name: "Composite", + className: "SearchCommonSummary" + } + }, + results: { + serializedName: "results", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "SearchCommonResult" + } + } + } + } + } + } +}; + +export const SearchCommonSummary: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchCommonSummary", + modelProperties: { + query: { + serializedName: "query", + readOnly: true, + type: { + name: "String" + } + }, + queryType: { + serializedName: "queryType", + readOnly: true, + type: { + name: "String" + } + }, + queryTime: { + serializedName: "queryTime", + readOnly: true, + type: { + name: "Number" + } + }, + numResults: { + serializedName: "numResults", + readOnly: true, + type: { + name: "Number" + } + }, + limit: { + serializedName: "limit", + readOnly: true, + type: { + name: "Number" + } + }, + offset: { + serializedName: "offset", + readOnly: true, + type: { + name: "Number" + } + }, + totalResults: { + serializedName: "totalResults", + readOnly: true, + type: { + name: "Number" + } + }, + fuzzyLevel: { + serializedName: "fuzzyLevel", + readOnly: true, + type: { + name: "Number" + } + }, + geoBias: { + serializedName: "geoBias", + type: { + name: "Composite", + className: "SearchCommonSummaryGeoBias" + } + } + } + } +}; + +export const CoordinatesPairAbbreviated: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "CoordinatesPairAbbreviated", + modelProperties: { + lat: { + serializedName: "lat", + type: { + name: "Number" + } + }, + lon: { + serializedName: "lon", + type: { + name: "Number" + } + } + } + } +}; + +export const SearchCommonResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchCommonResult", + modelProperties: { + type: { + serializedName: "type", + readOnly: true, + type: { + name: "String" + } + }, + id: { + serializedName: "id", + readOnly: true, + type: { + name: "String" + } + }, + score: { + serializedName: "score", + readOnly: true, + type: { + name: "Number" + } + }, + dist: { + serializedName: "dist", + readOnly: true, + type: { + name: "Number" + } + }, + info: { + serializedName: "info", + readOnly: true, + type: { + name: "String" + } + }, + entityType: { + serializedName: "entityType", + type: { + name: "String" + } + }, + poi: { + serializedName: "poi", + type: { + name: "Composite", + className: "SearchResultPoi" + } + }, + address: { + serializedName: "address", + type: { + name: "Composite", + className: "SearchResultAddress" + } + }, + position: { + serializedName: "position", + type: { + name: "Composite", + className: "CoordinatesPairAbbreviated" + } + }, + viewport: { + serializedName: "viewport", + type: { + name: "Composite", + className: "SearchResultViewport" + } + }, + entryPoints: { + serializedName: "entryPoints", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "SearchResultEntryPoint" + } + } + } + }, + addressRanges: { + serializedName: "addressRanges", + type: { + name: "Composite", + className: "SearchResultAddressRanges" + } + }, + dataSources: { + serializedName: "dataSources", + type: { + name: "Composite", + className: "DataSources" + } + }, + matchType: { + serializedName: "matchType", + readOnly: true, + type: { + name: "String" + } + }, + detourTime: { + serializedName: "detourTime", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const SearchResultPoi: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchResultPoi", + modelProperties: { + name: { + serializedName: "name", + readOnly: true, + type: { + name: "String" + } + }, + phone: { + serializedName: "phone", + readOnly: true, + type: { + name: "String" + } + }, + url: { + serializedName: "url", + readOnly: true, + type: { + name: "String" + } + }, + categorySet: { + serializedName: "categorySet", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "SearchResultPoiCategorySet" + } + } + } + }, + categories: { + serializedName: "categories", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + classifications: { + serializedName: "classifications", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "SearchResultPoiClassification" + } + } + } + }, + brands: { + serializedName: "brands", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "SearchResultPoiBrand" + } + } + } + }, + openingHours: { + serializedName: "openingHours", + type: { + name: "Composite", + className: "SearchResultPoiOpeningHours" + } + } + } + } +}; + +export const SearchResultPoiCategorySet: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchResultPoiCategorySet", + modelProperties: { + id: { + serializedName: "id", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const SearchResultPoiClassification: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchResultPoiClassification", + modelProperties: { + code: { + serializedName: "code", + readOnly: true, + type: { + name: "String" + } + }, + names: { + serializedName: "names", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "SearchResultPoiClassificationName" + } + } + } + } + } + } +}; + +export const SearchResultPoiClassificationName: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchResultPoiClassificationName", + modelProperties: { + nameLocale: { + serializedName: "nameLocale", + readOnly: true, + type: { + name: "String" + } + }, + name: { + serializedName: "name", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const SearchResultPoiBrand: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchResultPoiBrand", + modelProperties: { + name: { + serializedName: "name", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const SearchResultPoiOpeningHours: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchResultPoiOpeningHours", + modelProperties: { + mode: { + serializedName: "mode", + readOnly: true, + type: { + name: "String" + } + }, + timeRanges: { + serializedName: "timeRanges", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "SearchResultPoiOpeningHoursTimeRange" + } + } + } + } + } + } +}; + +export const SearchResultPoiOpeningHoursTimeRange: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchResultPoiOpeningHoursTimeRange", + modelProperties: { + startTime: { + serializedName: "startTime", + type: { + name: "Composite", + className: "SearchResultPoiOpeningHoursTimeRangeTime" + } + }, + endTime: { + serializedName: "endTime", + type: { + name: "Composite", + className: "SearchResultPoiOpeningHoursTimeRangeTime" + } + } + } + } +}; + +export const SearchResultPoiOpeningHoursTimeRangeTime: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchResultPoiOpeningHoursTimeRangeTime", + modelProperties: { + date: { + serializedName: "date", + readOnly: true, + type: { + name: "String" + } + }, + hour: { + serializedName: "hour", + readOnly: true, + type: { + name: "Number" + } + }, + minute: { + serializedName: "minute", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const SearchResultAddress: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchResultAddress", + modelProperties: { + buildingNumber: { + serializedName: "buildingNumber", + readOnly: true, + type: { + name: "String" + } + }, + street: { + serializedName: "street", + readOnly: true, + type: { + name: "String" + } + }, + crossStreet: { + serializedName: "crossStreet", + readOnly: true, + type: { + name: "String" + } + }, + streetNumber: { + serializedName: "streetNumber", + readOnly: true, + type: { + name: "String" + } + }, + routeNumbers: { + serializedName: "routeNumbers", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + }, + streetName: { + serializedName: "streetName", + readOnly: true, + type: { + name: "String" + } + }, + streetNameAndNumber: { + serializedName: "streetNameAndNumber", + readOnly: true, + type: { + name: "String" + } + }, + municipality: { + serializedName: "municipality", + readOnly: true, + type: { + name: "String" + } + }, + municipalitySubdivision: { + serializedName: "municipalitySubdivision", + readOnly: true, + type: { + name: "String" + } + }, + countryTertiarySubdivision: { + serializedName: "countryTertiarySubdivision", + readOnly: true, + type: { + name: "String" + } + }, + countrySecondarySubdivision: { + serializedName: "countrySecondarySubdivision", + readOnly: true, + type: { + name: "String" + } + }, + countrySubdivision: { + serializedName: "countrySubdivision", + readOnly: true, + type: { + name: "String" + } + }, + postalCode: { + serializedName: "postalCode", + readOnly: true, + type: { + name: "String" + } + }, + extendedPostalCode: { + serializedName: "extendedPostalCode", + readOnly: true, + type: { + name: "String" + } + }, + countryCode: { + serializedName: "countryCode", + readOnly: true, + type: { + name: "String" + } + }, + country: { + serializedName: "country", + readOnly: true, + type: { + name: "String" + } + }, + countryCodeISO3: { + serializedName: "countryCodeISO3", + readOnly: true, + type: { + name: "String" + } + }, + freeformAddress: { + serializedName: "freeformAddress", + readOnly: true, + type: { + name: "String" + } + }, + countrySubdivisionName: { + serializedName: "countrySubdivisionName", + readOnly: true, + type: { + name: "String" + } + }, + localName: { + serializedName: "localName", + readOnly: true, + type: { + name: "String" + } + }, + boundingBox: { + serializedName: "boundingBox", + readOnly: true, + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } + } + } +}; + +export const SearchResultViewport: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchResultViewport", + modelProperties: { + topLeftPoint: { + serializedName: "topLeftPoint", + type: { + name: "Composite", + className: "CoordinatesPairAbbreviated" + } + }, + btmRightPoint: { + serializedName: "btmRightPoint", + type: { + name: "Composite", + className: "CoordinatesPairAbbreviated" + } + } + } + } +}; + +export const SearchResultEntryPoint: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchResultEntryPoint", + modelProperties: { + type: { + serializedName: "type", + readOnly: true, + type: { + name: "String" + } + }, + position: { + serializedName: "position", + type: { + name: "Composite", + className: "CoordinatesPairAbbreviated" + } + } + } + } +}; + +export const SearchResultAddressRanges: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchResultAddressRanges", + modelProperties: { + rangeLeft: { + serializedName: "rangeLeft", + type: { + name: "String" + } + }, + rangeRight: { + serializedName: "rangeRight", + type: { + name: "String" + } + }, + from: { + serializedName: "from", + type: { + name: "Composite", + className: "CoordinatesPairAbbreviated" + } + }, + to: { + serializedName: "to", + type: { + name: "Composite", + className: "CoordinatesPairAbbreviated" + } + } + } + } +}; + +export const DataSources: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "DataSources", + modelProperties: { + geometry: { + serializedName: "geometry", + type: { + name: "Composite", + className: "DataSourcesGeometry" + } + } + } + } +}; + +export const DataSourcesGeometry: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "DataSourcesGeometry", + modelProperties: { + id: { + serializedName: "id", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const SearchPoiCategoryTreeResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchPoiCategoryTreeResponse", + modelProperties: { + poiCategories: { + serializedName: "poiCategories", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "PoiCategoryResult" + } + } + } + } + } + } +}; + +export const PoiCategoryResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "PoiCategoryResult", + modelProperties: { + id: { + serializedName: "id", + readOnly: true, + type: { + name: "Number" + } + }, + name: { + serializedName: "name", + readOnly: true, + type: { + name: "String" + } + }, + childCategoryIds: { + serializedName: "childCategoryIds", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + }, + synonyms: { + serializedName: "synonyms", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + } + } + } +}; + +export const SearchAddressReverseResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchAddressReverseResponse", + modelProperties: { + summary: { + serializedName: "summary", + type: { + name: "Composite", + className: "SearchCommonSummary" + } + }, + addresses: { + serializedName: "addresses", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "SearchAddressReverseResult" + } + } + } + } + } + } +}; + +export const SearchAddressReverseResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchAddressReverseResult", + modelProperties: { + address: { + serializedName: "address", + type: { + name: "Composite", + className: "SearchResultAddress" + } + }, + position: { + serializedName: "position", + readOnly: true, + type: { + name: "String" + } + }, + matchType: { + serializedName: "matchType", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const SearchAddressReverseCrossStreetResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchAddressReverseCrossStreetResponse", + modelProperties: { + summary: { + serializedName: "summary", + type: { + name: "Composite", + className: "SearchCommonSummary" + } + }, + addresses: { + serializedName: "addresses", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "SearchAddressReverseCrossStreetResult" + } + } + } + } + } + } +}; + +export const SearchAddressReverseCrossStreetResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchAddressReverseCrossStreetResult", + modelProperties: { + address: { + serializedName: "address", + type: { + name: "Composite", + className: "SearchResultAddress" + } + }, + position: { + serializedName: "position", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const SearchInsideGeometryRequestBody: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchInsideGeometryRequestBody", + modelProperties: { + geometry: { + serializedName: "geometry", + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } + } + } +}; + +export const SearchAlongRouteRequestBody: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchAlongRouteRequestBody", + modelProperties: { + route: { + serializedName: "route", + type: { + name: "Composite", + className: "GeoJsonLineString" + } + } + } + } +}; + +export const GeoJsonLineStringData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonLineStringData", + modelProperties: { + coordinates: { + serializedName: "coordinates", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } + } + } +}; + +export const BatchRequestBody: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "BatchRequestBody", + modelProperties: { + batchItems: { + serializedName: "batchItems", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "BatchRequestBodyBatchItemsItem" + } + } + } + } + } + } +}; + +export const BatchRequestBodyBatchItemsItem: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "BatchRequestBodyBatchItemsItem", + modelProperties: { + query: { + serializedName: "query", + type: { + name: "String" + } + } + } + } +}; + +export const BatchResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "BatchResponse", + modelProperties: { + summary: { + serializedName: "summary", + type: { + name: "Composite", + className: "BatchResponseSummary" + } + } + } + } +}; + +export const BatchResponseSummary: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "BatchResponseSummary", + modelProperties: { + successfulRequests: { + serializedName: "successfulRequests", + readOnly: true, + type: { + name: "Number" + } + }, + totalRequests: { + serializedName: "totalRequests", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const BatchItem: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "BatchItem", + modelProperties: { + statusCode: { + serializedName: "statusCode", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const SearchSummaryGeoBias: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchSummaryGeoBias", + modelProperties: { + lat: { + serializedName: "lat", + readOnly: true, + type: { + name: "Number" + } + }, + lon: { + serializedName: "lon", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const GeoJsonPointData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonPointData", + modelProperties: { + coordinates: { + serializedName: "coordinates", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } +}; + +export const GeoJsonMultiPointData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonMultiPointData", + modelProperties: { + coordinates: { + serializedName: "coordinates", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } + } + } +}; + +export const GeoJsonMultiLineStringData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonMultiLineStringData", + modelProperties: { + coordinates: { + serializedName: "coordinates", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } + } + } + } + } +}; + +export const GeoJsonPolygonData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonPolygonData", + modelProperties: { + coordinates: { + serializedName: "coordinates", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } + } + } + } + } +}; + +export const GeoJsonMultiPolygonData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonMultiPolygonData", + modelProperties: { + coordinates: { + serializedName: "coordinates", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + } + } + } + } + } + } + } + } + } +}; + +export const GeoJsonGeometryCollectionData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonGeometryCollectionData", + modelProperties: { + geometries: { + serializedName: "geometries", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "GeoJsonGeometry" + } + } + } + } + } + } +}; + +export const GeoJsonFeatureData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonFeatureData", + modelProperties: { + geometry: { + serializedName: "geometry", + type: { + name: "Composite", + className: "GeoJsonGeometry" + } + }, + properties: { + serializedName: "properties", + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + }, + id: { + serializedName: "id", + type: { + name: "String" + } + }, + featureType: { + serializedName: "featureType", + type: { + name: "String" + } + } + } + } +}; + +export const GeoJsonFeatureCollectionData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "GeoJsonFeatureCollectionData", + modelProperties: { + features: { + serializedName: "features", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "GeoJsonFeature" + } + } + } + } + } + } +}; + +export const GeoJsonGeometry: coreClient.CompositeMapper = { + serializedName: "GeoJsonGeometry", + type: { + name: "Composite", + className: "GeoJsonGeometry", + uberParent: "GeoJsonObject", + polymorphicDiscriminator: { + serializedName: "type", + clientName: "type" + }, + modelProperties: { + ...GeoJsonObject.type.modelProperties + } + } +}; + +export const GeoJsonFeature: coreClient.CompositeMapper = { + serializedName: "Feature", + type: { + name: "Composite", + className: "GeoJsonFeature", + uberParent: "GeoJsonObject", + polymorphicDiscriminator: GeoJsonObject.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonObject.type.modelProperties, + ...GeoJsonFeatureData.type.modelProperties + } + } +}; + +export const GeoJsonFeatureCollection: coreClient.CompositeMapper = { + serializedName: "FeatureCollection", + type: { + name: "Composite", + className: "GeoJsonFeatureCollection", + uberParent: "GeoJsonObject", + polymorphicDiscriminator: GeoJsonObject.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonObject.type.modelProperties, + ...GeoJsonFeatureCollectionData.type.modelProperties + } + } +}; + +export const SearchFuzzyBatchItemResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchFuzzyBatchItemResponse", + modelProperties: { + ...SearchCommonResponse.type.modelProperties, + ...ErrorResponse.type.modelProperties + } + } +}; + +export const SearchAddressBatchItemResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchAddressBatchItemResponse", + modelProperties: { + ...SearchCommonResponse.type.modelProperties, + ...ErrorResponse.type.modelProperties + } + } +}; + +export const SearchAddressReverseBatchItemResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchAddressReverseBatchItemResponse", + modelProperties: { + ...SearchAddressReverseResponse.type.modelProperties, + ...ErrorResponse.type.modelProperties + } + } +}; + +export const SearchCommonSummaryGeoBias: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchCommonSummaryGeoBias", + modelProperties: { + ...CoordinatesPairAbbreviated.type.modelProperties + } + } +}; + +export const GeoJsonLineString: coreClient.CompositeMapper = { + serializedName: "LineString", + type: { + name: "Composite", + className: "GeoJsonLineString", + uberParent: "GeoJsonLineStringData", + polymorphicDiscriminator: + GeoJsonLineStringData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonLineStringData.type.modelProperties + } + } +}; + +export const SearchFuzzyBatchResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchFuzzyBatchResponse", + modelProperties: { + ...BatchResponse.type.modelProperties, + batchItems: { + serializedName: "batchItems", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "SearchFuzzyBatchItem" + } + } + } + } + } + } +}; + +export const SearchAddressBatchResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchAddressBatchResponse", + modelProperties: { + ...BatchResponse.type.modelProperties, + batchItems: { + serializedName: "batchItems", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "SearchAddressBatchItem" + } + } + } + } + } + } +}; + +export const SearchAddressReverseBatchResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchAddressReverseBatchResponse", + modelProperties: { + ...BatchResponse.type.modelProperties, + batchItems: { + serializedName: "batchItems", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "SearchAddressReverseBatchItem" + } + } + } + } + } + } +}; + +export const SearchFuzzyBatchItem: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchFuzzyBatchItem", + modelProperties: { + ...BatchItem.type.modelProperties, + response: { + serializedName: "response", + type: { + name: "Composite", + className: "SearchFuzzyBatchItemResponse" + } + } + } + } +}; + +export const SearchAddressBatchItem: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchAddressBatchItem", + modelProperties: { + ...BatchItem.type.modelProperties, + response: { + serializedName: "response", + type: { + name: "Composite", + className: "SearchAddressBatchItemResponse" + } + } + } + } +}; + +export const SearchAddressReverseBatchItem: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchAddressReverseBatchItem", + modelProperties: { + ...BatchItem.type.modelProperties, + response: { + serializedName: "response", + type: { + name: "Composite", + className: "SearchAddressReverseBatchItemResponse" + } + } + } + } +}; + +export const GeoJsonPoint: coreClient.CompositeMapper = { + serializedName: "Point", + type: { + name: "Composite", + className: "GeoJsonPoint", + uberParent: "GeoJsonPointData", + polymorphicDiscriminator: GeoJsonPointData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonPointData.type.modelProperties + } + } +}; + +export const GeoJsonMultiPoint: coreClient.CompositeMapper = { + serializedName: "MultiPoint", + type: { + name: "Composite", + className: "GeoJsonMultiPoint", + uberParent: "GeoJsonMultiPointData", + polymorphicDiscriminator: + GeoJsonMultiPointData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonMultiPointData.type.modelProperties + } + } +}; + +export const GeoJsonMultiLineString: coreClient.CompositeMapper = { + serializedName: "MultiLineString", + type: { + name: "Composite", + className: "GeoJsonMultiLineString", + uberParent: "GeoJsonMultiLineStringData", + polymorphicDiscriminator: + GeoJsonMultiLineStringData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonMultiLineStringData.type.modelProperties + } + } +}; + +export const GeoJsonPolygon: coreClient.CompositeMapper = { + serializedName: "Polygon", + type: { + name: "Composite", + className: "GeoJsonPolygon", + uberParent: "GeoJsonPolygonData", + polymorphicDiscriminator: GeoJsonPolygonData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonPolygonData.type.modelProperties + } + } +}; + +export const GeoJsonMultiPolygon: coreClient.CompositeMapper = { + serializedName: "MultiPolygon", + type: { + name: "Composite", + className: "GeoJsonMultiPolygon", + uberParent: "GeoJsonMultiPolygonData", + polymorphicDiscriminator: + GeoJsonMultiPolygonData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonMultiPolygonData.type.modelProperties + } + } +}; + +export const GeoJsonGeometryCollection: coreClient.CompositeMapper = { + serializedName: "GeometryCollection", + type: { + name: "Composite", + className: "GeoJsonGeometryCollection", + uberParent: "GeoJsonGeometryCollectionData", + polymorphicDiscriminator: + GeoJsonGeometryCollectionData.type.polymorphicDiscriminator, + modelProperties: { + ...GeoJsonGeometry.type.modelProperties, + ...GeoJsonGeometryCollectionData.type.modelProperties + } + } +}; + +export const SearchPostSearchFuzzyBatchHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchPostSearchFuzzyBatchHeaders", + modelProperties: { + location: { + serializedName: "location", + type: { + name: "String" + } + } + } + } +}; + +export const SearchPostSearchAddressBatchHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchPostSearchAddressBatchHeaders", + modelProperties: { + location: { + serializedName: "location", + type: { + name: "String" + } + } + } + } +}; + +export const SearchPostSearchAddressReverseBatchHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SearchPostSearchAddressReverseBatchHeaders", + modelProperties: { + location: { + serializedName: "location", + type: { + name: "String" + } + } + } + } +}; + +export let discriminators = { + GeoJsonObject: GeoJsonObject, + "GeoJsonObject.GeoJsonGeometry": GeoJsonGeometry, + "GeoJsonObject.Feature": GeoJsonFeature, + "GeoJsonObject.FeatureCollection": GeoJsonFeatureCollection, + "GeoJsonLineStringData.LineString": GeoJsonLineString, + "GeoJsonPointData.Point": GeoJsonPoint, + "GeoJsonMultiPointData.MultiPoint": GeoJsonMultiPoint, + "GeoJsonMultiLineStringData.MultiLineString": GeoJsonMultiLineString, + "GeoJsonPolygonData.Polygon": GeoJsonPolygon, + "GeoJsonMultiPolygonData.MultiPolygon": GeoJsonMultiPolygon, + "GeoJsonGeometryCollectionData.GeometryCollection": GeoJsonGeometryCollection +}; diff --git a/sdk/maps/maps-search/src/models/parameters.ts b/sdk/maps/maps-search/src/models/parameters.ts new file mode 100644 index 000000000000..49166b71eea2 --- /dev/null +++ b/sdk/maps/maps-search/src/models/parameters.ts @@ -0,0 +1,620 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { + OperationParameter, + OperationURLParameter, + OperationQueryParameter +} from "@azure/core-client"; +import { + SearchInsideGeometryRequestBody as SearchInsideGeometryRequestBodyMapper, + SearchAlongRouteRequestBody as SearchAlongRouteRequestBodyMapper, + BatchRequestBody as BatchRequestBodyMapper +} from "../models/mappers"; + +export const accept: OperationParameter = { + parameterPath: "accept", + mapper: { + defaultValue: "application/json", + isConstant: true, + serializedName: "Accept", + type: { + name: "String" + } + } +}; + +export const geography: OperationURLParameter = { + parameterPath: "geography", + mapper: { + serializedName: "geography", + required: true, + type: { + name: "String" + } + } +}; + +export const xMsClientId: OperationParameter = { + parameterPath: "xMsClientId", + mapper: { + serializedName: "x-ms-client-id", + type: { + name: "String" + } + } +}; + +export const apiVersion: OperationQueryParameter = { + parameterPath: "apiVersion", + mapper: { + defaultValue: "1.0", + isConstant: true, + serializedName: "api-version", + type: { + name: "String" + } + } +}; + +export const format: OperationURLParameter = { + parameterPath: "format", + mapper: { + serializedName: "format", + required: true, + type: { + name: "String" + } + } +}; + +export const geometries: OperationQueryParameter = { + parameterPath: "geometries", + mapper: { + serializedName: "geometries", + required: true, + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + collectionFormat: "CSV" +}; + +export const format1: OperationURLParameter = { + parameterPath: "format", + mapper: { + serializedName: "format", + required: true, + type: { + name: "String" + } + } +}; + +export const query: OperationQueryParameter = { + parameterPath: "query", + mapper: { + serializedName: "query", + required: true, + type: { + name: "String" + } + } +}; + +export const typeahead: OperationQueryParameter = { + parameterPath: ["options", "typeahead"], + mapper: { + serializedName: "typeahead", + type: { + name: "Boolean" + } + } +}; + +export const limit: OperationQueryParameter = { + parameterPath: ["options", "limit"], + mapper: { + constraints: { + InclusiveMaximum: 100, + InclusiveMinimum: 1 + }, + serializedName: "limit", + type: { + name: "Number" + } + } +}; + +export const ofs: OperationQueryParameter = { + parameterPath: ["options", "ofs"], + mapper: { + constraints: { + InclusiveMaximum: 1900, + InclusiveMinimum: 0 + }, + serializedName: "ofs", + type: { + name: "Number" + } + } +}; + +export const categorySet: OperationQueryParameter = { + parameterPath: ["options", "categorySet"], + mapper: { + serializedName: "categorySet", + type: { + name: "Sequence", + element: { + type: { + name: "Number" + } + } + } + }, + collectionFormat: "CSV" +}; + +export const countrySet: OperationQueryParameter = { + parameterPath: ["options", "countrySet"], + mapper: { + serializedName: "countrySet", + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + collectionFormat: "CSV" +}; + +export const lat: OperationQueryParameter = { + parameterPath: ["options", "lat"], + mapper: { + serializedName: "lat", + type: { + name: "Number" + } + } +}; + +export const lon: OperationQueryParameter = { + parameterPath: ["options", "lon"], + mapper: { + serializedName: "lon", + type: { + name: "Number" + } + } +}; + +export const radius: OperationQueryParameter = { + parameterPath: ["options", "radius"], + mapper: { + serializedName: "radius", + type: { + name: "Number" + } + } +}; + +export const topLeft: OperationQueryParameter = { + parameterPath: ["options", "topLeft"], + mapper: { + serializedName: "topLeft", + type: { + name: "String" + } + } +}; + +export const btmRight: OperationQueryParameter = { + parameterPath: ["options", "btmRight"], + mapper: { + serializedName: "btmRight", + type: { + name: "String" + } + } +}; + +export const language: OperationQueryParameter = { + parameterPath: ["options", "language"], + mapper: { + serializedName: "language", + type: { + name: "String" + } + } +}; + +export const extendedPostalCodesFor: OperationQueryParameter = { + parameterPath: ["options", "extendedPostalCodesFor"], + mapper: { + serializedName: "extendedPostalCodesFor", + type: { + name: "String" + } + } +}; + +export const minFuzzyLevel: OperationQueryParameter = { + parameterPath: ["options", "minFuzzyLevel"], + mapper: { + constraints: { + InclusiveMaximum: 4, + InclusiveMinimum: 1 + }, + serializedName: "minFuzzyLevel", + type: { + name: "Number" + } + } +}; + +export const maxFuzzyLevel: OperationQueryParameter = { + parameterPath: ["options", "maxFuzzyLevel"], + mapper: { + constraints: { + InclusiveMaximum: 4, + InclusiveMinimum: 1 + }, + serializedName: "maxFuzzyLevel", + type: { + name: "Number" + } + } +}; + +export const idxSet: OperationQueryParameter = { + parameterPath: ["options", "idxSet"], + mapper: { + serializedName: "idxSet", + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + collectionFormat: "CSV" +}; + +export const brandSet: OperationQueryParameter = { + parameterPath: ["options", "brandSet"], + mapper: { + serializedName: "brandSet", + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + collectionFormat: "CSV" +}; + +export const connectorSet: OperationQueryParameter = { + parameterPath: ["options", "connectorSet"], + mapper: { + serializedName: "connectorSet", + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + collectionFormat: "CSV" +}; + +export const view: OperationQueryParameter = { + parameterPath: ["options", "view"], + mapper: { + serializedName: "view", + type: { + name: "String" + } + } +}; + +export const openingHours: OperationQueryParameter = { + parameterPath: ["options", "openingHours"], + mapper: { + serializedName: "openingHours", + type: { + name: "String" + } + } +}; + +export const lat1: OperationQueryParameter = { + parameterPath: "lat", + mapper: { + serializedName: "lat", + required: true, + type: { + name: "Number" + } + } +}; + +export const lon1: OperationQueryParameter = { + parameterPath: "lon", + mapper: { + serializedName: "lon", + required: true, + type: { + name: "Number" + } + } +}; + +export const returnSpeedLimit: OperationQueryParameter = { + parameterPath: ["options", "returnSpeedLimit"], + mapper: { + serializedName: "returnSpeedLimit", + type: { + name: "Boolean" + } + } +}; + +export const heading: OperationQueryParameter = { + parameterPath: ["options", "heading"], + mapper: { + constraints: { + InclusiveMaximum: 360, + InclusiveMinimum: -360 + }, + serializedName: "heading", + type: { + name: "Number" + } + } +}; + +export const numberParam: OperationQueryParameter = { + parameterPath: ["options", "numberParam"], + mapper: { + serializedName: "number", + type: { + name: "String" + } + } +}; + +export const returnRoadUse: OperationQueryParameter = { + parameterPath: ["options", "returnRoadUse"], + mapper: { + serializedName: "returnRoadUse", + type: { + name: "Boolean" + } + } +}; + +export const roadUse: OperationQueryParameter = { + parameterPath: ["options", "roadUse"], + mapper: { + serializedName: "roadUse", + type: { + name: "String" + } + } +}; + +export const allowFreeformNewline: OperationQueryParameter = { + parameterPath: ["options", "allowFreeformNewline"], + mapper: { + serializedName: "allowFreeformNewline", + type: { + name: "Boolean" + } + } +}; + +export const returnMatchType: OperationQueryParameter = { + parameterPath: ["options", "returnMatchType"], + mapper: { + serializedName: "returnMatchType", + type: { + name: "Boolean" + } + } +}; + +export const entityType: OperationQueryParameter = { + parameterPath: ["options", "entityType"], + mapper: { + serializedName: "entityType", + type: { + name: "String" + } + } +}; + +export const countryCode: OperationQueryParameter = { + parameterPath: ["options", "countryCode"], + mapper: { + defaultValue: "US", + serializedName: "countryCode", + type: { + name: "String" + } + } +}; + +export const streetNumber: OperationQueryParameter = { + parameterPath: ["options", "streetNumber"], + mapper: { + serializedName: "streetNumber", + type: { + name: "String" + } + } +}; + +export const streetName: OperationQueryParameter = { + parameterPath: ["options", "streetName"], + mapper: { + serializedName: "streetName", + type: { + name: "String" + } + } +}; + +export const crossStreet: OperationQueryParameter = { + parameterPath: ["options", "crossStreet"], + mapper: { + serializedName: "crossStreet", + type: { + name: "String" + } + } +}; + +export const municipality: OperationQueryParameter = { + parameterPath: ["options", "municipality"], + mapper: { + serializedName: "municipality", + type: { + name: "String" + } + } +}; + +export const municipalitySubdivision: OperationQueryParameter = { + parameterPath: ["options", "municipalitySubdivision"], + mapper: { + serializedName: "municipalitySubdivision", + type: { + name: "String" + } + } +}; + +export const countryTertiarySubdivision: OperationQueryParameter = { + parameterPath: ["options", "countryTertiarySubdivision"], + mapper: { + serializedName: "countryTertiarySubdivision", + type: { + name: "String" + } + } +}; + +export const countrySecondarySubdivision: OperationQueryParameter = { + parameterPath: ["options", "countrySecondarySubdivision"], + mapper: { + serializedName: "countrySecondarySubdivision", + type: { + name: "String" + } + } +}; + +export const countrySubdivision: OperationQueryParameter = { + parameterPath: ["options", "countrySubdivision"], + mapper: { + serializedName: "countrySubdivision", + type: { + name: "String" + } + } +}; + +export const postalCode: OperationQueryParameter = { + parameterPath: ["options", "postalCode"], + mapper: { + serializedName: "postalCode", + type: { + name: "String" + } + } +}; + +export const contentType: OperationParameter = { + parameterPath: ["options", "contentType"], + mapper: { + defaultValue: "application/json", + isConstant: true, + serializedName: "Content-Type", + type: { + name: "String" + } + } +}; + +export const searchInsideGeometryRequestBody: OperationParameter = { + parameterPath: "searchInsideGeometryRequestBody", + mapper: SearchInsideGeometryRequestBodyMapper +}; + +export const searchAlongRouteRequestBody: OperationParameter = { + parameterPath: "searchAlongRouteRequestBody", + mapper: SearchAlongRouteRequestBodyMapper +}; + +export const maxDetourTime: OperationQueryParameter = { + parameterPath: "maxDetourTime", + mapper: { + constraints: { + InclusiveMaximum: 3600 + }, + serializedName: "maxDetourTime", + required: true, + type: { + name: "Number" + } + } +}; + +export const limit1: OperationQueryParameter = { + parameterPath: ["options", "limit"], + mapper: { + constraints: { + InclusiveMaximum: 20 + }, + serializedName: "limit", + type: { + name: "Number" + } + } +}; + +export const searchFuzzyBatchRequestBody: OperationParameter = { + parameterPath: "searchFuzzyBatchRequestBody", + mapper: BatchRequestBodyMapper +}; + +export const searchAddressBatchRequestBody: OperationParameter = { + parameterPath: "searchAddressBatchRequestBody", + mapper: BatchRequestBodyMapper +}; + +export const searchAddressReverseBatchRequestBody: OperationParameter = { + parameterPath: "searchAddressReverseBatchRequestBody", + mapper: BatchRequestBodyMapper +}; diff --git a/sdk/maps/maps-search/src/operations/index.ts b/sdk/maps/maps-search/src/operations/index.ts new file mode 100644 index 000000000000..3ff28b477242 --- /dev/null +++ b/sdk/maps/maps-search/src/operations/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./search"; diff --git a/sdk/maps/maps-search/src/operations/search.ts b/sdk/maps/maps-search/src/operations/search.ts new file mode 100644 index 000000000000..94a8bc0734ba --- /dev/null +++ b/sdk/maps/maps-search/src/operations/search.ts @@ -0,0 +1,2899 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { Search } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; +import * as Mappers from "../models/mappers"; +import * as Parameters from "../models/parameters"; +import { SearchClientContext } from "../searchClientContext"; +import { LROPoller, shouldDeserializeLRO } from "../lro"; +import { PollerLike, PollOperationState } from "@azure/core-lro"; +import { + ResponseFormat, + SearchGetSearchPolygonOptionalParams, + SearchGetSearchPolygonResponse, + TextFormat, + SearchGetSearchFuzzyOptionalParams, + SearchGetSearchFuzzyResponse, + SearchGetSearchPOIOptionalParams, + SearchGetSearchPOIResponse, + SearchGetSearchNearbyOptionalParams, + SearchGetSearchNearbyResponse, + SearchGetSearchPOICategoryOptionalParams, + SearchGetSearchPOICategoryResponse, + SearchGetSearchPOICategoryTreePreviewOptionalParams, + SearchGetSearchPOICategoryTreePreviewResponse, + SearchGetSearchAddressOptionalParams, + SearchGetSearchAddressResponse, + SearchGetSearchAddressReverseOptionalParams, + SearchGetSearchAddressReverseResponse, + SearchGetSearchAddressReverseCrossStreetOptionalParams, + SearchGetSearchAddressReverseCrossStreetResponse, + SearchGetSearchAddressStructuredOptionalParams, + SearchGetSearchAddressStructuredResponse, + SearchInsideGeometryRequestBody, + SearchPostSearchInsideGeometryOptionalParams, + SearchPostSearchInsideGeometryResponse, + SearchAlongRouteRequestBody, + SearchPostSearchAlongRouteOptionalParams, + SearchPostSearchAlongRouteResponse, + BatchRequestBody, + SearchPostSearchFuzzyBatchSyncOptionalParams, + SearchPostSearchFuzzyBatchSyncResponse, + SearchPostSearchFuzzyBatchOptionalParams, + SearchPostSearchFuzzyBatchResponse, + SearchPostSearchAddressBatchSyncOptionalParams, + SearchPostSearchAddressBatchSyncResponse, + SearchPostSearchAddressBatchOptionalParams, + SearchPostSearchAddressBatchResponse, + SearchPostSearchAddressReverseBatchSyncOptionalParams, + SearchPostSearchAddressReverseBatchSyncResponse, + SearchPostSearchAddressReverseBatchOptionalParams, + SearchPostSearchAddressReverseBatchResponse +} from "../models"; + +/** Class representing a Search. */ +export class SearchImpl implements Search { + private readonly client: SearchClientContext; + + /** + * Initialize a new instance of the class Search class. + * @param client Reference to the service client + */ + constructor(client: SearchClientContext) { + this.client = client; + } + + /** + * **Get Polygon** + * + * + * **Applies to**: S1 pricing tier. + * + * + * The Get Polygon service allows you to request the geometry data such as a city or country outline + * for a set of entities, previously retrieved from an Online Search request in GeoJSON format. The + * geometry ID is returned in the dataSources object under "geometry" and "id" in either a Search + * Address or Search Fuzzy call. + * + * Please note that any geometry ID retrieved from an Online Search endpoint has a limited lifetime. + * The client should not store geometry IDs in persistent storage for later referral, as the stability + * of these identifiers is not guaranteed for a long period of time. It is expected that a request to + * the Polygon method is made within a few minutes of the request to the Online Search method that + * provided the ID. The service allows for batch requests up to 20 identifiers. + * @param format Desired format of the response. Only `json` format is supported. + * @param geometries Comma separated list of geometry UUIDs, previously retrieved from an Online Search + * request. + * @param options The options parameters. + */ + getSearchPolygon( + format: ResponseFormat, + geometries: string[], + options?: SearchGetSearchPolygonOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, geometries, options }, + getSearchPolygonOperationSpec + ); + } + + /** + * **Free Form Search** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * The basic default API is Free Form Search which handles the most fuzzy of inputs handling any + * combination of address or POI tokens. This search API is the canonical 'single line search'. The + * Free Form Search API is a seamless combination of POI search and geocoding. The API can also be + * weighted with a contextual position (lat./lon. pair), or fully constrained by a coordinate and + * radius, or it can be executed more generally without any geo biasing anchor point.

We + * strongly advise you to use the 'countrySet' parameter to specify only the countries for which your + * application needs coverage, as the default behavior will be to search the entire world, potentially + * returning unnecessary results.

E.g.: `countrySet`=US,FR

Please see [Search + * Coverage](https://docs.microsoft.com/azure/location-based-services/geocoding-coverage) for a + * complete list of all the supported countries.

Most Search queries default to + * `maxFuzzyLevel`=2 to gain performance and also reduce unusual results. This new default can be + * overridden as needed per request by passing in the query param `maxFuzzyLevel`=3 or 4. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The applicable query string (e.g., "seattle", "pizza"). Can _also_ be specified as a + * comma separated string composed by latitude followed by longitude (e.g., "47.641268, -122.125679"). + * Must be properly URL encoded. + * @param options The options parameters. + */ + getSearchFuzzy( + format: TextFormat, + query: string, + options?: SearchGetSearchFuzzyOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getSearchFuzzyOperationSpec + ); + } + + /** + * **Get POI by Name** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Points of Interest (POI) Search allows you to request POI results by name. Search supports + * additional query parameters such as language and filtering results by area of interest driven by + * country or bounding box. Endpoint will return only POI results matching the query string. Response + * includes POI details such as address, coordinate location and category. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The POI name to search for (e.g., "statue of liberty", "starbucks"), must be properly + * URL encoded. + * @param options The options parameters. + */ + getSearchPOI( + format: TextFormat, + query: string, + options?: SearchGetSearchPOIOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getSearchPOIOperationSpec + ); + } + + /** + * **Nearby Search** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * If you have a use case for only retrieving POI results around a specific location, the nearby search + * method may be the right choice. This endpoint will only return POI results, and does not take in a + * search query parameter. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param lat Latitude where results should be biased. E.g. 37.337. + * @param lon Longitude where results should be biased. E.g. -121.89. + * @param options The options parameters. + */ + getSearchNearby( + format: TextFormat, + lat: number, + lon: number, + options?: SearchGetSearchNearbyOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, lat, lon, options }, + getSearchNearbyOperationSpec + ); + } + + /** + * **Get POI by Category** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Points of Interest (POI) Category Search allows you to request POI results from given category. + * Search allows to query POIs from one category at a time. Endpoint will only return POI results + * which are categorized as specified. Response includes POI details such as address, coordinate + * location and classification. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The POI category to search for (e.g., "AIRPORT", "RESTAURANT"), must be properly URL + * encoded. Supported main categories can be requested by calling [Get Search POI Category Tree + * API](https://aka.ms/AzureMapsPOICategoryTree). List of available categories can also be found + * [here](https://docs.microsoft.com/azure/azure-maps/supported-search-categories). We recommend to use + * POI Search Category Tree API to request the supported categories. + * @param options The options parameters. + */ + getSearchPOICategory( + format: TextFormat, + query: string, + options?: SearchGetSearchPOICategoryOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getSearchPOICategoryOperationSpec + ); + } + + /** + * **Get POI Category Tree** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * POI Category API provides a full list of supported Points of Interest (POI) categories and + * subcategories together with their translations and synonyms. The returned content can be used to + * provide more meaningful results through other Search Service APIs, like [Get Search + * POI](https://docs.microsoft.com/rest/api/maps/search/getsearchpoi). + * @param format Desired format of the response. Only `json` format is supported. + * @param options The options parameters. + */ + getSearchPOICategoryTreePreview( + format: ResponseFormat, + options?: SearchGetSearchPOICategoryTreePreviewOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, options }, + getSearchPOICategoryTreePreviewOperationSpec + ); + } + + /** + * **Address Geocoding** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * In many cases, the complete search service might be too much, for instance if you are only + * interested in traditional geocoding. Search can also be accessed for address look up exclusively. + * The geocoding is performed by hitting the geocode endpoint with just the address or partial address + * in question. The geocoding search index will be queried for everything above the street level data. + * No POIs will be returned. Note that the geocoder is very tolerant of typos and incomplete addresses. + * It will also handle everything from exact street addresses or street or intersections as well as + * higher level geographies such as city centers, counties, states etc. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The address to search for (e.g., "1 Microsoft way, Redmond, WA"), must be properly URL + * encoded. + * @param options The options parameters. + */ + getSearchAddress( + format: TextFormat, + query: string, + options?: SearchGetSearchAddressOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getSearchAddressOperationSpec + ); + } + + /** + * **Reverse Geocode to an Address** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * There may be times when you need to translate a coordinate (example: 37.786505, -122.3862) into a + * human understandable street address. Most often this is needed in tracking applications where you + * receive a GPS feed from the device or asset and wish to know what address where the coordinate is + * located. This endpoint will return address information for a given coordinate. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The applicable query specified as a comma separated string composed by latitude + * followed by longitude e.g. "47.641268,-122.125679". + * @param options The options parameters. + */ + getSearchAddressReverse( + format: TextFormat, + query: string, + options?: SearchGetSearchAddressReverseOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getSearchAddressReverseOperationSpec + ); + } + + /** + * **Reverse Geocode to a Cross Street** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * There may be times when you need to translate a coordinate (example: 37.786505, -122.3862) into a + * human understandable cross street. Most often this is needed in tracking applications where you + * receive a GPS feed from the device or asset and wish to know what address where the coordinate is + * located. + * This endpoint will return cross street information for a given coordinate. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The applicable query specified as a comma separated string composed by latitude + * followed by longitude e.g. "47.641268,-122.125679". + * @param options The options parameters. + */ + getSearchAddressReverseCrossStreet( + format: TextFormat, + query: string, + options?: SearchGetSearchAddressReverseCrossStreetOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getSearchAddressReverseCrossStreetOperationSpec + ); + } + + /** + * **Structured Address Geocoding** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Azure Address Geocoding can also be accessed for structured address look up exclusively. The + * geocoding search index will be queried for everything above the street level data. No POIs will be + * returned. Note that the geocoder is very tolerant of typos and incomplete addresses. It will also + * handle everything from exact street addresses or street or intersections as well as higher level + * geographies such as city centers, counties, states etc. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param options The options parameters. + */ + getSearchAddressStructured( + format: TextFormat, + options?: SearchGetSearchAddressStructuredOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, options }, + getSearchAddressStructuredOperationSpec + ); + } + + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * The Search Geometry endpoint allows you to perform a free form search inside a single geometry or + * many of them. The search results that fall inside the geometry/geometries will be + * returned.

To send the geometry you will use a `POST` request where the request body will + * contain the `geometry` object represented as a `GeoJSON` type and the `Content-Type` header will be + * set to `application/json`. The geographical features to be searched can be modeled as Polygon and/or + * Circle geometries represented using any one of the following `GeoJSON` types:

.

+ * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The POI name to search for (e.g., "statue of liberty", "starbucks", "pizza"). Must be + * properly URL encoded. + * @param searchInsideGeometryRequestBody This represents the geometry for one or more geographical + * features (parks, state boundary etc.) to search in and should be a GeoJSON compliant type. Please + * refer to [RFC 7946](https://tools.ietf.org/html/rfc7946) for details. + * @param options The options parameters. + */ + postSearchInsideGeometry( + format: TextFormat, + query: string, + searchInsideGeometryRequestBody: SearchInsideGeometryRequestBody, + options?: SearchPostSearchInsideGeometryOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, searchInsideGeometryRequestBody, options }, + postSearchInsideGeometryOperationSpec + ); + } + + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * The Search Along Route endpoint allows you to perform a fuzzy search for POIs along a specified + * route. This search is constrained by specifying the `maxDetourTime` limiting measure.

To send + * the route-points you will use a `POST` request where the request body will contain the `route` + * object represented as a `GeoJSON LineString` type and the `Content-Type` header will be set to + * `application/json`. Each route-point in `route` is represented as a `GeoJSON Position` type i.e. an + * array where the _longitude_ value is followed by the _latitude_ value and the _altitude_ value is + * ignored. The `route` should contain at least 2 route-points.

It is possible that original + * route will be altered, some of it's points may be skipped. If the route that passes through the + * found point is faster than the original one, the `detourTime` value in the response is negative. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The POI name to search for (e.g., "statue of liberty", "starbucks", "pizza"). Must be + * properly URL encoded. + * @param maxDetourTime Maximum detour time of the point of interest in seconds. Max value is 3600 + * seconds + * @param searchAlongRouteRequestBody This represents the route to search along and should be a valid + * `GeoJSON LineString` type. Please refer to [RFC + * 7946](https://tools.ietf.org/html/rfc7946#section-3.1.4) for details. + * @param options The options parameters. + */ + postSearchAlongRoute( + format: TextFormat, + query: string, + maxDetourTime: number, + searchAlongRouteRequestBody: SearchAlongRouteRequestBody, + options?: SearchPostSearchAlongRouteOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, maxDetourTime, searchAlongRouteRequestBody, options }, + postSearchAlongRouteOperationSpec + ); + } + + /** + * **Search Fuzzy Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Search Address Batch API sends batches of queries to [Search Fuzzy + * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy) using just a single API + * call. You can call Search Address Fuzzy Batch API to run either asynchronously (async) or + * synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API up + * to **100** queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/search/fuzzy/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **10,000** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Search Address Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` + * GET + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _search fuzzy_ queries you will use a `POST` request where the request body will contain + * the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 5 _search fuzzy_ queries: + * + * + * ```json + * { + * "batchItems": [ + * {"query": "?query=atm&lat=47.639769&lon=-122.128362&radius=5000&limit=5"}, + * {"query": "?query=Statue Of Liberty&limit=2"}, + * {"query": "?query=Starbucks&lat=47.639769&lon=-122.128362&radius=5000"}, + * {"query": "?query=Space Needle"}, + * {"query": "?query=pizza&limit=10"} + * ] + * } + * ``` + * + * A _search fuzzy_ query in a batch is just a partial URL _without_ the protocol, base URL, path, + * api-version and subscription-key. It can accept any of the supported _search fuzzy_ [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#uri-parameters). + * The string values in the _search fuzzy_ query must be properly escaped (e.g. " character should be + * escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, + * and the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#searchcommonresponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 2, + * "totalRequests": 3 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "atm" + * }, + * "results": [ + * { + * "type": "POI", + * "poi": { + * "name": "ATM at Wells Fargo" + * }, + * "address": { + * "country": "United States Of America", + * "freeformAddress": "3240 157th Ave NE, Redmond, WA 98052" + * } + * } + * ] + * } + * }, + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "statue of liberty" + * }, + * "results": [ + * { + * "type": "POI", + * "poi": { + * "name": "Statue of Liberty" + * }, + * "address": { + * "country": "United States Of America", + * "freeformAddress": "New York, NY 10004" + * } + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param searchFuzzyBatchRequestBody The list of search fuzzy queries/requests to process. The list + * can contain a max of 10,000 queries and must contain at least 1 query. + * @param options The options parameters. + */ + postSearchFuzzyBatchSync( + format: ResponseFormat, + searchFuzzyBatchRequestBody: BatchRequestBody, + options?: SearchPostSearchFuzzyBatchSyncOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, searchFuzzyBatchRequestBody, options }, + postSearchFuzzyBatchSyncOperationSpec + ); + } + + /** + * **Search Fuzzy Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Search Address Batch API sends batches of queries to [Search Fuzzy + * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy) using just a single API + * call. You can call Search Address Fuzzy Batch API to run either asynchronously (async) or + * synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API up + * to **100** queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/search/fuzzy/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **10,000** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Search Address Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` + * GET + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _search fuzzy_ queries you will use a `POST` request where the request body will contain + * the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 5 _search fuzzy_ queries: + * + * + * ```json + * { + * "batchItems": [ + * {"query": "?query=atm&lat=47.639769&lon=-122.128362&radius=5000&limit=5"}, + * {"query": "?query=Statue Of Liberty&limit=2"}, + * {"query": "?query=Starbucks&lat=47.639769&lon=-122.128362&radius=5000"}, + * {"query": "?query=Space Needle"}, + * {"query": "?query=pizza&limit=10"} + * ] + * } + * ``` + * + * A _search fuzzy_ query in a batch is just a partial URL _without_ the protocol, base URL, path, + * api-version and subscription-key. It can accept any of the supported _search fuzzy_ [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#uri-parameters). + * The string values in the _search fuzzy_ query must be properly escaped (e.g. " character should be + * escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, + * and the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#searchcommonresponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 2, + * "totalRequests": 3 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "atm" + * }, + * "results": [ + * { + * "type": "POI", + * "poi": { + * "name": "ATM at Wells Fargo" + * }, + * "address": { + * "country": "United States Of America", + * "freeformAddress": "3240 157th Ave NE, Redmond, WA 98052" + * } + * } + * ] + * } + * }, + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "statue of liberty" + * }, + * "results": [ + * { + * "type": "POI", + * "poi": { + * "name": "Statue of Liberty" + * }, + * "address": { + * "country": "United States Of America", + * "freeformAddress": "New York, NY 10004" + * } + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param searchFuzzyBatchRequestBody The list of search fuzzy queries/requests to process. The list + * can contain a max of 10,000 queries and must contain at least 1 query. + * @param options The options parameters. + */ + async beginPostSearchFuzzyBatch( + format: ResponseFormat, + searchFuzzyBatchRequestBody: BatchRequestBody, + options?: SearchPostSearchFuzzyBatchOptionalParams + ): Promise< + PollerLike< + PollOperationState, + SearchPostSearchFuzzyBatchResponse + > + > { + const directSendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ): Promise => { + return this.client.sendOperationRequest(args, spec); + }; + const sendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ) => { + let currentRawResponse: + | coreClient.FullOperationResponse + | undefined = undefined; + const providedCallback = args.options?.onResponse; + const callback: coreClient.RawResponseCallback = ( + rawResponse: coreClient.FullOperationResponse, + flatResponse: unknown + ) => { + currentRawResponse = rawResponse; + providedCallback?.(rawResponse, flatResponse); + }; + const updatedArgs = { + ...args, + options: { + ...args.options, + onResponse: callback + } + }; + const flatResponse = await directSendOperation(updatedArgs, spec); + return { flatResponse, rawResponse: currentRawResponse! }; + }; + + return new LROPoller( + { intervalInMs: options?.updateIntervalInMs }, + { format, searchFuzzyBatchRequestBody, options }, + postSearchFuzzyBatchOperationSpec, + sendOperation, + "location" + ); + } + + /** + * **Search Fuzzy Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Search Address Batch API sends batches of queries to [Search Fuzzy + * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy) using just a single API + * call. You can call Search Address Fuzzy Batch API to run either asynchronously (async) or + * synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API up + * to **100** queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/search/fuzzy/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **10,000** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Search Address Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` + * GET + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _search fuzzy_ queries you will use a `POST` request where the request body will contain + * the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 5 _search fuzzy_ queries: + * + * + * ```json + * { + * "batchItems": [ + * {"query": "?query=atm&lat=47.639769&lon=-122.128362&radius=5000&limit=5"}, + * {"query": "?query=Statue Of Liberty&limit=2"}, + * {"query": "?query=Starbucks&lat=47.639769&lon=-122.128362&radius=5000"}, + * {"query": "?query=Space Needle"}, + * {"query": "?query=pizza&limit=10"} + * ] + * } + * ``` + * + * A _search fuzzy_ query in a batch is just a partial URL _without_ the protocol, base URL, path, + * api-version and subscription-key. It can accept any of the supported _search fuzzy_ [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#uri-parameters). + * The string values in the _search fuzzy_ query must be properly escaped (e.g. " character should be + * escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, + * and the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#searchcommonresponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 2, + * "totalRequests": 3 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "atm" + * }, + * "results": [ + * { + * "type": "POI", + * "poi": { + * "name": "ATM at Wells Fargo" + * }, + * "address": { + * "country": "United States Of America", + * "freeformAddress": "3240 157th Ave NE, Redmond, WA 98052" + * } + * } + * ] + * } + * }, + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "statue of liberty" + * }, + * "results": [ + * { + * "type": "POI", + * "poi": { + * "name": "Statue of Liberty" + * }, + * "address": { + * "country": "United States Of America", + * "freeformAddress": "New York, NY 10004" + * } + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param searchFuzzyBatchRequestBody The list of search fuzzy queries/requests to process. The list + * can contain a max of 10,000 queries and must contain at least 1 query. + * @param options The options parameters. + */ + async beginPostSearchFuzzyBatchAndWait( + format: ResponseFormat, + searchFuzzyBatchRequestBody: BatchRequestBody, + options?: SearchPostSearchFuzzyBatchOptionalParams + ): Promise { + const poller = await this.beginPostSearchFuzzyBatch( + format, + searchFuzzyBatchRequestBody, + options + ); + return poller.pollUntilDone(); + } + + /** + * **Search Address Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Search Address Batch API sends batches of queries to [Search Address + * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress) using just a single API + * call. You can call Search Address Batch API to run either asynchronously (async) or synchronously + * (sync). The async API allows caller to batch up to **10,000** queries and sync API up to **100** + * queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/search/address/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **10,000** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Search Address Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` + * GET + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _search address_ queries you will use a `POST` request where the request body will + * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 5 _search address_ queries: + * + * + * ```json + * { + * "batchItems": [ + * {"query": "?query=400 Broad St, Seattle, WA 98109&limit=3"}, + * {"query": "?query=One, Microsoft Way, Redmond, WA 98052&limit=3"}, + * {"query": "?query=350 5th Ave, New York, NY 10118&limit=1"}, + * {"query": "?query=Pike Pl, Seattle, WA 98101&lat=47.610970&lon=-122.342469&radius=1000"}, + * {"query": "?query=Champ de Mars, 5 Avenue Anatole France, 75007 Paris, France&limit=1"} + * ] + * } + * ``` + * + * A _search address_ query in a batch is just a partial URL _without_ the protocol, base URL, path, + * api-version and subscription-key. It can accept any of the supported _search address_ [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#uri-parameters). + * The string values in the _search address_ query must be properly escaped (e.g. " character should be + * escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, + * and the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#SearchCommonResponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 2, + * "totalRequests": 3 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "one microsoft way redmond wa 98052" + * }, + * "results": [ + * { + * "position": { + * "lat": 47.63989, + * "lon": -122.12509 + * } + * } + * ] + * } + * }, + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "pike pl seattle wa 98101" + * }, + * "results": [ + * { + * "position": { + * "lat": 47.60963, + * "lon": -122.34215 + * } + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param searchAddressBatchRequestBody The list of address geocoding queries/requests to process. The + * list can contain a max of 10,000 queries and must contain at least 1 query. + * @param options The options parameters. + */ + postSearchAddressBatchSync( + format: ResponseFormat, + searchAddressBatchRequestBody: BatchRequestBody, + options?: SearchPostSearchAddressBatchSyncOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, searchAddressBatchRequestBody, options }, + postSearchAddressBatchSyncOperationSpec + ); + } + + /** + * **Search Address Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Search Address Batch API sends batches of queries to [Search Address + * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress) using just a single API + * call. You can call Search Address Batch API to run either asynchronously (async) or synchronously + * (sync). The async API allows caller to batch up to **10,000** queries and sync API up to **100** + * queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/search/address/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **10,000** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Search Address Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` + * GET + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _search address_ queries you will use a `POST` request where the request body will + * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 5 _search address_ queries: + * + * + * ```json + * { + * "batchItems": [ + * {"query": "?query=400 Broad St, Seattle, WA 98109&limit=3"}, + * {"query": "?query=One, Microsoft Way, Redmond, WA 98052&limit=3"}, + * {"query": "?query=350 5th Ave, New York, NY 10118&limit=1"}, + * {"query": "?query=Pike Pl, Seattle, WA 98101&lat=47.610970&lon=-122.342469&radius=1000"}, + * {"query": "?query=Champ de Mars, 5 Avenue Anatole France, 75007 Paris, France&limit=1"} + * ] + * } + * ``` + * + * A _search address_ query in a batch is just a partial URL _without_ the protocol, base URL, path, + * api-version and subscription-key. It can accept any of the supported _search address_ [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#uri-parameters). + * The string values in the _search address_ query must be properly escaped (e.g. " character should be + * escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, + * and the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#SearchCommonResponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 2, + * "totalRequests": 3 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "one microsoft way redmond wa 98052" + * }, + * "results": [ + * { + * "position": { + * "lat": 47.63989, + * "lon": -122.12509 + * } + * } + * ] + * } + * }, + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "pike pl seattle wa 98101" + * }, + * "results": [ + * { + * "position": { + * "lat": 47.60963, + * "lon": -122.34215 + * } + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param searchAddressBatchRequestBody The list of address geocoding queries/requests to process. The + * list can contain a max of 10,000 queries and must contain at least 1 query. + * @param options The options parameters. + */ + async beginPostSearchAddressBatch( + format: ResponseFormat, + searchAddressBatchRequestBody: BatchRequestBody, + options?: SearchPostSearchAddressBatchOptionalParams + ): Promise< + PollerLike< + PollOperationState, + SearchPostSearchAddressBatchResponse + > + > { + const directSendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ): Promise => { + return this.client.sendOperationRequest(args, spec); + }; + const sendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ) => { + let currentRawResponse: + | coreClient.FullOperationResponse + | undefined = undefined; + const providedCallback = args.options?.onResponse; + const callback: coreClient.RawResponseCallback = ( + rawResponse: coreClient.FullOperationResponse, + flatResponse: unknown + ) => { + currentRawResponse = rawResponse; + providedCallback?.(rawResponse, flatResponse); + }; + const updatedArgs = { + ...args, + options: { + ...args.options, + onResponse: callback + } + }; + const flatResponse = await directSendOperation(updatedArgs, spec); + return { flatResponse, rawResponse: currentRawResponse! }; + }; + + return new LROPoller( + { intervalInMs: options?.updateIntervalInMs }, + { format, searchAddressBatchRequestBody, options }, + postSearchAddressBatchOperationSpec, + sendOperation, + "location" + ); + } + + /** + * **Search Address Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Search Address Batch API sends batches of queries to [Search Address + * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress) using just a single API + * call. You can call Search Address Batch API to run either asynchronously (async) or synchronously + * (sync). The async API allows caller to batch up to **10,000** queries and sync API up to **100** + * queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/search/address/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **10,000** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Search Address Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` + * GET + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _search address_ queries you will use a `POST` request where the request body will + * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 5 _search address_ queries: + * + * + * ```json + * { + * "batchItems": [ + * {"query": "?query=400 Broad St, Seattle, WA 98109&limit=3"}, + * {"query": "?query=One, Microsoft Way, Redmond, WA 98052&limit=3"}, + * {"query": "?query=350 5th Ave, New York, NY 10118&limit=1"}, + * {"query": "?query=Pike Pl, Seattle, WA 98101&lat=47.610970&lon=-122.342469&radius=1000"}, + * {"query": "?query=Champ de Mars, 5 Avenue Anatole France, 75007 Paris, France&limit=1"} + * ] + * } + * ``` + * + * A _search address_ query in a batch is just a partial URL _without_ the protocol, base URL, path, + * api-version and subscription-key. It can accept any of the supported _search address_ [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#uri-parameters). + * The string values in the _search address_ query must be properly escaped (e.g. " character should be + * escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, + * and the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#SearchCommonResponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 2, + * "totalRequests": 3 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "one microsoft way redmond wa 98052" + * }, + * "results": [ + * { + * "position": { + * "lat": 47.63989, + * "lon": -122.12509 + * } + * } + * ] + * } + * }, + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "pike pl seattle wa 98101" + * }, + * "results": [ + * { + * "position": { + * "lat": 47.60963, + * "lon": -122.34215 + * } + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param searchAddressBatchRequestBody The list of address geocoding queries/requests to process. The + * list can contain a max of 10,000 queries and must contain at least 1 query. + * @param options The options parameters. + */ + async beginPostSearchAddressBatchAndWait( + format: ResponseFormat, + searchAddressBatchRequestBody: BatchRequestBody, + options?: SearchPostSearchAddressBatchOptionalParams + ): Promise { + const poller = await this.beginPostSearchAddressBatch( + format, + searchAddressBatchRequestBody, + options + ); + return poller.pollUntilDone(); + } + + /** + * **Search Address Reverse Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Search Address Batch API sends batches of queries to [Search Address Reverse + * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse) using just a + * single API call. You can call Search Address Reverse Batch API to run either asynchronously (async) + * or synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API + * up to **100** queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/search/address/reverse/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **10,000** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Search Address Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` + * GET + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _search address reverse_ queries you will use a `POST` request where the request body + * will contain the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 5 _search address reverse_ queries: + * + * + * ```json + * { + * "batchItems": [ + * {"query": "?query=48.858561,2.294911"}, + * {"query": "?query=47.639765,-122.127896&radius=5000&limit=2"}, + * {"query": "?query=47.621028,-122.348170"}, + * {"query": "?query=43.722990,10.396695"}, + * {"query": "?query=40.750958,-73.982336"} + * ] + * } + * ``` + * + * A _search address reverse_ query in a batch is just a partial URL _without_ the protocol, base URL, + * path, api-version and subscription-key. It can accept any of the supported _search address reverse_ + * [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#uri-parameters). + * The string values in the _search address reverse_ query must be properly escaped (e.g. " character + * should be escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, + * and the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`SearchAddressReverseResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#searchaddressreverseresponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 2, + * "totalRequests": 3 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "queryTime": 11 + * }, + * "addresses": [ + * { + * "address": { + * "country": "France", + * "freeformAddress": "Avenue Anatole France, 75007 Paris" + * }, + * "position": "48.858490,2.294820" + * } + * ] + * } + * }, + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "queryTime": 1 + * }, + * "addresses": [ + * { + * "address": { + * "country": "United States of America", + * "freeformAddress": "157th Pl NE, Redmond WA 98052" + * }, + * "position": "47.640470,-122.129430" + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param searchAddressReverseBatchRequestBody The list of reverse geocoding queries/requests to + * process. The list can contain a max of 10,000 queries and must contain at least 1 query. + * @param options The options parameters. + */ + postSearchAddressReverseBatchSync( + format: ResponseFormat, + searchAddressReverseBatchRequestBody: BatchRequestBody, + options?: SearchPostSearchAddressReverseBatchSyncOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, searchAddressReverseBatchRequestBody, options }, + postSearchAddressReverseBatchSyncOperationSpec + ); + } + + /** + * **Search Address Reverse Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Search Address Batch API sends batches of queries to [Search Address Reverse + * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse) using just a + * single API call. You can call Search Address Reverse Batch API to run either asynchronously (async) + * or synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API + * up to **100** queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/search/address/reverse/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **10,000** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Search Address Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` + * GET + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _search address reverse_ queries you will use a `POST` request where the request body + * will contain the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 5 _search address reverse_ queries: + * + * + * ```json + * { + * "batchItems": [ + * {"query": "?query=48.858561,2.294911"}, + * {"query": "?query=47.639765,-122.127896&radius=5000&limit=2"}, + * {"query": "?query=47.621028,-122.348170"}, + * {"query": "?query=43.722990,10.396695"}, + * {"query": "?query=40.750958,-73.982336"} + * ] + * } + * ``` + * + * A _search address reverse_ query in a batch is just a partial URL _without_ the protocol, base URL, + * path, api-version and subscription-key. It can accept any of the supported _search address reverse_ + * [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#uri-parameters). + * The string values in the _search address reverse_ query must be properly escaped (e.g. " character + * should be escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, + * and the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`SearchAddressReverseResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#searchaddressreverseresponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 2, + * "totalRequests": 3 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "queryTime": 11 + * }, + * "addresses": [ + * { + * "address": { + * "country": "France", + * "freeformAddress": "Avenue Anatole France, 75007 Paris" + * }, + * "position": "48.858490,2.294820" + * } + * ] + * } + * }, + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "queryTime": 1 + * }, + * "addresses": [ + * { + * "address": { + * "country": "United States of America", + * "freeformAddress": "157th Pl NE, Redmond WA 98052" + * }, + * "position": "47.640470,-122.129430" + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param searchAddressReverseBatchRequestBody The list of reverse geocoding queries/requests to + * process. The list can contain a max of 10,000 queries and must contain at least 1 query. + * @param options The options parameters. + */ + async beginPostSearchAddressReverseBatch( + format: ResponseFormat, + searchAddressReverseBatchRequestBody: BatchRequestBody, + options?: SearchPostSearchAddressReverseBatchOptionalParams + ): Promise< + PollerLike< + PollOperationState, + SearchPostSearchAddressReverseBatchResponse + > + > { + const directSendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ): Promise => { + return this.client.sendOperationRequest(args, spec); + }; + const sendOperation = async ( + args: coreClient.OperationArguments, + spec: coreClient.OperationSpec + ) => { + let currentRawResponse: + | coreClient.FullOperationResponse + | undefined = undefined; + const providedCallback = args.options?.onResponse; + const callback: coreClient.RawResponseCallback = ( + rawResponse: coreClient.FullOperationResponse, + flatResponse: unknown + ) => { + currentRawResponse = rawResponse; + providedCallback?.(rawResponse, flatResponse); + }; + const updatedArgs = { + ...args, + options: { + ...args.options, + onResponse: callback + } + }; + const flatResponse = await directSendOperation(updatedArgs, spec); + return { flatResponse, rawResponse: currentRawResponse! }; + }; + + return new LROPoller( + { intervalInMs: options?.updateIntervalInMs }, + { format, searchAddressReverseBatchRequestBody, options }, + postSearchAddressReverseBatchOperationSpec, + sendOperation, + "location" + ); + } + + /** + * **Search Address Reverse Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Search Address Batch API sends batches of queries to [Search Address Reverse + * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse) using just a + * single API call. You can call Search Address Reverse Batch API to run either asynchronously (async) + * or synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API + * up to **100** queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/search/address/reverse/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **10,000** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Search Address Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` + * GET + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _search address reverse_ queries you will use a `POST` request where the request body + * will contain the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 5 _search address reverse_ queries: + * + * + * ```json + * { + * "batchItems": [ + * {"query": "?query=48.858561,2.294911"}, + * {"query": "?query=47.639765,-122.127896&radius=5000&limit=2"}, + * {"query": "?query=47.621028,-122.348170"}, + * {"query": "?query=43.722990,10.396695"}, + * {"query": "?query=40.750958,-73.982336"} + * ] + * } + * ``` + * + * A _search address reverse_ query in a batch is just a partial URL _without_ the protocol, base URL, + * path, api-version and subscription-key. It can accept any of the supported _search address reverse_ + * [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#uri-parameters). + * The string values in the _search address reverse_ query must be properly escaped (e.g. " character + * should be escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, + * and the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`SearchAddressReverseResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#searchaddressreverseresponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 2, + * "totalRequests": 3 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "queryTime": 11 + * }, + * "addresses": [ + * { + * "address": { + * "country": "France", + * "freeformAddress": "Avenue Anatole France, 75007 Paris" + * }, + * "position": "48.858490,2.294820" + * } + * ] + * } + * }, + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "queryTime": 1 + * }, + * "addresses": [ + * { + * "address": { + * "country": "United States of America", + * "freeformAddress": "157th Pl NE, Redmond WA 98052" + * }, + * "position": "47.640470,-122.129430" + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param searchAddressReverseBatchRequestBody The list of reverse geocoding queries/requests to + * process. The list can contain a max of 10,000 queries and must contain at least 1 query. + * @param options The options parameters. + */ + async beginPostSearchAddressReverseBatchAndWait( + format: ResponseFormat, + searchAddressReverseBatchRequestBody: BatchRequestBody, + options?: SearchPostSearchAddressReverseBatchOptionalParams + ): Promise { + const poller = await this.beginPostSearchAddressReverseBatch( + format, + searchAddressReverseBatchRequestBody, + options + ); + return poller.pollUntilDone(); + } +} +// Operation Specifications +const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); + +const getSearchPolygonOperationSpec: coreClient.OperationSpec = { + path: "/search/polygon/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.SearchPolygonResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion, Parameters.geometries], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getSearchFuzzyOperationSpec: coreClient.OperationSpec = { + path: "/search/fuzzy/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.SearchCommonResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.query, + Parameters.typeahead, + Parameters.limit, + Parameters.ofs, + Parameters.categorySet, + Parameters.countrySet, + Parameters.lat, + Parameters.lon, + Parameters.radius, + Parameters.topLeft, + Parameters.btmRight, + Parameters.language, + Parameters.extendedPostalCodesFor, + Parameters.minFuzzyLevel, + Parameters.maxFuzzyLevel, + Parameters.idxSet, + Parameters.brandSet, + Parameters.connectorSet, + Parameters.view, + Parameters.openingHours + ], + urlParameters: [Parameters.geography, Parameters.format1], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getSearchPOIOperationSpec: coreClient.OperationSpec = { + path: "/search/poi/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.SearchCommonResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.query, + Parameters.typeahead, + Parameters.limit, + Parameters.ofs, + Parameters.categorySet, + Parameters.countrySet, + Parameters.lat, + Parameters.lon, + Parameters.radius, + Parameters.topLeft, + Parameters.btmRight, + Parameters.language, + Parameters.extendedPostalCodesFor, + Parameters.brandSet, + Parameters.connectorSet, + Parameters.view, + Parameters.openingHours + ], + urlParameters: [Parameters.geography, Parameters.format1], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getSearchNearbyOperationSpec: coreClient.OperationSpec = { + path: "/search/nearby/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.SearchCommonResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.limit, + Parameters.ofs, + Parameters.categorySet, + Parameters.countrySet, + Parameters.radius, + Parameters.language, + Parameters.extendedPostalCodesFor, + Parameters.brandSet, + Parameters.connectorSet, + Parameters.view, + Parameters.lat1, + Parameters.lon1 + ], + urlParameters: [Parameters.geography, Parameters.format1], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getSearchPOICategoryOperationSpec: coreClient.OperationSpec = { + path: "/search/poi/category/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.SearchCommonResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.query, + Parameters.typeahead, + Parameters.limit, + Parameters.ofs, + Parameters.categorySet, + Parameters.countrySet, + Parameters.lat, + Parameters.lon, + Parameters.radius, + Parameters.topLeft, + Parameters.btmRight, + Parameters.language, + Parameters.extendedPostalCodesFor, + Parameters.brandSet, + Parameters.connectorSet, + Parameters.view, + Parameters.openingHours + ], + urlParameters: [Parameters.geography, Parameters.format1], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getSearchPOICategoryTreePreviewOperationSpec: coreClient.OperationSpec = { + path: "/search/poi/category/tree/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.SearchPoiCategoryTreeResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion, Parameters.language], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getSearchAddressOperationSpec: coreClient.OperationSpec = { + path: "/search/address/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.SearchCommonResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.query, + Parameters.typeahead, + Parameters.limit, + Parameters.ofs, + Parameters.countrySet, + Parameters.lat, + Parameters.lon, + Parameters.radius, + Parameters.topLeft, + Parameters.btmRight, + Parameters.language, + Parameters.extendedPostalCodesFor, + Parameters.view + ], + urlParameters: [Parameters.geography, Parameters.format1], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getSearchAddressReverseOperationSpec: coreClient.OperationSpec = { + path: "/search/address/reverse/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.SearchAddressReverseResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.query, + Parameters.radius, + Parameters.language, + Parameters.view, + Parameters.returnSpeedLimit, + Parameters.heading, + Parameters.numberParam, + Parameters.returnRoadUse, + Parameters.roadUse, + Parameters.allowFreeformNewline, + Parameters.returnMatchType, + Parameters.entityType + ], + urlParameters: [Parameters.geography, Parameters.format1], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getSearchAddressReverseCrossStreetOperationSpec: coreClient.OperationSpec = { + path: "/search/address/reverse/crossStreet/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.SearchAddressReverseCrossStreetResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.query, + Parameters.limit, + Parameters.radius, + Parameters.language, + Parameters.view, + Parameters.heading + ], + urlParameters: [Parameters.geography, Parameters.format1], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getSearchAddressStructuredOperationSpec: coreClient.OperationSpec = { + path: "/search/address/structured/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.SearchCommonResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.limit, + Parameters.ofs, + Parameters.language, + Parameters.extendedPostalCodesFor, + Parameters.view, + Parameters.countryCode, + Parameters.streetNumber, + Parameters.streetName, + Parameters.crossStreet, + Parameters.municipality, + Parameters.municipalitySubdivision, + Parameters.countryTertiarySubdivision, + Parameters.countrySecondarySubdivision, + Parameters.countrySubdivision, + Parameters.postalCode + ], + urlParameters: [Parameters.geography, Parameters.format1], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const postSearchInsideGeometryOperationSpec: coreClient.OperationSpec = { + path: "/search/geometry/{format}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.SearchCommonResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.searchInsideGeometryRequestBody, + queryParameters: [ + Parameters.apiVersion, + Parameters.query, + Parameters.limit, + Parameters.categorySet, + Parameters.language, + Parameters.extendedPostalCodesFor, + Parameters.idxSet, + Parameters.view, + Parameters.openingHours + ], + urlParameters: [Parameters.geography, Parameters.format1], + headerParameters: [ + Parameters.accept, + Parameters.xMsClientId, + Parameters.contentType + ], + mediaType: "json", + serializer +}; +const postSearchAlongRouteOperationSpec: coreClient.OperationSpec = { + path: "/search/alongRoute/{format}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.SearchCommonResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.searchAlongRouteRequestBody, + queryParameters: [ + Parameters.apiVersion, + Parameters.query, + Parameters.categorySet, + Parameters.brandSet, + Parameters.connectorSet, + Parameters.view, + Parameters.openingHours, + Parameters.maxDetourTime, + Parameters.limit1 + ], + urlParameters: [Parameters.geography, Parameters.format1], + headerParameters: [ + Parameters.accept, + Parameters.xMsClientId, + Parameters.contentType + ], + mediaType: "json", + serializer +}; +const postSearchFuzzyBatchSyncOperationSpec: coreClient.OperationSpec = { + path: "/search/fuzzy/batch/sync/{format}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.SearchFuzzyBatchResponse + }, + 408: { + bodyMapper: Mappers.ErrorResponse, + isError: true + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.searchFuzzyBatchRequestBody, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [ + Parameters.accept, + Parameters.xMsClientId, + Parameters.contentType + ], + mediaType: "json", + serializer +}; +const postSearchFuzzyBatchOperationSpec: coreClient.OperationSpec = { + path: "/search/fuzzy/batch/{format}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.SearchFuzzyBatchResponse + }, + 201: { + bodyMapper: Mappers.SearchFuzzyBatchResponse + }, + 202: { + bodyMapper: Mappers.SearchFuzzyBatchResponse + }, + 204: { + bodyMapper: Mappers.SearchFuzzyBatchResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.searchFuzzyBatchRequestBody, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [ + Parameters.accept, + Parameters.xMsClientId, + Parameters.contentType + ], + mediaType: "json", + serializer +}; +const postSearchAddressBatchSyncOperationSpec: coreClient.OperationSpec = { + path: "/search/address/batch/sync/{format}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.SearchAddressBatchResponse + }, + 408: { + bodyMapper: Mappers.ErrorResponse, + isError: true + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.searchAddressBatchRequestBody, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [ + Parameters.accept, + Parameters.xMsClientId, + Parameters.contentType + ], + mediaType: "json", + serializer +}; +const postSearchAddressBatchOperationSpec: coreClient.OperationSpec = { + path: "/search/address/batch/{format}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.SearchAddressBatchResponse + }, + 201: { + bodyMapper: Mappers.SearchAddressBatchResponse + }, + 202: { + bodyMapper: Mappers.SearchAddressBatchResponse + }, + 204: { + bodyMapper: Mappers.SearchAddressBatchResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.searchAddressBatchRequestBody, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [ + Parameters.accept, + Parameters.xMsClientId, + Parameters.contentType + ], + mediaType: "json", + serializer +}; +const postSearchAddressReverseBatchSyncOperationSpec: coreClient.OperationSpec = { + path: "/search/address/reverse/batch/sync/{format}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.SearchAddressReverseBatchResponse + }, + 408: { + bodyMapper: Mappers.ErrorResponse, + isError: true + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.searchAddressReverseBatchRequestBody, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [ + Parameters.accept, + Parameters.xMsClientId, + Parameters.contentType + ], + mediaType: "json", + serializer +}; +const postSearchAddressReverseBatchOperationSpec: coreClient.OperationSpec = { + path: "/search/address/reverse/batch/{format}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: Mappers.SearchAddressReverseBatchResponse + }, + 201: { + bodyMapper: Mappers.SearchAddressReverseBatchResponse + }, + 202: { + bodyMapper: Mappers.SearchAddressReverseBatchResponse + }, + 204: { + bodyMapper: Mappers.SearchAddressReverseBatchResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + requestBody: Parameters.searchAddressReverseBatchRequestBody, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [ + Parameters.accept, + Parameters.xMsClientId, + Parameters.contentType + ], + mediaType: "json", + serializer +}; diff --git a/sdk/maps/maps-search/src/operationsInterfaces/index.ts b/sdk/maps/maps-search/src/operationsInterfaces/index.ts new file mode 100644 index 000000000000..3ff28b477242 --- /dev/null +++ b/sdk/maps/maps-search/src/operationsInterfaces/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./search"; diff --git a/sdk/maps/maps-search/src/operationsInterfaces/search.ts b/sdk/maps/maps-search/src/operationsInterfaces/search.ts new file mode 100644 index 000000000000..9555fa861263 --- /dev/null +++ b/sdk/maps/maps-search/src/operationsInterfaces/search.ts @@ -0,0 +1,2121 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { PollerLike, PollOperationState } from "@azure/core-lro"; +import { + ResponseFormat, + SearchGetSearchPolygonOptionalParams, + SearchGetSearchPolygonResponse, + TextFormat, + SearchGetSearchFuzzyOptionalParams, + SearchGetSearchFuzzyResponse, + SearchGetSearchPOIOptionalParams, + SearchGetSearchPOIResponse, + SearchGetSearchNearbyOptionalParams, + SearchGetSearchNearbyResponse, + SearchGetSearchPOICategoryOptionalParams, + SearchGetSearchPOICategoryResponse, + SearchGetSearchPOICategoryTreePreviewOptionalParams, + SearchGetSearchPOICategoryTreePreviewResponse, + SearchGetSearchAddressOptionalParams, + SearchGetSearchAddressResponse, + SearchGetSearchAddressReverseOptionalParams, + SearchGetSearchAddressReverseResponse, + SearchGetSearchAddressReverseCrossStreetOptionalParams, + SearchGetSearchAddressReverseCrossStreetResponse, + SearchGetSearchAddressStructuredOptionalParams, + SearchGetSearchAddressStructuredResponse, + SearchInsideGeometryRequestBody, + SearchPostSearchInsideGeometryOptionalParams, + SearchPostSearchInsideGeometryResponse, + SearchAlongRouteRequestBody, + SearchPostSearchAlongRouteOptionalParams, + SearchPostSearchAlongRouteResponse, + BatchRequestBody, + SearchPostSearchFuzzyBatchSyncOptionalParams, + SearchPostSearchFuzzyBatchSyncResponse, + SearchPostSearchFuzzyBatchOptionalParams, + SearchPostSearchFuzzyBatchResponse, + SearchPostSearchAddressBatchSyncOptionalParams, + SearchPostSearchAddressBatchSyncResponse, + SearchPostSearchAddressBatchOptionalParams, + SearchPostSearchAddressBatchResponse, + SearchPostSearchAddressReverseBatchSyncOptionalParams, + SearchPostSearchAddressReverseBatchSyncResponse, + SearchPostSearchAddressReverseBatchOptionalParams, + SearchPostSearchAddressReverseBatchResponse +} from "../models"; + +/** Interface representing a Search. */ +export interface Search { + /** + * **Get Polygon** + * + * + * **Applies to**: S1 pricing tier. + * + * + * The Get Polygon service allows you to request the geometry data such as a city or country outline + * for a set of entities, previously retrieved from an Online Search request in GeoJSON format. The + * geometry ID is returned in the dataSources object under "geometry" and "id" in either a Search + * Address or Search Fuzzy call. + * + * Please note that any geometry ID retrieved from an Online Search endpoint has a limited lifetime. + * The client should not store geometry IDs in persistent storage for later referral, as the stability + * of these identifiers is not guaranteed for a long period of time. It is expected that a request to + * the Polygon method is made within a few minutes of the request to the Online Search method that + * provided the ID. The service allows for batch requests up to 20 identifiers. + * @param format Desired format of the response. Only `json` format is supported. + * @param geometries Comma separated list of geometry UUIDs, previously retrieved from an Online Search + * request. + * @param options The options parameters. + */ + getSearchPolygon( + format: ResponseFormat, + geometries: string[], + options?: SearchGetSearchPolygonOptionalParams + ): Promise; + /** + * **Free Form Search** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * The basic default API is Free Form Search which handles the most fuzzy of inputs handling any + * combination of address or POI tokens. This search API is the canonical 'single line search'. The + * Free Form Search API is a seamless combination of POI search and geocoding. The API can also be + * weighted with a contextual position (lat./lon. pair), or fully constrained by a coordinate and + * radius, or it can be executed more generally without any geo biasing anchor point.

We + * strongly advise you to use the 'countrySet' parameter to specify only the countries for which your + * application needs coverage, as the default behavior will be to search the entire world, potentially + * returning unnecessary results.

E.g.: `countrySet`=US,FR

Please see [Search + * Coverage](https://docs.microsoft.com/azure/location-based-services/geocoding-coverage) for a + * complete list of all the supported countries.

Most Search queries default to + * `maxFuzzyLevel`=2 to gain performance and also reduce unusual results. This new default can be + * overridden as needed per request by passing in the query param `maxFuzzyLevel`=3 or 4. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The applicable query string (e.g., "seattle", "pizza"). Can _also_ be specified as a + * comma separated string composed by latitude followed by longitude (e.g., "47.641268, -122.125679"). + * Must be properly URL encoded. + * @param options The options parameters. + */ + getSearchFuzzy( + format: TextFormat, + query: string, + options?: SearchGetSearchFuzzyOptionalParams + ): Promise; + /** + * **Get POI by Name** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Points of Interest (POI) Search allows you to request POI results by name. Search supports + * additional query parameters such as language and filtering results by area of interest driven by + * country or bounding box. Endpoint will return only POI results matching the query string. Response + * includes POI details such as address, coordinate location and category. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The POI name to search for (e.g., "statue of liberty", "starbucks"), must be properly + * URL encoded. + * @param options The options parameters. + */ + getSearchPOI( + format: TextFormat, + query: string, + options?: SearchGetSearchPOIOptionalParams + ): Promise; + /** + * **Nearby Search** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * If you have a use case for only retrieving POI results around a specific location, the nearby search + * method may be the right choice. This endpoint will only return POI results, and does not take in a + * search query parameter. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param lat Latitude where results should be biased. E.g. 37.337. + * @param lon Longitude where results should be biased. E.g. -121.89. + * @param options The options parameters. + */ + getSearchNearby( + format: TextFormat, + lat: number, + lon: number, + options?: SearchGetSearchNearbyOptionalParams + ): Promise; + /** + * **Get POI by Category** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Points of Interest (POI) Category Search allows you to request POI results from given category. + * Search allows to query POIs from one category at a time. Endpoint will only return POI results + * which are categorized as specified. Response includes POI details such as address, coordinate + * location and classification. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The POI category to search for (e.g., "AIRPORT", "RESTAURANT"), must be properly URL + * encoded. Supported main categories can be requested by calling [Get Search POI Category Tree + * API](https://aka.ms/AzureMapsPOICategoryTree). List of available categories can also be found + * [here](https://docs.microsoft.com/azure/azure-maps/supported-search-categories). We recommend to use + * POI Search Category Tree API to request the supported categories. + * @param options The options parameters. + */ + getSearchPOICategory( + format: TextFormat, + query: string, + options?: SearchGetSearchPOICategoryOptionalParams + ): Promise; + /** + * **Get POI Category Tree** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * POI Category API provides a full list of supported Points of Interest (POI) categories and + * subcategories together with their translations and synonyms. The returned content can be used to + * provide more meaningful results through other Search Service APIs, like [Get Search + * POI](https://docs.microsoft.com/rest/api/maps/search/getsearchpoi). + * @param format Desired format of the response. Only `json` format is supported. + * @param options The options parameters. + */ + getSearchPOICategoryTreePreview( + format: ResponseFormat, + options?: SearchGetSearchPOICategoryTreePreviewOptionalParams + ): Promise; + /** + * **Address Geocoding** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * In many cases, the complete search service might be too much, for instance if you are only + * interested in traditional geocoding. Search can also be accessed for address look up exclusively. + * The geocoding is performed by hitting the geocode endpoint with just the address or partial address + * in question. The geocoding search index will be queried for everything above the street level data. + * No POIs will be returned. Note that the geocoder is very tolerant of typos and incomplete addresses. + * It will also handle everything from exact street addresses or street or intersections as well as + * higher level geographies such as city centers, counties, states etc. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The address to search for (e.g., "1 Microsoft way, Redmond, WA"), must be properly URL + * encoded. + * @param options The options parameters. + */ + getSearchAddress( + format: TextFormat, + query: string, + options?: SearchGetSearchAddressOptionalParams + ): Promise; + /** + * **Reverse Geocode to an Address** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * There may be times when you need to translate a coordinate (example: 37.786505, -122.3862) into a + * human understandable street address. Most often this is needed in tracking applications where you + * receive a GPS feed from the device or asset and wish to know what address where the coordinate is + * located. This endpoint will return address information for a given coordinate. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The applicable query specified as a comma separated string composed by latitude + * followed by longitude e.g. "47.641268,-122.125679". + * @param options The options parameters. + */ + getSearchAddressReverse( + format: TextFormat, + query: string, + options?: SearchGetSearchAddressReverseOptionalParams + ): Promise; + /** + * **Reverse Geocode to a Cross Street** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * There may be times when you need to translate a coordinate (example: 37.786505, -122.3862) into a + * human understandable cross street. Most often this is needed in tracking applications where you + * receive a GPS feed from the device or asset and wish to know what address where the coordinate is + * located. + * This endpoint will return cross street information for a given coordinate. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The applicable query specified as a comma separated string composed by latitude + * followed by longitude e.g. "47.641268,-122.125679". + * @param options The options parameters. + */ + getSearchAddressReverseCrossStreet( + format: TextFormat, + query: string, + options?: SearchGetSearchAddressReverseCrossStreetOptionalParams + ): Promise; + /** + * **Structured Address Geocoding** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Azure Address Geocoding can also be accessed for structured address look up exclusively. The + * geocoding search index will be queried for everything above the street level data. No POIs will be + * returned. Note that the geocoder is very tolerant of typos and incomplete addresses. It will also + * handle everything from exact street addresses or street or intersections as well as higher level + * geographies such as city centers, counties, states etc. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param options The options parameters. + */ + getSearchAddressStructured( + format: TextFormat, + options?: SearchGetSearchAddressStructuredOptionalParams + ): Promise; + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * The Search Geometry endpoint allows you to perform a free form search inside a single geometry or + * many of them. The search results that fall inside the geometry/geometries will be + * returned.

To send the geometry you will use a `POST` request where the request body will + * contain the `geometry` object represented as a `GeoJSON` type and the `Content-Type` header will be + * set to `application/json`. The geographical features to be searched can be modeled as Polygon and/or + * Circle geometries represented using any one of the following `GeoJSON` types:
  • **GeoJSON + * FeatureCollection**
    The `geometry` can be represented as a `GeoJSON FeatureCollection` object. + * This is the recommended option if the geometry contains both Polygons and Circles. The + * `FeatureCollection` can contain a max of 50 `GeoJSON Feature` objects. Each `Feature` object should + * represent either a Polygon or a Circle with the following conditions:
    • A `Feature` object for the Polygon geometry can have a max of 50 + * coordinates and it's properties must be empty.
    • A `Feature` object for the Circle geometry is + * composed of a _center_ represented using a `GeoJSON Point` type and a _radius_ value (in meters) + * which must be specified in the object's properties along with the _subType_ property whose value + * should be 'Circle'.

    Please see the Examples section below for a sample + * `FeatureCollection` representation.

  • **GeoJSON GeometryCollection**
    The `geometry` + * can be represented as a `GeoJSON GeometryCollection` object. This is the recommended option if the + * geometry contains a list of Polygons only. The `GeometryCollection` can contain a max of 50 `GeoJSON + * Polygon` objects. Each `Polygon` object can have a max of 50 coordinates. Please see the Examples + * section below for a sample `GeometryCollection` representation.

  • **GeoJSON + * Polygon**
    The `geometry` can be represented as a `GeoJSON Polygon` object. This is the + * recommended option if the geometry contains a single Polygon. The `Polygon` object can have a max of + * 50 coordinates. Please see the Examples section below for a sample `Polygon` + * representation.

.

+ * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The POI name to search for (e.g., "statue of liberty", "starbucks", "pizza"). Must be + * properly URL encoded. + * @param searchInsideGeometryRequestBody This represents the geometry for one or more geographical + * features (parks, state boundary etc.) to search in and should be a GeoJSON compliant type. Please + * refer to [RFC 7946](https://tools.ietf.org/html/rfc7946) for details. + * @param options The options parameters. + */ + postSearchInsideGeometry( + format: TextFormat, + query: string, + searchInsideGeometryRequestBody: SearchInsideGeometryRequestBody, + options?: SearchPostSearchInsideGeometryOptionalParams + ): Promise; + /** + * **Applies to**: S0 and S1 pricing tiers. + * + * + * The Search Along Route endpoint allows you to perform a fuzzy search for POIs along a specified + * route. This search is constrained by specifying the `maxDetourTime` limiting measure.

To send + * the route-points you will use a `POST` request where the request body will contain the `route` + * object represented as a `GeoJSON LineString` type and the `Content-Type` header will be set to + * `application/json`. Each route-point in `route` is represented as a `GeoJSON Position` type i.e. an + * array where the _longitude_ value is followed by the _latitude_ value and the _altitude_ value is + * ignored. The `route` should contain at least 2 route-points.

It is possible that original + * route will be altered, some of it's points may be skipped. If the route that passes through the + * found point is faster than the original one, the `detourTime` value in the response is negative. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param query The POI name to search for (e.g., "statue of liberty", "starbucks", "pizza"). Must be + * properly URL encoded. + * @param maxDetourTime Maximum detour time of the point of interest in seconds. Max value is 3600 + * seconds + * @param searchAlongRouteRequestBody This represents the route to search along and should be a valid + * `GeoJSON LineString` type. Please refer to [RFC + * 7946](https://tools.ietf.org/html/rfc7946#section-3.1.4) for details. + * @param options The options parameters. + */ + postSearchAlongRoute( + format: TextFormat, + query: string, + maxDetourTime: number, + searchAlongRouteRequestBody: SearchAlongRouteRequestBody, + options?: SearchPostSearchAlongRouteOptionalParams + ): Promise; + /** + * **Search Fuzzy Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Search Address Batch API sends batches of queries to [Search Fuzzy + * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy) using just a single API + * call. You can call Search Address Fuzzy Batch API to run either asynchronously (async) or + * synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API up + * to **100** queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/search/fuzzy/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **10,000** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Search Address Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` + * GET + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _search fuzzy_ queries you will use a `POST` request where the request body will contain + * the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 5 _search fuzzy_ queries: + * + * + * ```json + * { + * "batchItems": [ + * {"query": "?query=atm&lat=47.639769&lon=-122.128362&radius=5000&limit=5"}, + * {"query": "?query=Statue Of Liberty&limit=2"}, + * {"query": "?query=Starbucks&lat=47.639769&lon=-122.128362&radius=5000"}, + * {"query": "?query=Space Needle"}, + * {"query": "?query=pizza&limit=10"} + * ] + * } + * ``` + * + * A _search fuzzy_ query in a batch is just a partial URL _without_ the protocol, base URL, path, + * api-version and subscription-key. It can accept any of the supported _search fuzzy_ [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#uri-parameters). + * The string values in the _search fuzzy_ query must be properly escaped (e.g. " character should be + * escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, + * and the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#searchcommonresponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 2, + * "totalRequests": 3 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "atm" + * }, + * "results": [ + * { + * "type": "POI", + * "poi": { + * "name": "ATM at Wells Fargo" + * }, + * "address": { + * "country": "United States Of America", + * "freeformAddress": "3240 157th Ave NE, Redmond, WA 98052" + * } + * } + * ] + * } + * }, + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "statue of liberty" + * }, + * "results": [ + * { + * "type": "POI", + * "poi": { + * "name": "Statue of Liberty" + * }, + * "address": { + * "country": "United States Of America", + * "freeformAddress": "New York, NY 10004" + * } + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param searchFuzzyBatchRequestBody The list of search fuzzy queries/requests to process. The list + * can contain a max of 10,000 queries and must contain at least 1 query. + * @param options The options parameters. + */ + postSearchFuzzyBatchSync( + format: ResponseFormat, + searchFuzzyBatchRequestBody: BatchRequestBody, + options?: SearchPostSearchFuzzyBatchSyncOptionalParams + ): Promise; + /** + * **Search Fuzzy Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Search Address Batch API sends batches of queries to [Search Fuzzy + * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy) using just a single API + * call. You can call Search Address Fuzzy Batch API to run either asynchronously (async) or + * synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API up + * to **100** queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/search/fuzzy/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **10,000** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Search Address Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` + * GET + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _search fuzzy_ queries you will use a `POST` request where the request body will contain + * the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 5 _search fuzzy_ queries: + * + * + * ```json + * { + * "batchItems": [ + * {"query": "?query=atm&lat=47.639769&lon=-122.128362&radius=5000&limit=5"}, + * {"query": "?query=Statue Of Liberty&limit=2"}, + * {"query": "?query=Starbucks&lat=47.639769&lon=-122.128362&radius=5000"}, + * {"query": "?query=Space Needle"}, + * {"query": "?query=pizza&limit=10"} + * ] + * } + * ``` + * + * A _search fuzzy_ query in a batch is just a partial URL _without_ the protocol, base URL, path, + * api-version and subscription-key. It can accept any of the supported _search fuzzy_ [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#uri-parameters). + * The string values in the _search fuzzy_ query must be properly escaped (e.g. " character should be + * escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, + * and the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#searchcommonresponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 2, + * "totalRequests": 3 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "atm" + * }, + * "results": [ + * { + * "type": "POI", + * "poi": { + * "name": "ATM at Wells Fargo" + * }, + * "address": { + * "country": "United States Of America", + * "freeformAddress": "3240 157th Ave NE, Redmond, WA 98052" + * } + * } + * ] + * } + * }, + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "statue of liberty" + * }, + * "results": [ + * { + * "type": "POI", + * "poi": { + * "name": "Statue of Liberty" + * }, + * "address": { + * "country": "United States Of America", + * "freeformAddress": "New York, NY 10004" + * } + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param searchFuzzyBatchRequestBody The list of search fuzzy queries/requests to process. The list + * can contain a max of 10,000 queries and must contain at least 1 query. + * @param options The options parameters. + */ + beginPostSearchFuzzyBatch( + format: ResponseFormat, + searchFuzzyBatchRequestBody: BatchRequestBody, + options?: SearchPostSearchFuzzyBatchOptionalParams + ): Promise< + PollerLike< + PollOperationState, + SearchPostSearchFuzzyBatchResponse + > + >; + /** + * **Search Fuzzy Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Search Address Batch API sends batches of queries to [Search Fuzzy + * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy) using just a single API + * call. You can call Search Address Fuzzy Batch API to run either asynchronously (async) or + * synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API up + * to **100** queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/search/fuzzy/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **10,000** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Search Address Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` + * GET + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _search fuzzy_ queries you will use a `POST` request where the request body will contain + * the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 5 _search fuzzy_ queries: + * + * + * ```json + * { + * "batchItems": [ + * {"query": "?query=atm&lat=47.639769&lon=-122.128362&radius=5000&limit=5"}, + * {"query": "?query=Statue Of Liberty&limit=2"}, + * {"query": "?query=Starbucks&lat=47.639769&lon=-122.128362&radius=5000"}, + * {"query": "?query=Space Needle"}, + * {"query": "?query=pizza&limit=10"} + * ] + * } + * ``` + * + * A _search fuzzy_ query in a batch is just a partial URL _without_ the protocol, base URL, path, + * api-version and subscription-key. It can accept any of the supported _search fuzzy_ [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#uri-parameters). + * The string values in the _search fuzzy_ query must be properly escaped (e.g. " character should be + * escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, + * and the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#searchcommonresponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 2, + * "totalRequests": 3 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "atm" + * }, + * "results": [ + * { + * "type": "POI", + * "poi": { + * "name": "ATM at Wells Fargo" + * }, + * "address": { + * "country": "United States Of America", + * "freeformAddress": "3240 157th Ave NE, Redmond, WA 98052" + * } + * } + * ] + * } + * }, + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "statue of liberty" + * }, + * "results": [ + * { + * "type": "POI", + * "poi": { + * "name": "Statue of Liberty" + * }, + * "address": { + * "country": "United States Of America", + * "freeformAddress": "New York, NY 10004" + * } + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param searchFuzzyBatchRequestBody The list of search fuzzy queries/requests to process. The list + * can contain a max of 10,000 queries and must contain at least 1 query. + * @param options The options parameters. + */ + beginPostSearchFuzzyBatchAndWait( + format: ResponseFormat, + searchFuzzyBatchRequestBody: BatchRequestBody, + options?: SearchPostSearchFuzzyBatchOptionalParams + ): Promise; + /** + * **Search Address Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Search Address Batch API sends batches of queries to [Search Address + * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress) using just a single API + * call. You can call Search Address Batch API to run either asynchronously (async) or synchronously + * (sync). The async API allows caller to batch up to **10,000** queries and sync API up to **100** + * queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/search/address/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **10,000** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Search Address Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` + * GET + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _search address_ queries you will use a `POST` request where the request body will + * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 5 _search address_ queries: + * + * + * ```json + * { + * "batchItems": [ + * {"query": "?query=400 Broad St, Seattle, WA 98109&limit=3"}, + * {"query": "?query=One, Microsoft Way, Redmond, WA 98052&limit=3"}, + * {"query": "?query=350 5th Ave, New York, NY 10118&limit=1"}, + * {"query": "?query=Pike Pl, Seattle, WA 98101&lat=47.610970&lon=-122.342469&radius=1000"}, + * {"query": "?query=Champ de Mars, 5 Avenue Anatole France, 75007 Paris, France&limit=1"} + * ] + * } + * ``` + * + * A _search address_ query in a batch is just a partial URL _without_ the protocol, base URL, path, + * api-version and subscription-key. It can accept any of the supported _search address_ [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#uri-parameters). + * The string values in the _search address_ query must be properly escaped (e.g. " character should be + * escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, + * and the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#SearchCommonResponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 2, + * "totalRequests": 3 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "one microsoft way redmond wa 98052" + * }, + * "results": [ + * { + * "position": { + * "lat": 47.63989, + * "lon": -122.12509 + * } + * } + * ] + * } + * }, + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "pike pl seattle wa 98101" + * }, + * "results": [ + * { + * "position": { + * "lat": 47.60963, + * "lon": -122.34215 + * } + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param searchAddressBatchRequestBody The list of address geocoding queries/requests to process. The + * list can contain a max of 10,000 queries and must contain at least 1 query. + * @param options The options parameters. + */ + postSearchAddressBatchSync( + format: ResponseFormat, + searchAddressBatchRequestBody: BatchRequestBody, + options?: SearchPostSearchAddressBatchSyncOptionalParams + ): Promise; + /** + * **Search Address Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Search Address Batch API sends batches of queries to [Search Address + * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress) using just a single API + * call. You can call Search Address Batch API to run either asynchronously (async) or synchronously + * (sync). The async API allows caller to batch up to **10,000** queries and sync API up to **100** + * queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/search/address/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **10,000** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Search Address Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` + * GET + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _search address_ queries you will use a `POST` request where the request body will + * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 5 _search address_ queries: + * + * + * ```json + * { + * "batchItems": [ + * {"query": "?query=400 Broad St, Seattle, WA 98109&limit=3"}, + * {"query": "?query=One, Microsoft Way, Redmond, WA 98052&limit=3"}, + * {"query": "?query=350 5th Ave, New York, NY 10118&limit=1"}, + * {"query": "?query=Pike Pl, Seattle, WA 98101&lat=47.610970&lon=-122.342469&radius=1000"}, + * {"query": "?query=Champ de Mars, 5 Avenue Anatole France, 75007 Paris, France&limit=1"} + * ] + * } + * ``` + * + * A _search address_ query in a batch is just a partial URL _without_ the protocol, base URL, path, + * api-version and subscription-key. It can accept any of the supported _search address_ [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#uri-parameters). + * The string values in the _search address_ query must be properly escaped (e.g. " character should be + * escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, + * and the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#SearchCommonResponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 2, + * "totalRequests": 3 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "one microsoft way redmond wa 98052" + * }, + * "results": [ + * { + * "position": { + * "lat": 47.63989, + * "lon": -122.12509 + * } + * } + * ] + * } + * }, + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "pike pl seattle wa 98101" + * }, + * "results": [ + * { + * "position": { + * "lat": 47.60963, + * "lon": -122.34215 + * } + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param searchAddressBatchRequestBody The list of address geocoding queries/requests to process. The + * list can contain a max of 10,000 queries and must contain at least 1 query. + * @param options The options parameters. + */ + beginPostSearchAddressBatch( + format: ResponseFormat, + searchAddressBatchRequestBody: BatchRequestBody, + options?: SearchPostSearchAddressBatchOptionalParams + ): Promise< + PollerLike< + PollOperationState, + SearchPostSearchAddressBatchResponse + > + >; + /** + * **Search Address Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Search Address Batch API sends batches of queries to [Search Address + * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress) using just a single API + * call. You can call Search Address Batch API to run either asynchronously (async) or synchronously + * (sync). The async API allows caller to batch up to **10,000** queries and sync API up to **100** + * queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/search/address/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **10,000** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Search Address Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` + * GET + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _search address_ queries you will use a `POST` request where the request body will + * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 5 _search address_ queries: + * + * + * ```json + * { + * "batchItems": [ + * {"query": "?query=400 Broad St, Seattle, WA 98109&limit=3"}, + * {"query": "?query=One, Microsoft Way, Redmond, WA 98052&limit=3"}, + * {"query": "?query=350 5th Ave, New York, NY 10118&limit=1"}, + * {"query": "?query=Pike Pl, Seattle, WA 98101&lat=47.610970&lon=-122.342469&radius=1000"}, + * {"query": "?query=Champ de Mars, 5 Avenue Anatole France, 75007 Paris, France&limit=1"} + * ] + * } + * ``` + * + * A _search address_ query in a batch is just a partial URL _without_ the protocol, base URL, path, + * api-version and subscription-key. It can accept any of the supported _search address_ [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#uri-parameters). + * The string values in the _search address_ query must be properly escaped (e.g. " character should be + * escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, + * and the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#SearchCommonResponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 2, + * "totalRequests": 3 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "one microsoft way redmond wa 98052" + * }, + * "results": [ + * { + * "position": { + * "lat": 47.63989, + * "lon": -122.12509 + * } + * } + * ] + * } + * }, + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "query": "pike pl seattle wa 98101" + * }, + * "results": [ + * { + * "position": { + * "lat": 47.60963, + * "lon": -122.34215 + * } + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param searchAddressBatchRequestBody The list of address geocoding queries/requests to process. The + * list can contain a max of 10,000 queries and must contain at least 1 query. + * @param options The options parameters. + */ + beginPostSearchAddressBatchAndWait( + format: ResponseFormat, + searchAddressBatchRequestBody: BatchRequestBody, + options?: SearchPostSearchAddressBatchOptionalParams + ): Promise; + /** + * **Search Address Reverse Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Search Address Batch API sends batches of queries to [Search Address Reverse + * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse) using just a + * single API call. You can call Search Address Reverse Batch API to run either asynchronously (async) + * or synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API + * up to **100** queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/search/address/reverse/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **10,000** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Search Address Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` + * GET + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _search address reverse_ queries you will use a `POST` request where the request body + * will contain the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 5 _search address reverse_ queries: + * + * + * ```json + * { + * "batchItems": [ + * {"query": "?query=48.858561,2.294911"}, + * {"query": "?query=47.639765,-122.127896&radius=5000&limit=2"}, + * {"query": "?query=47.621028,-122.348170"}, + * {"query": "?query=43.722990,10.396695"}, + * {"query": "?query=40.750958,-73.982336"} + * ] + * } + * ``` + * + * A _search address reverse_ query in a batch is just a partial URL _without_ the protocol, base URL, + * path, api-version and subscription-key. It can accept any of the supported _search address reverse_ + * [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#uri-parameters). + * The string values in the _search address reverse_ query must be properly escaped (e.g. " character + * should be escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, + * and the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`SearchAddressReverseResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#searchaddressreverseresponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 2, + * "totalRequests": 3 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "queryTime": 11 + * }, + * "addresses": [ + * { + * "address": { + * "country": "France", + * "freeformAddress": "Avenue Anatole France, 75007 Paris" + * }, + * "position": "48.858490,2.294820" + * } + * ] + * } + * }, + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "queryTime": 1 + * }, + * "addresses": [ + * { + * "address": { + * "country": "United States of America", + * "freeformAddress": "157th Pl NE, Redmond WA 98052" + * }, + * "position": "47.640470,-122.129430" + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param searchAddressReverseBatchRequestBody The list of reverse geocoding queries/requests to + * process. The list can contain a max of 10,000 queries and must contain at least 1 query. + * @param options The options parameters. + */ + postSearchAddressReverseBatchSync( + format: ResponseFormat, + searchAddressReverseBatchRequestBody: BatchRequestBody, + options?: SearchPostSearchAddressReverseBatchSyncOptionalParams + ): Promise; + /** + * **Search Address Reverse Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Search Address Batch API sends batches of queries to [Search Address Reverse + * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse) using just a + * single API call. You can call Search Address Reverse Batch API to run either asynchronously (async) + * or synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API + * up to **100** queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/search/address/reverse/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **10,000** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Search Address Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` + * GET + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _search address reverse_ queries you will use a `POST` request where the request body + * will contain the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 5 _search address reverse_ queries: + * + * + * ```json + * { + * "batchItems": [ + * {"query": "?query=48.858561,2.294911"}, + * {"query": "?query=47.639765,-122.127896&radius=5000&limit=2"}, + * {"query": "?query=47.621028,-122.348170"}, + * {"query": "?query=43.722990,10.396695"}, + * {"query": "?query=40.750958,-73.982336"} + * ] + * } + * ``` + * + * A _search address reverse_ query in a batch is just a partial URL _without_ the protocol, base URL, + * path, api-version and subscription-key. It can accept any of the supported _search address reverse_ + * [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#uri-parameters). + * The string values in the _search address reverse_ query must be properly escaped (e.g. " character + * should be escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, + * and the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`SearchAddressReverseResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#searchaddressreverseresponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 2, + * "totalRequests": 3 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "queryTime": 11 + * }, + * "addresses": [ + * { + * "address": { + * "country": "France", + * "freeformAddress": "Avenue Anatole France, 75007 Paris" + * }, + * "position": "48.858490,2.294820" + * } + * ] + * } + * }, + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "queryTime": 1 + * }, + * "addresses": [ + * { + * "address": { + * "country": "United States of America", + * "freeformAddress": "157th Pl NE, Redmond WA 98052" + * }, + * "position": "47.640470,-122.129430" + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param searchAddressReverseBatchRequestBody The list of reverse geocoding queries/requests to + * process. The list can contain a max of 10,000 queries and must contain at least 1 query. + * @param options The options parameters. + */ + beginPostSearchAddressReverseBatch( + format: ResponseFormat, + searchAddressReverseBatchRequestBody: BatchRequestBody, + options?: SearchPostSearchAddressReverseBatchOptionalParams + ): Promise< + PollerLike< + PollOperationState, + SearchPostSearchAddressReverseBatchResponse + > + >; + /** + * **Search Address Reverse Batch API** + * + * + * **Applies to**: S1 pricing tier. + * + * + * + * The Search Address Batch API sends batches of queries to [Search Address Reverse + * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse) using just a + * single API call. You can call Search Address Reverse Batch API to run either asynchronously (async) + * or synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API + * up to **100** queries. + * ### Submit Synchronous Batch Request + * The Synchronous API is recommended for lightweight batch requests. When the service receives a + * request, it will respond as soon as the batch items are calculated and there will be no possibility + * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if + * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this + * API. + * ``` + * POST + * https://atlas.microsoft.com/search/address/reverse/batch/sync/json?api-version=1.0&subscription-key={subscription-key} + * ``` + * ### Submit Asynchronous Batch Request + * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests + * - It allows the retrieval of results in a separate call (multiple downloads are possible). + * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. + * - The number of batch items is limited to **10,000** for this API. + * + * When you make a request by using async request, by default the service returns a 202 response code + * along a redirect URL in the Location field of the response header. This URL should be checked + * periodically until the response data or error information is available. + * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if + * used after the expiration period. + * + * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of + * operations: + * 1. Client sends a Search Address Batch `POST` request to Azure Maps + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request has been accepted. + * + * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 + * Bad Request` or any other `Error` status code. + * + * 3. If the batch request was accepted successfully, the `Location` header in the response contains + * the URL to download the results of the batch request. + * This status URI looks like following: + * + * ``` + * GET + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch + * results. + * + * ### POST Body for Batch Request + * To send the _search address reverse_ queries you will use a `POST` request where the request body + * will contain the `batchItems` array in `json` format and the `Content-Type` header will be set to + * `application/json`. Here's a sample request body containing 5 _search address reverse_ queries: + * + * + * ```json + * { + * "batchItems": [ + * {"query": "?query=48.858561,2.294911"}, + * {"query": "?query=47.639765,-122.127896&radius=5000&limit=2"}, + * {"query": "?query=47.621028,-122.348170"}, + * {"query": "?query=43.722990,10.396695"}, + * {"query": "?query=40.750958,-73.982336"} + * ] + * } + * ``` + * + * A _search address reverse_ query in a batch is just a partial URL _without_ the protocol, base URL, + * path, api-version and subscription-key. It can accept any of the supported _search address reverse_ + * [URI + * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#uri-parameters). + * The string values in the _search address reverse_ query must be properly escaped (e.g. " character + * should be escaped with \\ ) and it should also be properly URL-encoded. + * + * + * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, + * and the batch should contain at least **1** query. + * + * + * ### Download Asynchronous Batch Results + * To download the async batch results you will issue a `GET` request to the batch download endpoint. + * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request + * and looks like the following: + * + * ``` + * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} + * ``` + * Here's the typical sequence of operations for downloading the batch results: + * 1. Client sends a `GET` request using the _download URL_. + * 2. The server will respond with one of the following: + * + * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try + * again in some time. + * + * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch + * results. + * + * + * + * ### Batch Response Model + * The returned data content is similar for async and sync requests. When downloading the results of an + * async batch request, if the batch has finished processing, the response body contains the batch + * response. This batch response contains a `summary` component that indicates the `totalRequests` that + * were part of the original batch request and `successfulRequests`i.e. queries which were executed + * successfully. The batch response also includes a `batchItems` array which contains a response for + * each and every query in the batch request. The `batchItems` will contain the results in the exact + * same order the original queries were sent in the batch request. Each item in `batchItems` contains + * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following + * types: + * + * - + * [`SearchAddressReverseResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#searchaddressreverseresponse) + * - If the query completed successfully. + * + * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. + * + * + * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: + * + * + * ```json + * { + * "summary": { + * "successfulRequests": 2, + * "totalRequests": 3 + * }, + * "batchItems": [ + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "queryTime": 11 + * }, + * "addresses": [ + * { + * "address": { + * "country": "France", + * "freeformAddress": "Avenue Anatole France, 75007 Paris" + * }, + * "position": "48.858490,2.294820" + * } + * ] + * } + * }, + * { + * "statusCode": 200, + * "response": + * { + * "summary": { + * "queryTime": 1 + * }, + * "addresses": [ + * { + * "address": { + * "country": "United States of America", + * "freeformAddress": "157th Pl NE, Redmond WA 98052" + * }, + * "position": "47.640470,-122.129430" + * } + * ] + * } + * }, + * { + * "statusCode": 400, + * "response": + * { + * "error": + * { + * "code": "400 BadRequest", + * "message": "Bad request: one or more parameters were incorrectly specified or + * are mutually exclusive." + * } + * } + * } + * ] + * } + * ``` + * @param format Desired format of the response. Only `json` format is supported. + * @param searchAddressReverseBatchRequestBody The list of reverse geocoding queries/requests to + * process. The list can contain a max of 10,000 queries and must contain at least 1 query. + * @param options The options parameters. + */ + beginPostSearchAddressReverseBatchAndWait( + format: ResponseFormat, + searchAddressReverseBatchRequestBody: BatchRequestBody, + options?: SearchPostSearchAddressReverseBatchOptionalParams + ): Promise; +} diff --git a/sdk/maps/maps-search/src/searchClient.ts b/sdk/maps/maps-search/src/searchClient.ts new file mode 100644 index 000000000000..adcc32caecd7 --- /dev/null +++ b/sdk/maps/maps-search/src/searchClient.ts @@ -0,0 +1,30 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreAuth from "@azure/core-auth"; +import { SearchImpl } from "./operations"; +import { Search } from "./operationsInterfaces"; +import { SearchClientContext } from "./searchClientContext"; +import { SearchClientOptionalParams } from "./models"; + +export class SearchClient extends SearchClientContext { + /** + * Initializes a new instance of the SearchClient class. + * @param credentials Subscription credentials which uniquely identify client subscription. + * @param options The parameter options + */ + constructor( + credentials: coreAuth.TokenCredential, + options?: SearchClientOptionalParams + ) { + super(credentials, options); + this.search = new SearchImpl(this); + } + + search: Search; +} diff --git a/sdk/maps/maps-search/src/searchClientContext.ts b/sdk/maps/maps-search/src/searchClientContext.ts new file mode 100644 index 000000000000..7dcd6c113706 --- /dev/null +++ b/sdk/maps/maps-search/src/searchClientContext.ts @@ -0,0 +1,63 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; +import * as coreAuth from "@azure/core-auth"; +import { Geography, SearchClientOptionalParams } from "./models"; + +export class SearchClientContext extends coreClient.ServiceClient { + geography: Geography; + xMsClientId?: string; + apiVersion: string; + + /** + * Initializes a new instance of the SearchClientContext class. + * @param credentials Subscription credentials which uniquely identify client subscription. + * @param options The parameter options + */ + constructor( + credentials: coreAuth.TokenCredential, + options?: SearchClientOptionalParams + ) { + if (credentials === undefined) { + throw new Error("'credentials' cannot be null"); + } + + // Initializing default values for options + if (!options) { + options = {}; + } + const defaults: SearchClientOptionalParams = { + requestContentType: "application/json; charset=utf-8", + credential: credentials + }; + + const packageDetails = `azsdk-js-maps-search/1.0.0-beta.1`; + const userAgentPrefix = + options.userAgentOptions && options.userAgentOptions.userAgentPrefix + ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` + : `${packageDetails}`; + + if (!options.credentialScopes) { + options.credentialScopes = ["https://atlas.microsoft.com/.default"]; + } + const optionsWithDefaults = { + ...defaults, + ...options, + userAgentOptions: { + userAgentPrefix + }, + baseUri: options.endpoint || "https://{geography}.atlas.microsoft.com" + }; + super(optionsWithDefaults); + + // Assigning values to Constant parameters + this.geography = options.geography || "us"; + this.apiVersion = options.apiVersion || "1.0"; + } +} diff --git a/sdk/maps/maps-search/tsconfig.json b/sdk/maps/maps-search/tsconfig.json new file mode 100644 index 000000000000..0ec8659c8e83 --- /dev/null +++ b/sdk/maps/maps-search/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "module": "es6", + "moduleResolution": "node", + "strict": true, + "target": "es6", + "sourceMap": true, + "declarationMap": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "preserveConstEnums": true, + "lib": ["es6", "dom"], + "declaration": true, + "outDir": "./esm", + "importHelpers": true + }, + "include": ["./src/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/sdk/maps/maps-timezone/LICENSE.txt b/sdk/maps/maps-timezone/LICENSE.txt new file mode 100644 index 000000000000..ccb63b166732 --- /dev/null +++ b/sdk/maps/maps-timezone/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2021 Microsoft + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/sdk/maps/maps-timezone/README.md b/sdk/maps/maps-timezone/README.md new file mode 100644 index 000000000000..35166535fdda --- /dev/null +++ b/sdk/maps/maps-timezone/README.md @@ -0,0 +1,91 @@ +# Azure Timezone client library for JavaScript + +This package contains an isomorphic SDK (runs both in Node.js and in browsers) for Azure Timezone client. + +Azure Maps Time Zone REST APIs + +[Source code](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-timezone) | +[Package (NPM)](https://www.npmjs.com/package/@azure/maps-timezone) | +[API reference documentation](https://docs.microsoft.com/javascript/api/@azure/maps-timezone) | +[Samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-timezone/samples) + +## Getting started + +### Currently supported environments + +- [LTS versions of Node.js](https://nodejs.org/about/releases/) +- Latest versions of Safari, Chrome, Edge and Firefox. + +### Prerequisites + +- An [Azure subscription][azure_sub]. + +### Install the `@azure/maps-timezone` package + +Install the Azure Timezone client library for JavaScript with `npm`: + +```bash +npm install @azure/maps-timezone +``` + +### Create and authenticate a `TimezoneClient` + +To create a client object to access the Azure Timezone API, you will need the `endpoint` of your Azure Timezone resource and a `credential`. The Azure Timezone client can use Azure Active Directory credentials to authenticate. +You can find the endpoint for your Azure Timezone resource in the [Azure Portal][azure_portal]. + +#### Using an Azure Active Directory Credential + +You can authenticate with Azure Active Directory using the [Azure Identity library][azure_identity]. To use the [DefaultAzureCredential][defaultazurecredential] provider shown below, or other credential providers provided with the Azure SDK, please install the `@azure/identity` package: + +```bash +npm install @azure/identity +``` + +You will also need to register a new AAD application and grant access to Azure Timezone by assigning the suitable role to your service principal (note: roles such as `"Owner"` will not grant the necessary permissions). +Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`. + +```javascript +const { TimezoneClient } = require("@azure/maps-timezone"); +const { DefaultAzureCredential } = require("@azure/identity"); +const client = new TimezoneClient("", new DefaultAzureCredential()); +``` + +## Key concepts + +### TimezoneClient + +`TimezoneClient` is the primary interface for developers using the Azure Timezone client library. Explore the methods on this client object to understand the different features of the Azure Timezone service that you can access. + +## Troubleshooting + +### Logging + +Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: + +```javascript +import { setLogLevel } from "@azure/logger"; +setLogLevel("info"); +``` + +For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger). + +## Next steps + +Please take a look at the [samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-timezone/samples) directory for detailed examples on how to use this library. + +## Contributing + +If you'd like to contribute to this library, please read the [contributing guide](https://github.com/Azure/azure-sdk-for-js/blob/master/CONTRIBUTING.md) to learn more about how to build and test the code. + +## Related projects + +- [Microsoft Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) + +![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fmaps%2Fmaps-timezone%2FREADME.png) + +[azure_cli]: https://docs.microsoft.com/cli/azure +[azure_sub]: https://azure.microsoft.com/free/ +[azure_sub]: https://azure.microsoft.com/free/ +[azure_portal]: https://portal.azure.com +[azure_identity]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity +[defaultazurecredential]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity#defaultazurecredential diff --git a/sdk/maps/maps-timezone/api-extractor.json b/sdk/maps/maps-timezone/api-extractor.json new file mode 100644 index 000000000000..5fb5b21b56f2 --- /dev/null +++ b/sdk/maps/maps-timezone/api-extractor.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "mainEntryPointFilePath": "./esm/index.d.ts", + "docModel": { "enabled": true }, + "apiReport": { "enabled": true, "reportFolder": "./review" }, + "dtsRollup": { + "enabled": true, + "untrimmedFilePath": "", + "publicTrimmedFilePath": "./esm/index.d.ts" + }, + "messages": { + "tsdocMessageReporting": { "default": { "logLevel": "none" } }, + "extractorMessageReporting": { + "ae-missing-release-tag": { "logLevel": "none" }, + "ae-unresolved-link": { "logLevel": "none" } + } + } +} diff --git a/sdk/maps/maps-timezone/package.json b/sdk/maps/maps-timezone/package.json new file mode 100644 index 000000000000..47338aefc6b7 --- /dev/null +++ b/sdk/maps/maps-timezone/package.json @@ -0,0 +1,84 @@ +{ + "name": "@azure/maps-timezone", + "sdk-type": "client", + "author": "Microsoft Corporation", + "description": "A generated SDK for TimezoneClient.", + "version": "1.0.0-beta.1", + "engines": { "node": ">=12.0.0" }, + "dependencies": { + "@azure/core-client": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-rest-pipeline": "^1.1.0", + "tslib": "^2.2.0" + }, + "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], + "license": "MIT", + "main": "./dist/index.js", + "module": "./esm/index.js", + "types": "./esm/index.d.ts", + "devDependencies": { + "@microsoft/api-extractor": "7.7.11", + "@rollup/plugin-commonjs": "11.0.2", + "@rollup/plugin-json": "^4.0.0", + "@rollup/plugin-multi-entry": "^3.0.0", + "@rollup/plugin-node-resolve": "^8.0.0", + "mkdirp": "^1.0.4", + "rollup": "^1.16.3", + "rollup-plugin-sourcemaps": "^0.4.2", + "rollup-plugin-node-resolve": "^3.4.0", + "typescript": "~4.2.0", + "uglify-js": "^3.4.9" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js", + "repository": { + "type": "git", + "url": "https://github.com/Azure/azure-sdk-for-js.git" + }, + "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, + "files": [ + "dist/**/*.js", + "dist/**/*.js.map", + "dist/**/*.d.ts", + "dist/**/*.d.ts.map", + "esm/**/*.js", + "esm/**/*.js.map", + "esm/**/*.d.ts", + "esm/**/*.d.ts.map", + "src/**/*.ts", + "README.md", + "rollup.config.js", + "tsconfig.json", + "review/*", + "CHANGELOG.md" + ], + "scripts": { + "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", + "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js", + "prepack": "npm install && npm run build", + "pack": "npm pack 2>&1", + "extract-api": "mkdirp ./review && api-extractor run --local", + "lint": "echo skipped", + "audit": "echo skipped", + "clean": "echo skipped", + "build:node": "echo skipped", + "build:browser": "echo skipped", + "build:test": "echo skipped", + "build:samples": "echo skipped.", + "check-format": "echo skipped", + "execute:samples": "echo skipped", + "format": "echo skipped", + "test": "echo skipped", + "prebuild": "echo skipped", + "test:node": "echo skipped", + "test:browser": "echo skipped", + "unit-test": "echo skipped", + "unit-test:node": "echo skipped", + "unit-test:browser": "echo skipped", + "integration-test:browser": "echo skipped", + "integration-test:node": "echo skipped", + "integration-test": "echo skipped", + "docs": "echo skipped" + }, + "sideEffects": false, + "autoPublish": true +} diff --git a/sdk/maps/maps-timezone/review/maps-timezone.api.md b/sdk/maps/maps-timezone/review/maps-timezone.api.md new file mode 100644 index 000000000000..97521ba09fb4 --- /dev/null +++ b/sdk/maps/maps-timezone/review/maps-timezone.api.md @@ -0,0 +1,268 @@ +## API Report File for "@azure/maps-timezone" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import * as coreAuth from '@azure/core-auth'; +import * as coreClient from '@azure/core-client'; + +// @public +export interface CountryRecord { + readonly code?: string; + readonly name?: string; +} + +// @public +export interface ErrorAdditionalInfo { + readonly info?: Record; + readonly type?: string; +} + +// @public +export interface ErrorDetail { + readonly additionalInfo?: ErrorAdditionalInfo[]; + readonly code?: string; + readonly details?: ErrorDetail[]; + readonly message?: string; + readonly target?: string; +} + +// @public +export interface ErrorResponse { + error?: ErrorDetail; +} + +// @public +export type GeographicResourceLocation = string; + +// @public +export type Geography = string; + +// @public (undocumented) +export interface IanaId { + readonly aliasOf?: string; + readonly hasZone1970Location?: boolean; + readonly id?: string; + readonly isAlias?: boolean; +} + +// @public +export const enum KnownGeographicResourceLocation { + Eu = "eu", + Us = "us" +} + +// @public +export const enum KnownGeography { + // (undocumented) + Eu = "eu", + // (undocumented) + Us = "us" +} + +// @public +export const enum KnownResponseFormat { + Json = "json" +} + +// @public +export const enum KnownTimezoneOptions { + All = "all", + None = "none", + Transitions = "transitions", + ZoneInfo = "zoneInfo" +} + +// @public +export interface ReferenceTimeByCoordinates { + readonly daylightSavings?: string; + readonly posixTz?: string; + readonly posixTzValidYear?: number; + readonly standardOffset?: string; + readonly sunrise?: string; + readonly sunset?: string; + readonly tag?: string; + readonly wallTime?: string; +} + +// @public +export interface ReferenceTimeById { + readonly daylightSavings?: string; + readonly posixTz?: string; + readonly posixTzValidYear?: number; + readonly standardOffset?: string; + readonly tag?: string; + readonly wallTime?: string; +} + +// @public +export interface RepresentativePoint { + readonly latitude?: number; + readonly longitude?: number; +} + +// @public +export type ResponseFormat = string; + +// @public (undocumented) +export interface TimeTransition { + readonly daylightSavings?: string; + readonly standardOffset?: string; + readonly tag?: string; + readonly utcEnd?: Date; + readonly utcStart?: Date; +} + +// @public +export interface Timezone { + getTimezoneByCoordinates(format: ResponseFormat, query: string, options?: TimezoneGetTimezoneByCoordinatesOptionalParams): Promise; + getTimezoneByID(format: ResponseFormat, query: string, options?: TimezoneGetTimezoneByIDOptionalParams): Promise; + getTimezoneEnumIana(format: ResponseFormat, options?: TimezoneGetTimezoneEnumIanaOptionalParams): Promise; + getTimezoneEnumWindows(format: ResponseFormat, options?: TimezoneGetTimezoneEnumWindowsOptionalParams): Promise; + getTimezoneIanaVersion(format: ResponseFormat, options?: TimezoneGetTimezoneIanaVersionOptionalParams): Promise; + getTimezoneWindowsToIana(format: ResponseFormat, query: string, options?: TimezoneGetTimezoneWindowsToIanaOptionalParams): Promise; +} + +// @public (undocumented) +export interface TimeZoneByCoordinates { + readonly aliases?: string[]; + readonly countries?: CountryRecord[]; + readonly id?: string; + names?: TimezoneNames; + readonly referenceTime?: ReferenceTimeByCoordinates; + readonly representativePoint?: RepresentativePoint; + readonly timeTransitions?: TimeTransition[]; +} + +// @public +export interface TimezoneByCoordinatesResult { + readonly referenceUtcTimestamp?: Date; + readonly timeZones?: TimeZoneByCoordinates[]; + readonly version?: string; +} + +// @public (undocumented) +export interface TimezoneById { + readonly aliases?: string[]; + readonly countries?: CountryRecord[]; + readonly id?: string; + names?: TimezoneNames; + readonly referenceTime?: ReferenceTimeById; + readonly representativePoint?: RepresentativePoint; + readonly timeTransitions?: TimeTransition[]; +} + +// @public +export interface TimezoneByIdResult { + readonly referenceUtcTimestamp?: Date; + readonly timeZones?: TimezoneById[]; + readonly version?: string; +} + +// @public (undocumented) +export class TimezoneClient extends TimezoneClientContext { + constructor(credentials: coreAuth.TokenCredential, options?: TimezoneClientOptionalParams); + // (undocumented) + timezone: Timezone; +} + +// @public (undocumented) +export class TimezoneClientContext extends coreClient.ServiceClient { + constructor(credentials: coreAuth.TokenCredential, options?: TimezoneClientOptionalParams); + // (undocumented) + apiVersion: string; + // (undocumented) + geography: Geography; + // (undocumented) + xMsClientId?: string; +} + +// @public +export interface TimezoneClientOptionalParams extends coreClient.ServiceClientOptions { + apiVersion?: string; + endpoint?: string; + geography?: Geography; + xMsClientId?: string; +} + +// @public (undocumented) +export interface TimezoneEnumWindow { + ianaIds?: string[]; + readonly territory?: string; + readonly windowsId?: string; +} + +// @public +export interface TimezoneGetTimezoneByCoordinatesOptionalParams extends coreClient.OperationOptions { + acceptLanguage?: string; + options?: TimezoneOptions; + timeStamp?: Date; + transitionsFrom?: Date; + transitionsYears?: number; +} + +// @public +export type TimezoneGetTimezoneByCoordinatesResponse = TimezoneByCoordinatesResult; + +// @public +export interface TimezoneGetTimezoneByIDOptionalParams extends coreClient.OperationOptions { + acceptLanguage?: string; + options?: TimezoneOptions; + timeStamp?: Date; + transitionsFrom?: Date; + transitionsYears?: number; +} + +// @public +export type TimezoneGetTimezoneByIDResponse = TimezoneByIdResult; + +// @public +export interface TimezoneGetTimezoneEnumIanaOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type TimezoneGetTimezoneEnumIanaResponse = IanaId[]; + +// @public +export interface TimezoneGetTimezoneEnumWindowsOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type TimezoneGetTimezoneEnumWindowsResponse = TimezoneEnumWindow[]; + +// @public +export interface TimezoneGetTimezoneIanaVersionOptionalParams extends coreClient.OperationOptions { +} + +// @public +export type TimezoneGetTimezoneIanaVersionResponse = TimezoneIanaVersionResult; + +// @public +export interface TimezoneGetTimezoneWindowsToIanaOptionalParams extends coreClient.OperationOptions { + territory?: string; +} + +// @public +export type TimezoneGetTimezoneWindowsToIanaResponse = IanaId[]; + +// @public +export interface TimezoneIanaVersionResult { + readonly version?: string; +} + +// @public +export interface TimezoneNames { + readonly daylight?: string; + readonly generic?: string; + readonly iSO6391LanguageCode?: string; + readonly standard?: string; +} + +// @public +export type TimezoneOptions = string; + + +// (No @packageDocumentation comment for this package) + +``` diff --git a/sdk/maps/maps-timezone/rollup.config.js b/sdk/maps/maps-timezone/rollup.config.js new file mode 100644 index 000000000000..9be1955eb7f1 --- /dev/null +++ b/sdk/maps/maps-timezone/rollup.config.js @@ -0,0 +1,188 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import nodeResolve from "@rollup/plugin-node-resolve"; +import cjs from "@rollup/plugin-commonjs"; +import sourcemaps from "rollup-plugin-sourcemaps"; +import multiEntry from "@rollup/plugin-multi-entry"; +import json from "@rollup/plugin-json"; + +import nodeBuiltins from "builtin-modules"; + +/** + * Gets the proper configuration needed for rollup's commonJS plugin for @opentelemetry/api. + * + * NOTE: this manual configuration is only needed because OpenTelemetry uses an + * __exportStar downleveled helper function to declare its exports which confuses + * rollup's automatic discovery mechanism. + * + * @returns an object reference that can be `...`'d into your cjs() configuration. + */ +export function openTelemetryCommonJs() { + const namedExports = {}; + + for (const key of [ + "@opentelemetry/api", + "@azure/core-tracing/node_modules/@opentelemetry/api" + ]) { + namedExports[key] = [ + "SpanKind", + "TraceFlags", + "getSpan", + "setSpan", + "SpanStatusCode", + "getSpanContext", + "setSpanContext" + ]; + } + + const releasedOpenTelemetryVersions = ["0.10.2", "1.0.0-rc.0"]; + + for (const version of releasedOpenTelemetryVersions) { + namedExports[ + // working around a limitation in the rollup common.js plugin - it's not able to resolve these modules so the named exports listed above will not get applied. We have to drill down to the actual path. + `../../../common/temp/node_modules/.pnpm/@opentelemetry/api@${version}/node_modules/@opentelemetry/api/build/src/index.js` + ] = [ + "SpanKind", + "TraceFlags", + "getSpan", + "setSpan", + "StatusCode", + "CanonicalCode", + "getSpanContext", + "setSpanContext" + ]; + } + + return namedExports; +} + +// #region Warning Handler + +/** + * A function that can determine whether a rollupwarning should be ignored. If + * the function returns `true`, then the warning will not be displayed. + */ + +function ignoreNiseSinonEvalWarnings(warning) { + return ( + warning.code === "EVAL" && + warning.id && + (warning.id.includes("node_modules/nise") || + warning.id.includes("node_modules/sinon")) === true + ); +} + +function ignoreChaiCircularDependencyWarnings(warning) { + return ( + warning.code === "CIRCULAR_DEPENDENCY" && + warning.importer && warning.importer.includes("node_modules/chai") === true + ); +} + +const warningInhibitors = [ + ignoreChaiCircularDependencyWarnings, + ignoreNiseSinonEvalWarnings +]; + +/** + * Construct a warning handler for the shared rollup configuration + * that ignores certain warnings that are not relevant to testing. + */ +function makeOnWarnForTesting() { + return (warning, warn) => { + // If every inhibitor returns false (i.e. no inhibitors), then show the warning + if (warningInhibitors.every((inhib) => !inhib(warning))) { + warn(warning); + } + }; +} + +// #endregion + +function makeBrowserTestConfig() { + const config = { + input: { + include: ["dist-esm/test/**/*.spec.js"], + exclude: ["dist-esm/test/**/node/**"] + }, + output: { + file: `dist-test/index.browser.js`, + format: "umd", + sourcemap: true + }, + preserveSymlinks: false, + plugins: [ + multiEntry({ exports: false }), + nodeResolve({ + mainFields: ["module", "browser"] + }), + cjs({ + namedExports: { + // Chai's strange internal architecture makes it impossible to statically + // analyze its exports. + chai: [ + "version", + "use", + "util", + "config", + "expect", + "should", + "assert" + ], + ...openTelemetryCommonJs() + } + }), + json(), + sourcemaps() + //viz({ filename: "dist-test/browser-stats.html", sourcemap: true }) + ], + onwarn: makeOnWarnForTesting(), + // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, + // rollup started respecting the "sideEffects" field in package.json. Since + // our package.json sets "sideEffects=false", this also applies to test + // code, which causes all tests to be removed by tree-shaking. + treeshake: false + }; + + return config; +} + +const defaultConfigurationOptions = { + disableBrowserBundle: false +}; + +export function makeConfig(pkg, options) { + options = { + ...defaultConfigurationOptions, + ...(options || {}) + }; + + const baseConfig = { + // Use the package's module field if it has one + input: pkg["module"] || "dist-esm/src/index.js", + external: [ + ...nodeBuiltins, + ...Object.keys(pkg.dependencies), + ...Object.keys(pkg.devDependencies) + ], + output: { file: "dist/index.js", format: "cjs", sourcemap: true }, + preserveSymlinks: false, + plugins: [sourcemaps(), nodeResolve(), cjs()] + }; + + const config = [baseConfig]; + + if (!options.disableBrowserBundle) { + config.push(makeBrowserTestConfig()); + } + + return config; +} + +export default makeConfig(require("./package.json")); diff --git a/sdk/maps/maps-timezone/samples/v1/javascript/README.md b/sdk/maps/maps-timezone/samples/v1/javascript/README.md new file mode 100644 index 000000000000..20b07f1db219 --- /dev/null +++ b/sdk/maps/maps-timezone/samples/v1/javascript/README.md @@ -0,0 +1,54 @@ +--- +page_type: sample +languages: + - javascript +products: + - azure +urlFragment: maps-timezone-javascript +--- + +# Azure Maps Timezone client library samples for JavaScript + +These sample programs show how to use the JavaScript client libraries for Azure Maps Timezone in some common scenarios. + +| **File Name** | **Description** | +| ----------------------- | ---------------------------------------------------------------------------- | +| [timezone.js][timezone] | Timezone related operations. Supports Windows and IANA timezone definitions. | + +## Prerequisites + +The sample programs are compatible with Node.js >=12.0.0. + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +3. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node timezone.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx cross-env MAPS_SUBSCRIPTION_KEY="" node timezone.js +``` + +[timezone]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-timezone/samples/v1/javascript/src/timezone.js +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-timezone/README.md diff --git a/sdk/maps/maps-timezone/samples/v1/javascript/elevation.js b/sdk/maps/maps-timezone/samples/v1/javascript/elevation.js new file mode 100644 index 000000000000..422587aca96f --- /dev/null +++ b/sdk/maps/maps-timezone/samples/v1/javascript/elevation.js @@ -0,0 +1,70 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Elevation API usage. Simple CRUD operations are performed. + */ + +const { DefaultAzureCredential } = require("@azure/identity"); +const { ElevationClient } = require("@azure/maps-elevation"); +require("dotenv").config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + const elevation = new ElevationClient(credential).elevation; + + console.log(" --- Get Data For Bounding Box:"); + console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); + + console.log(" --- Get Data For Points:"); + console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Get Data For Polyline:"); + console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Post Data For Points:"); + console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + + console.log(" --- Post Data For Polyline:"); + console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-timezone/samples/v1/javascript/package.json b/sdk/maps/maps-timezone/samples/v1/javascript/package.json new file mode 100644 index 000000000000..667c8566f1f5 --- /dev/null +++ b/sdk/maps/maps-timezone/samples/v1/javascript/package.json @@ -0,0 +1,28 @@ +{ + "name": "azure-maps-timezone-samples-js", + "private": true, + "version": "1.0.0", + "description": "Azure Maps Timezone client library samples for JavaScript", + "engine": { + "node": ">=12.0.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/maps/maps-timezone" + }, + "keywords": [ + "Azure", + "cloud" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-timezone", + "dependencies": { + "@azure/maps-timezone": "next", + "dotenv": "latest" + } +} diff --git a/sdk/maps/maps-timezone/samples/v1/javascript/sample.env b/sdk/maps/maps-timezone/samples/v1/javascript/sample.env new file mode 100644 index 000000000000..2259ae4da0ec --- /dev/null +++ b/sdk/maps/maps-timezone/samples/v1/javascript/sample.env @@ -0,0 +1,7 @@ +# Maps subscription key when using AzureKey authentication +MAPS_SUBSCRIPTION_KEY="" + +# Maps Azure AD authentication +AZURE_CLIENT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_TENANT_ID="" diff --git a/sdk/maps/maps-timezone/samples/v1/typescript/README.md b/sdk/maps/maps-timezone/samples/v1/typescript/README.md new file mode 100644 index 000000000000..321ecc130eff --- /dev/null +++ b/sdk/maps/maps-timezone/samples/v1/typescript/README.md @@ -0,0 +1,67 @@ +--- +page_type: sample +languages: + - typescript +products: + - azure +urlFragment: maps-timezone-typescript +--- + +# Azure Maps Timezone client library samples for TypeScript + +These sample programs show how to use the TypeScript client libraries for Azure Maps Timezone in some common scenarios. + +| **File Name** | **Description** | +| ----------------------- | ---------------------------------------------------------------------------- | +| [timezone.ts][timezone] | Timezone related operations. Supports Windows and IANA timezone definitions. | + +## Prerequisites + +The sample programs are compatible with Node.js >=12.0.0. + +Before running the samples in Node, they must be compiled to JavaScript using the TypeScript compiler. For more information on TypeScript, see the [TypeScript documentation][typescript]. Install the TypeScript compiler using: + +```bash +npm install -g typescript +``` + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Compile the samples: + +```bash +npm run build +``` + +3. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +4. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node dist/timezone.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx cross-env MAPS_SUBSCRIPTION_KEY="" node dist/timezone.js +``` + +[timezone]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-timezone/samples/v1/typescript/src/timezone.ts +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-timezone/README.md +[typescript]: https://www.typescriptlang.org/docs/home.html diff --git a/sdk/maps/maps-timezone/samples/v1/typescript/package.json b/sdk/maps/maps-timezone/samples/v1/typescript/package.json new file mode 100644 index 000000000000..5f3b96967288 --- /dev/null +++ b/sdk/maps/maps-timezone/samples/v1/typescript/package.json @@ -0,0 +1,36 @@ +{ + "name": "azure-maps-timezone-samples-ts", + "private": true, + "version": "1.0.0", + "description": "Azure Maps Timezone client library samples for TypeScript", + "engine": { + "node": ">=12.0.0" + }, + "scripts": { + "build": "tsc", + "prebuild": "rimraf dist/" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/maps/maps-timezone" + }, + "keywords": [ + "Azure", + "cloud" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-timezone", + "dependencies": { + "@azure/maps-timezone": "next", + "dotenv": "latest" + }, + "devDependencies": { + "typescript": "~4.2.0", + "rimraf": "latest" + } +} diff --git a/sdk/maps/maps-timezone/samples/v1/typescript/sample.env b/sdk/maps/maps-timezone/samples/v1/typescript/sample.env new file mode 100644 index 000000000000..2259ae4da0ec --- /dev/null +++ b/sdk/maps/maps-timezone/samples/v1/typescript/sample.env @@ -0,0 +1,7 @@ +# Maps subscription key when using AzureKey authentication +MAPS_SUBSCRIPTION_KEY="" + +# Maps Azure AD authentication +AZURE_CLIENT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_TENANT_ID="" diff --git a/sdk/maps/maps-timezone/samples/v1/typescript/src/elevation.ts b/sdk/maps/maps-timezone/samples/v1/typescript/src/elevation.ts new file mode 100644 index 000000000000..5e1f91bd6989 --- /dev/null +++ b/sdk/maps/maps-timezone/samples/v1/typescript/src/elevation.ts @@ -0,0 +1,76 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Elevation API usage. Simple queries are performed. + */ + +import { getDefaultAzureCredential } from "@azure/identity"; +import * as coreAuth from "@azure/core-auth"; +import * as coreClient from "@azure/core-client"; +import { ElevationClient } from "@azure/maps-elevation"; +import * as dotenv from "dotenv"; +dotenv.config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential implements coreAuth.TokenCredential { + async getToken( + _scopes: string | string[], + _options?: coreAuth.GetTokenOptions + ): Promise { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential: coreAuth.TokenCredential; + let operationOptions: coreClient.OperationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = getDefaultAzureCredential(); + } + + const elevation = new ElevationClient(credential).elevation; + + console.log(" --- Get Data For Bounding Box:"); + console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); + + console.log(" --- Get Data For Points:"); + console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Get Data For Polyline:"); + console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Post Data For Points:"); + console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + + console.log(" --- Post Data For Polyline:"); + console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-timezone/samples/v1/typescript/tsconfig.json b/sdk/maps/maps-timezone/samples/v1/typescript/tsconfig.json new file mode 100644 index 000000000000..416c2dd82e00 --- /dev/null +++ b/sdk/maps/maps-timezone/samples/v1/typescript/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2018", + "module": "commonjs", + "moduleResolution": "node", + "resolveJsonModule": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "alwaysStrict": true, + "outDir": "dist", + "rootDir": "src" + }, + "include": [ + "src/**.ts" + ] +} diff --git a/sdk/maps/maps-timezone/src/index.ts b/sdk/maps/maps-timezone/src/index.ts new file mode 100644 index 000000000000..ddeef0536f5e --- /dev/null +++ b/sdk/maps/maps-timezone/src/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./models"; +export { TimezoneClient } from "./timezoneClient"; +export { TimezoneClientContext } from "./timezoneClientContext"; +export * from "./operationsInterfaces"; diff --git a/sdk/maps/maps-timezone/src/models/index.ts b/sdk/maps/maps-timezone/src/models/index.ts new file mode 100644 index 000000000000..17ac6ad3a986 --- /dev/null +++ b/sdk/maps/maps-timezone/src/models/index.ts @@ -0,0 +1,528 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; + +/** This object is returned from a successful Timezone By ID call */ +export interface TimezoneByIdResult { + /** + * Version property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly version?: string; + /** + * Reference Utc Timestamp property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly referenceUtcTimestamp?: Date; + /** + * TimeZoneById array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly timeZones?: TimezoneById[]; +} + +export interface TimezoneById { + /** + * Id property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly id?: string; + /** + * An array of time zone ID aliases.  Only returned when [options]=*zoneinfo* or *all*. + * + * Note: may be null. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly aliases?: string[]; + /** + * An array of country records. Only returned when [options]=*zoneinfo* or *all*. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly countries?: CountryRecord[]; + /** Timezone names object. */ + names?: TimezoneNames; + /** + * Details in effect at the local time. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly referenceTime?: ReferenceTimeById; + /** + * Representative point property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly representativePoint?: RepresentativePoint; + /** + * Time zone DST transitions from [transitionsFrom] until timestamp + 1 year. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly timeTransitions?: TimeTransition[]; +} + +/** A country record. */ +export interface CountryRecord { + /** + * Country Name + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly name?: string; + /** + * ISO-3166 2-letter country code for the country. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly code?: string; +} + +/** Timezone names object. */ +export interface TimezoneNames { + /** + * The ISO 639-1 language code of the Names + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly iSO6391LanguageCode?: string; + /** + * Generic Name + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly generic?: string; + /** + * Standard Name + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly standard?: string; + /** + * Daylight Name + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly daylight?: string; +} + +/** Details in effect at the local time. */ +export interface ReferenceTimeById { + /** + * Time zone name in effect at the reference timestamp (i.e. PST or PDT depending whether Daylight Savings Time is in effect). + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly tag?: string; + /** + * UTC offset in effect at the `ReferenceUTCTimestamp`. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly standardOffset?: string; + /** + * Time saving in minutes in effect at the `ReferenceUTCTimestamp`. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly daylightSavings?: string; + /** + * Current wall time at the given time zone as shown in the `Tag` property. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly wallTime?: string; + /** + * The year this POSIX string is valid for. Note: A POSIX string will only be valid in the given year. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly posixTzValidYear?: number; + /** + * POSIX string used to set the time zone environment variable. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly posixTz?: string; +} + +/** Representative point property */ +export interface RepresentativePoint { + /** + * Latitude property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly latitude?: number; + /** + * Longitude property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly longitude?: number; +} + +export interface TimeTransition { + /** + * Tag property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly tag?: string; + /** + * StandardOffset property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly standardOffset?: string; + /** + * DaylightSavings property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly daylightSavings?: string; + /** + * Start date, start time for this transition period + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly utcStart?: Date; + /** + * End date, end time for this transition period + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly utcEnd?: Date; +} + +/** Common error response for all Azure Resource Manager APIs to return error details for failed operations. (This also follows the OData error response format.). */ +export interface ErrorResponse { + /** The error object. */ + error?: ErrorDetail; +} + +/** The error detail. */ +export interface ErrorDetail { + /** + * The error code. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly code?: string; + /** + * The error message. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly message?: string; + /** + * The error target. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly target?: string; + /** + * The error details. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly details?: ErrorDetail[]; + /** + * The error additional info. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly additionalInfo?: ErrorAdditionalInfo[]; +} + +/** The resource management error additional info. */ +export interface ErrorAdditionalInfo { + /** + * The additional info type. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly type?: string; + /** + * The additional info. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly info?: Record; +} + +/** This object is returned from a successful Timezone By Coordinates call */ +export interface TimezoneByCoordinatesResult { + /** + * Version property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly version?: string; + /** + * Reference Utc Timestamp property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly referenceUtcTimestamp?: Date; + /** + * TimeZoneByCoordinates array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly timeZones?: TimeZoneByCoordinates[]; +} + +export interface TimeZoneByCoordinates { + /** + * Id property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly id?: string; + /** + * An array of time zone ID aliases.  Only returned when [options]=*zoneinfo* or *all*. + * + * Note: may be null. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly aliases?: string[]; + /** + * An array of country records. Only returned when [options]=*zoneinfo* or *all*. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly countries?: CountryRecord[]; + /** Timezone names object. */ + names?: TimezoneNames; + /** + * Details in effect at the local time. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly referenceTime?: ReferenceTimeByCoordinates; + /** + * Representative point property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly representativePoint?: RepresentativePoint; + /** + * Time zone DST transitions from [transitionsFrom] until timestamp + 1 year. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly timeTransitions?: TimeTransition[]; +} + +/** Details in effect at the local time. */ +export interface ReferenceTimeByCoordinates { + /** + * Time zone name in effect at the reference timestamp (i.e. PST or PDT depending whether Daylight Savings Time is in effect). + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly tag?: string; + /** + * UTC offset in effect at the `ReferenceUTCTimestamp`. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly standardOffset?: string; + /** + * Time saving in minutes in effect at the `ReferenceUTCTimestamp`. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly daylightSavings?: string; + /** + * Current wall time at the given time zone as shown in the `Tag` property. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly wallTime?: string; + /** + * The year this POSIX string is valid for. Note: A POSIX string will only be valid in the given year. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly posixTzValidYear?: number; + /** + * POSIX string used to set the time zone environment variable. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly posixTz?: string; + /** + * Sunrise at the given time zone as shown in the `Tag` property. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly sunrise?: string; + /** + * Sunset at the given time zone as shown in the `Tag` property. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly sunset?: string; +} + +export interface TimezoneEnumWindow { + /** + * Windows Id property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly windowsId?: string; + /** + * Territory property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly territory?: string; + /** IanaIds array */ + ianaIds?: string[]; +} + +export interface IanaId { + /** + * Id property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly id?: string; + /** + * IsAlias property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly isAlias?: boolean; + /** + * AliasOf property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly aliasOf?: string; + /** + * HasZone1970Location property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly hasZone1970Location?: boolean; +} + +/** This object is returned from a successful Timezone IANA Version call */ +export interface TimezoneIanaVersionResult { + /** + * Version property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly version?: string; +} + +/** Known values of {@link Geography} that the service accepts. */ +export const enum KnownGeography { + Us = "us", + Eu = "eu" +} + +/** + * Defines values for Geography. \ + * {@link KnownGeography} can be used interchangeably with Geography, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **us** \ + * **eu** + */ +export type Geography = string; + +/** Known values of {@link TimezoneOptions} that the service accepts. */ +export const enum KnownTimezoneOptions { + /** Do not include zoneinfo or transitions in the result. */ + None = "none", + /** Include additional time zone info in the result. */ + ZoneInfo = "zoneInfo", + /** Include transition information in the result (The number of transitions is currently capped at 250). */ + Transitions = "transitions", + /** Include both zoneinfo and transitions in the result. */ + All = "all" +} + +/** + * Defines values for TimezoneOptions. \ + * {@link KnownTimezoneOptions} can be used interchangeably with TimezoneOptions, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **none**: Do not include zoneinfo or transitions in the result. \ + * **zoneInfo**: Include additional time zone info in the result. \ + * **transitions**: Include transition information in the result (The number of transitions is currently capped at 250). \ + * **all**: Include both zoneinfo and transitions in the result. + */ +export type TimezoneOptions = string; + +/** Known values of {@link ResponseFormat} that the service accepts. */ +export const enum KnownResponseFormat { + /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ + Json = "json" +} + +/** + * Defines values for ResponseFormat. \ + * {@link KnownResponseFormat} can be used interchangeably with ResponseFormat, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) + */ +export type ResponseFormat = string; + +/** Known values of {@link GeographicResourceLocation} that the service accepts. */ +export const enum KnownGeographicResourceLocation { + /** Used to access an Azure Maps Creator resource in the United States */ + Us = "us", + /** Used to access an Azure Maps Creator resource in Europe */ + Eu = "eu" +} + +/** + * Defines values for GeographicResourceLocation. \ + * {@link KnownGeographicResourceLocation} can be used interchangeably with GeographicResourceLocation, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **us**: Used to access an Azure Maps Creator resource in the United States \ + * **eu**: Used to access an Azure Maps Creator resource in Europe + */ +export type GeographicResourceLocation = string; + +/** Optional parameters. */ +export interface TimezoneGetTimezoneByIDOptionalParams + extends coreClient.OperationOptions { + /** Specifies the language code in which the timezone names should be returned. If no language code is provided, the response will be in "EN". Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. */ + acceptLanguage?: string; + /** Alternatively, use alias "o". Options available for types of information returned in the result. */ + options?: TimezoneOptions; + /** Alternatively, use alias "stamp", or "s". Reference time, if omitted, the API will use the machine time serving the request. */ + timeStamp?: Date; + /** Alternatively, use alias "tf". The start date from which daylight savings time (DST) transitions are requested, only applies when "options" = all or "options" = transitions. */ + transitionsFrom?: Date; + /** Alternatively, use alias "ty". The number of years from "transitionsFrom" for which DST transitions are requested, only applies when "options" = all or "options" = transitions. */ + transitionsYears?: number; +} + +/** Contains response data for the getTimezoneByID operation. */ +export type TimezoneGetTimezoneByIDResponse = TimezoneByIdResult; + +/** Optional parameters. */ +export interface TimezoneGetTimezoneByCoordinatesOptionalParams + extends coreClient.OperationOptions { + /** Specifies the language code in which the timezone names should be returned. If no language code is provided, the response will be in "EN". Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. */ + acceptLanguage?: string; + /** Alternatively, use alias "o". Options available for types of information returned in the result. */ + options?: TimezoneOptions; + /** Alternatively, use alias "stamp", or "s". Reference time, if omitted, the API will use the machine time serving the request. */ + timeStamp?: Date; + /** Alternatively, use alias "tf". The start date from which daylight savings time (DST) transitions are requested, only applies when "options" = all or "options" = transitions. */ + transitionsFrom?: Date; + /** Alternatively, use alias "ty". The number of years from "transitionsFrom" for which DST transitions are requested, only applies when "options" = all or "options" = transitions. */ + transitionsYears?: number; +} + +/** Contains response data for the getTimezoneByCoordinates operation. */ +export type TimezoneGetTimezoneByCoordinatesResponse = TimezoneByCoordinatesResult; + +/** Optional parameters. */ +export interface TimezoneGetTimezoneEnumWindowsOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getTimezoneEnumWindows operation. */ +export type TimezoneGetTimezoneEnumWindowsResponse = TimezoneEnumWindow[]; + +/** Optional parameters. */ +export interface TimezoneGetTimezoneEnumIanaOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getTimezoneEnumIana operation. */ +export type TimezoneGetTimezoneEnumIanaResponse = IanaId[]; + +/** Optional parameters. */ +export interface TimezoneGetTimezoneIanaVersionOptionalParams + extends coreClient.OperationOptions {} + +/** Contains response data for the getTimezoneIanaVersion operation. */ +export type TimezoneGetTimezoneIanaVersionResponse = TimezoneIanaVersionResult; + +/** Optional parameters. */ +export interface TimezoneGetTimezoneWindowsToIanaOptionalParams + extends coreClient.OperationOptions { + /** Windows Time Zone territory code. */ + territory?: string; +} + +/** Contains response data for the getTimezoneWindowsToIana operation. */ +export type TimezoneGetTimezoneWindowsToIanaResponse = IanaId[]; + +/** Optional parameters. */ +export interface TimezoneClientOptionalParams + extends coreClient.ServiceClientOptions { + /** This parameter specifies where the Azure Maps Creator resource is located. Valid values are us and eu. */ + geography?: Geography; + /** Specifies which account is intended for usage in conjunction with the Azure AD security model. It represents a unique ID for the Azure Maps account and can be retrieved from the Azure Maps management plane Account API. To use Azure AD security in Azure Maps see the following [articles](https://aka.ms/amauthdetails) for guidance. */ + xMsClientId?: string; + /** Api Version */ + apiVersion?: string; + /** Overrides client endpoint. */ + endpoint?: string; +} diff --git a/sdk/maps/maps-timezone/src/models/mappers.ts b/sdk/maps/maps-timezone/src/models/mappers.ts new file mode 100644 index 000000000000..8eacffc0c433 --- /dev/null +++ b/sdk/maps/maps-timezone/src/models/mappers.ts @@ -0,0 +1,657 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; + +export const TimezoneByIdResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TimezoneByIdResult", + modelProperties: { + version: { + serializedName: "Version", + readOnly: true, + type: { + name: "String" + } + }, + referenceUtcTimestamp: { + serializedName: "ReferenceUtcTimestamp", + readOnly: true, + type: { + name: "DateTime" + } + }, + timeZones: { + serializedName: "TimeZones", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "TimezoneById" + } + } + } + } + } + } +}; + +export const TimezoneById: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TimezoneById", + modelProperties: { + id: { + serializedName: "Id", + readOnly: true, + type: { + name: "String" + } + }, + aliases: { + serializedName: "Aliases", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + countries: { + serializedName: "Countries", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "CountryRecord" + } + } + } + }, + names: { + serializedName: "Names", + type: { + name: "Composite", + className: "TimezoneNames" + } + }, + referenceTime: { + serializedName: "ReferenceTime", + type: { + name: "Composite", + className: "ReferenceTimeById" + } + }, + representativePoint: { + serializedName: "RepresentativePoint", + type: { + name: "Composite", + className: "RepresentativePoint" + } + }, + timeTransitions: { + serializedName: "TimeTransitions", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "TimeTransition" + } + } + } + } + } + } +}; + +export const CountryRecord: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "CountryRecord", + modelProperties: { + name: { + serializedName: "Name", + readOnly: true, + type: { + name: "String" + } + }, + code: { + serializedName: "Code", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const TimezoneNames: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TimezoneNames", + modelProperties: { + iSO6391LanguageCode: { + serializedName: "ISO6391LanguageCode", + readOnly: true, + type: { + name: "String" + } + }, + generic: { + serializedName: "Generic", + readOnly: true, + type: { + name: "String" + } + }, + standard: { + serializedName: "Standard", + readOnly: true, + type: { + name: "String" + } + }, + daylight: { + serializedName: "Daylight", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const ReferenceTimeById: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ReferenceTimeById", + modelProperties: { + tag: { + serializedName: "Tag", + readOnly: true, + type: { + name: "String" + } + }, + standardOffset: { + serializedName: "StandardOffset", + readOnly: true, + type: { + name: "String" + } + }, + daylightSavings: { + serializedName: "DaylightSavings", + readOnly: true, + type: { + name: "String" + } + }, + wallTime: { + serializedName: "WallTime", + readOnly: true, + type: { + name: "String" + } + }, + posixTzValidYear: { + serializedName: "PosixTzValidYear", + readOnly: true, + type: { + name: "Number" + } + }, + posixTz: { + serializedName: "PosixTz", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const RepresentativePoint: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "RepresentativePoint", + modelProperties: { + latitude: { + serializedName: "Latitude", + readOnly: true, + type: { + name: "Number" + } + }, + longitude: { + serializedName: "Longitude", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const TimeTransition: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TimeTransition", + modelProperties: { + tag: { + serializedName: "Tag", + readOnly: true, + type: { + name: "String" + } + }, + standardOffset: { + serializedName: "StandardOffset", + readOnly: true, + type: { + name: "String" + } + }, + daylightSavings: { + serializedName: "DaylightSavings", + readOnly: true, + type: { + name: "String" + } + }, + utcStart: { + serializedName: "UtcStart", + readOnly: true, + type: { + name: "DateTime" + } + }, + utcEnd: { + serializedName: "UtcEnd", + readOnly: true, + type: { + name: "DateTime" + } + } + } + } +}; + +export const ErrorResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorResponse", + modelProperties: { + error: { + serializedName: "error", + type: { + name: "Composite", + className: "ErrorDetail" + } + } + } + } +}; + +export const ErrorDetail: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorDetail", + modelProperties: { + code: { + serializedName: "code", + readOnly: true, + type: { + name: "String" + } + }, + message: { + serializedName: "message", + readOnly: true, + type: { + name: "String" + } + }, + target: { + serializedName: "target", + readOnly: true, + type: { + name: "String" + } + }, + details: { + serializedName: "details", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ErrorDetail" + } + } + } + }, + additionalInfo: { + serializedName: "additionalInfo", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ErrorAdditionalInfo" + } + } + } + } + } + } +}; + +export const ErrorAdditionalInfo: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorAdditionalInfo", + modelProperties: { + type: { + serializedName: "type", + readOnly: true, + type: { + name: "String" + } + }, + info: { + serializedName: "info", + readOnly: true, + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } + } + } +}; + +export const TimezoneByCoordinatesResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TimezoneByCoordinatesResult", + modelProperties: { + version: { + serializedName: "Version", + readOnly: true, + type: { + name: "String" + } + }, + referenceUtcTimestamp: { + serializedName: "ReferenceUtcTimestamp", + readOnly: true, + type: { + name: "DateTime" + } + }, + timeZones: { + serializedName: "TimeZones", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "TimeZoneByCoordinates" + } + } + } + } + } + } +}; + +export const TimeZoneByCoordinates: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TimeZoneByCoordinates", + modelProperties: { + id: { + serializedName: "Id", + readOnly: true, + type: { + name: "String" + } + }, + aliases: { + serializedName: "Aliases", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + countries: { + serializedName: "Countries", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "CountryRecord" + } + } + } + }, + names: { + serializedName: "Names", + type: { + name: "Composite", + className: "TimezoneNames" + } + }, + referenceTime: { + serializedName: "ReferenceTime", + type: { + name: "Composite", + className: "ReferenceTimeByCoordinates" + } + }, + representativePoint: { + serializedName: "RepresentativePoint", + type: { + name: "Composite", + className: "RepresentativePoint" + } + }, + timeTransitions: { + serializedName: "TimeTransitions", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "TimeTransition" + } + } + } + } + } + } +}; + +export const ReferenceTimeByCoordinates: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ReferenceTimeByCoordinates", + modelProperties: { + tag: { + serializedName: "Tag", + readOnly: true, + type: { + name: "String" + } + }, + standardOffset: { + serializedName: "StandardOffset", + readOnly: true, + type: { + name: "String" + } + }, + daylightSavings: { + serializedName: "DaylightSavings", + readOnly: true, + type: { + name: "String" + } + }, + wallTime: { + serializedName: "WallTime", + readOnly: true, + type: { + name: "String" + } + }, + posixTzValidYear: { + serializedName: "PosixTzValidYear", + readOnly: true, + type: { + name: "Number" + } + }, + posixTz: { + serializedName: "PosixTz", + readOnly: true, + type: { + name: "String" + } + }, + sunrise: { + serializedName: "Sunrise", + readOnly: true, + type: { + name: "String" + } + }, + sunset: { + serializedName: "Sunset", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const TimezoneEnumWindow: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TimezoneEnumWindow", + modelProperties: { + windowsId: { + serializedName: "WindowsId", + readOnly: true, + type: { + name: "String" + } + }, + territory: { + serializedName: "Territory", + readOnly: true, + type: { + name: "String" + } + }, + ianaIds: { + serializedName: "IanaIds", + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + } + } + } +}; + +export const IanaId: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "IanaId", + modelProperties: { + id: { + serializedName: "id", + readOnly: true, + type: { + name: "String" + } + }, + isAlias: { + serializedName: "isAlias", + readOnly: true, + type: { + name: "Boolean" + } + }, + aliasOf: { + serializedName: "aliasOf", + readOnly: true, + type: { + name: "String" + } + }, + hasZone1970Location: { + serializedName: "hasZone1970Location", + readOnly: true, + type: { + name: "Boolean" + } + } + } + } +}; + +export const TimezoneIanaVersionResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TimezoneIanaVersionResult", + modelProperties: { + version: { + serializedName: "version", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; diff --git a/sdk/maps/maps-timezone/src/models/parameters.ts b/sdk/maps/maps-timezone/src/models/parameters.ts new file mode 100644 index 000000000000..4e2e56f05b38 --- /dev/null +++ b/sdk/maps/maps-timezone/src/models/parameters.ts @@ -0,0 +1,140 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { + OperationParameter, + OperationURLParameter, + OperationQueryParameter +} from "@azure/core-client"; + +export const accept: OperationParameter = { + parameterPath: "accept", + mapper: { + defaultValue: "application/json", + isConstant: true, + serializedName: "Accept", + type: { + name: "String" + } + } +}; + +export const geography: OperationURLParameter = { + parameterPath: "geography", + mapper: { + serializedName: "geography", + required: true, + type: { + name: "String" + } + } +}; + +export const xMsClientId: OperationParameter = { + parameterPath: "xMsClientId", + mapper: { + serializedName: "x-ms-client-id", + type: { + name: "String" + } + } +}; + +export const apiVersion: OperationQueryParameter = { + parameterPath: "apiVersion", + mapper: { + defaultValue: "1.0", + isConstant: true, + serializedName: "api-version", + type: { + name: "String" + } + } +}; + +export const acceptLanguage: OperationParameter = { + parameterPath: ["options", "acceptLanguage"], + mapper: { + serializedName: "Accept-Language", + type: { + name: "String" + } + } +}; + +export const options: OperationQueryParameter = { + parameterPath: ["options", "options"], + mapper: { + serializedName: "options", + type: { + name: "String" + } + } +}; + +export const timeStamp: OperationQueryParameter = { + parameterPath: ["options", "timeStamp"], + mapper: { + serializedName: "timeStamp", + type: { + name: "DateTime" + } + } +}; + +export const transitionsFrom: OperationQueryParameter = { + parameterPath: ["options", "transitionsFrom"], + mapper: { + serializedName: "transitionsFrom", + type: { + name: "DateTime" + } + } +}; + +export const transitionsYears: OperationQueryParameter = { + parameterPath: ["options", "transitionsYears"], + mapper: { + serializedName: "transitionsYears", + type: { + name: "Number" + } + } +}; + +export const format: OperationURLParameter = { + parameterPath: "format", + mapper: { + serializedName: "format", + required: true, + type: { + name: "String" + } + } +}; + +export const query: OperationQueryParameter = { + parameterPath: "query", + mapper: { + serializedName: "query", + required: true, + type: { + name: "String" + } + } +}; + +export const territory: OperationQueryParameter = { + parameterPath: ["options", "territory"], + mapper: { + serializedName: "territory", + type: { + name: "String" + } + } +}; diff --git a/sdk/maps/maps-timezone/src/operations/index.ts b/sdk/maps/maps-timezone/src/operations/index.ts new file mode 100644 index 000000000000..8593a64717da --- /dev/null +++ b/sdk/maps/maps-timezone/src/operations/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./timezone"; diff --git a/sdk/maps/maps-timezone/src/operations/timezone.ts b/sdk/maps/maps-timezone/src/operations/timezone.ts new file mode 100644 index 000000000000..2ced2c2cbb43 --- /dev/null +++ b/sdk/maps/maps-timezone/src/operations/timezone.ts @@ -0,0 +1,321 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { Timezone } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; +import * as Mappers from "../models/mappers"; +import * as Parameters from "../models/parameters"; +import { TimezoneClientContext } from "../timezoneClientContext"; +import { + ResponseFormat, + TimezoneGetTimezoneByIDOptionalParams, + TimezoneGetTimezoneByIDResponse, + TimezoneGetTimezoneByCoordinatesOptionalParams, + TimezoneGetTimezoneByCoordinatesResponse, + TimezoneGetTimezoneEnumWindowsOptionalParams, + TimezoneGetTimezoneEnumWindowsResponse, + TimezoneGetTimezoneEnumIanaOptionalParams, + TimezoneGetTimezoneEnumIanaResponse, + TimezoneGetTimezoneIanaVersionOptionalParams, + TimezoneGetTimezoneIanaVersionResponse, + TimezoneGetTimezoneWindowsToIanaOptionalParams, + TimezoneGetTimezoneWindowsToIanaResponse +} from "../models"; + +/** Class representing a Timezone. */ +export class TimezoneImpl implements Timezone { + private readonly client: TimezoneClientContext; + + /** + * Initialize a new instance of the class Timezone class. + * @param client Reference to the service client + */ + constructor(client: TimezoneClientContext) { + this.client = client; + } + + /** + * __Time Zone by Id__ + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * This API returns current, historical, and future time zone information for the specified IANA time + * zone ID. + * @param format Desired format of the response. Only `json` format is supported. + * @param query The IANA time zone ID. + * @param options The options parameters. + */ + getTimezoneByID( + format: ResponseFormat, + query: string, + options?: TimezoneGetTimezoneByIDOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getTimezoneByIDOperationSpec + ); + } + + /** + * __Time Zone by Coordinates__ + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * This API returns current, historical, and future time zone information for a specified + * latitude-longitude pair. In addition, the API provides sunset and sunrise times for a given + * location. + * @param format Desired format of the response. Only `json` format is supported. + * @param query Coordinates of the point for which time zone information is requested. The applicable + * query is specified as a comma separated string composed by latitude followed by longitude e.g. + * "47.641268,-122.125679". + * @param options The options parameters. + */ + getTimezoneByCoordinates( + format: ResponseFormat, + query: string, + options?: TimezoneGetTimezoneByCoordinatesOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getTimezoneByCoordinatesOperationSpec + ); + } + + /** + * __Enumerate Windows Time Zones__ + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * This API returns a full list of Windows Time Zone IDs. + * @param format Desired format of the response. Only `json` format is supported. + * @param options The options parameters. + */ + getTimezoneEnumWindows( + format: ResponseFormat, + options?: TimezoneGetTimezoneEnumWindowsOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, options }, + getTimezoneEnumWindowsOperationSpec + ); + } + + /** + * __Enumerate IANA Time Zones__ + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * This API returns a full list of IANA time zone IDs. Updates to the IANA service will be reflected in + * the system within one day. + * @param format Desired format of the response. Only `json` format is supported. + * @param options The options parameters. + */ + getTimezoneEnumIana( + format: ResponseFormat, + options?: TimezoneGetTimezoneEnumIanaOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, options }, + getTimezoneEnumIanaOperationSpec + ); + } + + /** + * __Time Zone IANA Version__ + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * This API returns the current IANA version number. + * @param format Desired format of the response. Only `json` format is supported. + * @param options The options parameters. + */ + getTimezoneIanaVersion( + format: ResponseFormat, + options?: TimezoneGetTimezoneIanaVersionOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, options }, + getTimezoneIanaVersionOperationSpec + ); + } + + /** + * __Windows to IANA Time Zone__ + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * This API returns a corresponding IANA ID, given a valid Windows Time Zone ID. Multiple IANA IDs may + * be returned for a single Windows ID. It is possible to narrow these results by adding an optional + * territory parameter. + * @param format Desired format of the response. Only `json` format is supported. + * @param query The Windows time zone ID. + * @param options The options parameters. + */ + getTimezoneWindowsToIana( + format: ResponseFormat, + query: string, + options?: TimezoneGetTimezoneWindowsToIanaOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getTimezoneWindowsToIanaOperationSpec + ); + } +} +// Operation Specifications +const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); + +const getTimezoneByIDOperationSpec: coreClient.OperationSpec = { + path: "/timezone/byId/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.TimezoneByIdResult + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.options, + Parameters.timeStamp, + Parameters.transitionsFrom, + Parameters.transitionsYears, + Parameters.query + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [ + Parameters.accept, + Parameters.xMsClientId, + Parameters.acceptLanguage + ], + serializer +}; +const getTimezoneByCoordinatesOperationSpec: coreClient.OperationSpec = { + path: "/timezone/byCoordinates/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.TimezoneByCoordinatesResult + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.options, + Parameters.timeStamp, + Parameters.transitionsFrom, + Parameters.transitionsYears, + Parameters.query + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [ + Parameters.accept, + Parameters.xMsClientId, + Parameters.acceptLanguage + ], + serializer +}; +const getTimezoneEnumWindowsOperationSpec: coreClient.OperationSpec = { + path: "/timezone/enumWindows/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: { + type: { + name: "Sequence", + element: { + type: { name: "Composite", className: "TimezoneEnumWindow" } + } + } + } + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getTimezoneEnumIanaOperationSpec: coreClient.OperationSpec = { + path: "/timezone/enumIana/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: { + type: { + name: "Sequence", + element: { type: { name: "Composite", className: "IanaId" } } + } + } + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getTimezoneIanaVersionOperationSpec: coreClient.OperationSpec = { + path: "/timezone/ianaVersion/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.TimezoneIanaVersionResult + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [Parameters.apiVersion], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getTimezoneWindowsToIanaOperationSpec: coreClient.OperationSpec = { + path: "/timezone/windowsToIana/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: { + type: { + name: "Sequence", + element: { type: { name: "Composite", className: "IanaId" } } + } + } + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.query, + Parameters.territory + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; diff --git a/sdk/maps/maps-timezone/src/operationsInterfaces/index.ts b/sdk/maps/maps-timezone/src/operationsInterfaces/index.ts new file mode 100644 index 000000000000..8593a64717da --- /dev/null +++ b/sdk/maps/maps-timezone/src/operationsInterfaces/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./timezone"; diff --git a/sdk/maps/maps-timezone/src/operationsInterfaces/timezone.ts b/sdk/maps/maps-timezone/src/operationsInterfaces/timezone.ts new file mode 100644 index 000000000000..4fd8a623debd --- /dev/null +++ b/sdk/maps/maps-timezone/src/operationsInterfaces/timezone.ts @@ -0,0 +1,129 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { + ResponseFormat, + TimezoneGetTimezoneByIDOptionalParams, + TimezoneGetTimezoneByIDResponse, + TimezoneGetTimezoneByCoordinatesOptionalParams, + TimezoneGetTimezoneByCoordinatesResponse, + TimezoneGetTimezoneEnumWindowsOptionalParams, + TimezoneGetTimezoneEnumWindowsResponse, + TimezoneGetTimezoneEnumIanaOptionalParams, + TimezoneGetTimezoneEnumIanaResponse, + TimezoneGetTimezoneIanaVersionOptionalParams, + TimezoneGetTimezoneIanaVersionResponse, + TimezoneGetTimezoneWindowsToIanaOptionalParams, + TimezoneGetTimezoneWindowsToIanaResponse +} from "../models"; + +/** Interface representing a Timezone. */ +export interface Timezone { + /** + * __Time Zone by Id__ + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * This API returns current, historical, and future time zone information for the specified IANA time + * zone ID. + * @param format Desired format of the response. Only `json` format is supported. + * @param query The IANA time zone ID. + * @param options The options parameters. + */ + getTimezoneByID( + format: ResponseFormat, + query: string, + options?: TimezoneGetTimezoneByIDOptionalParams + ): Promise; + /** + * __Time Zone by Coordinates__ + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * This API returns current, historical, and future time zone information for a specified + * latitude-longitude pair. In addition, the API provides sunset and sunrise times for a given + * location. + * @param format Desired format of the response. Only `json` format is supported. + * @param query Coordinates of the point for which time zone information is requested. The applicable + * query is specified as a comma separated string composed by latitude followed by longitude e.g. + * "47.641268,-122.125679". + * @param options The options parameters. + */ + getTimezoneByCoordinates( + format: ResponseFormat, + query: string, + options?: TimezoneGetTimezoneByCoordinatesOptionalParams + ): Promise; + /** + * __Enumerate Windows Time Zones__ + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * This API returns a full list of Windows Time Zone IDs. + * @param format Desired format of the response. Only `json` format is supported. + * @param options The options parameters. + */ + getTimezoneEnumWindows( + format: ResponseFormat, + options?: TimezoneGetTimezoneEnumWindowsOptionalParams + ): Promise; + /** + * __Enumerate IANA Time Zones__ + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * This API returns a full list of IANA time zone IDs. Updates to the IANA service will be reflected in + * the system within one day. + * @param format Desired format of the response. Only `json` format is supported. + * @param options The options parameters. + */ + getTimezoneEnumIana( + format: ResponseFormat, + options?: TimezoneGetTimezoneEnumIanaOptionalParams + ): Promise; + /** + * __Time Zone IANA Version__ + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * This API returns the current IANA version number. + * @param format Desired format of the response. Only `json` format is supported. + * @param options The options parameters. + */ + getTimezoneIanaVersion( + format: ResponseFormat, + options?: TimezoneGetTimezoneIanaVersionOptionalParams + ): Promise; + /** + * __Windows to IANA Time Zone__ + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * This API returns a corresponding IANA ID, given a valid Windows Time Zone ID. Multiple IANA IDs may + * be returned for a single Windows ID. It is possible to narrow these results by adding an optional + * territory parameter. + * @param format Desired format of the response. Only `json` format is supported. + * @param query The Windows time zone ID. + * @param options The options parameters. + */ + getTimezoneWindowsToIana( + format: ResponseFormat, + query: string, + options?: TimezoneGetTimezoneWindowsToIanaOptionalParams + ): Promise; +} diff --git a/sdk/maps/maps-timezone/src/timezoneClient.ts b/sdk/maps/maps-timezone/src/timezoneClient.ts new file mode 100644 index 000000000000..34222e8bf958 --- /dev/null +++ b/sdk/maps/maps-timezone/src/timezoneClient.ts @@ -0,0 +1,30 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreAuth from "@azure/core-auth"; +import { TimezoneImpl } from "./operations"; +import { Timezone } from "./operationsInterfaces"; +import { TimezoneClientContext } from "./timezoneClientContext"; +import { TimezoneClientOptionalParams } from "./models"; + +export class TimezoneClient extends TimezoneClientContext { + /** + * Initializes a new instance of the TimezoneClient class. + * @param credentials Subscription credentials which uniquely identify client subscription. + * @param options The parameter options + */ + constructor( + credentials: coreAuth.TokenCredential, + options?: TimezoneClientOptionalParams + ) { + super(credentials, options); + this.timezone = new TimezoneImpl(this); + } + + timezone: Timezone; +} diff --git a/sdk/maps/maps-timezone/src/timezoneClientContext.ts b/sdk/maps/maps-timezone/src/timezoneClientContext.ts new file mode 100644 index 000000000000..524821c2ba20 --- /dev/null +++ b/sdk/maps/maps-timezone/src/timezoneClientContext.ts @@ -0,0 +1,63 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; +import * as coreAuth from "@azure/core-auth"; +import { Geography, TimezoneClientOptionalParams } from "./models"; + +export class TimezoneClientContext extends coreClient.ServiceClient { + geography: Geography; + xMsClientId?: string; + apiVersion: string; + + /** + * Initializes a new instance of the TimezoneClientContext class. + * @param credentials Subscription credentials which uniquely identify client subscription. + * @param options The parameter options + */ + constructor( + credentials: coreAuth.TokenCredential, + options?: TimezoneClientOptionalParams + ) { + if (credentials === undefined) { + throw new Error("'credentials' cannot be null"); + } + + // Initializing default values for options + if (!options) { + options = {}; + } + const defaults: TimezoneClientOptionalParams = { + requestContentType: "application/json; charset=utf-8", + credential: credentials + }; + + const packageDetails = `azsdk-js-maps-timezone/1.0.0-beta.1`; + const userAgentPrefix = + options.userAgentOptions && options.userAgentOptions.userAgentPrefix + ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` + : `${packageDetails}`; + + if (!options.credentialScopes) { + options.credentialScopes = ["https://atlas.microsoft.com/.default"]; + } + const optionsWithDefaults = { + ...defaults, + ...options, + userAgentOptions: { + userAgentPrefix + }, + baseUri: options.endpoint || "https://{geography}.atlas.microsoft.com" + }; + super(optionsWithDefaults); + + // Assigning values to Constant parameters + this.geography = options.geography || "us"; + this.apiVersion = options.apiVersion || "1.0"; + } +} diff --git a/sdk/maps/maps-timezone/tsconfig.json b/sdk/maps/maps-timezone/tsconfig.json new file mode 100644 index 000000000000..0ec8659c8e83 --- /dev/null +++ b/sdk/maps/maps-timezone/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "module": "es6", + "moduleResolution": "node", + "strict": true, + "target": "es6", + "sourceMap": true, + "declarationMap": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "preserveConstEnums": true, + "lib": ["es6", "dom"], + "declaration": true, + "outDir": "./esm", + "importHelpers": true + }, + "include": ["./src/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/sdk/maps/maps-traffic/LICENSE.txt b/sdk/maps/maps-traffic/LICENSE.txt new file mode 100644 index 000000000000..ccb63b166732 --- /dev/null +++ b/sdk/maps/maps-traffic/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2021 Microsoft + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/sdk/maps/maps-traffic/README.md b/sdk/maps/maps-traffic/README.md new file mode 100644 index 000000000000..a040e8d19bf5 --- /dev/null +++ b/sdk/maps/maps-traffic/README.md @@ -0,0 +1,91 @@ +# Azure Traffic client library for JavaScript + +This package contains an isomorphic SDK (runs both in Node.js and in browsers) for Azure Traffic client. + +Azure Maps Traffic REST APIs + +[Source code](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-traffic) | +[Package (NPM)](https://www.npmjs.com/package/@azure/maps-traffic) | +[API reference documentation](https://docs.microsoft.com/javascript/api/@azure/maps-traffic) | +[Samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-traffic/samples) + +## Getting started + +### Currently supported environments + +- [LTS versions of Node.js](https://nodejs.org/about/releases/) +- Latest versions of Safari, Chrome, Edge and Firefox. + +### Prerequisites + +- An [Azure subscription][azure_sub]. + +### Install the `@azure/maps-traffic` package + +Install the Azure Traffic client library for JavaScript with `npm`: + +```bash +npm install @azure/maps-traffic +``` + +### Create and authenticate a `TrafficClient` + +To create a client object to access the Azure Traffic API, you will need the `endpoint` of your Azure Traffic resource and a `credential`. The Azure Traffic client can use Azure Active Directory credentials to authenticate. +You can find the endpoint for your Azure Traffic resource in the [Azure Portal][azure_portal]. + +#### Using an Azure Active Directory Credential + +You can authenticate with Azure Active Directory using the [Azure Identity library][azure_identity]. To use the [DefaultAzureCredential][defaultazurecredential] provider shown below, or other credential providers provided with the Azure SDK, please install the `@azure/identity` package: + +```bash +npm install @azure/identity +``` + +You will also need to register a new AAD application and grant access to Azure Traffic by assigning the suitable role to your service principal (note: roles such as `"Owner"` will not grant the necessary permissions). +Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`. + +```javascript +const { TrafficClient } = require("@azure/maps-traffic"); +const { DefaultAzureCredential } = require("@azure/identity"); +const client = new TrafficClient("", new DefaultAzureCredential()); +``` + +## Key concepts + +### TrafficClient + +`TrafficClient` is the primary interface for developers using the Azure Traffic client library. Explore the methods on this client object to understand the different features of the Azure Traffic service that you can access. + +## Troubleshooting + +### Logging + +Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: + +```javascript +import { setLogLevel } from "@azure/logger"; +setLogLevel("info"); +``` + +For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger). + +## Next steps + +Please take a look at the [samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-traffic/samples) directory for detailed examples on how to use this library. + +## Contributing + +If you'd like to contribute to this library, please read the [contributing guide](https://github.com/Azure/azure-sdk-for-js/blob/master/CONTRIBUTING.md) to learn more about how to build and test the code. + +## Related projects + +- [Microsoft Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) + +![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fmaps%2Fmaps-traffic%2FREADME.png) + +[azure_cli]: https://docs.microsoft.com/cli/azure +[azure_sub]: https://azure.microsoft.com/free/ +[azure_sub]: https://azure.microsoft.com/free/ +[azure_portal]: https://portal.azure.com +[azure_identity]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity +[defaultazurecredential]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity#defaultazurecredential diff --git a/sdk/maps/maps-traffic/api-extractor.json b/sdk/maps/maps-traffic/api-extractor.json new file mode 100644 index 000000000000..5fb5b21b56f2 --- /dev/null +++ b/sdk/maps/maps-traffic/api-extractor.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "mainEntryPointFilePath": "./esm/index.d.ts", + "docModel": { "enabled": true }, + "apiReport": { "enabled": true, "reportFolder": "./review" }, + "dtsRollup": { + "enabled": true, + "untrimmedFilePath": "", + "publicTrimmedFilePath": "./esm/index.d.ts" + }, + "messages": { + "tsdocMessageReporting": { "default": { "logLevel": "none" } }, + "extractorMessageReporting": { + "ae-missing-release-tag": { "logLevel": "none" }, + "ae-unresolved-link": { "logLevel": "none" } + } + } +} diff --git a/sdk/maps/maps-traffic/package.json b/sdk/maps/maps-traffic/package.json new file mode 100644 index 000000000000..1f1517c221d5 --- /dev/null +++ b/sdk/maps/maps-traffic/package.json @@ -0,0 +1,84 @@ +{ + "name": "@azure/maps-traffic", + "sdk-type": "client", + "author": "Microsoft Corporation", + "description": "A generated SDK for TrafficClient.", + "version": "1.0.0-beta.1", + "engines": { "node": ">=12.0.0" }, + "dependencies": { + "@azure/core-client": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-rest-pipeline": "^1.1.0", + "tslib": "^2.2.0" + }, + "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], + "license": "MIT", + "main": "./dist/index.js", + "module": "./esm/index.js", + "types": "./esm/index.d.ts", + "devDependencies": { + "@microsoft/api-extractor": "7.7.11", + "@rollup/plugin-commonjs": "11.0.2", + "@rollup/plugin-json": "^4.0.0", + "@rollup/plugin-multi-entry": "^3.0.0", + "@rollup/plugin-node-resolve": "^8.0.0", + "mkdirp": "^1.0.4", + "rollup": "^1.16.3", + "rollup-plugin-sourcemaps": "^0.4.2", + "rollup-plugin-node-resolve": "^3.4.0", + "typescript": "~4.2.0", + "uglify-js": "^3.4.9" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js", + "repository": { + "type": "git", + "url": "https://github.com/Azure/azure-sdk-for-js.git" + }, + "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, + "files": [ + "dist/**/*.js", + "dist/**/*.js.map", + "dist/**/*.d.ts", + "dist/**/*.d.ts.map", + "esm/**/*.js", + "esm/**/*.js.map", + "esm/**/*.d.ts", + "esm/**/*.d.ts.map", + "src/**/*.ts", + "README.md", + "rollup.config.js", + "tsconfig.json", + "review/*", + "CHANGELOG.md" + ], + "scripts": { + "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", + "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js", + "prepack": "npm install && npm run build", + "pack": "npm pack 2>&1", + "extract-api": "mkdirp ./review && api-extractor run --local", + "lint": "echo skipped", + "audit": "echo skipped", + "clean": "echo skipped", + "build:node": "echo skipped", + "build:browser": "echo skipped", + "build:test": "echo skipped", + "build:samples": "echo skipped.", + "check-format": "echo skipped", + "execute:samples": "echo skipped", + "format": "echo skipped", + "test": "echo skipped", + "prebuild": "echo skipped", + "test:node": "echo skipped", + "test:browser": "echo skipped", + "unit-test": "echo skipped", + "unit-test:node": "echo skipped", + "unit-test:browser": "echo skipped", + "integration-test:browser": "echo skipped", + "integration-test:node": "echo skipped", + "integration-test": "echo skipped", + "docs": "echo skipped" + }, + "sideEffects": false, + "autoPublish": true +} diff --git a/sdk/maps/maps-traffic/review/maps-traffic.api.md b/sdk/maps/maps-traffic/review/maps-traffic.api.md new file mode 100644 index 000000000000..b4620fe47902 --- /dev/null +++ b/sdk/maps/maps-traffic/review/maps-traffic.api.md @@ -0,0 +1,336 @@ +## API Report File for "@azure/maps-traffic" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import * as coreAuth from '@azure/core-auth'; +import * as coreClient from '@azure/core-client'; + +// @public +export interface CoordinatesPair { + latitude?: number; + longitude?: number; +} + +// @public +export interface ErrorAdditionalInfo { + readonly info?: Record; + readonly type?: string; +} + +// @public +export interface ErrorDetail { + readonly additionalInfo?: ErrorAdditionalInfo[]; + readonly code?: string; + readonly details?: ErrorDetail[]; + readonly message?: string; + readonly target?: string; +} + +// @public +export interface ErrorResponse { + error?: ErrorDetail; +} + +// @public +export type GeographicResourceLocation = string; + +// @public +export type Geography = string; + +// @public +export type IncidentGeometryType = string; + +// @public +export const enum KnownGeographicResourceLocation { + Eu = "eu", + Us = "us" +} + +// @public +export const enum KnownGeography { + // (undocumented) + Eu = "eu", + // (undocumented) + Us = "us" +} + +// @public +export const enum KnownIncidentGeometryType { + Original = "original", + Shifted = "shifted" +} + +// @public +export const enum KnownProjectionStandard { + Epsg4326 = "EPSG4326", + Epsg900913 = "EPSG900913" +} + +// @public +export const enum KnownSpeedUnit { + Kmph = "KMPH", + MPH = "MPH" +} + +// @public +export const enum KnownTextFormat { + Json = "json", + Xml = "xml" +} + +// @public +export const enum KnownTileFormat { + Pbf = "pbf", + Png = "png" +} + +// @public +export const enum KnownTrafficFlowSegmentStyle { + // (undocumented) + Absolute = "absolute", + // (undocumented) + Relative = "relative", + // (undocumented) + RelativeDelay = "relative-delay" +} + +// @public +export const enum KnownTrafficFlowTileStyle { + Absolute = "absolute", + ReducedSensitivity = "reduced-sensitivity", + Relative = "relative", + RelativeDelay = "relative-delay" +} + +// @public +export const enum KnownTrafficIncidentDetailStyle { + Night = "night", + S1 = "s1", + S2 = "s2", + S3 = "s3" +} + +// @public +export const enum KnownTrafficIncidentTileStyle { + Night = "night", + S1 = "s1", + S2 = "s2", + S3 = "s3" +} + +// @public +export type ProjectionStandard = string; + +// @public +export type SpeedUnit = string; + +// @public +export type TextFormat = string; + +// @public +export type TileFormat = string; + +// @public +export interface Traffic { + getTrafficFlowSegment(format: TextFormat, style: TrafficFlowSegmentStyle, zoom: number, query: string, options?: TrafficGetTrafficFlowSegmentOptionalParams): Promise; + getTrafficFlowTile(format: TileFormat, style: TrafficFlowTileStyle, zoom: number, xTileIndex: number, yTileIndex: number, options?: TrafficGetTrafficFlowTileOptionalParams): Promise; + getTrafficIncidentDetail(format: TextFormat, style: TrafficIncidentDetailStyle, boundingbox: string, boundingZoom: number, trafficmodelid: string, options?: TrafficGetTrafficIncidentDetailOptionalParams): Promise; + getTrafficIncidentTile(format: TileFormat, style: TrafficIncidentTileStyle, zoom: number, xTileIndex: number, yTileIndex: number, options?: TrafficGetTrafficIncidentTileOptionalParams): Promise; + getTrafficIncidentViewport(format: TextFormat, boundingbox: string, boundingzoom: number, overviewbox: string, overviewzoom: number, options?: TrafficGetTrafficIncidentViewportOptionalParams): Promise; +} + +// @public (undocumented) +export class TrafficClient extends TrafficClientContext { + constructor(credentials: coreAuth.TokenCredential, options?: TrafficClientOptionalParams); + // (undocumented) + traffic: Traffic; +} + +// @public (undocumented) +export class TrafficClientContext extends coreClient.ServiceClient { + constructor(credentials: coreAuth.TokenCredential, options?: TrafficClientOptionalParams); + // (undocumented) + apiVersion: string; + // (undocumented) + geography: Geography; + // (undocumented) + xMsClientId?: string; +} + +// @public +export interface TrafficClientOptionalParams extends coreClient.ServiceClientOptions { + apiVersion?: string; + endpoint?: string; + geography?: Geography; + xMsClientId?: string; +} + +// @public +export interface TrafficFlowSegmentResult { + readonly flowSegmentData?: TrafficFlowSegmentResultFlowSegmentData; +} + +// @public +export interface TrafficFlowSegmentResultFlowSegmentData { + readonly confidence?: number; + coordinates?: TrafficFlowSegmentResultFlowSegmentDataCoordinates; + readonly currentSpeed?: number; + readonly currentTravelTime?: number; + readonly frc?: string; + readonly freeFlowSpeed?: number; + readonly freeFlowTravelTime?: number; + readonly openlr?: number; + readonly version?: string; +} + +// @public +export interface TrafficFlowSegmentResultFlowSegmentDataCoordinates { + readonly coordinate?: CoordinatesPair[]; +} + +// @public +export type TrafficFlowSegmentStyle = string; + +// @public +export type TrafficFlowTileStyle = string; + +// @public +export interface TrafficGetTrafficFlowSegmentOptionalParams extends coreClient.OperationOptions { + openLr?: boolean; + thickness?: number; + unit?: SpeedUnit; +} + +// @public +export type TrafficGetTrafficFlowSegmentResponse = TrafficFlowSegmentResult; + +// @public +export interface TrafficGetTrafficFlowTileHeaders { + contentType?: string; +} + +// @public +export interface TrafficGetTrafficFlowTileOptionalParams extends coreClient.OperationOptions { + thickness?: number; +} + +// @public +export type TrafficGetTrafficFlowTileResponse = TrafficGetTrafficFlowTileHeaders & { + blobBody?: Promise; + readableStreamBody?: NodeJS.ReadableStream; +}; + +// @public +export interface TrafficGetTrafficIncidentDetailOptionalParams extends coreClient.OperationOptions { + expandCluster?: boolean; + geometries?: IncidentGeometryType; + language?: string; + originalPosition?: boolean; + projection?: ProjectionStandard; +} + +// @public +export type TrafficGetTrafficIncidentDetailResponse = TrafficIncidentDetailResult; + +// @public +export interface TrafficGetTrafficIncidentTileHeaders { + contentType?: string; +} + +// @public +export interface TrafficGetTrafficIncidentTileOptionalParams extends coreClient.OperationOptions { + trafficState?: string; +} + +// @public +export type TrafficGetTrafficIncidentTileResponse = TrafficGetTrafficIncidentTileHeaders & { + blobBody?: Promise; + readableStreamBody?: NodeJS.ReadableStream; +}; + +// @public +export interface TrafficGetTrafficIncidentViewportOptionalParams extends coreClient.OperationOptions { + copyright?: boolean; +} + +// @public +export type TrafficGetTrafficIncidentViewportResponse = TrafficIncidentViewportResult; + +// @public +export interface TrafficIncidentDetailResult { + readonly tm?: TrafficIncidentDetailResultTm; +} + +// @public +export interface TrafficIncidentDetailResultTm { + readonly id?: string; + readonly poi?: TrafficIncidentPoi[]; +} + +// @public +export type TrafficIncidentDetailStyle = string; + +// @public (undocumented) +export interface TrafficIncidentPoi { + readonly c?: string; + readonly cbl?: TrafficIncidentPoiCbl; + readonly cs?: number; + readonly ctr?: TrafficIncidentPoiCtr; + readonly d?: string; + readonly dl?: number; + readonly f?: string; + readonly ic?: number; + readonly id?: string; + readonly l?: number; + readonly p?: TrafficIncidentPoiP; + readonly r?: string; + readonly t?: string; + readonly ty?: number; +} + +// @public +export interface TrafficIncidentPoiCbl { + readonly x?: number; + readonly y?: number; +} + +// @public +export interface TrafficIncidentPoiCtr { + readonly x?: number; + readonly y?: number; +} + +// @public +export interface TrafficIncidentPoiP { + readonly x?: number; + readonly y?: number; +} + +// @public +export type TrafficIncidentTileStyle = string; + +// @public +export interface TrafficIncidentViewportResult { + readonly viewpResp?: TrafficIncidentViewportResultViewpResp; +} + +// @public +export interface TrafficIncidentViewportResultViewpResp { + readonly copyrightIds?: string; + readonly maps?: string; + readonly trafficState?: TrafficIncidentViewportResultViewpRespTrafficState; + readonly version?: string; +} + +// @public +export interface TrafficIncidentViewportResultViewpRespTrafficState { + readonly trafficAge?: number; + readonly trafficModelId?: string; +} + + +// (No @packageDocumentation comment for this package) + +``` diff --git a/sdk/maps/maps-traffic/rollup.config.js b/sdk/maps/maps-traffic/rollup.config.js new file mode 100644 index 000000000000..9be1955eb7f1 --- /dev/null +++ b/sdk/maps/maps-traffic/rollup.config.js @@ -0,0 +1,188 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import nodeResolve from "@rollup/plugin-node-resolve"; +import cjs from "@rollup/plugin-commonjs"; +import sourcemaps from "rollup-plugin-sourcemaps"; +import multiEntry from "@rollup/plugin-multi-entry"; +import json from "@rollup/plugin-json"; + +import nodeBuiltins from "builtin-modules"; + +/** + * Gets the proper configuration needed for rollup's commonJS plugin for @opentelemetry/api. + * + * NOTE: this manual configuration is only needed because OpenTelemetry uses an + * __exportStar downleveled helper function to declare its exports which confuses + * rollup's automatic discovery mechanism. + * + * @returns an object reference that can be `...`'d into your cjs() configuration. + */ +export function openTelemetryCommonJs() { + const namedExports = {}; + + for (const key of [ + "@opentelemetry/api", + "@azure/core-tracing/node_modules/@opentelemetry/api" + ]) { + namedExports[key] = [ + "SpanKind", + "TraceFlags", + "getSpan", + "setSpan", + "SpanStatusCode", + "getSpanContext", + "setSpanContext" + ]; + } + + const releasedOpenTelemetryVersions = ["0.10.2", "1.0.0-rc.0"]; + + for (const version of releasedOpenTelemetryVersions) { + namedExports[ + // working around a limitation in the rollup common.js plugin - it's not able to resolve these modules so the named exports listed above will not get applied. We have to drill down to the actual path. + `../../../common/temp/node_modules/.pnpm/@opentelemetry/api@${version}/node_modules/@opentelemetry/api/build/src/index.js` + ] = [ + "SpanKind", + "TraceFlags", + "getSpan", + "setSpan", + "StatusCode", + "CanonicalCode", + "getSpanContext", + "setSpanContext" + ]; + } + + return namedExports; +} + +// #region Warning Handler + +/** + * A function that can determine whether a rollupwarning should be ignored. If + * the function returns `true`, then the warning will not be displayed. + */ + +function ignoreNiseSinonEvalWarnings(warning) { + return ( + warning.code === "EVAL" && + warning.id && + (warning.id.includes("node_modules/nise") || + warning.id.includes("node_modules/sinon")) === true + ); +} + +function ignoreChaiCircularDependencyWarnings(warning) { + return ( + warning.code === "CIRCULAR_DEPENDENCY" && + warning.importer && warning.importer.includes("node_modules/chai") === true + ); +} + +const warningInhibitors = [ + ignoreChaiCircularDependencyWarnings, + ignoreNiseSinonEvalWarnings +]; + +/** + * Construct a warning handler for the shared rollup configuration + * that ignores certain warnings that are not relevant to testing. + */ +function makeOnWarnForTesting() { + return (warning, warn) => { + // If every inhibitor returns false (i.e. no inhibitors), then show the warning + if (warningInhibitors.every((inhib) => !inhib(warning))) { + warn(warning); + } + }; +} + +// #endregion + +function makeBrowserTestConfig() { + const config = { + input: { + include: ["dist-esm/test/**/*.spec.js"], + exclude: ["dist-esm/test/**/node/**"] + }, + output: { + file: `dist-test/index.browser.js`, + format: "umd", + sourcemap: true + }, + preserveSymlinks: false, + plugins: [ + multiEntry({ exports: false }), + nodeResolve({ + mainFields: ["module", "browser"] + }), + cjs({ + namedExports: { + // Chai's strange internal architecture makes it impossible to statically + // analyze its exports. + chai: [ + "version", + "use", + "util", + "config", + "expect", + "should", + "assert" + ], + ...openTelemetryCommonJs() + } + }), + json(), + sourcemaps() + //viz({ filename: "dist-test/browser-stats.html", sourcemap: true }) + ], + onwarn: makeOnWarnForTesting(), + // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, + // rollup started respecting the "sideEffects" field in package.json. Since + // our package.json sets "sideEffects=false", this also applies to test + // code, which causes all tests to be removed by tree-shaking. + treeshake: false + }; + + return config; +} + +const defaultConfigurationOptions = { + disableBrowserBundle: false +}; + +export function makeConfig(pkg, options) { + options = { + ...defaultConfigurationOptions, + ...(options || {}) + }; + + const baseConfig = { + // Use the package's module field if it has one + input: pkg["module"] || "dist-esm/src/index.js", + external: [ + ...nodeBuiltins, + ...Object.keys(pkg.dependencies), + ...Object.keys(pkg.devDependencies) + ], + output: { file: "dist/index.js", format: "cjs", sourcemap: true }, + preserveSymlinks: false, + plugins: [sourcemaps(), nodeResolve(), cjs()] + }; + + const config = [baseConfig]; + + if (!options.disableBrowserBundle) { + config.push(makeBrowserTestConfig()); + } + + return config; +} + +export default makeConfig(require("./package.json")); diff --git a/sdk/maps/maps-traffic/samples/v1/javascript/README.md b/sdk/maps/maps-traffic/samples/v1/javascript/README.md new file mode 100644 index 000000000000..5f02fdcf8220 --- /dev/null +++ b/sdk/maps/maps-traffic/samples/v1/javascript/README.md @@ -0,0 +1,54 @@ +--- +page_type: sample +languages: + - javascript +products: + - azure +urlFragment: maps-traffic-javascript +--- + +# Azure Maps Traffic client library samples for JavaScript + +These sample programs show how to use the JavaScript client libraries for Azure Maps Traffic in some common scenarios. + +| **File Name** | **Description** | +| --------------------- | ---------------------------------------------- | +| [traffic.js][traffic] | Gets traffic related data to display on tiles. | + +## Prerequisites + +The sample programs are compatible with Node.js >=12.0.0. + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +3. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node traffic.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx cross-env MAPS_SUBSCRIPTION_KEY="" node traffic.js +``` + +[traffic]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-traffic/samples/v1/javascript/src/traffic.js +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-traffic/README.md diff --git a/sdk/maps/maps-traffic/samples/v1/javascript/elevation.js b/sdk/maps/maps-traffic/samples/v1/javascript/elevation.js new file mode 100644 index 000000000000..422587aca96f --- /dev/null +++ b/sdk/maps/maps-traffic/samples/v1/javascript/elevation.js @@ -0,0 +1,70 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Elevation API usage. Simple CRUD operations are performed. + */ + +const { DefaultAzureCredential } = require("@azure/identity"); +const { ElevationClient } = require("@azure/maps-elevation"); +require("dotenv").config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + const elevation = new ElevationClient(credential).elevation; + + console.log(" --- Get Data For Bounding Box:"); + console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); + + console.log(" --- Get Data For Points:"); + console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Get Data For Polyline:"); + console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Post Data For Points:"); + console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + + console.log(" --- Post Data For Polyline:"); + console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-traffic/samples/v1/javascript/package.json b/sdk/maps/maps-traffic/samples/v1/javascript/package.json new file mode 100644 index 000000000000..dc474f099dec --- /dev/null +++ b/sdk/maps/maps-traffic/samples/v1/javascript/package.json @@ -0,0 +1,28 @@ +{ + "name": "azure-maps-traffic-samples-js", + "private": true, + "version": "1.0.0", + "description": "Azure Maps Traffic client library samples for JavaScript", + "engine": { + "node": ">=12.0.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/maps/maps-traffic" + }, + "keywords": [ + "Azure", + "cloud" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-traffic", + "dependencies": { + "@azure/maps-traffic": "next", + "dotenv": "latest" + } +} diff --git a/sdk/maps/maps-traffic/samples/v1/javascript/sample.env b/sdk/maps/maps-traffic/samples/v1/javascript/sample.env new file mode 100644 index 000000000000..2259ae4da0ec --- /dev/null +++ b/sdk/maps/maps-traffic/samples/v1/javascript/sample.env @@ -0,0 +1,7 @@ +# Maps subscription key when using AzureKey authentication +MAPS_SUBSCRIPTION_KEY="" + +# Maps Azure AD authentication +AZURE_CLIENT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_TENANT_ID="" diff --git a/sdk/maps/maps-traffic/samples/v1/typescript/README.md b/sdk/maps/maps-traffic/samples/v1/typescript/README.md new file mode 100644 index 000000000000..028d3e2ccc9d --- /dev/null +++ b/sdk/maps/maps-traffic/samples/v1/typescript/README.md @@ -0,0 +1,67 @@ +--- +page_type: sample +languages: + - typescript +products: + - azure +urlFragment: maps-traffic-typescript +--- + +# Azure Maps Traffic client library samples for TypeScript + +These sample programs show how to use the TypeScript client libraries for Azure Maps Traffic in some common scenarios. + +| **File Name** | **Description** | +| --------------------- | ---------------------------------------------- | +| [traffic.ts][traffic] | Gets traffic related data to display on tiles. | + +## Prerequisites + +The sample programs are compatible with Node.js >=12.0.0. + +Before running the samples in Node, they must be compiled to JavaScript using the TypeScript compiler. For more information on TypeScript, see the [TypeScript documentation][typescript]. Install the TypeScript compiler using: + +```bash +npm install -g typescript +``` + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Compile the samples: + +```bash +npm run build +``` + +3. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +4. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node dist/traffic.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx cross-env MAPS_SUBSCRIPTION_KEY="" node dist/traffic.js +``` + +[traffic]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-traffic/samples/v1/typescript/src/traffic.ts +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-traffic/README.md +[typescript]: https://www.typescriptlang.org/docs/home.html diff --git a/sdk/maps/maps-traffic/samples/v1/typescript/package.json b/sdk/maps/maps-traffic/samples/v1/typescript/package.json new file mode 100644 index 000000000000..94479c477776 --- /dev/null +++ b/sdk/maps/maps-traffic/samples/v1/typescript/package.json @@ -0,0 +1,36 @@ +{ + "name": "azure-maps-traffic-samples-ts", + "private": true, + "version": "1.0.0", + "description": "Azure Maps Traffic client library samples for TypeScript", + "engine": { + "node": ">=12.0.0" + }, + "scripts": { + "build": "tsc", + "prebuild": "rimraf dist/" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/maps/maps-traffic" + }, + "keywords": [ + "Azure", + "cloud" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-traffic", + "dependencies": { + "@azure/maps-traffic": "next", + "dotenv": "latest" + }, + "devDependencies": { + "typescript": "~4.2.0", + "rimraf": "latest" + } +} diff --git a/sdk/maps/maps-traffic/samples/v1/typescript/sample.env b/sdk/maps/maps-traffic/samples/v1/typescript/sample.env new file mode 100644 index 000000000000..2259ae4da0ec --- /dev/null +++ b/sdk/maps/maps-traffic/samples/v1/typescript/sample.env @@ -0,0 +1,7 @@ +# Maps subscription key when using AzureKey authentication +MAPS_SUBSCRIPTION_KEY="" + +# Maps Azure AD authentication +AZURE_CLIENT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_TENANT_ID="" diff --git a/sdk/maps/maps-traffic/samples/v1/typescript/src/elevation.ts b/sdk/maps/maps-traffic/samples/v1/typescript/src/elevation.ts new file mode 100644 index 000000000000..5e1f91bd6989 --- /dev/null +++ b/sdk/maps/maps-traffic/samples/v1/typescript/src/elevation.ts @@ -0,0 +1,76 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Elevation API usage. Simple queries are performed. + */ + +import { getDefaultAzureCredential } from "@azure/identity"; +import * as coreAuth from "@azure/core-auth"; +import * as coreClient from "@azure/core-client"; +import { ElevationClient } from "@azure/maps-elevation"; +import * as dotenv from "dotenv"; +dotenv.config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential implements coreAuth.TokenCredential { + async getToken( + _scopes: string | string[], + _options?: coreAuth.GetTokenOptions + ): Promise { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential: coreAuth.TokenCredential; + let operationOptions: coreClient.OperationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = getDefaultAzureCredential(); + } + + const elevation = new ElevationClient(credential).elevation; + + console.log(" --- Get Data For Bounding Box:"); + console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); + + console.log(" --- Get Data For Points:"); + console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Get Data For Polyline:"); + console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Post Data For Points:"); + console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + + console.log(" --- Post Data For Polyline:"); + console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-traffic/samples/v1/typescript/tsconfig.json b/sdk/maps/maps-traffic/samples/v1/typescript/tsconfig.json new file mode 100644 index 000000000000..416c2dd82e00 --- /dev/null +++ b/sdk/maps/maps-traffic/samples/v1/typescript/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2018", + "module": "commonjs", + "moduleResolution": "node", + "resolveJsonModule": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "alwaysStrict": true, + "outDir": "dist", + "rootDir": "src" + }, + "include": [ + "src/**.ts" + ] +} diff --git a/sdk/maps/maps-traffic/src/index.ts b/sdk/maps/maps-traffic/src/index.ts new file mode 100644 index 000000000000..19da68364a99 --- /dev/null +++ b/sdk/maps/maps-traffic/src/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./models"; +export { TrafficClient } from "./trafficClient"; +export { TrafficClientContext } from "./trafficClientContext"; +export * from "./operationsInterfaces"; diff --git a/sdk/maps/maps-traffic/src/models/index.ts b/sdk/maps/maps-traffic/src/models/index.ts new file mode 100644 index 000000000000..78cfd2cf6c77 --- /dev/null +++ b/sdk/maps/maps-traffic/src/models/index.ts @@ -0,0 +1,657 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; + +/** Common error response for all Azure Resource Manager APIs to return error details for failed operations. (This also follows the OData error response format.). */ +export interface ErrorResponse { + /** The error object. */ + error?: ErrorDetail; +} + +/** The error detail. */ +export interface ErrorDetail { + /** + * The error code. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly code?: string; + /** + * The error message. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly message?: string; + /** + * The error target. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly target?: string; + /** + * The error details. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly details?: ErrorDetail[]; + /** + * The error additional info. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly additionalInfo?: ErrorAdditionalInfo[]; +} + +/** The resource management error additional info. */ +export interface ErrorAdditionalInfo { + /** + * The additional info type. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly type?: string; + /** + * The additional info. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly info?: Record; +} + +/** This object is returned from a successful Traffic Flow Segment call */ +export interface TrafficFlowSegmentResult { + /** + * Flow Segment Data property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly flowSegmentData?: TrafficFlowSegmentResultFlowSegmentData; +} + +/** Flow Segment Data property */ +export interface TrafficFlowSegmentResultFlowSegmentData { + /** + * Functional Road Class. This indicates the road type: + * 0: Motorway, freeway or other major road. + * 1: Major road, less important than a motorway. + * 2: Other major road. + * 3: Secondary road. + * 4: Local connecting road. + * 5: Local road of high importance. + * 6: Local road. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly frc?: string; + /** + * The current average speed at the selected point, in the units requested. This is calculated from the currentTravelTime and the length of the selected segment. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly currentSpeed?: number; + /** + * The free flow speed expected under ideal conditions, expressed in the units requested. This is related to the freeFlowTravelTime. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly freeFlowSpeed?: number; + /** + * Current travel time in seconds based on fused real-time measurements between the defined locations in the specified direction. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly currentTravelTime?: number; + /** + * The travel time in seconds which would be expected under ideal free flow conditions. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly freeFlowTravelTime?: number; + /** + * The confidence is a measure of the quality of the provided travel time and speed. A value of 1 means full confidence, that the response contains the highest quality data. Lower values indicate the degree that the response may vary from the actual conditions on the road. Any value greater than 0.6 means the information was based on real-time probe input. A value of 0.5 means the reported speed is based on historical info. A value between 0.5 and 0.6 has a calculated weighted average between historical and live speeds. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly confidence?: number; + /** Includes the coordinates describing the shape of the segment. Coordinates are shifted from the road depending on the zoom level to support high quality visualization in every scale. */ + coordinates?: TrafficFlowSegmentResultFlowSegmentDataCoordinates; + /** + * This indicates the software version that generated the response. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly version?: string; + /** + * OpenLR code for segment + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly openlr?: number; +} + +/** Includes the coordinates describing the shape of the segment. Coordinates are shifted from the road depending on the zoom level to support high quality visualization in every scale. */ +export interface TrafficFlowSegmentResultFlowSegmentDataCoordinates { + /** + * Coordinate array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly coordinate?: CoordinatesPair[]; +} + +/** A location represented as a latitude and longitude. */ +export interface CoordinatesPair { + /** Latitude property */ + latitude?: number; + /** Longitude property */ + longitude?: number; +} + +/** This object is returned from a successful Traffic incident Detail call */ +export interface TrafficIncidentDetailResult { + /** + * Main response element + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly tm?: TrafficIncidentDetailResultTm; +} + +/** Main response element */ +export interface TrafficIncidentDetailResultTm { + /** + * ID of the traffic incident + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly id?: string; + /** + * A single traffic incident, or a cluster of traffic incidents + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly poi?: TrafficIncidentPoi[]; +} + +export interface TrafficIncidentPoi { + /** + * ID of the traffic incident + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly id?: string; + /** + * The point where an icon of the cluster or raw incident should be drawn, expressed in the requested projection. This is affected by traffic style, zoom level and road type + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly p?: TrafficIncidentPoiP; + /** + * The icon category associated with this incident. Values are numbers in the range 0-13, with the following meanings -- 0: Unknown, 1: Accident, 2: Fog, 3: Dangerous Conditions, 4: Rain, 5: Ice, 6: Jam, 7: Lane Closed, 8: Road Closed, 9: Road Works, 10: Wind, 11: Flooding, 12: Detour, 13: Cluster + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly ic?: number; + /** + * The magnitude of delay associated with incident. These values correspond to incident colors in the traffic tiles + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly ty?: number; + /** + * Bottom left coordinate of the cluster in the projection of the request + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly cbl?: TrafficIncidentPoiCbl; + /** + * Top right coordinate of the cluster in the projection of the request + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly ctr?: TrafficIncidentPoiCtr; + /** + * Cluster size: the number of incidents in the cluster + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly cs?: number; + /** + * Length of the incident in meters + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly l?: number; + /** + * The road number(s) affected by the incident. Multiple road numbers will delimited by slashes + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly r?: string; + /** + * Delay caused by the incident in seconds (except in road closures) + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly dl?: number; + /** + * To: the name of the intersection or location where the traffic due to the incident ends + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly t?: string; + /** + * From: the name of the intersection or location where the traffic due to the incident starts + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly f?: string; + /** + * Description of the incident in the language requested + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly d?: string; + /** + * Cause of the incident, where available, in the language requested + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly c?: string; +} + +/** The point where an icon of the cluster or raw incident should be drawn, expressed in the requested projection. This is affected by traffic style, zoom level and road type */ +export interface TrafficIncidentPoiP { + /** + * x coordinate + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly x?: number; + /** + * y coordinate + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly y?: number; +} + +/** Bottom left coordinate of the cluster in the projection of the request */ +export interface TrafficIncidentPoiCbl { + /** + * x coordinate + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly x?: number; + /** + * y coordinate + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly y?: number; +} + +/** Top right coordinate of the cluster in the projection of the request */ +export interface TrafficIncidentPoiCtr { + /** + * x coordinate + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly x?: number; + /** + * y coordinate + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly y?: number; +} + +/** This object is returned from a successful Traffic Incident Viewport call */ +export interface TrafficIncidentViewportResult { + /** + * Viewport Response object + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly viewpResp?: TrafficIncidentViewportResultViewpResp; +} + +/** Viewport Response object */ +export interface TrafficIncidentViewportResultViewpResp { + /** + * Traffic State array + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly trafficState?: TrafficIncidentViewportResultViewpRespTrafficState; + /** + * Copyright Ids property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly copyrightIds?: string; + /** + * @Version property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly version?: string; + /** + * @maps property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly maps?: string; +} + +/** Traffic State array */ +export interface TrafficIncidentViewportResultViewpRespTrafficState { + /** + * @Traffic Age property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly trafficAge?: number; + /** + * @Traffic Model Id property + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly trafficModelId?: string; +} + +/** Defines headers for Traffic_getTrafficFlowTile operation. */ +export interface TrafficGetTrafficFlowTileHeaders { + /** The content-type for the response. */ + contentType?: string; +} + +/** Defines headers for Traffic_getTrafficIncidentTile operation. */ +export interface TrafficGetTrafficIncidentTileHeaders { + /** The content-type for the response. */ + contentType?: string; +} + +/** Known values of {@link Geography} that the service accepts. */ +export const enum KnownGeography { + Us = "us", + Eu = "eu" +} + +/** + * Defines values for Geography. \ + * {@link KnownGeography} can be used interchangeably with Geography, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **us** \ + * **eu** + */ +export type Geography = string; + +/** Known values of {@link TileFormat} that the service accepts. */ +export const enum KnownTileFormat { + /** An image in the png format. Supports zoom levels 0 through 18. */ + Png = "png", + /** Vector graphic in the pbf format. Supports zoom levels 0 through 22. */ + Pbf = "pbf" +} + +/** + * Defines values for TileFormat. \ + * {@link KnownTileFormat} can be used interchangeably with TileFormat, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **png**: An image in the png format. Supports zoom levels 0 through 18. \ + * **pbf**: Vector graphic in the pbf format. Supports zoom levels 0 through 22. + */ +export type TileFormat = string; + +/** Known values of {@link TrafficFlowTileStyle} that the service accepts. */ +export const enum KnownTrafficFlowTileStyle { + /** Colors will reflect the absolute speed measured. Absolute speed is the capability to access the full speed. */ + Absolute = "absolute", + /** This is the speed relative to free-flow, highlighting areas of congestion visualizing the traffic flow. Free-flow refers to conditions where there is no congestion and traffic can follow the speed limits. The most used option to visualize traffic flow on a map. */ + Relative = "relative", + /** Displays relative colors only where they are different from the free-flow speeds. This option will only highlights areas of congestion. */ + RelativeDelay = "relative-delay", + /** Displays relative colors but a larger difference from freeflow is required for segments to change the color. This mode only valid when format is png. */ + ReducedSensitivity = "reduced-sensitivity" +} + +/** + * Defines values for TrafficFlowTileStyle. \ + * {@link KnownTrafficFlowTileStyle} can be used interchangeably with TrafficFlowTileStyle, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **absolute**: Colors will reflect the absolute speed measured. Absolute speed is the capability to access the full speed. \ + * **relative**: This is the speed relative to free-flow, highlighting areas of congestion visualizing the traffic flow. Free-flow refers to conditions where there is no congestion and traffic can follow the speed limits. The most used option to visualize traffic flow on a map. \ + * **relative-delay**: Displays relative colors only where they are different from the free-flow speeds. This option will only highlights areas of congestion. \ + * **reduced-sensitivity**: Displays relative colors but a larger difference from freeflow is required for segments to change the color. This mode only valid when format is png. + */ +export type TrafficFlowTileStyle = string; + +/** Known values of {@link TextFormat} that the service accepts. */ +export const enum KnownTextFormat { + /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ + Json = "json", + /** [The Extensible Markup Language](https://www.w3.org/TR/xml/) */ + Xml = "xml" +} + +/** + * Defines values for TextFormat. \ + * {@link KnownTextFormat} can be used interchangeably with TextFormat, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) \ + * **xml**: [The Extensible Markup Language](https:\/\/www.w3.org\/TR\/xml\/) + */ +export type TextFormat = string; + +/** Known values of {@link TrafficFlowSegmentStyle} that the service accepts. */ +export const enum KnownTrafficFlowSegmentStyle { + Absolute = "absolute", + Relative = "relative", + RelativeDelay = "relative-delay" +} + +/** + * Defines values for TrafficFlowSegmentStyle. \ + * {@link KnownTrafficFlowSegmentStyle} can be used interchangeably with TrafficFlowSegmentStyle, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **absolute** \ + * **relative** \ + * **relative-delay** + */ +export type TrafficFlowSegmentStyle = string; + +/** Known values of {@link SpeedUnit} that the service accepts. */ +export const enum KnownSpeedUnit { + /** Kilometers Per Hour */ + Kmph = "KMPH", + /** Miles Per Hour */ + MPH = "MPH" +} + +/** + * Defines values for SpeedUnit. \ + * {@link KnownSpeedUnit} can be used interchangeably with SpeedUnit, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **KMPH**: Kilometers Per Hour \ + * **MPH**: Miles Per Hour + */ +export type SpeedUnit = string; + +/** Known values of {@link TrafficIncidentTileStyle} that the service accepts. */ +export const enum KnownTrafficIncidentTileStyle { + /** Creates traffic lines with colored chevrons indicating severity. */ + S1 = "s1", + /** Creates plain lines with certain degree of glow. */ + S2 = "s2", + /** Creates plain lines with certain degree of glow. */ + S3 = "s3", + /** Night style. */ + Night = "night" +} + +/** + * Defines values for TrafficIncidentTileStyle. \ + * {@link KnownTrafficIncidentTileStyle} can be used interchangeably with TrafficIncidentTileStyle, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **s1**: Creates traffic lines with colored chevrons indicating severity. \ + * **s2**: Creates plain lines with certain degree of glow. \ + * **s3**: Creates plain lines with certain degree of glow. \ + * **night**: Night style. + */ +export type TrafficIncidentTileStyle = string; + +/** Known values of {@link TrafficIncidentDetailStyle} that the service accepts. */ +export const enum KnownTrafficIncidentDetailStyle { + /** Creates traffic lines with colored chevrons indicating severity. */ + S1 = "s1", + /** Creates plain lines with certain degree of glow. */ + S2 = "s2", + /** Creates plain lines with certain degree of glow. */ + S3 = "s3", + /** Night style. */ + Night = "night" +} + +/** + * Defines values for TrafficIncidentDetailStyle. \ + * {@link KnownTrafficIncidentDetailStyle} can be used interchangeably with TrafficIncidentDetailStyle, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **s1**: Creates traffic lines with colored chevrons indicating severity. \ + * **s2**: Creates plain lines with certain degree of glow. \ + * **s3**: Creates plain lines with certain degree of glow. \ + * **night**: Night style. + */ +export type TrafficIncidentDetailStyle = string; + +/** Known values of {@link ProjectionStandard} that the service accepts. */ +export const enum KnownProjectionStandard { + /** [EPSG900913](http://docs.openlayers.org/library/spherical_mercator.html) */ + Epsg900913 = "EPSG900913", + /** [EPSG4326](http://spatialreference.org/ref/epsg/4326/) */ + Epsg4326 = "EPSG4326" +} + +/** + * Defines values for ProjectionStandard. \ + * {@link KnownProjectionStandard} can be used interchangeably with ProjectionStandard, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **EPSG900913**: [EPSG900913](http:\/\/docs.openlayers.org\/library\/spherical_mercator.html) \ + * **EPSG4326**: [EPSG4326](http:\/\/spatialreference.org\/ref\/epsg\/4326\/) + */ +export type ProjectionStandard = string; + +/** Known values of {@link IncidentGeometryType} that the service accepts. */ +export const enum KnownIncidentGeometryType { + /** Places incidents precisely on the road. */ + Original = "original", + /** Moves the incident slightly (depending on zoom level) to indicate specific road lanes. */ + Shifted = "shifted" +} + +/** + * Defines values for IncidentGeometryType. \ + * {@link KnownIncidentGeometryType} can be used interchangeably with IncidentGeometryType, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **original**: Places incidents precisely on the road. \ + * **shifted**: Moves the incident slightly (depending on zoom level) to indicate specific road lanes. + */ +export type IncidentGeometryType = string; + +/** Known values of {@link GeographicResourceLocation} that the service accepts. */ +export const enum KnownGeographicResourceLocation { + /** Used to access an Azure Maps Creator resource in the United States */ + Us = "us", + /** Used to access an Azure Maps Creator resource in Europe */ + Eu = "eu" +} + +/** + * Defines values for GeographicResourceLocation. \ + * {@link KnownGeographicResourceLocation} can be used interchangeably with GeographicResourceLocation, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **us**: Used to access an Azure Maps Creator resource in the United States \ + * **eu**: Used to access an Azure Maps Creator resource in Europe + */ +export type GeographicResourceLocation = string; + +/** Optional parameters. */ +export interface TrafficGetTrafficFlowTileOptionalParams + extends coreClient.OperationOptions { + /** The value of the width of the line representing traffic. This value is a multiplier and the accepted values range from 1 - 20. The default value is 10. This parameter is not valid when format is pbf. */ + thickness?: number; +} + +/** Contains response data for the getTrafficFlowTile operation. */ +export type TrafficGetTrafficFlowTileResponse = TrafficGetTrafficFlowTileHeaders & { + /** + * BROWSER ONLY + * + * The response body as a browser Blob. + * Always `undefined` in node.js. + */ + blobBody?: Promise; + /** + * NODEJS ONLY + * + * The response body as a node.js Readable stream. + * Always `undefined` in the browser. + */ + readableStreamBody?: NodeJS.ReadableStream; +}; + +/** Optional parameters. */ +export interface TrafficGetTrafficFlowSegmentOptionalParams + extends coreClient.OperationOptions { + /** The value of the width of the line representing traffic. This value is a multiplier and the accepted values range from 1 - 20. The default value is 10. */ + thickness?: number; + /** Unit of speed in KMPH or MPH */ + unit?: SpeedUnit; + /** Boolean on whether the response should include OpenLR code */ + openLr?: boolean; +} + +/** Contains response data for the getTrafficFlowSegment operation. */ +export type TrafficGetTrafficFlowSegmentResponse = TrafficFlowSegmentResult; + +/** Optional parameters. */ +export interface TrafficGetTrafficIncidentTileOptionalParams + extends coreClient.OperationOptions { + /** Reference value for the state of traffic at a particular time, obtained from the Viewport API call, trafficModelId attribute in trafficState field. It is updated every minute, and is valid for two minutes before it times out. Use -1 to get the most recent traffic information. Default: most recent traffic information. */ + trafficState?: string; +} + +/** Contains response data for the getTrafficIncidentTile operation. */ +export type TrafficGetTrafficIncidentTileResponse = TrafficGetTrafficIncidentTileHeaders & { + /** + * BROWSER ONLY + * + * The response body as a browser Blob. + * Always `undefined` in node.js. + */ + blobBody?: Promise; + /** + * NODEJS ONLY + * + * The response body as a node.js Readable stream. + * Always `undefined` in the browser. + */ + readableStreamBody?: NodeJS.ReadableStream; +}; + +/** Optional parameters. */ +export interface TrafficGetTrafficIncidentDetailOptionalParams + extends coreClient.OperationOptions { + /** + * [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) for the output language. Supported languages are ar, ca, cs, da, de, el, en, en-GB, en-US, es, et, fi, fr, he, hu, id, in*, it, lt, lv, nb, nl, no, pl, pt, ro, ru, sk, sv, th, tr, zh. + * + * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. When invalid language code is provided response is returned in English. When incident cause or description does not have translation, English description is returned. + */ + language?: string; + /** The projection used to specify the coordinates in the request and response. [EPSG900913](http://docs.openlayers.org/library/spherical_mercator.html) (default) or [EPSG4326](http://spatialreference.org/ref/epsg/4326/) */ + projection?: ProjectionStandard; + /** The type of vector geometry added to incidents (returned in the element of the response). */ + geometries?: IncidentGeometryType; + /** Boolean to indicate whether to list all traffic incidents in a cluster separately */ + expandCluster?: boolean; + /** Boolean on whether to return the original position of the incident () as well as the one shifted to the beginning of the traffic tube () */ + originalPosition?: boolean; +} + +/** Contains response data for the getTrafficIncidentDetail operation. */ +export type TrafficGetTrafficIncidentDetailResponse = TrafficIncidentDetailResult; + +/** Optional parameters. */ +export interface TrafficGetTrafficIncidentViewportOptionalParams + extends coreClient.OperationOptions { + /** Determines what copyright information to return. When true the copyright text is returned; when false only the copyright index is returned. */ + copyright?: boolean; +} + +/** Contains response data for the getTrafficIncidentViewport operation. */ +export type TrafficGetTrafficIncidentViewportResponse = TrafficIncidentViewportResult; + +/** Optional parameters. */ +export interface TrafficClientOptionalParams + extends coreClient.ServiceClientOptions { + /** This parameter specifies where the Azure Maps Creator resource is located. Valid values are us and eu. */ + geography?: Geography; + /** Specifies which account is intended for usage in conjunction with the Azure AD security model. It represents a unique ID for the Azure Maps account and can be retrieved from the Azure Maps management plane Account API. To use Azure AD security in Azure Maps see the following [articles](https://aka.ms/amauthdetails) for guidance. */ + xMsClientId?: string; + /** Api Version */ + apiVersion?: string; + /** Overrides client endpoint. */ + endpoint?: string; +} diff --git a/sdk/maps/maps-traffic/src/models/mappers.ts b/sdk/maps/maps-traffic/src/models/mappers.ts new file mode 100644 index 000000000000..716a86811ab2 --- /dev/null +++ b/sdk/maps/maps-traffic/src/models/mappers.ts @@ -0,0 +1,563 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; + +export const ErrorResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorResponse", + modelProperties: { + error: { + serializedName: "error", + type: { + name: "Composite", + className: "ErrorDetail" + } + } + } + } +}; + +export const ErrorDetail: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorDetail", + modelProperties: { + code: { + serializedName: "code", + readOnly: true, + type: { + name: "String" + } + }, + message: { + serializedName: "message", + readOnly: true, + type: { + name: "String" + } + }, + target: { + serializedName: "target", + readOnly: true, + type: { + name: "String" + } + }, + details: { + serializedName: "details", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ErrorDetail" + } + } + } + }, + additionalInfo: { + serializedName: "additionalInfo", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ErrorAdditionalInfo" + } + } + } + } + } + } +}; + +export const ErrorAdditionalInfo: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorAdditionalInfo", + modelProperties: { + type: { + serializedName: "type", + readOnly: true, + type: { + name: "String" + } + }, + info: { + serializedName: "info", + readOnly: true, + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } + } + } +}; + +export const TrafficFlowSegmentResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TrafficFlowSegmentResult", + modelProperties: { + flowSegmentData: { + serializedName: "flowSegmentData", + type: { + name: "Composite", + className: "TrafficFlowSegmentResultFlowSegmentData" + } + } + } + } +}; + +export const TrafficFlowSegmentResultFlowSegmentData: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TrafficFlowSegmentResultFlowSegmentData", + modelProperties: { + frc: { + serializedName: "frc", + readOnly: true, + type: { + name: "String" + } + }, + currentSpeed: { + serializedName: "currentSpeed", + readOnly: true, + type: { + name: "Number" + } + }, + freeFlowSpeed: { + serializedName: "freeFlowSpeed", + readOnly: true, + type: { + name: "Number" + } + }, + currentTravelTime: { + serializedName: "currentTravelTime", + readOnly: true, + type: { + name: "Number" + } + }, + freeFlowTravelTime: { + serializedName: "freeFlowTravelTime", + readOnly: true, + type: { + name: "Number" + } + }, + confidence: { + serializedName: "confidence", + readOnly: true, + type: { + name: "Number" + } + }, + coordinates: { + serializedName: "coordinates", + type: { + name: "Composite", + className: "TrafficFlowSegmentResultFlowSegmentDataCoordinates" + } + }, + version: { + serializedName: "@version", + readOnly: true, + type: { + name: "String" + } + }, + openlr: { + serializedName: "openlr", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const TrafficFlowSegmentResultFlowSegmentDataCoordinates: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TrafficFlowSegmentResultFlowSegmentDataCoordinates", + modelProperties: { + coordinate: { + serializedName: "coordinate", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "CoordinatesPair" + } + } + } + } + } + } +}; + +export const CoordinatesPair: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "CoordinatesPair", + modelProperties: { + latitude: { + serializedName: "latitude", + type: { + name: "Number" + } + }, + longitude: { + serializedName: "longitude", + type: { + name: "Number" + } + } + } + } +}; + +export const TrafficIncidentDetailResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TrafficIncidentDetailResult", + modelProperties: { + tm: { + serializedName: "tm", + type: { + name: "Composite", + className: "TrafficIncidentDetailResultTm" + } + } + } + } +}; + +export const TrafficIncidentDetailResultTm: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TrafficIncidentDetailResultTm", + modelProperties: { + id: { + serializedName: "@id", + readOnly: true, + type: { + name: "String" + } + }, + poi: { + serializedName: "poi", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "TrafficIncidentPoi" + } + } + } + } + } + } +}; + +export const TrafficIncidentPoi: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TrafficIncidentPoi", + modelProperties: { + id: { + serializedName: "id", + readOnly: true, + type: { + name: "String" + } + }, + p: { + serializedName: "p", + type: { + name: "Composite", + className: "TrafficIncidentPoiP" + } + }, + ic: { + serializedName: "ic", + readOnly: true, + type: { + name: "Number" + } + }, + ty: { + serializedName: "ty", + readOnly: true, + type: { + name: "Number" + } + }, + cbl: { + serializedName: "cbl", + type: { + name: "Composite", + className: "TrafficIncidentPoiCbl" + } + }, + ctr: { + serializedName: "ctr", + type: { + name: "Composite", + className: "TrafficIncidentPoiCtr" + } + }, + cs: { + serializedName: "cs", + readOnly: true, + type: { + name: "Number" + } + }, + l: { + serializedName: "l", + readOnly: true, + type: { + name: "Number" + } + }, + r: { + serializedName: "r", + readOnly: true, + type: { + name: "String" + } + }, + dl: { + serializedName: "dl", + readOnly: true, + type: { + name: "Number" + } + }, + t: { + serializedName: "t", + readOnly: true, + type: { + name: "String" + } + }, + f: { + serializedName: "f", + readOnly: true, + type: { + name: "String" + } + }, + d: { + serializedName: "d", + readOnly: true, + type: { + name: "String" + } + }, + c: { + serializedName: "c", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const TrafficIncidentPoiP: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TrafficIncidentPoiP", + modelProperties: { + x: { + serializedName: "x", + readOnly: true, + type: { + name: "Number" + } + }, + y: { + serializedName: "y", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const TrafficIncidentPoiCbl: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TrafficIncidentPoiCbl", + modelProperties: { + x: { + serializedName: "x", + readOnly: true, + type: { + name: "Number" + } + }, + y: { + serializedName: "y", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const TrafficIncidentPoiCtr: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TrafficIncidentPoiCtr", + modelProperties: { + x: { + serializedName: "x", + readOnly: true, + type: { + name: "Number" + } + }, + y: { + serializedName: "y", + readOnly: true, + type: { + name: "Number" + } + } + } + } +}; + +export const TrafficIncidentViewportResult: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TrafficIncidentViewportResult", + modelProperties: { + viewpResp: { + serializedName: "viewpResp", + type: { + name: "Composite", + className: "TrafficIncidentViewportResultViewpResp" + } + } + } + } +}; + +export const TrafficIncidentViewportResultViewpResp: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TrafficIncidentViewportResultViewpResp", + modelProperties: { + trafficState: { + serializedName: "trafficState", + type: { + name: "Composite", + className: "TrafficIncidentViewportResultViewpRespTrafficState" + } + }, + copyrightIds: { + serializedName: "copyrightIds", + readOnly: true, + type: { + name: "String" + } + }, + version: { + serializedName: "@version", + readOnly: true, + type: { + name: "String" + } + }, + maps: { + serializedName: "@maps", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const TrafficIncidentViewportResultViewpRespTrafficState: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TrafficIncidentViewportResultViewpRespTrafficState", + modelProperties: { + trafficAge: { + serializedName: "@trafficAge", + readOnly: true, + type: { + name: "Number" + } + }, + trafficModelId: { + serializedName: "@trafficModelId", + readOnly: true, + type: { + name: "String" + } + } + } + } +}; + +export const TrafficGetTrafficFlowTileHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TrafficGetTrafficFlowTileHeaders", + modelProperties: { + contentType: { + serializedName: "content-type", + type: { + name: "String" + } + } + } + } +}; + +export const TrafficGetTrafficIncidentTileHeaders: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TrafficGetTrafficIncidentTileHeaders", + modelProperties: { + contentType: { + serializedName: "content-type", + type: { + name: "String" + } + } + } + } +}; diff --git a/sdk/maps/maps-traffic/src/models/parameters.ts b/sdk/maps/maps-traffic/src/models/parameters.ts new file mode 100644 index 000000000000..3bb6749cb5ec --- /dev/null +++ b/sdk/maps/maps-traffic/src/models/parameters.ts @@ -0,0 +1,364 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { + OperationParameter, + OperationURLParameter, + OperationQueryParameter +} from "@azure/core-client"; + +export const accept: OperationParameter = { + parameterPath: "accept", + mapper: { + defaultValue: + "application/json, image/jpeg, image/png, image/pbf, application/vnd.mapbox-vector-tile", + isConstant: true, + serializedName: "Accept", + type: { + name: "String" + } + } +}; + +export const geography: OperationURLParameter = { + parameterPath: "geography", + mapper: { + serializedName: "geography", + required: true, + type: { + name: "String" + } + } +}; + +export const xMsClientId: OperationParameter = { + parameterPath: "xMsClientId", + mapper: { + serializedName: "x-ms-client-id", + type: { + name: "String" + } + } +}; + +export const apiVersion: OperationQueryParameter = { + parameterPath: "apiVersion", + mapper: { + defaultValue: "1.0", + isConstant: true, + serializedName: "api-version", + type: { + name: "String" + } + } +}; + +export const format: OperationURLParameter = { + parameterPath: "format", + mapper: { + serializedName: "format", + required: true, + type: { + name: "String" + } + } +}; + +export const style: OperationQueryParameter = { + parameterPath: "style", + mapper: { + serializedName: "style", + required: true, + type: { + name: "String" + } + } +}; + +export const zoom: OperationQueryParameter = { + parameterPath: "zoom", + mapper: { + serializedName: "zoom", + required: true, + type: { + name: "Number" + } + } +}; + +export const xTileIndex: OperationQueryParameter = { + parameterPath: "xTileIndex", + mapper: { + serializedName: "x", + required: true, + type: { + name: "Number" + } + } +}; + +export const yTileIndex: OperationQueryParameter = { + parameterPath: "yTileIndex", + mapper: { + serializedName: "y", + required: true, + type: { + name: "Number" + } + } +}; + +export const thickness: OperationQueryParameter = { + parameterPath: ["options", "thickness"], + mapper: { + constraints: { + InclusiveMaximum: 20, + InclusiveMinimum: 1 + }, + serializedName: "thickness", + type: { + name: "Number" + } + } +}; + +export const accept1: OperationParameter = { + parameterPath: "accept", + mapper: { + defaultValue: "application/json", + isConstant: true, + serializedName: "Accept", + type: { + name: "String" + } + } +}; + +export const format1: OperationURLParameter = { + parameterPath: "format", + mapper: { + serializedName: "format", + required: true, + type: { + name: "String" + } + } +}; + +export const style1: OperationQueryParameter = { + parameterPath: "style", + mapper: { + serializedName: "style", + required: true, + type: { + name: "String" + } + } +}; + +export const query: OperationQueryParameter = { + parameterPath: "query", + mapper: { + serializedName: "query", + required: true, + type: { + name: "String" + } + } +}; + +export const unit: OperationQueryParameter = { + parameterPath: ["options", "unit"], + mapper: { + serializedName: "unit", + type: { + name: "String" + } + } +}; + +export const openLr: OperationQueryParameter = { + parameterPath: ["options", "openLr"], + mapper: { + serializedName: "openLr", + type: { + name: "Boolean" + } + } +}; + +export const style2: OperationQueryParameter = { + parameterPath: "style", + mapper: { + serializedName: "style", + required: true, + type: { + name: "String" + } + } +}; + +export const trafficState: OperationQueryParameter = { + parameterPath: ["options", "trafficState"], + mapper: { + serializedName: "t", + type: { + name: "String" + } + } +}; + +export const style3: OperationQueryParameter = { + parameterPath: "style", + mapper: { + serializedName: "style", + required: true, + type: { + name: "String" + } + } +}; + +export const boundingbox: OperationQueryParameter = { + parameterPath: "boundingbox", + mapper: { + serializedName: "boundingbox", + required: true, + type: { + name: "String" + } + } +}; + +export const boundingZoom: OperationQueryParameter = { + parameterPath: "boundingZoom", + mapper: { + constraints: { + InclusiveMaximum: 22, + InclusiveMinimum: 0 + }, + serializedName: "boundingZoom", + required: true, + type: { + name: "Number" + } + } +}; + +export const trafficmodelid: OperationQueryParameter = { + parameterPath: "trafficmodelid", + mapper: { + serializedName: "trafficmodelid", + required: true, + type: { + name: "String" + } + } +}; + +export const language: OperationQueryParameter = { + parameterPath: ["options", "language"], + mapper: { + serializedName: "language", + type: { + name: "String" + } + } +}; + +export const projection: OperationQueryParameter = { + parameterPath: ["options", "projection"], + mapper: { + serializedName: "projection", + type: { + name: "String" + } + } +}; + +export const geometries: OperationQueryParameter = { + parameterPath: ["options", "geometries"], + mapper: { + serializedName: "geometries", + type: { + name: "String" + } + } +}; + +export const expandCluster: OperationQueryParameter = { + parameterPath: ["options", "expandCluster"], + mapper: { + serializedName: "expandCluster", + type: { + name: "Boolean" + } + } +}; + +export const originalPosition: OperationQueryParameter = { + parameterPath: ["options", "originalPosition"], + mapper: { + serializedName: "originalPosition", + type: { + name: "Boolean" + } + } +}; + +export const boundingzoom: OperationQueryParameter = { + parameterPath: "boundingzoom", + mapper: { + constraints: { + InclusiveMaximum: 22, + InclusiveMinimum: 0 + }, + serializedName: "boundingzoom", + required: true, + type: { + name: "Number" + } + } +}; + +export const overviewbox: OperationQueryParameter = { + parameterPath: "overviewbox", + mapper: { + serializedName: "overviewbox", + required: true, + type: { + name: "String" + } + } +}; + +export const overviewzoom: OperationQueryParameter = { + parameterPath: "overviewzoom", + mapper: { + constraints: { + InclusiveMaximum: 22, + InclusiveMinimum: 0 + }, + serializedName: "overviewzoom", + required: true, + type: { + name: "Number" + } + } +}; + +export const copyright: OperationQueryParameter = { + parameterPath: ["options", "copyright"], + mapper: { + defaultValue: true, + serializedName: "copyright", + type: { + name: "Boolean" + } + } +}; diff --git a/sdk/maps/maps-traffic/src/operations/index.ts b/sdk/maps/maps-traffic/src/operations/index.ts new file mode 100644 index 000000000000..0d19681b070d --- /dev/null +++ b/sdk/maps/maps-traffic/src/operations/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./traffic"; diff --git a/sdk/maps/maps-traffic/src/operations/traffic.ts b/sdk/maps/maps-traffic/src/operations/traffic.ts new file mode 100644 index 000000000000..e86b9ec18b7a --- /dev/null +++ b/sdk/maps/maps-traffic/src/operations/traffic.ts @@ -0,0 +1,397 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { Traffic } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; +import * as Mappers from "../models/mappers"; +import * as Parameters from "../models/parameters"; +import { TrafficClientContext } from "../trafficClientContext"; +import { + TileFormat, + TrafficFlowTileStyle, + TrafficGetTrafficFlowTileOptionalParams, + TrafficGetTrafficFlowTileResponse, + TextFormat, + TrafficFlowSegmentStyle, + TrafficGetTrafficFlowSegmentOptionalParams, + TrafficGetTrafficFlowSegmentResponse, + TrafficIncidentTileStyle, + TrafficGetTrafficIncidentTileOptionalParams, + TrafficGetTrafficIncidentTileResponse, + TrafficIncidentDetailStyle, + TrafficGetTrafficIncidentDetailOptionalParams, + TrafficGetTrafficIncidentDetailResponse, + TrafficGetTrafficIncidentViewportOptionalParams, + TrafficGetTrafficIncidentViewportResponse +} from "../models"; + +/** Class representing a Traffic. */ +export class TrafficImpl implements Traffic { + private readonly client: TrafficClientContext; + + /** + * Initialize a new instance of the class Traffic class. + * @param client Reference to the service client + */ + constructor(client: TrafficClientContext) { + this.client = client; + } + + /** + * __Traffic Flow Tile__ + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * The Azure Flow Tile API serves 256 x 256 pixel tiles showing traffic flow. All tiles use the same + * grid system. Because the traffic tiles use transparent images, they can be layered on top of map + * tiles to create a compound display. The Flow tiles use colors to indicate either the speed of + * traffic on different road segments, or the difference between that speed and the free-flow speed on + * the road segment in question. + * @param format Desired format of the response. Possible values are png & pbf. + * @param style

The style to be used to render the tile.

+ * @param zoom Zoom level for the desired tile. For _raster_ tiles, value must be in the range: 0-22 + * (inclusive). For _vector_ tiles, value must be in the range: 0-22 (inclusive). + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param options The options parameters. + */ + getTrafficFlowTile( + format: TileFormat, + style: TrafficFlowTileStyle, + zoom: number, + xTileIndex: number, + yTileIndex: number, + options?: TrafficGetTrafficFlowTileOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, style, zoom, xTileIndex, yTileIndex, options }, + getTrafficFlowTileOperationSpec + ); + } + + /** + * __Traffic Flow Segment__ + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * This service provides information about the speeds and travel times of the road fragment closest to + * the given coordinates. It is designed to work alongside the Flow layer of the Render Service to + * support clickable flow data visualizations. With this API, the client side can connect any place in + * the map with flow data on the closest road and present it to the user. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param style The style to be used to render the tile. Valid values are absolute which returns colors + * reflecting the absolute speed measured, relative which returns the speed relative to free-flow, + * Relative-delay which displays relative speeds only where they are different from the freeflow speeds + * @param zoom Zoom level for the desired tile. Zoom value must be in the range: 0-22 (inclusive). + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param query Coordinates of the point close to the road segment. They have to be comma-separated and + * calculated using EPSG4326 projection. + * @param options The options parameters. + */ + getTrafficFlowSegment( + format: TextFormat, + style: TrafficFlowSegmentStyle, + zoom: number, + query: string, + options?: TrafficGetTrafficFlowSegmentOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, style, zoom, query, options }, + getTrafficFlowSegmentOperationSpec + ); + } + + /** + * __Traffic Incident Tile__ + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * This service serves 256 x 256 pixel tiles showing traffic incidents. All tiles use the same grid + * system. Because the traffic tiles use transparent images, they can be layered on top of map tiles to + * create a compound display. Traffic tiles render graphics to indicate traffic on the roads in the + * specified area. + * @param format Desired format of the response. Possible values are png & pbf. + * @param style The style to be used to render the tile. This parameter is not valid when format is + * pbf. + * @param zoom Zoom level for the desired tile. For _raster_ tiles, value must be in the range: 0-22 + * (inclusive). For _vector_ tiles, value must be in the range: 0-22 (inclusive). + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param options The options parameters. + */ + getTrafficIncidentTile( + format: TileFormat, + style: TrafficIncidentTileStyle, + zoom: number, + xTileIndex: number, + yTileIndex: number, + options?: TrafficGetTrafficIncidentTileOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, style, zoom, xTileIndex, yTileIndex, options }, + getTrafficIncidentTileOperationSpec + ); + } + + /** + * __Traffic Incident Detail__ + * + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * This API provides information on traffic incidents inside a given bounding box, based on the current + * Traffic Model ID. The Traffic Model ID is available to grant synchronization of data between calls + * and API's. The Traffic Model ID is a key value for determining the currency of traffic incidents. + * It is updated every minute, and is valid for two minutes before it times out. It is used in + * rendering [incident + * tiles](https://docs.microsoft.com/en-us/rest/api/maps/traffic/gettrafficincidenttile). It can be + * obtained from the [Viewport + * API](https://docs.microsoft.com/en-us/rest/api/maps/traffic/gettrafficincidentviewport). + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param style The style that will be used to render the tile in Traffic [Incident Tile + * API](https://docs.microsoft.com/en-us/rest/api/maps/traffic/gettrafficincidenttile). This will have + * an effect on the coordinates of traffic incidents in the reply. + * @param boundingbox The `boundingbox` is represented by two value pairs describing it's corners + * (first pair for lower left corner and second for upper right). The pairs can either be specified + * using any of the `projection`'s specified below (e.g., _minY,minX,maxY,maxX_) or by two + * latitude-longitude pairs (e.g., _minLat,minLon,maxLat,maxLon_).

NOTE: If latitude/longitude + * pairs are used, then the `projection` parameter must be set to "EPSG4326". + * @param boundingZoom Zoom level for desired tile. 0 to 22 for raster tiles, 0 through 22 for vector + * tiles + * @param trafficmodelid Number referencing traffic model. This can be obtained from the [Viewport + * API](https://docs.microsoft.com/en-us/rest/api/maps/traffic/gettrafficincidentviewport). It is + * updated every minute, and is valid for two minutes before it times out. If the wrong Traffic Model + * ID is specified, the correct one will be returned by the interface. A value of -1 will always invoke + * the most recent traffic model + * @param options The options parameters. + */ + getTrafficIncidentDetail( + format: TextFormat, + style: TrafficIncidentDetailStyle, + boundingbox: string, + boundingZoom: number, + trafficmodelid: string, + options?: TrafficGetTrafficIncidentDetailOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, style, boundingbox, boundingZoom, trafficmodelid, options }, + getTrafficIncidentDetailOperationSpec + ); + } + + /** + * __Traffic Incident Viewport__ + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * This API returns legal and technical information for the viewport described in the request. It + * should be called by client applications whenever the viewport changes (for instance, through + * zooming, panning, going to a location, or displaying a route). The request should contain the + * bounding box and zoom level of the viewport whose information is needed. The return will contain + * map version information, as well as the current Traffic Model ID and copyright IDs. The Traffic + * Model ID returned by the Viewport Description is used by other APIs to retrieve last traffic + * information for further processing. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param boundingbox Bounding box of the map viewport in + * [EPSG900913](http://docs.openlayers.org/library/spherical_mercator.html) projection. The + * `boundingbox` is represented by two value pairs describing it's corners (first pair for lower left + * corner and second for upper right). All values should be separated by commas (e.g., + * _minY,minX,maxY,maxX_). The maximum size of the bounding box that can be passed is dependent on the + * requested zoom level. The width and height cannot exceed 4092 pixels when rendered on the given zoom + * level.

NOTE: Bounding boxes that cross the 180° meridian require special treatment. For such + * boxes, the eastern _maxX_ value will be negative, and thus less than the _minX_ value west of the + * 180° meridian. To address that, the value 40075016.6855874 should be added to the true _maxX_ value + * before it is passed in the request. + * @param boundingzoom Zoom level of the map viewport. Used to determine whether the view can be zoomed + * in. + * @param overviewbox Bounding box of the overview map in + * [EPSG900913](http://docs.openlayers.org/library/spherical_mercator.html) projection.

Used in + * case the overview box/mini map has different copyright data than the main map. If there is no mini + * map, the same coordinates as `boundingBox` is used. + * @param overviewzoom Zoom level of the overview map. If there is no mini map, use the same zoom level + * as boundingZoom. + * @param options The options parameters. + */ + getTrafficIncidentViewport( + format: TextFormat, + boundingbox: string, + boundingzoom: number, + overviewbox: string, + overviewzoom: number, + options?: TrafficGetTrafficIncidentViewportOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, boundingbox, boundingzoom, overviewbox, overviewzoom, options }, + getTrafficIncidentViewportOperationSpec + ); + } +} +// Operation Specifications +const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); + +const getTrafficFlowTileOperationSpec: coreClient.OperationSpec = { + path: "/traffic/flow/tile/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: { + type: { name: "Stream" }, + serializedName: "parsedResponse" + }, + headersMapper: Mappers.TrafficGetTrafficFlowTileHeaders + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.style, + Parameters.zoom, + Parameters.xTileIndex, + Parameters.yTileIndex, + Parameters.thickness + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getTrafficFlowSegmentOperationSpec: coreClient.OperationSpec = { + path: "/traffic/flow/segment/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.TrafficFlowSegmentResult + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.zoom, + Parameters.thickness, + Parameters.style1, + Parameters.query, + Parameters.unit, + Parameters.openLr + ], + urlParameters: [Parameters.geography, Parameters.format1], + headerParameters: [Parameters.xMsClientId, Parameters.accept1], + serializer +}; +const getTrafficIncidentTileOperationSpec: coreClient.OperationSpec = { + path: "/traffic/incident/tile/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: { + type: { name: "Stream" }, + serializedName: "parsedResponse" + }, + headersMapper: Mappers.TrafficGetTrafficIncidentTileHeaders + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.zoom, + Parameters.xTileIndex, + Parameters.yTileIndex, + Parameters.style2, + Parameters.trafficState + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getTrafficIncidentDetailOperationSpec: coreClient.OperationSpec = { + path: "/traffic/incident/detail/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.TrafficIncidentDetailResult + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.style3, + Parameters.boundingbox, + Parameters.boundingZoom, + Parameters.trafficmodelid, + Parameters.language, + Parameters.projection, + Parameters.geometries, + Parameters.expandCluster, + Parameters.originalPosition + ], + urlParameters: [Parameters.geography, Parameters.format1], + headerParameters: [Parameters.xMsClientId, Parameters.accept1], + serializer +}; +const getTrafficIncidentViewportOperationSpec: coreClient.OperationSpec = { + path: "/traffic/incident/viewport/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.TrafficIncidentViewportResult + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.boundingbox, + Parameters.boundingzoom, + Parameters.overviewbox, + Parameters.overviewzoom, + Parameters.copyright + ], + urlParameters: [Parameters.geography, Parameters.format1], + headerParameters: [Parameters.xMsClientId, Parameters.accept1], + serializer +}; diff --git a/sdk/maps/maps-traffic/src/operationsInterfaces/index.ts b/sdk/maps/maps-traffic/src/operationsInterfaces/index.ts new file mode 100644 index 000000000000..0d19681b070d --- /dev/null +++ b/sdk/maps/maps-traffic/src/operationsInterfaces/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./traffic"; diff --git a/sdk/maps/maps-traffic/src/operationsInterfaces/traffic.ts b/sdk/maps/maps-traffic/src/operationsInterfaces/traffic.ts new file mode 100644 index 000000000000..f2937c123f82 --- /dev/null +++ b/sdk/maps/maps-traffic/src/operationsInterfaces/traffic.ts @@ -0,0 +1,222 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { + TileFormat, + TrafficFlowTileStyle, + TrafficGetTrafficFlowTileOptionalParams, + TrafficGetTrafficFlowTileResponse, + TextFormat, + TrafficFlowSegmentStyle, + TrafficGetTrafficFlowSegmentOptionalParams, + TrafficGetTrafficFlowSegmentResponse, + TrafficIncidentTileStyle, + TrafficGetTrafficIncidentTileOptionalParams, + TrafficGetTrafficIncidentTileResponse, + TrafficIncidentDetailStyle, + TrafficGetTrafficIncidentDetailOptionalParams, + TrafficGetTrafficIncidentDetailResponse, + TrafficGetTrafficIncidentViewportOptionalParams, + TrafficGetTrafficIncidentViewportResponse +} from "../models"; + +/** Interface representing a Traffic. */ +export interface Traffic { + /** + * __Traffic Flow Tile__ + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * The Azure Flow Tile API serves 256 x 256 pixel tiles showing traffic flow. All tiles use the same + * grid system. Because the traffic tiles use transparent images, they can be layered on top of map + * tiles to create a compound display. The Flow tiles use colors to indicate either the speed of + * traffic on different road segments, or the difference between that speed and the free-flow speed on + * the road segment in question. + * @param format Desired format of the response. Possible values are png & pbf. + * @param style

The style to be used to render the tile.

+ * @param zoom Zoom level for the desired tile. For _raster_ tiles, value must be in the range: 0-22 + * (inclusive). For _vector_ tiles, value must be in the range: 0-22 (inclusive). + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param options The options parameters. + */ + getTrafficFlowTile( + format: TileFormat, + style: TrafficFlowTileStyle, + zoom: number, + xTileIndex: number, + yTileIndex: number, + options?: TrafficGetTrafficFlowTileOptionalParams + ): Promise; + /** + * __Traffic Flow Segment__ + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * This service provides information about the speeds and travel times of the road fragment closest to + * the given coordinates. It is designed to work alongside the Flow layer of the Render Service to + * support clickable flow data visualizations. With this API, the client side can connect any place in + * the map with flow data on the closest road and present it to the user. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param style The style to be used to render the tile. Valid values are absolute which returns colors + * reflecting the absolute speed measured, relative which returns the speed relative to free-flow, + * Relative-delay which displays relative speeds only where they are different from the freeflow speeds + * @param zoom Zoom level for the desired tile. Zoom value must be in the range: 0-22 (inclusive). + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param query Coordinates of the point close to the road segment. They have to be comma-separated and + * calculated using EPSG4326 projection. + * @param options The options parameters. + */ + getTrafficFlowSegment( + format: TextFormat, + style: TrafficFlowSegmentStyle, + zoom: number, + query: string, + options?: TrafficGetTrafficFlowSegmentOptionalParams + ): Promise; + /** + * __Traffic Incident Tile__ + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * This service serves 256 x 256 pixel tiles showing traffic incidents. All tiles use the same grid + * system. Because the traffic tiles use transparent images, they can be layered on top of map tiles to + * create a compound display. Traffic tiles render graphics to indicate traffic on the roads in the + * specified area. + * @param format Desired format of the response. Possible values are png & pbf. + * @param style The style to be used to render the tile. This parameter is not valid when format is + * pbf. + * @param zoom Zoom level for the desired tile. For _raster_ tiles, value must be in the range: 0-22 + * (inclusive). For _vector_ tiles, value must be in the range: 0-22 (inclusive). + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, + * 2`zoom` -1]. + * + * Please see [Zoom Levels and Tile + * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for + * details. + * @param options The options parameters. + */ + getTrafficIncidentTile( + format: TileFormat, + style: TrafficIncidentTileStyle, + zoom: number, + xTileIndex: number, + yTileIndex: number, + options?: TrafficGetTrafficIncidentTileOptionalParams + ): Promise; + /** + * __Traffic Incident Detail__ + * + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * This API provides information on traffic incidents inside a given bounding box, based on the current + * Traffic Model ID. The Traffic Model ID is available to grant synchronization of data between calls + * and API's. The Traffic Model ID is a key value for determining the currency of traffic incidents. + * It is updated every minute, and is valid for two minutes before it times out. It is used in + * rendering [incident + * tiles](https://docs.microsoft.com/en-us/rest/api/maps/traffic/gettrafficincidenttile). It can be + * obtained from the [Viewport + * API](https://docs.microsoft.com/en-us/rest/api/maps/traffic/gettrafficincidentviewport). + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param style The style that will be used to render the tile in Traffic [Incident Tile + * API](https://docs.microsoft.com/en-us/rest/api/maps/traffic/gettrafficincidenttile). This will have + * an effect on the coordinates of traffic incidents in the reply. + * @param boundingbox The `boundingbox` is represented by two value pairs describing it's corners + * (first pair for lower left corner and second for upper right). The pairs can either be specified + * using any of the `projection`'s specified below (e.g., _minY,minX,maxY,maxX_) or by two + * latitude-longitude pairs (e.g., _minLat,minLon,maxLat,maxLon_).

NOTE: If latitude/longitude + * pairs are used, then the `projection` parameter must be set to "EPSG4326". + * @param boundingZoom Zoom level for desired tile. 0 to 22 for raster tiles, 0 through 22 for vector + * tiles + * @param trafficmodelid Number referencing traffic model. This can be obtained from the [Viewport + * API](https://docs.microsoft.com/en-us/rest/api/maps/traffic/gettrafficincidentviewport). It is + * updated every minute, and is valid for two minutes before it times out. If the wrong Traffic Model + * ID is specified, the correct one will be returned by the interface. A value of -1 will always invoke + * the most recent traffic model + * @param options The options parameters. + */ + getTrafficIncidentDetail( + format: TextFormat, + style: TrafficIncidentDetailStyle, + boundingbox: string, + boundingZoom: number, + trafficmodelid: string, + options?: TrafficGetTrafficIncidentDetailOptionalParams + ): Promise; + /** + * __Traffic Incident Viewport__ + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * This API returns legal and technical information for the viewport described in the request. It + * should be called by client applications whenever the viewport changes (for instance, through + * zooming, panning, going to a location, or displaying a route). The request should contain the + * bounding box and zoom level of the viewport whose information is needed. The return will contain + * map version information, as well as the current Traffic Model ID and copyright IDs. The Traffic + * Model ID returned by the Viewport Description is used by other APIs to retrieve last traffic + * information for further processing. + * @param format Desired format of the response. Value can be either _json_ or _xml_. + * @param boundingbox Bounding box of the map viewport in + * [EPSG900913](http://docs.openlayers.org/library/spherical_mercator.html) projection. The + * `boundingbox` is represented by two value pairs describing it's corners (first pair for lower left + * corner and second for upper right). All values should be separated by commas (e.g., + * _minY,minX,maxY,maxX_). The maximum size of the bounding box that can be passed is dependent on the + * requested zoom level. The width and height cannot exceed 4092 pixels when rendered on the given zoom + * level.

NOTE: Bounding boxes that cross the 180° meridian require special treatment. For such + * boxes, the eastern _maxX_ value will be negative, and thus less than the _minX_ value west of the + * 180° meridian. To address that, the value 40075016.6855874 should be added to the true _maxX_ value + * before it is passed in the request. + * @param boundingzoom Zoom level of the map viewport. Used to determine whether the view can be zoomed + * in. + * @param overviewbox Bounding box of the overview map in + * [EPSG900913](http://docs.openlayers.org/library/spherical_mercator.html) projection.

Used in + * case the overview box/mini map has different copyright data than the main map. If there is no mini + * map, the same coordinates as `boundingBox` is used. + * @param overviewzoom Zoom level of the overview map. If there is no mini map, use the same zoom level + * as boundingZoom. + * @param options The options parameters. + */ + getTrafficIncidentViewport( + format: TextFormat, + boundingbox: string, + boundingzoom: number, + overviewbox: string, + overviewzoom: number, + options?: TrafficGetTrafficIncidentViewportOptionalParams + ): Promise; +} diff --git a/sdk/maps/maps-traffic/src/trafficClient.ts b/sdk/maps/maps-traffic/src/trafficClient.ts new file mode 100644 index 000000000000..60ce72068097 --- /dev/null +++ b/sdk/maps/maps-traffic/src/trafficClient.ts @@ -0,0 +1,30 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreAuth from "@azure/core-auth"; +import { TrafficImpl } from "./operations"; +import { Traffic } from "./operationsInterfaces"; +import { TrafficClientContext } from "./trafficClientContext"; +import { TrafficClientOptionalParams } from "./models"; + +export class TrafficClient extends TrafficClientContext { + /** + * Initializes a new instance of the TrafficClient class. + * @param credentials Subscription credentials which uniquely identify client subscription. + * @param options The parameter options + */ + constructor( + credentials: coreAuth.TokenCredential, + options?: TrafficClientOptionalParams + ) { + super(credentials, options); + this.traffic = new TrafficImpl(this); + } + + traffic: Traffic; +} diff --git a/sdk/maps/maps-traffic/src/trafficClientContext.ts b/sdk/maps/maps-traffic/src/trafficClientContext.ts new file mode 100644 index 000000000000..4219d2e95cad --- /dev/null +++ b/sdk/maps/maps-traffic/src/trafficClientContext.ts @@ -0,0 +1,63 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; +import * as coreAuth from "@azure/core-auth"; +import { Geography, TrafficClientOptionalParams } from "./models"; + +export class TrafficClientContext extends coreClient.ServiceClient { + geography: Geography; + xMsClientId?: string; + apiVersion: string; + + /** + * Initializes a new instance of the TrafficClientContext class. + * @param credentials Subscription credentials which uniquely identify client subscription. + * @param options The parameter options + */ + constructor( + credentials: coreAuth.TokenCredential, + options?: TrafficClientOptionalParams + ) { + if (credentials === undefined) { + throw new Error("'credentials' cannot be null"); + } + + // Initializing default values for options + if (!options) { + options = {}; + } + const defaults: TrafficClientOptionalParams = { + requestContentType: "application/json; charset=utf-8", + credential: credentials + }; + + const packageDetails = `azsdk-js-maps-traffic/1.0.0-beta.1`; + const userAgentPrefix = + options.userAgentOptions && options.userAgentOptions.userAgentPrefix + ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` + : `${packageDetails}`; + + if (!options.credentialScopes) { + options.credentialScopes = ["https://atlas.microsoft.com/.default"]; + } + const optionsWithDefaults = { + ...defaults, + ...options, + userAgentOptions: { + userAgentPrefix + }, + baseUri: options.endpoint || "https://{geography}.atlas.microsoft.com" + }; + super(optionsWithDefaults); + + // Assigning values to Constant parameters + this.geography = options.geography || "us"; + this.apiVersion = options.apiVersion || "1.0"; + } +} diff --git a/sdk/maps/maps-traffic/tsconfig.json b/sdk/maps/maps-traffic/tsconfig.json new file mode 100644 index 000000000000..0ec8659c8e83 --- /dev/null +++ b/sdk/maps/maps-traffic/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "module": "es6", + "moduleResolution": "node", + "strict": true, + "target": "es6", + "sourceMap": true, + "declarationMap": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "preserveConstEnums": true, + "lib": ["es6", "dom"], + "declaration": true, + "outDir": "./esm", + "importHelpers": true + }, + "include": ["./src/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/sdk/maps/maps-weather/LICENSE.txt b/sdk/maps/maps-weather/LICENSE.txt new file mode 100644 index 000000000000..ccb63b166732 --- /dev/null +++ b/sdk/maps/maps-weather/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2021 Microsoft + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/sdk/maps/maps-weather/README.md b/sdk/maps/maps-weather/README.md new file mode 100644 index 000000000000..d321da18f5cf --- /dev/null +++ b/sdk/maps/maps-weather/README.md @@ -0,0 +1,91 @@ +# Azure Weather client library for JavaScript + +This package contains an isomorphic SDK (runs both in Node.js and in browsers) for Azure Weather client. + + + +[Source code](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-weather) | +[Package (NPM)](https://www.npmjs.com/package/@azure/maps-weather) | +[API reference documentation](https://docs.microsoft.com/javascript/api/@azure/maps-weather) | +[Samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-weather/samples) + +## Getting started + +### Currently supported environments + +- [LTS versions of Node.js](https://nodejs.org/about/releases/) +- Latest versions of Safari, Chrome, Edge and Firefox. + +### Prerequisites + +- An [Azure subscription][azure_sub]. + +### Install the `@azure/maps-weather` package + +Install the Azure Weather client library for JavaScript with `npm`: + +```bash +npm install @azure/maps-weather +``` + +### Create and authenticate a `WeatherClient` + +To create a client object to access the Azure Weather API, you will need the `endpoint` of your Azure Weather resource and a `credential`. The Azure Weather client can use Azure Active Directory credentials to authenticate. +You can find the endpoint for your Azure Weather resource in the [Azure Portal][azure_portal]. + +#### Using an Azure Active Directory Credential + +You can authenticate with Azure Active Directory using the [Azure Identity library][azure_identity]. To use the [DefaultAzureCredential][defaultazurecredential] provider shown below, or other credential providers provided with the Azure SDK, please install the `@azure/identity` package: + +```bash +npm install @azure/identity +``` + +You will also need to register a new AAD application and grant access to Azure Weather by assigning the suitable role to your service principal (note: roles such as `"Owner"` will not grant the necessary permissions). +Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`. + +```javascript +const { WeatherClient } = require("@azure/maps-weather"); +const { DefaultAzureCredential } = require("@azure/identity"); +const client = new WeatherClient("", new DefaultAzureCredential()); +``` + +## Key concepts + +### WeatherClient + +`WeatherClient` is the primary interface for developers using the Azure Weather client library. Explore the methods on this client object to understand the different features of the Azure Weather service that you can access. + +## Troubleshooting + +### Logging + +Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: + +```javascript +import { setLogLevel } from "@azure/logger"; +setLogLevel("info"); +``` + +For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger). + +## Next steps + +Please take a look at the [samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-weather/samples) directory for detailed examples on how to use this library. + +## Contributing + +If you'd like to contribute to this library, please read the [contributing guide](https://github.com/Azure/azure-sdk-for-js/blob/master/CONTRIBUTING.md) to learn more about how to build and test the code. + +## Related projects + +- [Microsoft Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) + +![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fmaps%2Fmaps-weather%2FREADME.png) + +[azure_cli]: https://docs.microsoft.com/cli/azure +[azure_sub]: https://azure.microsoft.com/free/ +[azure_sub]: https://azure.microsoft.com/free/ +[azure_portal]: https://portal.azure.com +[azure_identity]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity +[defaultazurecredential]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity#defaultazurecredential diff --git a/sdk/maps/maps-weather/api-extractor.json b/sdk/maps/maps-weather/api-extractor.json new file mode 100644 index 000000000000..5fb5b21b56f2 --- /dev/null +++ b/sdk/maps/maps-weather/api-extractor.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "mainEntryPointFilePath": "./esm/index.d.ts", + "docModel": { "enabled": true }, + "apiReport": { "enabled": true, "reportFolder": "./review" }, + "dtsRollup": { + "enabled": true, + "untrimmedFilePath": "", + "publicTrimmedFilePath": "./esm/index.d.ts" + }, + "messages": { + "tsdocMessageReporting": { "default": { "logLevel": "none" } }, + "extractorMessageReporting": { + "ae-missing-release-tag": { "logLevel": "none" }, + "ae-unresolved-link": { "logLevel": "none" } + } + } +} diff --git a/sdk/maps/maps-weather/package.json b/sdk/maps/maps-weather/package.json new file mode 100644 index 000000000000..ededa4824217 --- /dev/null +++ b/sdk/maps/maps-weather/package.json @@ -0,0 +1,84 @@ +{ + "name": "@azure/maps-weather", + "sdk-type": "client", + "author": "Microsoft Corporation", + "description": "A generated SDK for WeatherClient.", + "version": "1.0.0-beta.1", + "engines": { "node": ">=12.0.0" }, + "dependencies": { + "@azure/core-client": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-rest-pipeline": "^1.1.0", + "tslib": "^2.2.0" + }, + "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], + "license": "MIT", + "main": "./dist/index.js", + "module": "./esm/index.js", + "types": "./esm/index.d.ts", + "devDependencies": { + "@microsoft/api-extractor": "7.7.11", + "@rollup/plugin-commonjs": "11.0.2", + "@rollup/plugin-json": "^4.0.0", + "@rollup/plugin-multi-entry": "^3.0.0", + "@rollup/plugin-node-resolve": "^8.0.0", + "mkdirp": "^1.0.4", + "rollup": "^1.16.3", + "rollup-plugin-sourcemaps": "^0.4.2", + "rollup-plugin-node-resolve": "^3.4.0", + "typescript": "~4.2.0", + "uglify-js": "^3.4.9" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js", + "repository": { + "type": "git", + "url": "https://github.com/Azure/azure-sdk-for-js.git" + }, + "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, + "files": [ + "dist/**/*.js", + "dist/**/*.js.map", + "dist/**/*.d.ts", + "dist/**/*.d.ts.map", + "esm/**/*.js", + "esm/**/*.js.map", + "esm/**/*.d.ts", + "esm/**/*.d.ts.map", + "src/**/*.ts", + "README.md", + "rollup.config.js", + "tsconfig.json", + "review/*", + "CHANGELOG.md" + ], + "scripts": { + "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", + "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js", + "prepack": "npm install && npm run build", + "pack": "npm pack 2>&1", + "extract-api": "mkdirp ./review && api-extractor run --local", + "lint": "echo skipped", + "audit": "echo skipped", + "clean": "echo skipped", + "build:node": "echo skipped", + "build:browser": "echo skipped", + "build:test": "echo skipped", + "build:samples": "echo skipped.", + "check-format": "echo skipped", + "execute:samples": "echo skipped", + "format": "echo skipped", + "test": "echo skipped", + "prebuild": "echo skipped", + "test:node": "echo skipped", + "test:browser": "echo skipped", + "unit-test": "echo skipped", + "unit-test:node": "echo skipped", + "unit-test:browser": "echo skipped", + "integration-test:browser": "echo skipped", + "integration-test:node": "echo skipped", + "integration-test": "echo skipped", + "docs": "echo skipped" + }, + "sideEffects": false, + "autoPublish": true +} diff --git a/sdk/maps/maps-weather/review/maps-weather.api.md b/sdk/maps/maps-weather/review/maps-weather.api.md new file mode 100644 index 000000000000..8c52516febdc --- /dev/null +++ b/sdk/maps/maps-weather/review/maps-weather.api.md @@ -0,0 +1,636 @@ +## API Report File for "@azure/maps-weather" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import * as coreAuth from '@azure/core-auth'; +import * as coreClient from '@azure/core-client'; + +// @public (undocumented) +export interface AirAndPollen { + category?: string; + categoryValue?: number; + name?: string; + type?: string; + value?: number; +} + +// @public +export interface AlertArea { + alertDetails?: string; + alertDetailsLanguageCode?: string; + endTime?: string; + latestStatus?: LatestStatus; + name?: string; + startTime?: string; + summary?: string; +} + +// @public (undocumented) +export interface ColorValue { + blue?: number; + green?: number; + hex?: string; + red?: number; +} + +// @public (undocumented) +export interface CurrentConditions { + apparentTemperature?: WeatherUnit; + ceiling?: WeatherUnit; + cloudCover?: number; + dateTime?: string; + dewPoint?: WeatherUnit; + hasPrecipitation?: boolean; + iconCode?: number; + isDayTime?: boolean; + obstructionsToVisibility?: string; + past24HourTemperatureDeparture?: WeatherUnit; + phrase?: string; + precipitationSummary?: PrecipitationSummary; + pressure?: WeatherUnit; + pressureTendency?: PressureTendency; + realFeelTemperature?: WeatherUnit; + realFeelTemperatureShade?: WeatherUnit; + relativeHumidity?: number; + temperature?: WeatherUnit; + temperatureSummary?: TemperatureSummary; + uvIndex?: number; + uvIndexPhrase?: string; + visibility?: WeatherUnit; + wetBulbTemperature?: WeatherUnit; + wind?: WindDetails; + windChillTemperature?: WeatherUnit; + windGust?: WindDetails; +} + +// @public (undocumented) +export interface CurrentConditionsResponse { + results?: CurrentConditions[]; +} + +// @public (undocumented) +export interface DailyForecast { + airAndPollen?: AirAndPollen[]; + date?: string; + day?: DayOrNight; + degreeDaySummary?: DegreeDaySummary; + hoursOfSun?: number; + night?: DayOrNight; + realFeelTemperature?: WeatherUnitRange; + realFeelTemperatureShade?: WeatherUnitRange; + sources?: string[]; + temperature?: WeatherUnitRange; +} + +// @public (undocumented) +export interface DailyForecastResponse { + forecasts?: DailyForecast[]; + summary?: DailyForecastSummary; +} + +// @public +export interface DailyForecastSummary { + category?: string; + endDate?: string; + phrase?: string; + severity?: number; + startDate?: string; +} + +// @public +export interface DailyIndex { + ascending?: boolean; + category?: string; + categoryValue?: number; + dateTime?: string; + description?: string; + indexId?: number; + indexName?: string; + value?: number; +} + +// @public +export interface DailyIndicesResponse { + results?: DailyIndex[]; +} + +// @public (undocumented) +export interface DayOrNight { + cloudCover?: number; + hasPrecipitation?: boolean; + hoursOfIce?: number; + hoursOfPrecipitation?: number; + hoursOfRain?: number; + hoursOfSnow?: number; + ice?: WeatherUnit; + iceProbability?: number; + iconCode?: number; + iconPhrase?: string; + localSource?: LocalSource; + longPhrase?: string; + precipitationIntensity?: string; + precipitationProbability?: number; + precipitationType?: string; + rain?: WeatherUnit; + rainProbability?: number; + shortPhrase?: string; + snow?: WeatherUnit; + snowProbability?: number; + thunderstormProbability?: number; + totalLiquid?: WeatherUnit; + wind?: WindDetails; + windGust?: WindDetails; +} + +// @public +export type DayQuarter = number; + +// @public (undocumented) +export interface DegreeDaySummary { + cooling?: WeatherUnit; + heating?: WeatherUnit; +} + +// @public +export interface ErrorAdditionalInfo { + readonly info?: Record; + readonly type?: string; +} + +// @public +export interface ErrorDetail { + readonly additionalInfo?: ErrorAdditionalInfo[]; + readonly code?: string; + readonly details?: ErrorDetail[]; + readonly message?: string; + readonly target?: string; +} + +// @public +export interface ErrorResponse { + error?: ErrorDetail; +} + +// @public (undocumented) +export interface ForecastInterval { + cloudCover?: number; + color?: ColorValue; + dbz?: number; + iconCode?: number; + minute?: number; + precipitationType?: string; + shortPhrase?: string; + simplifiedColor?: ColorValue; + startTime?: string; + threshold?: string; +} + +// @public +export type GeographicResourceLocation = string; + +// @public +export type Geography = string; + +// @public (undocumented) +export interface HazardDetail { + hazardCode?: string; + hazardIndex?: number; + shortPhrase?: string; +} + +// @public (undocumented) +export interface HourlyForecast { + ceiling?: WeatherUnit; + cloudCover?: number; + date?: string; + dewPoint?: WeatherUnit; + hasPrecipitation?: boolean; + ice?: WeatherUnit; + iceProbability?: number; + iconCode?: number; + iconPhrase?: string; + isDaylight?: boolean; + precipitationProbability?: number; + rain?: WeatherUnit; + rainProbability?: number; + realFeelTemperature?: WeatherUnit; + relativeHumidity?: number; + snow?: WeatherUnit; + snowProbability?: number; + temperature?: WeatherUnit; + totalLiquid?: WeatherUnit; + uvIndex?: number; + uvIndexPhrase?: string; + visibility?: WeatherUnit; + wetBulbTemperature?: WeatherUnit; + wind?: WindDetails; + windGust?: WindDetails; +} + +// @public (undocumented) +export interface HourlyForecastResponse { + forecasts?: HourlyForecast[]; +} + +// @public (undocumented) +export interface IntervalSummary { + briefPhrase?: string; + endMinute?: number; + iconCode?: number; + longPhrase?: string; + shortPhrase?: string; + startMinute?: number; + totalMinutes?: number; +} + +// @public +export const enum KnownDayQuarter { + One = 1, + Three = 3, + Two = 2, + Zero = 0 +} + +// @public +export const enum KnownGeographicResourceLocation { + Eu = "eu", + Us = "us" +} + +// @public +export const enum KnownGeography { + // (undocumented) + Eu = "eu", + // (undocumented) + Us = "us" +} + +// @public +export const enum KnownLatestStatusKeyword { + Cancel = "Cancel", + Continue = "Continue", + Correct = "Correct", + Expire = "Expire", + Extend = "Extend", + New = "New", + Update = "Update", + Upgrade = "Upgrade" +} + +// @public +export const enum KnownResponseFormat { + Json = "json" +} + +// @public +export const enum KnownWeatherDataUnit { + Imperial = "imperial", + Metric = "metric" +} + +// @public +export interface LatestStatus { + english?: LatestStatusKeyword; + localized?: string; +} + +// @public +export type LatestStatusKeyword = string; + +// @public +export interface LocalSource { + id?: number; + name?: string; + weatherCode?: string; +} + +// @public (undocumented) +export interface MinuteForecastResponse { + intervals?: ForecastInterval[]; + intervalSummaries?: IntervalSummary[]; + summary?: MinuteForecastSummary; +} + +// @public +export interface MinuteForecastSummary { + briefPhrase?: string; + briefPhrase60?: string; + iconCode?: number; + longPhrase?: string; + shortPhrase?: string; +} + +// @public (undocumented) +export interface PrecipitationSummary { + past12Hours?: WeatherUnit; + past18Hours?: WeatherUnit; + past24Hours?: WeatherUnit; + past3Hours?: WeatherUnit; + past6Hours?: WeatherUnit; + past9Hours?: WeatherUnit; + pastHour?: WeatherUnit; +} + +// @public (undocumented) +export interface PressureTendency { + code?: string; + localizedDescription?: string; +} + +// @public (undocumented) +export interface QuarterDayForecast { + cloudCover?: number; + date?: string; + dewPoint?: WeatherUnit; + effectiveDate?: string; + hasPrecipitation?: boolean; + ice?: WeatherUnit; + iconCode?: number; + iconPhrase?: string; + phrase?: string; + precipitationIntensity?: string; + precipitationProbability?: number; + precipitationType?: string; + quarter?: DayQuarter; + rain?: WeatherUnit; + realFeelTemperature?: WeatherUnitRange; + relativeHumidity?: number; + snow?: WeatherUnit; + temperature?: WeatherUnitRange; + thunderstormProbability?: number; + totalLiquid?: WeatherUnit; + visibility?: WeatherUnit; + wind?: WindDetails; + windGust?: WindDetails; +} + +// @public (undocumented) +export interface QuarterDayForecastResponse { + forecasts?: QuarterDayForecast[]; +} + +// @public +export type ResponseFormat = string; + +// @public +export interface SevereWeatherAlert { + alertAreas?: AlertArea[]; + alertId?: number; + category?: string; + class?: string; + countryCode?: string; + description?: SevereWeatherAlertDescription; + disclaimer?: string; + level?: string; + priority?: number; + source?: string; + sourceId?: number; +} + +// @public +export interface SevereWeatherAlertDescription { + english?: string; + localized?: string; +} + +// @public +export interface SevereWeatherAlertsResponse { + results?: SevereWeatherAlert[]; +} + +// @public +export interface SunGlare { + calculatedVehicleHeading?: number; + glareIndex?: number; +} + +// @public (undocumented) +export interface TemperatureSummary { + past12Hours?: TemperatureSummaryPast12Hours; + past24Hours?: TemperatureSummaryPast24Hours; + past6Hours?: TemperatureSummaryPast6Hours; +} + +// @public +export interface TemperatureSummaryPast12Hours { + maximum?: WeatherUnit; + minimum?: WeatherUnit; +} + +// @public +export interface TemperatureSummaryPast24Hours { + maximum?: WeatherUnit; + minimum?: WeatherUnit; +} + +// @public +export interface TemperatureSummaryPast6Hours { + maximum?: WeatherUnit; + minimum?: WeatherUnit; +} + +// @public +export interface Weather { + getCurrentConditions(format: ResponseFormat, query: string, options?: WeatherGetCurrentConditionsOptionalParams): Promise; + getDailyForecast(format: ResponseFormat, query: string, options?: WeatherGetDailyForecastOptionalParams): Promise; + getDailyIndices(format: ResponseFormat, query: string, options?: WeatherGetDailyIndicesOptionalParams): Promise; + getHourlyForecast(format: ResponseFormat, query: string, options?: WeatherGetHourlyForecastOptionalParams): Promise; + getMinuteForecast(format: ResponseFormat, query: string, options?: WeatherGetMinuteForecastOptionalParams): Promise; + getQuarterDayForecast(format: ResponseFormat, query: string, options?: WeatherGetQuarterDayForecastOptionalParams): Promise; + getSevereWeatherAlerts(format: ResponseFormat, query: string, options?: WeatherGetSevereWeatherAlertsOptionalParams): Promise; + getWeatherAlongRoute(format: ResponseFormat, query: string, options?: WeatherGetWeatherAlongRouteOptionalParams): Promise; +} + +// @public +export interface WeatherAlongRoutePrecipitation { + dbz?: number; + type?: string; +} + +// @public +export interface WeatherAlongRouteResponse { + summary?: WeatherAlongRouteSummary; + waypoints?: WeatherWaypoint[]; +} + +// @public +export interface WeatherAlongRouteSummary { + hazards?: WeatherHazards; + iconCode?: number; +} + +// @public (undocumented) +export class WeatherClient extends WeatherClientContext { + constructor(credentials: coreAuth.TokenCredential, options?: WeatherClientOptionalParams); + // (undocumented) + weather: Weather; +} + +// @public (undocumented) +export class WeatherClientContext extends coreClient.ServiceClient { + constructor(credentials: coreAuth.TokenCredential, options?: WeatherClientOptionalParams); + // (undocumented) + apiVersion: string; + // (undocumented) + geography: Geography; + // (undocumented) + xMsClientId?: string; +} + +// @public +export interface WeatherClientOptionalParams extends coreClient.ServiceClientOptions { + apiVersion?: string; + endpoint?: string; + geography?: Geography; + xMsClientId?: string; +} + +// @public +export type WeatherDataUnit = string; + +// @public +export interface WeatherGetCurrentConditionsOptionalParams extends coreClient.OperationOptions { + details?: string; + duration?: number; + language?: string; + unit?: WeatherDataUnit; +} + +// @public +export type WeatherGetCurrentConditionsResponse = CurrentConditionsResponse; + +// @public +export interface WeatherGetDailyForecastOptionalParams extends coreClient.OperationOptions { + duration?: number; + language?: string; + unit?: WeatherDataUnit; +} + +// @public +export type WeatherGetDailyForecastResponse = DailyForecastResponse; + +// @public +export interface WeatherGetDailyIndicesOptionalParams extends coreClient.OperationOptions { + duration?: number; + indexGroupId?: number; + indexId?: number; + language?: string; +} + +// @public +export type WeatherGetDailyIndicesResponse = DailyIndicesResponse; + +// @public +export interface WeatherGetHourlyForecastOptionalParams extends coreClient.OperationOptions { + duration?: number; + language?: string; + unit?: WeatherDataUnit; +} + +// @public +export type WeatherGetHourlyForecastResponse = HourlyForecastResponse; + +// @public +export interface WeatherGetMinuteForecastOptionalParams extends coreClient.OperationOptions { + interval?: number; + language?: string; +} + +// @public +export type WeatherGetMinuteForecastResponse = MinuteForecastResponse; + +// @public +export interface WeatherGetQuarterDayForecastOptionalParams extends coreClient.OperationOptions { + duration?: number; + language?: string; + unit?: WeatherDataUnit; +} + +// @public +export type WeatherGetQuarterDayForecastResponse = QuarterDayForecastResponse; + +// @public +export interface WeatherGetSevereWeatherAlertsOptionalParams extends coreClient.OperationOptions { + details?: string; + language?: string; +} + +// @public +export type WeatherGetSevereWeatherAlertsResponse = SevereWeatherAlertsResponse; + +// @public +export interface WeatherGetWeatherAlongRouteOptionalParams extends coreClient.OperationOptions { + language?: string; +} + +// @public +export type WeatherGetWeatherAlongRouteResponse = WeatherAlongRouteResponse; + +// @public +export interface WeatherHazards { + hazardDetails?: HazardDetail[]; + maxHazardIndex?: number; +} + +// @public (undocumented) +export interface WeatherNotification { + hazardCode?: string; + hazardIndex?: number; + shortPhrase?: string; + type?: string; +} + +// @public +export interface WeatherUnit { + unit?: string; + unitType?: number; + value?: number; +} + +// @public +export interface WeatherUnitRange { + maximum?: WeatherUnit; + minimum?: WeatherUnit; +} + +// @public (undocumented) +export interface WeatherWaypoint { + cloudCover?: number; + hazards?: WeatherHazards; + iconCode?: number; + isDayTime?: boolean; + lightningCount?: number; + notifications?: WeatherNotification[]; + precipitation?: WeatherAlongRoutePrecipitation; + shortPhrase?: string; + sunGlare?: SunGlare; + temperature?: WeatherUnit; + wind?: WindDetails; + windGust?: WindDetails; +} + +// @public +export interface WindDetails { + direction?: WindDirection; + speed?: WindSpeed; +} + +// @public +export interface WindDirection { + degrees?: number; + localizedDescription?: string; +} + +// @public +export interface WindSpeed { + unit?: string; + unitType?: number; + value?: number; +} + + +// (No @packageDocumentation comment for this package) + +``` diff --git a/sdk/maps/maps-weather/rollup.config.js b/sdk/maps/maps-weather/rollup.config.js new file mode 100644 index 000000000000..9be1955eb7f1 --- /dev/null +++ b/sdk/maps/maps-weather/rollup.config.js @@ -0,0 +1,188 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import nodeResolve from "@rollup/plugin-node-resolve"; +import cjs from "@rollup/plugin-commonjs"; +import sourcemaps from "rollup-plugin-sourcemaps"; +import multiEntry from "@rollup/plugin-multi-entry"; +import json from "@rollup/plugin-json"; + +import nodeBuiltins from "builtin-modules"; + +/** + * Gets the proper configuration needed for rollup's commonJS plugin for @opentelemetry/api. + * + * NOTE: this manual configuration is only needed because OpenTelemetry uses an + * __exportStar downleveled helper function to declare its exports which confuses + * rollup's automatic discovery mechanism. + * + * @returns an object reference that can be `...`'d into your cjs() configuration. + */ +export function openTelemetryCommonJs() { + const namedExports = {}; + + for (const key of [ + "@opentelemetry/api", + "@azure/core-tracing/node_modules/@opentelemetry/api" + ]) { + namedExports[key] = [ + "SpanKind", + "TraceFlags", + "getSpan", + "setSpan", + "SpanStatusCode", + "getSpanContext", + "setSpanContext" + ]; + } + + const releasedOpenTelemetryVersions = ["0.10.2", "1.0.0-rc.0"]; + + for (const version of releasedOpenTelemetryVersions) { + namedExports[ + // working around a limitation in the rollup common.js plugin - it's not able to resolve these modules so the named exports listed above will not get applied. We have to drill down to the actual path. + `../../../common/temp/node_modules/.pnpm/@opentelemetry/api@${version}/node_modules/@opentelemetry/api/build/src/index.js` + ] = [ + "SpanKind", + "TraceFlags", + "getSpan", + "setSpan", + "StatusCode", + "CanonicalCode", + "getSpanContext", + "setSpanContext" + ]; + } + + return namedExports; +} + +// #region Warning Handler + +/** + * A function that can determine whether a rollupwarning should be ignored. If + * the function returns `true`, then the warning will not be displayed. + */ + +function ignoreNiseSinonEvalWarnings(warning) { + return ( + warning.code === "EVAL" && + warning.id && + (warning.id.includes("node_modules/nise") || + warning.id.includes("node_modules/sinon")) === true + ); +} + +function ignoreChaiCircularDependencyWarnings(warning) { + return ( + warning.code === "CIRCULAR_DEPENDENCY" && + warning.importer && warning.importer.includes("node_modules/chai") === true + ); +} + +const warningInhibitors = [ + ignoreChaiCircularDependencyWarnings, + ignoreNiseSinonEvalWarnings +]; + +/** + * Construct a warning handler for the shared rollup configuration + * that ignores certain warnings that are not relevant to testing. + */ +function makeOnWarnForTesting() { + return (warning, warn) => { + // If every inhibitor returns false (i.e. no inhibitors), then show the warning + if (warningInhibitors.every((inhib) => !inhib(warning))) { + warn(warning); + } + }; +} + +// #endregion + +function makeBrowserTestConfig() { + const config = { + input: { + include: ["dist-esm/test/**/*.spec.js"], + exclude: ["dist-esm/test/**/node/**"] + }, + output: { + file: `dist-test/index.browser.js`, + format: "umd", + sourcemap: true + }, + preserveSymlinks: false, + plugins: [ + multiEntry({ exports: false }), + nodeResolve({ + mainFields: ["module", "browser"] + }), + cjs({ + namedExports: { + // Chai's strange internal architecture makes it impossible to statically + // analyze its exports. + chai: [ + "version", + "use", + "util", + "config", + "expect", + "should", + "assert" + ], + ...openTelemetryCommonJs() + } + }), + json(), + sourcemaps() + //viz({ filename: "dist-test/browser-stats.html", sourcemap: true }) + ], + onwarn: makeOnWarnForTesting(), + // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, + // rollup started respecting the "sideEffects" field in package.json. Since + // our package.json sets "sideEffects=false", this also applies to test + // code, which causes all tests to be removed by tree-shaking. + treeshake: false + }; + + return config; +} + +const defaultConfigurationOptions = { + disableBrowserBundle: false +}; + +export function makeConfig(pkg, options) { + options = { + ...defaultConfigurationOptions, + ...(options || {}) + }; + + const baseConfig = { + // Use the package's module field if it has one + input: pkg["module"] || "dist-esm/src/index.js", + external: [ + ...nodeBuiltins, + ...Object.keys(pkg.dependencies), + ...Object.keys(pkg.devDependencies) + ], + output: { file: "dist/index.js", format: "cjs", sourcemap: true }, + preserveSymlinks: false, + plugins: [sourcemaps(), nodeResolve(), cjs()] + }; + + const config = [baseConfig]; + + if (!options.disableBrowserBundle) { + config.push(makeBrowserTestConfig()); + } + + return config; +} + +export default makeConfig(require("./package.json")); diff --git a/sdk/maps/maps-weather/samples/v1/javascript/README.md b/sdk/maps/maps-weather/samples/v1/javascript/README.md new file mode 100644 index 000000000000..6bcd1f4e5170 --- /dev/null +++ b/sdk/maps/maps-weather/samples/v1/javascript/README.md @@ -0,0 +1,54 @@ +--- +page_type: sample +languages: + - javascript +products: + - azure +urlFragment: maps-weather-javascript +--- + +# Azure Maps Weather client library samples for JavaScript + +These sample programs show how to use the JavaScript client libraries for Azure Maps Weather in some common scenarios. + +| **File Name** | **Description** | +| --------------------- | ------------------------------------------ | +| [weather.js][weather] | Gets forecasts and weather related alerts. | + +## Prerequisites + +The sample programs are compatible with Node.js >=12.0.0. + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +3. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node weather.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx cross-env MAPS_SUBSCRIPTION_KEY="" node weather.js +``` + +[weather]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-weather/samples/v1/javascript/src/weather.js +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-weather/README.md diff --git a/sdk/maps/maps-weather/samples/v1/javascript/elevation.js b/sdk/maps/maps-weather/samples/v1/javascript/elevation.js new file mode 100644 index 000000000000..422587aca96f --- /dev/null +++ b/sdk/maps/maps-weather/samples/v1/javascript/elevation.js @@ -0,0 +1,70 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Elevation API usage. Simple CRUD operations are performed. + */ + +const { DefaultAzureCredential } = require("@azure/identity"); +const { ElevationClient } = require("@azure/maps-elevation"); +require("dotenv").config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + const elevation = new ElevationClient(credential).elevation; + + console.log(" --- Get Data For Bounding Box:"); + console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); + + console.log(" --- Get Data For Points:"); + console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Get Data For Polyline:"); + console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Post Data For Points:"); + console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + + console.log(" --- Post Data For Polyline:"); + console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-weather/samples/v1/javascript/package.json b/sdk/maps/maps-weather/samples/v1/javascript/package.json new file mode 100644 index 000000000000..eff07b322d5f --- /dev/null +++ b/sdk/maps/maps-weather/samples/v1/javascript/package.json @@ -0,0 +1,28 @@ +{ + "name": "azure-maps-weather-samples-js", + "private": true, + "version": "1.0.0", + "description": "Azure Maps Weather client library samples for JavaScript", + "engine": { + "node": ">=12.0.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/maps/maps-weather" + }, + "keywords": [ + "Azure", + "cloud" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-weather", + "dependencies": { + "@azure/maps-weather": "next", + "dotenv": "latest" + } +} diff --git a/sdk/maps/maps-weather/samples/v1/javascript/sample.env b/sdk/maps/maps-weather/samples/v1/javascript/sample.env new file mode 100644 index 000000000000..2259ae4da0ec --- /dev/null +++ b/sdk/maps/maps-weather/samples/v1/javascript/sample.env @@ -0,0 +1,7 @@ +# Maps subscription key when using AzureKey authentication +MAPS_SUBSCRIPTION_KEY="" + +# Maps Azure AD authentication +AZURE_CLIENT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_TENANT_ID="" diff --git a/sdk/maps/maps-weather/samples/v1/typescript/README.md b/sdk/maps/maps-weather/samples/v1/typescript/README.md new file mode 100644 index 000000000000..9c8aa2d85bbb --- /dev/null +++ b/sdk/maps/maps-weather/samples/v1/typescript/README.md @@ -0,0 +1,67 @@ +--- +page_type: sample +languages: + - typescript +products: + - azure +urlFragment: maps-weather-typescript +--- + +# Azure Maps Weather client library samples for TypeScript + +These sample programs show how to use the TypeScript client libraries for Azure Maps Weather in some common scenarios. + +| **File Name** | **Description** | +| --------------------- | ------------------------------------------ | +| [weather.js][weather] | Gets forecasts and weather related alerts. | + +## Prerequisites + +The sample programs are compatible with Node.js >=12.0.0. + +Before running the samples in Node, they must be compiled to JavaScript using the TypeScript compiler. For more information on TypeScript, see the [TypeScript documentation][typescript]. Install the TypeScript compiler using: + +```bash +npm install -g typescript +``` + +You need [an Azure subscription][freesub] to run these sample programs. + +Samples retrieve credentials to access the service endpoint from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Compile the samples: + +```bash +npm run build +``` + +3. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +4. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node dist/weather.js +``` + +Alternatively, run a single sample with the correct environment variables set (setting up the `.env` file is not required if you do this), for example (cross-platform): + +```bash +npx cross-env MAPS_SUBSCRIPTION_KEY="" node dist/weather.js +``` + +[weather]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/maps/maps-weather/samples/v1/typescript/src/weather.ts +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-weather/README.md +[typescript]: https://www.typescriptlang.org/docs/home.html diff --git a/sdk/maps/maps-weather/samples/v1/typescript/package.json b/sdk/maps/maps-weather/samples/v1/typescript/package.json new file mode 100644 index 000000000000..6a973b12c2d3 --- /dev/null +++ b/sdk/maps/maps-weather/samples/v1/typescript/package.json @@ -0,0 +1,36 @@ +{ + "name": "azure-maps-weather-samples-ts", + "private": true, + "version": "1.0.0", + "description": "Azure Maps Weather client library samples for TypeScript", + "engine": { + "node": ">=12.0.0" + }, + "scripts": { + "build": "tsc", + "prebuild": "rimraf dist/" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git", + "directory": "sdk/maps/maps-weather" + }, + "keywords": [ + "Azure", + "cloud" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-weather", + "dependencies": { + "@azure/maps-weather": "next", + "dotenv": "latest" + }, + "devDependencies": { + "typescript": "~4.2.0", + "rimraf": "latest" + } +} diff --git a/sdk/maps/maps-weather/samples/v1/typescript/sample.env b/sdk/maps/maps-weather/samples/v1/typescript/sample.env new file mode 100644 index 000000000000..2259ae4da0ec --- /dev/null +++ b/sdk/maps/maps-weather/samples/v1/typescript/sample.env @@ -0,0 +1,7 @@ +# Maps subscription key when using AzureKey authentication +MAPS_SUBSCRIPTION_KEY="" + +# Maps Azure AD authentication +AZURE_CLIENT_ID="" +AZURE_CLIENT_SECRET="" +AZURE_TENANT_ID="" diff --git a/sdk/maps/maps-weather/samples/v1/typescript/src/elevation.ts b/sdk/maps/maps-weather/samples/v1/typescript/src/elevation.ts new file mode 100644 index 000000000000..5e1f91bd6989 --- /dev/null +++ b/sdk/maps/maps-weather/samples/v1/typescript/src/elevation.ts @@ -0,0 +1,76 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Elevation API usage. Simple queries are performed. + */ + +import { getDefaultAzureCredential } from "@azure/identity"; +import * as coreAuth from "@azure/core-auth"; +import * as coreClient from "@azure/core-client"; +import { ElevationClient } from "@azure/maps-elevation"; +import * as dotenv from "dotenv"; +dotenv.config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential implements coreAuth.TokenCredential { + async getToken( + _scopes: string | string[], + _options?: coreAuth.GetTokenOptions + ): Promise { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential: coreAuth.TokenCredential; + let operationOptions: coreClient.OperationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = getDefaultAzureCredential(); + } + + const elevation = new ElevationClient(credential).elevation; + + console.log(" --- Get Data For Bounding Box:"); + console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); + + console.log(" --- Get Data For Points:"); + console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Get Data For Polyline:"); + console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + + console.log(" --- Post Data For Points:"); + console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + + console.log(" --- Post Data For Polyline:"); + console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-weather/samples/v1/typescript/tsconfig.json b/sdk/maps/maps-weather/samples/v1/typescript/tsconfig.json new file mode 100644 index 000000000000..416c2dd82e00 --- /dev/null +++ b/sdk/maps/maps-weather/samples/v1/typescript/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2018", + "module": "commonjs", + "moduleResolution": "node", + "resolveJsonModule": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "alwaysStrict": true, + "outDir": "dist", + "rootDir": "src" + }, + "include": [ + "src/**.ts" + ] +} diff --git a/sdk/maps/maps-weather/src/index.ts b/sdk/maps/maps-weather/src/index.ts new file mode 100644 index 000000000000..87609e29745a --- /dev/null +++ b/sdk/maps/maps-weather/src/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./models"; +export { WeatherClient } from "./weatherClient"; +export { WeatherClientContext } from "./weatherClientContext"; +export * from "./operationsInterfaces"; diff --git a/sdk/maps/maps-weather/src/models/index.ts b/sdk/maps/maps-weather/src/models/index.ts new file mode 100644 index 000000000000..19d527255c60 --- /dev/null +++ b/sdk/maps/maps-weather/src/models/index.ts @@ -0,0 +1,1069 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; + +export interface HourlyForecastResponse { + /** Forecast data for each returned hour. */ + forecasts?: HourlyForecast[]; +} + +export interface HourlyForecast { + /** Date and time of the forecast in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. */ + date?: string; + /** Numeric value representing an image that displays the `iconPhrase`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ + iconCode?: number; + /** Phrase description of the weather icon. */ + iconPhrase?: string; + /** Indicates the presence or absence of precipitation. True indicates the presence of precipitation, false indicates the absence of precipitation. */ + hasPrecipitation?: boolean; + /** Specifies whether or not it is daylight. True indicates day light. */ + isDaylight?: boolean; + /** Temperature being returned. */ + temperature?: WeatherUnit; + /** RealFeel™ Temperature being returned. Describes what the temperature really feels like in the shade. */ + realFeelTemperature?: WeatherUnit; + /** The temperature to which air may be cooled by evaporating water into it at constant pressure until it reaches saturation. */ + wetBulbTemperature?: WeatherUnit; + /** The dewpoint temperature in specified unit. The dewpoint temperature is the temperature that the air must be cooled to in order to reach saturation. */ + dewPoint?: WeatherUnit; + /** Wind details being returned including speed and direction. */ + wind?: WindDetails; + /** Wind gust. Wind gust is a sudden, brief increase in speed of the wind. */ + windGust?: WindDetails; + /** Relative humidity is the amount of water vapor present in air expressed as a percentage of the amount needed for saturation at the same temperature. */ + relativeHumidity?: number; + /** Visibility in specified unit. A measure of the distance at which an object or light can be clearly discerned. */ + visibility?: WeatherUnit; + /** Cloud ceiling in specified unit. The ceiling is a measurement of the height of the base of the lowest clouds. */ + ceiling?: WeatherUnit; + /** + * Measure of the strength of the ultraviolet radiation from the sun. Supported values are: + * * `0-2` - Low danger from the sun's UV rays or the average person. + * * `3-5` - Moderate risk of harm from unprotected sun exposure. + * * `6-7` - High risk of harm from unprotected sun exposure. + * * `8-10` - Very high risk of harm from unprotected sun exposure. + * * `11+` - Extreme risk of harm from unprotected sun exposure. + */ + uvIndex?: number; + /** Phrase associated with the `uvIndex`. */ + uvIndexPhrase?: string; + /** Percent representing the probability of precipitation. For example, '20'. */ + precipitationProbability?: number; + /** Percent representing the probability of rain. For example, '50'. */ + rainProbability?: number; + /** Percent representing the probability of snow. For example, '50'. */ + snowProbability?: number; + /** Percent representing the probability of snow. For example, '5'. */ + iceProbability?: number; + /** Total liquid equivalent of precipitation during the forecast period. */ + totalLiquid?: WeatherUnit; + /** Rain */ + rain?: WeatherUnit; + /** Snow */ + snow?: WeatherUnit; + /** Ice */ + ice?: WeatherUnit; + /** Percent representing cloud cover. */ + cloudCover?: number; +} + +/** Specific value of a given unit related to weather. */ +export interface WeatherUnit { + /** Rounded value. */ + value?: number; + /** Type of unit for the returned value. */ + unit?: string; + /** Numeric ID value associated with the type of unit being displayed. Can be used for unit translation. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ + unitType?: number; +} + +/** Wind details being returned including speed and direction. */ +export interface WindDetails { + /** Wind direction */ + direction?: WindDirection; + /** Speed of the wind in specified unit. */ + speed?: WindSpeed; +} + +/** Wind direction */ +export interface WindDirection { + /** Wind direction in Azimuth degrees, starting at true North and continuing in clockwise direction. North is 0 degrees, east is 90 degrees, south is 180 degrees, west is 270 degrees. Possible values 0-359. */ + degrees?: number; + /** Direction abbreviation in the specified language. */ + localizedDescription?: string; +} + +/** Speed of wind in specified unit. */ +export interface WindSpeed { + /** Rounded value of the speed. */ + value?: number; + /** Type of unit for the speed value. */ + unit?: string; + /** Numeric ID value associated with the type of unit being displayed. Can be used for unit translation. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ + unitType?: number; +} + +/** Common error response for all Azure Resource Manager APIs to return error details for failed operations. (This also follows the OData error response format.). */ +export interface ErrorResponse { + /** The error object. */ + error?: ErrorDetail; +} + +/** The error detail. */ +export interface ErrorDetail { + /** + * The error code. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly code?: string; + /** + * The error message. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly message?: string; + /** + * The error target. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly target?: string; + /** + * The error details. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly details?: ErrorDetail[]; + /** + * The error additional info. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly additionalInfo?: ErrorAdditionalInfo[]; +} + +/** The resource management error additional info. */ +export interface ErrorAdditionalInfo { + /** + * The additional info type. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly type?: string; + /** + * The additional info. + * NOTE: This property will not be serialized. It can only be populated by the server. + */ + readonly info?: Record; +} + +export interface MinuteForecastResponse { + /** Phrase summaries for the entire forecast period. */ + summary?: MinuteForecastSummary; + /** Summary information for each interval in the forecast. The Summaries breaks down each potential interval where precipitation starts and stops. */ + intervalSummaries?: IntervalSummary[]; + /** Forecast data for each interval in the forecast. */ + intervals?: ForecastInterval[]; +} + +/** Phrase summaries for the entire forecast period. */ +export interface MinuteForecastSummary { + /** Summary phrase for the next 60 minutes. Phrase length is approximately 60 characters. */ + briefPhrase60?: string; + /** Short summary phrase for the next 120 minutes. Phrase length is approximately 25 characters. */ + shortPhrase?: string; + /** Summary phrase for the next 120 minutes. Phrase length is approximately 60 characters. */ + briefPhrase?: string; + /** Long summary phrase for the next 120 minutes. Phrase length is 60+ characters. */ + longPhrase?: string; + /** Numeric value representing an image that displays the `iconPhrase`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ + iconCode?: number; +} + +export interface IntervalSummary { + /** The first minute to which the summary applies. */ + startMinute?: number; + /** The last minute to which the summary applies. */ + endMinute?: number; + /** The number of minutes for which the summary applies. */ + totalMinutes?: number; + /** Short summary phrase. Phrase length is approximately 25 characters. */ + shortPhrase?: string; + /** Brief summary phrase. Phrase length is approximately 60 characters. */ + briefPhrase?: string; + /** Long summary phrase. Phrase length is 60+ characters. */ + longPhrase?: string; + /** Numeric value representing an image that displays the `iconPhrase`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ + iconCode?: number; +} + +export interface ForecastInterval { + /** The date and time for the start of the interval in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. */ + startTime?: string; + /** The first minute for the interval. */ + minute?: number; + /** A unit that represents forecasted precipitation intensity. */ + dbz?: number; + /** A short phrase describing precipitation condition for the interval. */ + shortPhrase?: string; + /** Key that specifies the threshold value. Along with precipitationType, can be used to determine the simplifiedColor. If dbz is zero, not present in the response. */ + threshold?: string; + /** The full spectrum color that maps to the dBZ (decibel relative to Z). If dbz is zero, color is not present in the response. */ + color?: ColorValue; + /** The band color that maps to the precipitation type and threshold. If dbz is zero, not present in the response. */ + simplifiedColor?: ColorValue; + /** Specifies the type of precipitation ("rain" "snow" "ice" or "mix"). If dbz is zero, precipitationType is not present in the response. */ + precipitationType?: string; + /** Numeric value representing an image that displays the `iconPhrase`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ + iconCode?: number; + /** Percent representing cloud cover. */ + cloudCover?: number; +} + +export interface ColorValue { + /** Red component of the RGB value. */ + red?: number; + /** Green component of the RGB value. */ + green?: number; + /** Blue component of the RGB value */ + blue?: number; + /** Hexadecimal color value. */ + hex?: string; +} + +export interface QuarterDayForecastResponse { + /** Forecast data for each quarter in the response. */ + forecasts?: QuarterDayForecast[]; +} + +export interface QuarterDayForecast { + /** Date and time of the forecast in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. */ + date?: string; + /** Date and time of the beginning of the forecast quarter displayed in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. */ + effectiveDate?: string; + /** Quarter of the day. */ + quarter?: DayQuarter; + /** Numeric value representing an image that displays the `iconPhrase`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ + iconCode?: number; + /** Phrase description of the icon. Displayed in specified language. For example, 'Sunny'. */ + iconPhrase?: string; + /** Short summary phrase summary for quarter. */ + phrase?: string; + /** Temperature values for the quarter. */ + temperature?: WeatherUnitRange; + /** RealFeel™ Temperature values for the quarter. */ + realFeelTemperature?: WeatherUnitRange; + /** The dewpoint temperature in specified unit. The dewpoint temperature is the temperature that the air must be cooled to in order to reach saturation. */ + dewPoint?: WeatherUnit; + /** Relative humidity is the amount of water vapor present in air expressed as a percentage of the amount needed for saturation at the same temperature. */ + relativeHumidity?: number; + /** Wind details being returned including speed and direction. */ + wind?: WindDetails; + /** Wind gust. Wind gust is a sudden, brief increase in speed of the wind. */ + windGust?: WindDetails; + /** Visibility in specified unit. A measure of the distance at which an object or light can be clearly discerned. */ + visibility?: WeatherUnit; + /** Percent representing cloud cover. */ + cloudCover?: number; + /** Indicates the presence or absence of precipitation. True indicates the presence of precipitation, false indicates the absence of precipitation. */ + hasPrecipitation?: boolean; + /** Specifies the type of precipitation ("rain" "snow" "ice" or "mix"). If dbz = zero, precipitationType is not present in the response. */ + precipitationType?: string; + /** Description of the intensity. */ + precipitationIntensity?: string; + /** Percent representing the probability of precipitation. For example, '20'. */ + precipitationProbability?: number; + /** Percent representing the probability of a thunderstorm. For example, '10'. */ + thunderstormProbability?: number; + /** Total liquid equivalent of precipitation during the forecast period. */ + totalLiquid?: WeatherUnit; + /** Rain */ + rain?: WeatherUnit; + /** Snow */ + snow?: WeatherUnit; + /** Ice */ + ice?: WeatherUnit; +} + +/** Returned temperature values. */ +export interface WeatherUnitRange { + /** Minimum temperature for the time period. */ + minimum?: WeatherUnit; + /** Maximum temperature for the time period */ + maximum?: WeatherUnit; +} + +export interface CurrentConditionsResponse { + /** Detailed current weather conditions. */ + results?: CurrentConditions[]; +} + +export interface CurrentConditions { + /** Date and time of the current observation displayed in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. */ + dateTime?: string; + /** Phrase description of the current weather condition. Displayed in specified language. */ + phrase?: string; + /** Numeric value representing an image that displays the `iconPhrase`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ + iconCode?: number; + /** Indicates the presence or absence of precipitation. True indicates the presence of precipitation, false indicates the absence of precipitation. */ + hasPrecipitation?: boolean; + /** Indicates the time of the day. True indicates 'day',', false indicates 'night. */ + isDayTime?: boolean; + /** Temperature being returned. */ + temperature?: WeatherUnit; + /** RealFeel™ Temperature being returned. */ + realFeelTemperature?: WeatherUnit; + /** RealFeel™ Temperature being returned. Describes what the temperature really feels like in the shade. */ + realFeelTemperatureShade?: WeatherUnit; + /** Relative humidity is the amount of water vapor present in air expressed as a percentage of the amount needed for saturation at the same temperature. */ + relativeHumidity?: number; + /** The dewpoint temperature in specified unit. The dewpoint temperature is the temperature that the air must be cooled to in order to reach saturation. */ + dewPoint?: WeatherUnit; + /** Wind details being returned including speed and direction. */ + wind?: WindDetails; + /** Wind gust. Wind gust is a sudden, brief increase in speed of the wind. */ + windGust?: WindDetails; + /** + * Measure of the strength of the ultraviolet radiation from the sun. Supported values are: + * * `0-2` - Low danger from the sun's UV rays or the average person. + * * `3-5` - Moderate risk of harm from unprotected sun exposure. + * * `6-7` - High risk of harm from unprotected sun exposure. + * * `8-10` - Very high risk of harm from unprotected sun exposure. + * * `11+` - Extreme risk of harm from unprotected sun exposure. + */ + uvIndex?: number; + /** Phrase associated with the `uvIndex`. */ + uvIndexPhrase?: string; + /** Visibility in specified unit. A measure of the distance at which an object or light can be clearly discerned. */ + visibility?: WeatherUnit; + /** Cause of limited visibility. */ + obstructionsToVisibility?: string; + /** Percent representing cloud cover. */ + cloudCover?: number; + /** Cloud ceiling in specified unit. The ceiling is a measurement of the height of the base of the lowest clouds. */ + ceiling?: WeatherUnit; + /** Atmospheric pressure in specified unit. */ + pressure?: WeatherUnit; + /** Atmospheric pressure change. */ + pressureTendency?: PressureTendency; + /** Departure from the temperature observed 24 hours ago in specified unit. */ + past24HourTemperatureDeparture?: WeatherUnit; + /** Perceived outdoor temperature caused by the combination of air temperature, relative humidity, and wind speed in specified unit. */ + apparentTemperature?: WeatherUnit; + /** Perceived air temperature on exposed skin due to wind. */ + windChillTemperature?: WeatherUnit; + /** The temperature to which air may be cooled by evaporating water into it at constant pressure until it reaches saturation. */ + wetBulbTemperature?: WeatherUnit; + /** Summary of precipitation amounts over the past 24 hours. */ + precipitationSummary?: PrecipitationSummary; + /** Summary of temperature fluctuations over the past 6, 12, and 24 hours. */ + temperatureSummary?: TemperatureSummary; +} + +export interface PressureTendency { + /** Description of the pressure tendency in specified language */ + localizedDescription?: string; + /** Pressure tendency code regardless of language. One of F=Falling, S=Steady, R=Rising. */ + code?: string; +} + +export interface PrecipitationSummary { + /** The amount of precipitation (liquid equivalent) that has fallen in the past hour. */ + pastHour?: WeatherUnit; + /** The amount of precipitation (liquid equivalent) that has fallen in the past three hours. */ + past3Hours?: WeatherUnit; + /** The amount of precipitation (liquid equivalent) that has fallen in the past six hours. Contains Metric and Imperial Values. */ + past6Hours?: WeatherUnit; + /** The amount of precipitation (liquid equivalent) that has fallen in the past nine hours. */ + past9Hours?: WeatherUnit; + /** The amount of precipitation (liquid equivalent) that has fallen in the past 12 hours. */ + past12Hours?: WeatherUnit; + /** The amount of precipitation (liquid equivalent) that has fallen in the past 18 hours. */ + past18Hours?: WeatherUnit; + /** The amount of precipitation (liquid equivalent) that has fallen in the past 24 hours. */ + past24Hours?: WeatherUnit; +} + +export interface TemperatureSummary { + /** Summary of temperature fluctuations over the past 6 hours. */ + past6Hours?: TemperatureSummaryPast6Hours; + /** Summary of temperature fluctuations over the past 12 hours. */ + past12Hours?: TemperatureSummaryPast12Hours; + /** Summary of temperature fluctuations over the past 24 hours. */ + past24Hours?: TemperatureSummaryPast24Hours; +} + +/** Summary of temperature fluctuations over the past 6 hours. */ +export interface TemperatureSummaryPast6Hours { + /** minimum */ + minimum?: WeatherUnit; + /** maximum */ + maximum?: WeatherUnit; +} + +/** Summary of temperature fluctuations over the past 12 hours. */ +export interface TemperatureSummaryPast12Hours { + /** minimum */ + minimum?: WeatherUnit; + /** maximum */ + maximum?: WeatherUnit; +} + +/** Summary of temperature fluctuations over the past 24 hours. */ +export interface TemperatureSummaryPast24Hours { + /** minimum */ + minimum?: WeatherUnit; + /** maximum */ + maximum?: WeatherUnit; +} + +export interface DailyForecastResponse { + /** Summary for the main conditions for the requested time period. Notice that summary can cover only part of the time period. */ + summary?: DailyForecastSummary; + /** Forecast data for each requested day. */ + forecasts?: DailyForecast[]; +} + +/** Summary for the main conditions for the requested time period. Notice that summary can cover only part of the time period. */ +export interface DailyForecastSummary { + /** Date and time that the summary is in effect, displayed in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. */ + startDate?: string; + /** Date and time that the summary period ends, displayed in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. */ + endDate?: string; + /** severity */ + severity?: number; + /** Summary phrase of the daily forecast. Displayed in specified language. */ + phrase?: string; + /** one or 2 word(s) to summarize the phrase. */ + category?: string; +} + +export interface DailyForecast { + /** Date and time of the current observation displayed in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. */ + date?: string; + /** Temperature values for the day. */ + temperature?: WeatherUnitRange; + /** RealFeel™ Temperature being returned. */ + realFeelTemperature?: WeatherUnitRange; + /** RealFeel™ Temperature being returned. Describes what the temperature really feels like in the shade. */ + realFeelTemperatureShade?: WeatherUnitRange; + /** Hours of sun. */ + hoursOfSun?: number; + /** Summary of Heating Degree Day or Cooling Degree Day information */ + degreeDaySummary?: DegreeDaySummary; + /** airAndPollen */ + airAndPollen?: AirAndPollen[]; + /** Day */ + day?: DayOrNight; + /** Night */ + night?: DayOrNight; + /** Source(s) of the forecast data. */ + sources?: string[]; +} + +export interface DegreeDaySummary { + /** Number of degrees that the mean temperature is below 65 degrees F/ 18 degree C. */ + heating?: WeatherUnit; + /** Number of degrees that the mean temperature is above 65 degrees F/ 18 degree C. */ + cooling?: WeatherUnit; +} + +export interface AirAndPollen { + /** Name of the pollen or pollutant. For example, grass, mold, weed, air quality, tree and UV index. */ + name?: string; + /** Value of the given type above. Values associated with mold, grass, weed and tree are in units of parts per cubic meter. Both air quality and UV are indices, so they are unitless. */ + value?: number; + /** Category of the air quality or pollution type. For example, low, high, good, moderate, unhealthy, hazardous. */ + category?: string; + /** Value associated with the air quality or pollution category. These values range from 1 to 6. 1 implying good conditions, 6 implying hazardous conditions. */ + categoryValue?: number; + /** Only exists for air quality. Examples include ozone and particle pollution. */ + type?: string; +} + +export interface DayOrNight { + /** Numeric value representing an image that displays the `iconPhrase`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ + iconCode?: number; + /** Phrase description of the icon. Displayed in specified language. For example, 'Sunny'. */ + iconPhrase?: string; + /** Local weather data provider information. */ + localSource?: LocalSource; + /** Indicates the presence or absence of precipitation. True indicates the presence of precipitation, false indicates the absence of precipitation. */ + hasPrecipitation?: boolean; + /** Specifies the type of precipitation ("rain" "snow" "ice" or "mix"). If dbz = zero, precipitationType is not present in the response. */ + precipitationType?: string; + /** Description of the intensity. */ + precipitationIntensity?: string; + /** Phrase description of the forecast in specified language. Azure Maps attempts to keep this phrase under 30 characters in length, but some languages/weather events may result in a longer phrase length, exceeding 30 characters. */ + shortPhrase?: string; + /** Phrase description of the forecast in specified language. Azure Maps attempts to keep this phrase under 100 characters in length, but some languages/weather events may result in a longer phrase length, exceeding 100 characters. */ + longPhrase?: string; + /** Percent representing the probability of precipitation. For example, '20'. */ + precipitationProbability?: number; + /** Percent representing the probability of a thunderstorm. For example, '80'. */ + thunderstormProbability?: number; + /** Percent representing the probability of rain. For example, '40'. */ + rainProbability?: number; + /** Percent representing the probability of snow. For example, '30'. */ + snowProbability?: number; + /** Percent representing the probability of ice. For example, '30'. */ + iceProbability?: number; + /** Wind details being returned including speed and direction. */ + wind?: WindDetails; + /** Wind gust. Wind gust is a sudden, brief increase in speed of the wind. */ + windGust?: WindDetails; + /** Total liquid equivalent of precipitation during the forecast period. */ + totalLiquid?: WeatherUnit; + /** Rain */ + rain?: WeatherUnit; + /** Snow */ + snow?: WeatherUnit; + /** Ice */ + ice?: WeatherUnit; + /** Hours of precipitation */ + hoursOfPrecipitation?: number; + /** Hours of rain. */ + hoursOfRain?: number; + /** Hours of snow. */ + hoursOfSnow?: number; + /** Hours of ice. */ + hoursOfIce?: number; + /** Percent representing cloud cover. */ + cloudCover?: number; +} + +/** Local weather data provider information. */ +export interface LocalSource { + /** Numeric identifier, unique to the local data provider. */ + id?: number; + /** Name of the local data provider. Name is displayed in the language specified by language code in URL, if available. Otherwise, Name is displayed in English or the language in which the name was provided. */ + name?: string; + /** Weather code provided by the local data provider. This weather code allows the forecast to be matched to icons provided by the local data provider instead of Azure Maps icons. */ + weatherCode?: string; +} + +/** This object is returned from a successful Weather Along Route. */ +export interface WeatherAlongRouteResponse { + /** Short summary of the weather along the route. */ + summary?: WeatherAlongRouteSummary; + /** Data for each waypoint returned in the same order as specified in the request. */ + waypoints?: WeatherWaypoint[]; +} + +/** Short summary of the weather along the route. */ +export interface WeatherAlongRouteSummary { + /** Numeric value representing an image that displays the `iconPhrase`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ + iconCode?: number; + /** Description of the weather hazard affecting the trip. */ + hazards?: WeatherHazards; +} + +/** Description of the weather hazard affecting the trip. */ +export interface WeatherHazards { + /** + * A severity/hazard index. + * * `0` - No hazard. + * * `1` - Be informed, be aware. + * * `2` - Pay attention, be prepared. + * * `3` - Take action. + * * `4` - Life threatening, emergency. + */ + maxHazardIndex?: number; + /** Details of the weather hazards affecting the trip. */ + hazardDetails?: HazardDetail[]; +} + +export interface HazardDetail { + /** + * A severity/hazard index. + * * `0` - No hazard. + * * `1` - Be informed, be aware. + * * `2` - Pay attention, be prepared. + * * `3` - Take action. + * * `4` - Life threatening, emergency. + */ + hazardIndex?: number; + /** A unique identifier (non-displayable) for each type of hazard: LightRain, ModerateRain, HeavyRain, LightMix, ModerateMix, HeavyMix, LightSnow, ModerateSnow, HeavySnow, LightIce, ModerateIce, HeavyIce, Hail, LargeHail, SunGlare, SunGlareHigh, Lightning, SevereLightning, WindModerate, WindHigh, WindExtreme, FloodWarning, FlashFloodWarning, TornadoWarning, TsunamiWarning, SevereThunderstormWarning. */ + hazardCode?: string; + /** A displayable short phrase describing the forecasted conditions and precipitation intensity/type. */ + shortPhrase?: string; +} + +export interface WeatherWaypoint { + /** Numeric value representing an image that displays the `iconPhrase`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ + iconCode?: number; + /** A displayable short phrase describing the forecasted conditions and precipitation intensity/type. */ + shortPhrase?: string; + /** Indicates the time of the day. True indicates 'day',', false indicates 'night. */ + isDayTime?: boolean; + /** Percent representing cloud cover. */ + cloudCover?: number; + /** Specific value of a given unit related to weather. */ + temperature?: WeatherUnit; + /** Wind details being returned including speed and direction. */ + wind?: WindDetails; + /** Wind details being returned including speed and direction. */ + windGust?: WindDetails; + /** Precipitation forecast of the weather along the route. */ + precipitation?: WeatherAlongRoutePrecipitation; + /** Estimation of thunderstorm intensity on an open scale. A value of 0 means there is no thunderstorm; values of 1 and higher mean there is a thunderstorm in increasing intensity. */ + lightningCount?: number; + /** A rating that indicates how blinding the sun is for the driver. */ + sunGlare?: SunGlare; + /** Description of the weather hazard affecting the trip. */ + hazards?: WeatherHazards; + /** List of weather hazard notifications. */ + notifications?: WeatherNotification[]; +} + +/** Precipitation forecast of the weather along the route. */ +export interface WeatherAlongRoutePrecipitation { + /** The forecasted precipitation intensity in dBZ (decibels relative to Z) from 0.0 to 100.0. */ + dbz?: number; + /** Precipitation type. If precipitation should occur, the type that it will be: "RAIN," "HAIL," "SNOW," "ICE," or "MIX." */ + type?: string; +} + +/** A rating that indicates how blinding the sun is for the driver. */ +export interface SunGlare { + /** If the vehicle heading value is not provided for a waypoint, then the service will calculate a heading based upon the location of neighboring waypoints if provided. */ + calculatedVehicleHeading?: number; + /** An index from 0 to 100 indicating sun glare intensity for a driver. A value of 50 and above can be considered a hazard for some drivers and a value of 100 signifies the driver is driving straight into the sun and atmospheric conditions are clear allowing for the full intensity of the sun to blind the driver. */ + glareIndex?: number; +} + +export interface WeatherNotification { + /** A type of notification generated to warn drivers of the onset of a hazard, or increase in intensity of a hazard. */ + type?: string; + /** + * A severity/hazard index. + * * `0` - No hazard. + * * `1` - Be informed, be aware. + * * `2` - Pay attention, be prepared. + * * `3` - Take action. + * * `4` - Life threatening, emergency. + */ + hazardIndex?: number; + /** A unique identifier (non-displayable) for each type of hazard: LightRain, ModerateRain, HeavyRain, LightMix, ModerateMix, HeavyMix, LightSnow, ModerateSnow, HeavySnow, LightIce, ModerateIce, HeavyIce, Hail, LargeHail, SunGlare, SunGlareHigh, Lightning, SevereLightning, WindModerate, WindHigh, WindExtreme, FloodWarning, FlashFloodWarning, TornadoWarning, TsunamiWarning, SevereThunderstormWarning. */ + hazardCode?: string; + /** A displayable short phrase describing the forecasted conditions and precipitation intensity/type. */ + shortPhrase?: string; +} + +/** This object is returned from a successful Get Severe Weather Alerts call. */ +export interface SevereWeatherAlertsResponse { + /** A list of all severe weather alerts for the queried location. */ + results?: SevereWeatherAlert[]; +} + +/** Information about a severe weather alert. */ +export interface SevereWeatherAlert { + /** 2-character ISO 3166-1 Alpha-2 country code, for example, "US". */ + countryCode?: string; + /** A unique numerical identifier for a weather alert. */ + alertId?: number; + /** Description of the alert. */ + description?: SevereWeatherAlertDescription; + /** Category of the alert. */ + category?: string; + /** Number signifying the importance or ranking order of the given alert within the country/region it has originated. A lower number signifies a higher priority. For example, 1 is the highest priority. The number varies by country/region and can change over time as each country/region evolves their alert systems. */ + priority?: number; + /** Classification of the alert. This field is not available for all countries and therefore not always returned. */ + class?: string; + /** Severity level of the alert. This field is not available for all countries and therefore not always returned. */ + level?: string; + /** The provider of the alert information. By default the source is returned in English (en-US). The alerts are from official Government Meteorological Agencies and leading global weather alert providers. */ + source?: string; + /** A numerical identifier associated with the source provider name of the alert data. */ + sourceId?: number; + /** A disclaimer regarding the source of the alert information. This field is not always available. For example, disclaimer may include details about the delays or potential issues related to the alarm. */ + disclaimer?: string; + /** Information about the alert specific to the affected area(s). */ + alertAreas?: AlertArea[]; +} + +/** Description of a severe weather alert. */ +export interface SevereWeatherAlertDescription { + /** Description of the alert in the specified language. By default English (en-US) is returned if the language parameter is not specified in the request. */ + localized?: string; + /** Description of the alert in English (en-US). */ + english?: string; +} + +/** Information about a severe weather alert issued within an affected area(s). If multiple alerts are active for the same location, the alerts will be returned in order of `priority` within the API response, with the highest priority alert being returned at the top of the response. */ +export interface AlertArea { + /** The name of an area which is affected by the alert. The location that was requested falls under the alert area. */ + name?: string; + /** Text summarizing the alert in the returned area. */ + summary?: string; + /** The start date and time of the alert in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. If the alert crosses multiple time zones the returned time in the response is the local time to the requested coordinate location. */ + startTime?: string; + /** The end date and time of the alert in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. If the alert crosses multiple time zones the returned time in the response is the local time to the requested coordinate location. */ + endTime?: string; + /** The latest status of the alert in the current area. */ + latestStatus?: LatestStatus; + /** Full details associated with the alert. Returned if `details`=True. This field is always returned in the language(s) of choice by the issuing provider and Azure Maps only returns what is created by the provider. Please note, some countries/regions may offer their native language and English. Language parameter won’t apply to this field. */ + alertDetails?: string; + /** Language of the `alertDetails`. This field helps to point out that the language of the `alertDetails` may differ from the requested language parameter. Returned if `details`=True. Language code has been derived from the ISO 639-1 Alpha-2 codes. */ + alertDetailsLanguageCode?: string; +} + +/** The latest status on the alert in the current area. */ +export interface LatestStatus { + /** The latest status keyword for the alert, in the specified language. By default, returned in English (en-US). */ + localized?: string; + /** Latest status keyword for the alert, in English (en-US). */ + english?: LatestStatusKeyword; +} + +/** This object is returned from a successful Get Daily Indices call. */ +export interface DailyIndicesResponse { + /** A list of all daily indices for the queried location. */ + results?: DailyIndex[]; +} + +/** Information about a daily index. */ +export interface DailyIndex { + /** Name of the index, for example, "Construction", "Outdoor Activity", "Flight Delays". */ + indexName?: string; + /** Numeric ID used to identify the specific index. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details and to see the supported index IDs. For example, the index ID can support UI visualization scenarios. */ + indexId?: number; + /** Date and time of the current observation displayed in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. */ + dateTime?: string; + /** Index value. Ranges from 0.0 to 10.0. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details and to see the supported ranges. */ + value?: number; + /** Textual description for `categoryValue` corresponding to the level that the index value falls under, for example "Very Good". */ + category?: string; + /** Level that the index value falls under, represented by an integer. This value can be 1 through 5 and should be used in combination with the `ascending` flag because it can differ among indices. For example, the following values apply for Mosquito Activity: Low=1, Moderate=2, High=3, Very High=4, and Extreme=5. */ + categoryValue?: number; + /** Describes the direction of the `value` and `categoryValue`. For example, when `ascending`=True, the poorest index value is 0 and the best index value is 10. When `ascending`=True, the poorest index value is 10 and the best index value is 0. */ + ascending?: boolean; + /** A textual explanation that can be used for display purposes to summarize the index value and category. For example, when the index value for Flight Delays is very good, the description will be "Conditions are excellent for flying!". */ + description?: string; +} + +/** Known values of {@link Geography} that the service accepts. */ +export const enum KnownGeography { + Us = "us", + Eu = "eu" +} + +/** + * Defines values for Geography. \ + * {@link KnownGeography} can be used interchangeably with Geography, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **us** \ + * **eu** + */ +export type Geography = string; + +/** Known values of {@link ResponseFormat} that the service accepts. */ +export const enum KnownResponseFormat { + /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ + Json = "json" +} + +/** + * Defines values for ResponseFormat. \ + * {@link KnownResponseFormat} can be used interchangeably with ResponseFormat, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) + */ +export type ResponseFormat = string; + +/** Known values of {@link WeatherDataUnit} that the service accepts. */ +export const enum KnownWeatherDataUnit { + /** Return data in metric units. Some example units of metric system are Celsius and kilometer. */ + Metric = "metric", + /** Return data in imperial units. Some example units of imperial system are Fahrenheit and mile. */ + Imperial = "imperial" +} + +/** + * Defines values for WeatherDataUnit. \ + * {@link KnownWeatherDataUnit} can be used interchangeably with WeatherDataUnit, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **metric**: Return data in metric units. Some example units of metric system are Celsius and kilometer. \ + * **imperial**: Return data in imperial units. Some example units of imperial system are Fahrenheit and mile. + */ +export type WeatherDataUnit = string; + +/** Known values of {@link DayQuarter} that the service accepts. */ +export const enum KnownDayQuarter { + /** 7:00 am - 1:00 pm / 7:00- 13:00 */ + Zero = 0, + /** 1:00 pm - 7:00 pm/ 13:00- 19:00 */ + One = 1, + /** 7:00 pm - 1:00 am/ 19:00 - 01:00 */ + Two = 2, + /** 1:00 am - 7:00 am/ 01:00 - 07:00 */ + Three = 3 +} + +/** + * Defines values for DayQuarter. \ + * {@link KnownDayQuarter} can be used interchangeably with DayQuarter, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **0**: 7:00 am - 1:00 pm \/ 7:00- 13:00 \ + * **1**: 1:00 pm - 7:00 pm\/ 13:00- 19:00 \ + * **2**: 7:00 pm - 1:00 am\/ 19:00 - 01:00 \ + * **3**: 1:00 am - 7:00 am\/ 01:00 - 07:00 + */ +export type DayQuarter = number; + +/** Known values of {@link LatestStatusKeyword} that the service accepts. */ +export const enum KnownLatestStatusKeyword { + /** "New" - the status of an alert upon initial issuance. */ + New = "New", + /** "Extend" - the alert has been extended in time, in area, or both since its initial issuance. */ + Extend = "Extend", + /** "Cancel" - the alert has been canceled prior to its original expiration time. */ + Cancel = "Cancel", + /** "Correct" - the alert has been modified to correct a previous error. */ + Correct = "Correct", + /** "Expire" - the alert has expired and is no longer active. */ + Expire = "Expire", + /** "Upgrade" - the alert has been upgraded to a higher class or category since its initial issuance. */ + Upgrade = "Upgrade", + /** "Continue" - the alert has been updated since its initial issuance, but no changes were made to `alertAreas`, `startTime`, `endTime`, or `class`. */ + Continue = "Continue", + /** "Update" - the alert has been updated since its initial issuance. */ + Update = "Update" +} + +/** + * Defines values for LatestStatusKeyword. \ + * {@link KnownLatestStatusKeyword} can be used interchangeably with LatestStatusKeyword, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **New**: "New" - the status of an alert upon initial issuance. \ + * **Extend**: "Extend" - the alert has been extended in time, in area, or both since its initial issuance. \ + * **Cancel**: "Cancel" - the alert has been canceled prior to its original expiration time. \ + * **Correct**: "Correct" - the alert has been modified to correct a previous error. \ + * **Expire**: "Expire" - the alert has expired and is no longer active. \ + * **Upgrade**: "Upgrade" - the alert has been upgraded to a higher class or category since its initial issuance. \ + * **Continue**: "Continue" - the alert has been updated since its initial issuance, but no changes were made to `alertAreas`, `startTime`, `endTime`, or `class`. \ + * **Update**: "Update" - the alert has been updated since its initial issuance. + */ +export type LatestStatusKeyword = string; + +/** Known values of {@link GeographicResourceLocation} that the service accepts. */ +export const enum KnownGeographicResourceLocation { + /** Used to access an Azure Maps Creator resource in the United States */ + Us = "us", + /** Used to access an Azure Maps Creator resource in Europe */ + Eu = "eu" +} + +/** + * Defines values for GeographicResourceLocation. \ + * {@link KnownGeographicResourceLocation} can be used interchangeably with GeographicResourceLocation, + * this enum contains the known values that the service supports. + * ### Known values supported by the service + * **us**: Used to access an Azure Maps Creator resource in the United States \ + * **eu**: Used to access an Azure Maps Creator resource in Europe + */ +export type GeographicResourceLocation = string; + +/** Optional parameters. */ +export interface WeatherGetHourlyForecastOptionalParams + extends coreClient.OperationOptions { + /** Specifies to return the data in either metric units or imperial units. Default value is metric. */ + unit?: WeatherDataUnit; + /** + * Time frame of the returned weather forecast. By default, the forecast data for next hour will be returned. Available values are + * * `1` - Return forecast data for the next hour. Default value. + * * `12` - Return hourly forecast for next 12 hours. + * * `24` - Return hourly forecast for next 24 hours. + * * `72` - Return hourly forecast for next 72 hours (3 days). + * * `120` - Return hourly forecast for next 120 hours (5 days). Only available in S1 SKU. + * * `240` - Return hourly forecast for next 240 hours (10 days). Only available in S1 SKU. + */ + duration?: number; + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. Default value is en-us. + * + * Please refer to [Supported languages](https://docs.microsoft.com/azure/azure-maps/supported-languages) for details. + */ + language?: string; +} + +/** Contains response data for the getHourlyForecast operation. */ +export type WeatherGetHourlyForecastResponse = HourlyForecastResponse; + +/** Optional parameters. */ +export interface WeatherGetMinuteForecastOptionalParams + extends coreClient.OperationOptions { + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. Default value is en-us. + * + * Please refer to [Supported languages](https://docs.microsoft.com/azure/azure-maps/supported-languages) for details. + */ + language?: string; + /** + * Specifies time interval in minutes for the returned weather forecast. Supported values are + * * `1` - Retrieve forecast for 1-minute intervals. Returned by default. + * * `5` - Retrieve forecasts for 5-minute intervals. + * * `15` - Retrieve forecasts for 15-minute intervals. + */ + interval?: number; +} + +/** Contains response data for the getMinuteForecast operation. */ +export type WeatherGetMinuteForecastResponse = MinuteForecastResponse; + +/** Optional parameters. */ +export interface WeatherGetQuarterDayForecastOptionalParams + extends coreClient.OperationOptions { + /** Specifies to return the data in either metric units or imperial units. Default value is metric. */ + unit?: WeatherDataUnit; + /** + * Specifies for how many days the quester-day forecast responses are returned. Supported values are: + * * `1` - Return forecast data for the next day. Returned by default. + * * `5` - Return forecast data for the next 5 days. + * * `10` - Return forecast data for next 10 days. + * * `15` - Return forecast data for the next 15 days. + */ + duration?: number; + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. Default value is en-us. + * + * Please refer to [Supported languages](https://docs.microsoft.com/azure/azure-maps/supported-languages) for details. + */ + language?: string; +} + +/** Contains response data for the getQuarterDayForecast operation. */ +export type WeatherGetQuarterDayForecastResponse = QuarterDayForecastResponse; + +/** Optional parameters. */ +export interface WeatherGetCurrentConditionsOptionalParams + extends coreClient.OperationOptions { + /** Specifies to return the data in either metric units or imperial units. Default value is metric. */ + unit?: WeatherDataUnit; + /** + * Time frame of the returned weather conditions. By default, the most current weather conditions will be returned. Default value is 0. Supported values are: + * * `0` - Return the most current weather conditions. + * * `6` - Return weather conditions from past 6 hours. + * * `24` - Return weather conditions from past 24 hours. + */ + duration?: number; + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. Default value is en-us. + * + * Please refer to [Supported languages](https://docs.microsoft.com/azure/azure-maps/supported-languages) for details. + */ + language?: string; + /** + * Return full details for the current conditions. Available values are + * * `true` - Returns full details. By default all details are returned. + * * `false` - Returns a truncated version of the current condition data, which includes observation date time, weather phrase, icon code, precipitation indicator flag, and temperature. + */ + details?: string; +} + +/** Contains response data for the getCurrentConditions operation. */ +export type WeatherGetCurrentConditionsResponse = CurrentConditionsResponse; + +/** Optional parameters. */ +export interface WeatherGetDailyForecastOptionalParams + extends coreClient.OperationOptions { + /** Specifies to return the data in either metric units or imperial units. Default value is metric. */ + unit?: WeatherDataUnit; + /** + * Specifies for how many days the daily forecast responses are returned. Available values are + * * `1` - Return forecast data for the next day. Returned by default. + * * `5` - Return forecast data for the next 5 days. + * * `10` - Return forecast data for the next 10 days. + * * `25` - Return forecast data for the next 25 days. Only available in S1 SKU. + * * `45` - Return forecast data for the next 45 days. Only available in S1 SKU. + */ + duration?: number; + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. Default value is en-us. + * + * Please refer to [Supported languages](https://docs.microsoft.com/azure/azure-maps/supported-languages) for details. + */ + language?: string; +} + +/** Contains response data for the getDailyForecast operation. */ +export type WeatherGetDailyForecastResponse = DailyForecastResponse; + +/** Optional parameters. */ +export interface WeatherGetWeatherAlongRouteOptionalParams + extends coreClient.OperationOptions { + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. Default value is en-us. + * + * Please refer to [Supported languages](https://docs.microsoft.com/azure/azure-maps/supported-languages) for details. + */ + language?: string; +} + +/** Contains response data for the getWeatherAlongRoute operation. */ +export type WeatherGetWeatherAlongRouteResponse = WeatherAlongRouteResponse; + +/** Optional parameters. */ +export interface WeatherGetSevereWeatherAlertsOptionalParams + extends coreClient.OperationOptions { + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. Default value is en-us. + * + * Please refer to [Supported languages](https://docs.microsoft.com/azure/azure-maps/supported-languages) for details. + */ + language?: string; + /** + * Return full details for the severe weather alerts. Available values are + * * `true` - Returns full details. By default all details are returned. + * * `false` - Returns a truncated version of the alerts data, which excludes the area-specific full description of alert details (`alertDetails`). + */ + details?: string; +} + +/** Contains response data for the getSevereWeatherAlerts operation. */ +export type WeatherGetSevereWeatherAlertsResponse = SevereWeatherAlertsResponse; + +/** Optional parameters. */ +export interface WeatherGetDailyIndicesOptionalParams + extends coreClient.OperationOptions { + /** + * Specifies for how many days the daily indices are returned. By default, the indices data for the current day will be returned. When requesting future indices data, the current day is included in the response as day 1. Available values are + * * `1` - Return daily index data for the current day. Default value. + * * `5` - Return 5 days of daily index data starting from the current day. + * * `10` - Return 10 days of daily index data starting from the current day. + * * `15` - Return 15 days of daily index data starting from the current day. + */ + duration?: number; + /** + * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. Default value is en-us. + * + * Please refer to [Supported languages](https://docs.microsoft.com/azure/azure-maps/supported-languages) for details. + */ + language?: string; + /** Numeric index identifier that can be used for restricting returned results to the corresponding index type. Cannot be paired with `indexGroupId`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details and to see the supported indices. */ + indexId?: number; + /** Numeric index group identifier that can be used for restricting returned results to the corresponding subset of indices (index group). Cannot be paired with `indexId`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details and to see the supported index groups. */ + indexGroupId?: number; +} + +/** Contains response data for the getDailyIndices operation. */ +export type WeatherGetDailyIndicesResponse = DailyIndicesResponse; + +/** Optional parameters. */ +export interface WeatherClientOptionalParams + extends coreClient.ServiceClientOptions { + /** This parameter specifies where the Azure Maps Creator resource is located. Valid values are us and eu. */ + geography?: Geography; + /** Specifies which account is intended for usage in conjunction with the Azure AD security model. It represents a unique ID for the Azure Maps account and can be retrieved from the Azure Maps management plane Account API. To use Azure AD security in Azure Maps see the following [articles](https://aka.ms/amauthdetails) for guidance. */ + xMsClientId?: string; + /** Api Version */ + apiVersion?: string; + /** Overrides client endpoint. */ + endpoint?: string; +} diff --git a/sdk/maps/maps-weather/src/models/mappers.ts b/sdk/maps/maps-weather/src/models/mappers.ts new file mode 100644 index 000000000000..91d890d2e846 --- /dev/null +++ b/sdk/maps/maps-weather/src/models/mappers.ts @@ -0,0 +1,2159 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; + +export const HourlyForecastResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "HourlyForecastResponse", + modelProperties: { + forecasts: { + serializedName: "forecasts", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "HourlyForecast" + } + } + } + } + } + } +}; + +export const HourlyForecast: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "HourlyForecast", + modelProperties: { + date: { + serializedName: "date", + type: { + name: "String" + } + }, + iconCode: { + serializedName: "iconCode", + type: { + name: "Number" + } + }, + iconPhrase: { + serializedName: "iconPhrase", + type: { + name: "String" + } + }, + hasPrecipitation: { + serializedName: "hasPrecipitation", + type: { + name: "Boolean" + } + }, + isDaylight: { + serializedName: "isDaylight", + type: { + name: "Boolean" + } + }, + temperature: { + serializedName: "temperature", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + realFeelTemperature: { + serializedName: "realFeelTemperature", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + wetBulbTemperature: { + serializedName: "wetBulbTemperature", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + dewPoint: { + serializedName: "dewPoint", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + wind: { + serializedName: "wind", + type: { + name: "Composite", + className: "WindDetails" + } + }, + windGust: { + serializedName: "windGust", + type: { + name: "Composite", + className: "WindDetails" + } + }, + relativeHumidity: { + serializedName: "relativeHumidity", + type: { + name: "Number" + } + }, + visibility: { + serializedName: "visibility", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + ceiling: { + serializedName: "ceiling", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + uvIndex: { + serializedName: "uvIndex", + type: { + name: "Number" + } + }, + uvIndexPhrase: { + serializedName: "uvIndexPhrase", + type: { + name: "String" + } + }, + precipitationProbability: { + serializedName: "precipitationProbability", + type: { + name: "Number" + } + }, + rainProbability: { + serializedName: "rainProbability", + type: { + name: "Number" + } + }, + snowProbability: { + serializedName: "snowProbability", + type: { + name: "Number" + } + }, + iceProbability: { + serializedName: "iceProbability", + type: { + name: "Number" + } + }, + totalLiquid: { + serializedName: "totalLiquid", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + rain: { + serializedName: "rain", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + snow: { + serializedName: "snow", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + ice: { + serializedName: "ice", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + cloudCover: { + serializedName: "cloudCover", + type: { + name: "Number" + } + } + } + } +}; + +export const WeatherUnit: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "WeatherUnit", + modelProperties: { + value: { + serializedName: "value", + type: { + name: "Number" + } + }, + unit: { + serializedName: "unit", + type: { + name: "String" + } + }, + unitType: { + serializedName: "unitType", + type: { + name: "Number" + } + } + } + } +}; + +export const WindDetails: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "WindDetails", + modelProperties: { + direction: { + serializedName: "direction", + type: { + name: "Composite", + className: "WindDirection" + } + }, + speed: { + serializedName: "speed", + type: { + name: "Composite", + className: "WindSpeed" + } + } + } + } +}; + +export const WindDirection: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "WindDirection", + modelProperties: { + degrees: { + serializedName: "degrees", + type: { + name: "Number" + } + }, + localizedDescription: { + serializedName: "localizedDescription", + type: { + name: "String" + } + } + } + } +}; + +export const WindSpeed: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "WindSpeed", + modelProperties: { + value: { + serializedName: "value", + type: { + name: "Number" + } + }, + unit: { + serializedName: "unit", + type: { + name: "String" + } + }, + unitType: { + serializedName: "unitType", + type: { + name: "Number" + } + } + } + } +}; + +export const ErrorResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorResponse", + modelProperties: { + error: { + serializedName: "error", + type: { + name: "Composite", + className: "ErrorDetail" + } + } + } + } +}; + +export const ErrorDetail: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorDetail", + modelProperties: { + code: { + serializedName: "code", + readOnly: true, + type: { + name: "String" + } + }, + message: { + serializedName: "message", + readOnly: true, + type: { + name: "String" + } + }, + target: { + serializedName: "target", + readOnly: true, + type: { + name: "String" + } + }, + details: { + serializedName: "details", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ErrorDetail" + } + } + } + }, + additionalInfo: { + serializedName: "additionalInfo", + readOnly: true, + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ErrorAdditionalInfo" + } + } + } + } + } + } +}; + +export const ErrorAdditionalInfo: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ErrorAdditionalInfo", + modelProperties: { + type: { + serializedName: "type", + readOnly: true, + type: { + name: "String" + } + }, + info: { + serializedName: "info", + readOnly: true, + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } + } + } +}; + +export const MinuteForecastResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "MinuteForecastResponse", + modelProperties: { + summary: { + serializedName: "summary", + type: { + name: "Composite", + className: "MinuteForecastSummary" + } + }, + intervalSummaries: { + serializedName: "intervalSummaries", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "IntervalSummary" + } + } + } + }, + intervals: { + serializedName: "intervals", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ForecastInterval" + } + } + } + } + } + } +}; + +export const MinuteForecastSummary: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "MinuteForecastSummary", + modelProperties: { + briefPhrase60: { + serializedName: "briefPhrase60", + type: { + name: "String" + } + }, + shortPhrase: { + serializedName: "shortPhrase", + type: { + name: "String" + } + }, + briefPhrase: { + serializedName: "briefPhrase", + type: { + name: "String" + } + }, + longPhrase: { + serializedName: "longPhrase", + type: { + name: "String" + } + }, + iconCode: { + serializedName: "iconCode", + type: { + name: "Number" + } + } + } + } +}; + +export const IntervalSummary: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "IntervalSummary", + modelProperties: { + startMinute: { + serializedName: "startMinute", + type: { + name: "Number" + } + }, + endMinute: { + serializedName: "endMinute", + type: { + name: "Number" + } + }, + totalMinutes: { + serializedName: "totalMinutes", + type: { + name: "Number" + } + }, + shortPhrase: { + serializedName: "shortPhrase", + type: { + name: "String" + } + }, + briefPhrase: { + serializedName: "briefPhrase", + type: { + name: "String" + } + }, + longPhrase: { + serializedName: "longPhrase", + type: { + name: "String" + } + }, + iconCode: { + serializedName: "iconCode", + type: { + name: "Number" + } + } + } + } +}; + +export const ForecastInterval: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ForecastInterval", + modelProperties: { + startTime: { + serializedName: "startTime", + type: { + name: "String" + } + }, + minute: { + serializedName: "minute", + type: { + name: "Number" + } + }, + dbz: { + serializedName: "dbz", + type: { + name: "Number" + } + }, + shortPhrase: { + serializedName: "shortPhrase", + type: { + name: "String" + } + }, + threshold: { + serializedName: "threshold", + type: { + name: "String" + } + }, + color: { + serializedName: "color", + type: { + name: "Composite", + className: "ColorValue" + } + }, + simplifiedColor: { + serializedName: "simplifiedColor", + type: { + name: "Composite", + className: "ColorValue" + } + }, + precipitationType: { + serializedName: "precipitationType", + type: { + name: "String" + } + }, + iconCode: { + serializedName: "iconCode", + type: { + name: "Number" + } + }, + cloudCover: { + serializedName: "cloudCover", + type: { + name: "Number" + } + } + } + } +}; + +export const ColorValue: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "ColorValue", + modelProperties: { + red: { + serializedName: "red", + type: { + name: "Number" + } + }, + green: { + serializedName: "green", + type: { + name: "Number" + } + }, + blue: { + serializedName: "blue", + type: { + name: "Number" + } + }, + hex: { + serializedName: "hex", + type: { + name: "String" + } + } + } + } +}; + +export const QuarterDayForecastResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "QuarterDayForecastResponse", + modelProperties: { + forecasts: { + serializedName: "forecasts", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "QuarterDayForecast" + } + } + } + } + } + } +}; + +export const QuarterDayForecast: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "QuarterDayForecast", + modelProperties: { + date: { + serializedName: "date", + type: { + name: "String" + } + }, + effectiveDate: { + serializedName: "effectiveDate", + type: { + name: "String" + } + }, + quarter: { + serializedName: "quarter", + type: { + name: "Number" + } + }, + iconCode: { + serializedName: "iconCode", + type: { + name: "Number" + } + }, + iconPhrase: { + serializedName: "iconPhrase", + type: { + name: "String" + } + }, + phrase: { + serializedName: "phrase", + type: { + name: "String" + } + }, + temperature: { + serializedName: "temperature", + type: { + name: "Composite", + className: "WeatherUnitRange" + } + }, + realFeelTemperature: { + serializedName: "realFeelTemperature", + type: { + name: "Composite", + className: "WeatherUnitRange" + } + }, + dewPoint: { + serializedName: "dewPoint", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + relativeHumidity: { + serializedName: "relativeHumidity", + type: { + name: "Number" + } + }, + wind: { + serializedName: "wind", + type: { + name: "Composite", + className: "WindDetails" + } + }, + windGust: { + serializedName: "windGust", + type: { + name: "Composite", + className: "WindDetails" + } + }, + visibility: { + serializedName: "visibility", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + cloudCover: { + serializedName: "cloudCover", + type: { + name: "Number" + } + }, + hasPrecipitation: { + serializedName: "hasPrecipitation", + type: { + name: "Boolean" + } + }, + precipitationType: { + serializedName: "precipitationType", + type: { + name: "String" + } + }, + precipitationIntensity: { + serializedName: "precipitationIntensity", + type: { + name: "String" + } + }, + precipitationProbability: { + serializedName: "precipitationProbability", + type: { + name: "Number" + } + }, + thunderstormProbability: { + serializedName: "thunderstormProbability", + type: { + name: "Number" + } + }, + totalLiquid: { + serializedName: "totalLiquid", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + rain: { + serializedName: "rain", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + snow: { + serializedName: "snow", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + ice: { + serializedName: "ice", + type: { + name: "Composite", + className: "WeatherUnit" + } + } + } + } +}; + +export const WeatherUnitRange: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "WeatherUnitRange", + modelProperties: { + minimum: { + serializedName: "minimum", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + maximum: { + serializedName: "maximum", + type: { + name: "Composite", + className: "WeatherUnit" + } + } + } + } +}; + +export const CurrentConditionsResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "CurrentConditionsResponse", + modelProperties: { + results: { + serializedName: "results", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "CurrentConditions" + } + } + } + } + } + } +}; + +export const CurrentConditions: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "CurrentConditions", + modelProperties: { + dateTime: { + serializedName: "dateTime", + type: { + name: "String" + } + }, + phrase: { + serializedName: "phrase", + type: { + name: "String" + } + }, + iconCode: { + serializedName: "iconCode", + type: { + name: "Number" + } + }, + hasPrecipitation: { + serializedName: "hasPrecipitation", + type: { + name: "Boolean" + } + }, + isDayTime: { + serializedName: "isDayTime", + type: { + name: "Boolean" + } + }, + temperature: { + serializedName: "temperature", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + realFeelTemperature: { + serializedName: "realFeelTemperature", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + realFeelTemperatureShade: { + serializedName: "realFeelTemperatureShade", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + relativeHumidity: { + serializedName: "relativeHumidity", + type: { + name: "Number" + } + }, + dewPoint: { + serializedName: "dewPoint", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + wind: { + serializedName: "wind", + type: { + name: "Composite", + className: "WindDetails" + } + }, + windGust: { + serializedName: "windGust", + type: { + name: "Composite", + className: "WindDetails" + } + }, + uvIndex: { + serializedName: "uvIndex", + type: { + name: "Number" + } + }, + uvIndexPhrase: { + serializedName: "uvIndexPhrase", + type: { + name: "String" + } + }, + visibility: { + serializedName: "visibility", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + obstructionsToVisibility: { + serializedName: "obstructionsToVisibility", + type: { + name: "String" + } + }, + cloudCover: { + serializedName: "cloudCover", + type: { + name: "Number" + } + }, + ceiling: { + serializedName: "ceiling", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + pressure: { + serializedName: "pressure", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + pressureTendency: { + serializedName: "pressureTendency", + type: { + name: "Composite", + className: "PressureTendency" + } + }, + past24HourTemperatureDeparture: { + serializedName: "past24HourTemperatureDeparture", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + apparentTemperature: { + serializedName: "apparentTemperature", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + windChillTemperature: { + serializedName: "windChillTemperature", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + wetBulbTemperature: { + serializedName: "wetBulbTemperature", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + precipitationSummary: { + serializedName: "precipitationSummary", + type: { + name: "Composite", + className: "PrecipitationSummary" + } + }, + temperatureSummary: { + serializedName: "temperatureSummary", + type: { + name: "Composite", + className: "TemperatureSummary" + } + } + } + } +}; + +export const PressureTendency: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "PressureTendency", + modelProperties: { + localizedDescription: { + serializedName: "localizedDescription", + type: { + name: "String" + } + }, + code: { + serializedName: "code", + type: { + name: "String" + } + } + } + } +}; + +export const PrecipitationSummary: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "PrecipitationSummary", + modelProperties: { + pastHour: { + serializedName: "pastHour", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + past3Hours: { + serializedName: "past3Hours", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + past6Hours: { + serializedName: "past6Hours", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + past9Hours: { + serializedName: "past9Hours", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + past12Hours: { + serializedName: "past12Hours", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + past18Hours: { + serializedName: "past18Hours", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + past24Hours: { + serializedName: "past24Hours", + type: { + name: "Composite", + className: "WeatherUnit" + } + } + } + } +}; + +export const TemperatureSummary: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TemperatureSummary", + modelProperties: { + past6Hours: { + serializedName: "past6Hours", + type: { + name: "Composite", + className: "TemperatureSummaryPast6Hours" + } + }, + past12Hours: { + serializedName: "past12Hours", + type: { + name: "Composite", + className: "TemperatureSummaryPast12Hours" + } + }, + past24Hours: { + serializedName: "past24Hours", + type: { + name: "Composite", + className: "TemperatureSummaryPast24Hours" + } + } + } + } +}; + +export const TemperatureSummaryPast6Hours: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TemperatureSummaryPast6Hours", + modelProperties: { + minimum: { + serializedName: "minimum", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + maximum: { + serializedName: "maximum", + type: { + name: "Composite", + className: "WeatherUnit" + } + } + } + } +}; + +export const TemperatureSummaryPast12Hours: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TemperatureSummaryPast12Hours", + modelProperties: { + minimum: { + serializedName: "minimum", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + maximum: { + serializedName: "maximum", + type: { + name: "Composite", + className: "WeatherUnit" + } + } + } + } +}; + +export const TemperatureSummaryPast24Hours: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "TemperatureSummaryPast24Hours", + modelProperties: { + minimum: { + serializedName: "minimum", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + maximum: { + serializedName: "maximum", + type: { + name: "Composite", + className: "WeatherUnit" + } + } + } + } +}; + +export const DailyForecastResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "DailyForecastResponse", + modelProperties: { + summary: { + serializedName: "summary", + type: { + name: "Composite", + className: "DailyForecastSummary" + } + }, + forecasts: { + serializedName: "forecasts", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "DailyForecast" + } + } + } + } + } + } +}; + +export const DailyForecastSummary: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "DailyForecastSummary", + modelProperties: { + startDate: { + serializedName: "startDate", + type: { + name: "String" + } + }, + endDate: { + serializedName: "endDate", + type: { + name: "String" + } + }, + severity: { + serializedName: "severity", + type: { + name: "Number" + } + }, + phrase: { + serializedName: "phrase", + type: { + name: "String" + } + }, + category: { + serializedName: "category", + type: { + name: "String" + } + } + } + } +}; + +export const DailyForecast: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "DailyForecast", + modelProperties: { + date: { + serializedName: "date", + type: { + name: "String" + } + }, + temperature: { + serializedName: "temperature", + type: { + name: "Composite", + className: "WeatherUnitRange" + } + }, + realFeelTemperature: { + serializedName: "realFeelTemperature", + type: { + name: "Composite", + className: "WeatherUnitRange" + } + }, + realFeelTemperatureShade: { + serializedName: "realFeelTemperatureShade", + type: { + name: "Composite", + className: "WeatherUnitRange" + } + }, + hoursOfSun: { + serializedName: "hoursOfSun", + type: { + name: "Number" + } + }, + degreeDaySummary: { + serializedName: "degreeDaySummary", + type: { + name: "Composite", + className: "DegreeDaySummary" + } + }, + airAndPollen: { + serializedName: "airAndPollen", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "AirAndPollen" + } + } + } + }, + day: { + serializedName: "day", + type: { + name: "Composite", + className: "DayOrNight" + } + }, + night: { + serializedName: "night", + type: { + name: "Composite", + className: "DayOrNight" + } + }, + sources: { + serializedName: "sources", + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + } + } + } +}; + +export const DegreeDaySummary: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "DegreeDaySummary", + modelProperties: { + heating: { + serializedName: "heating", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + cooling: { + serializedName: "cooling", + type: { + name: "Composite", + className: "WeatherUnit" + } + } + } + } +}; + +export const AirAndPollen: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "AirAndPollen", + modelProperties: { + name: { + serializedName: "name", + type: { + name: "String" + } + }, + value: { + serializedName: "value", + type: { + name: "Number" + } + }, + category: { + serializedName: "category", + type: { + name: "String" + } + }, + categoryValue: { + serializedName: "categoryValue", + type: { + name: "Number" + } + }, + type: { + serializedName: "type", + type: { + name: "String" + } + } + } + } +}; + +export const DayOrNight: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "DayOrNight", + modelProperties: { + iconCode: { + serializedName: "iconCode", + type: { + name: "Number" + } + }, + iconPhrase: { + serializedName: "iconPhrase", + type: { + name: "String" + } + }, + localSource: { + serializedName: "localSource", + type: { + name: "Composite", + className: "LocalSource" + } + }, + hasPrecipitation: { + serializedName: "hasPrecipitation", + type: { + name: "Boolean" + } + }, + precipitationType: { + serializedName: "precipitationType", + type: { + name: "String" + } + }, + precipitationIntensity: { + serializedName: "precipitationIntensity", + type: { + name: "String" + } + }, + shortPhrase: { + serializedName: "shortPhrase", + type: { + name: "String" + } + }, + longPhrase: { + serializedName: "longPhrase", + type: { + name: "String" + } + }, + precipitationProbability: { + serializedName: "precipitationProbability", + type: { + name: "Number" + } + }, + thunderstormProbability: { + serializedName: "thunderstormProbability", + type: { + name: "Number" + } + }, + rainProbability: { + serializedName: "rainProbability", + type: { + name: "Number" + } + }, + snowProbability: { + serializedName: "snowProbability", + type: { + name: "Number" + } + }, + iceProbability: { + serializedName: "iceProbability", + type: { + name: "Number" + } + }, + wind: { + serializedName: "wind", + type: { + name: "Composite", + className: "WindDetails" + } + }, + windGust: { + serializedName: "windGust", + type: { + name: "Composite", + className: "WindDetails" + } + }, + totalLiquid: { + serializedName: "totalLiquid", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + rain: { + serializedName: "rain", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + snow: { + serializedName: "snow", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + ice: { + serializedName: "ice", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + hoursOfPrecipitation: { + serializedName: "hoursOfPrecipitation", + type: { + name: "Number" + } + }, + hoursOfRain: { + serializedName: "hoursOfRain", + type: { + name: "Number" + } + }, + hoursOfSnow: { + serializedName: "hoursOfSnow", + type: { + name: "Number" + } + }, + hoursOfIce: { + serializedName: "hoursOfIce", + type: { + name: "Number" + } + }, + cloudCover: { + serializedName: "cloudCover", + type: { + name: "Number" + } + } + } + } +}; + +export const LocalSource: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "LocalSource", + modelProperties: { + id: { + serializedName: "id", + type: { + name: "Number" + } + }, + name: { + serializedName: "name", + type: { + name: "String" + } + }, + weatherCode: { + serializedName: "weatherCode", + type: { + name: "String" + } + } + } + } +}; + +export const WeatherAlongRouteResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "WeatherAlongRouteResponse", + modelProperties: { + summary: { + serializedName: "summary", + type: { + name: "Composite", + className: "WeatherAlongRouteSummary" + } + }, + waypoints: { + serializedName: "waypoints", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "WeatherWaypoint" + } + } + } + } + } + } +}; + +export const WeatherAlongRouteSummary: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "WeatherAlongRouteSummary", + modelProperties: { + iconCode: { + serializedName: "iconCode", + type: { + name: "Number" + } + }, + hazards: { + serializedName: "hazards", + type: { + name: "Composite", + className: "WeatherHazards" + } + } + } + } +}; + +export const WeatherHazards: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "WeatherHazards", + modelProperties: { + maxHazardIndex: { + serializedName: "maxHazardIndex", + type: { + name: "Number" + } + }, + hazardDetails: { + serializedName: "hazardDetails", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "HazardDetail" + } + } + } + } + } + } +}; + +export const HazardDetail: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "HazardDetail", + modelProperties: { + hazardIndex: { + serializedName: "hazardIndex", + type: { + name: "Number" + } + }, + hazardCode: { + serializedName: "hazardCode", + type: { + name: "String" + } + }, + shortPhrase: { + serializedName: "shortPhrase", + type: { + name: "String" + } + } + } + } +}; + +export const WeatherWaypoint: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "WeatherWaypoint", + modelProperties: { + iconCode: { + serializedName: "iconCode", + type: { + name: "Number" + } + }, + shortPhrase: { + serializedName: "shortPhrase", + type: { + name: "String" + } + }, + isDayTime: { + serializedName: "isDayTime", + type: { + name: "Boolean" + } + }, + cloudCover: { + serializedName: "cloudCover", + type: { + name: "Number" + } + }, + temperature: { + serializedName: "temperature", + type: { + name: "Composite", + className: "WeatherUnit" + } + }, + wind: { + serializedName: "wind", + type: { + name: "Composite", + className: "WindDetails" + } + }, + windGust: { + serializedName: "windGust", + type: { + name: "Composite", + className: "WindDetails" + } + }, + precipitation: { + serializedName: "precipitation", + type: { + name: "Composite", + className: "WeatherAlongRoutePrecipitation" + } + }, + lightningCount: { + serializedName: "lightningCount", + type: { + name: "Number" + } + }, + sunGlare: { + serializedName: "sunGlare", + type: { + name: "Composite", + className: "SunGlare" + } + }, + hazards: { + serializedName: "hazards", + type: { + name: "Composite", + className: "WeatherHazards" + } + }, + notifications: { + serializedName: "notifications", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "WeatherNotification" + } + } + } + } + } + } +}; + +export const WeatherAlongRoutePrecipitation: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "WeatherAlongRoutePrecipitation", + modelProperties: { + dbz: { + serializedName: "dbz", + type: { + name: "Number" + } + }, + type: { + serializedName: "type", + type: { + name: "String" + } + } + } + } +}; + +export const SunGlare: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SunGlare", + modelProperties: { + calculatedVehicleHeading: { + serializedName: "calculatedVehicleHeading", + type: { + name: "Number" + } + }, + glareIndex: { + serializedName: "glareIndex", + type: { + name: "Number" + } + } + } + } +}; + +export const WeatherNotification: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "WeatherNotification", + modelProperties: { + type: { + serializedName: "type", + type: { + name: "String" + } + }, + hazardIndex: { + serializedName: "hazardIndex", + type: { + name: "Number" + } + }, + hazardCode: { + serializedName: "hazardCode", + type: { + name: "String" + } + }, + shortPhrase: { + serializedName: "shortPhrase", + type: { + name: "String" + } + } + } + } +}; + +export const SevereWeatherAlertsResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SevereWeatherAlertsResponse", + modelProperties: { + results: { + serializedName: "results", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "SevereWeatherAlert" + } + } + } + } + } + } +}; + +export const SevereWeatherAlert: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SevereWeatherAlert", + modelProperties: { + countryCode: { + serializedName: "countryCode", + type: { + name: "String" + } + }, + alertId: { + serializedName: "alertId", + type: { + name: "Number" + } + }, + description: { + serializedName: "description", + type: { + name: "Composite", + className: "SevereWeatherAlertDescription" + } + }, + category: { + serializedName: "category", + type: { + name: "String" + } + }, + priority: { + serializedName: "priority", + type: { + name: "Number" + } + }, + class: { + serializedName: "class", + type: { + name: "String" + } + }, + level: { + serializedName: "level", + type: { + name: "String" + } + }, + source: { + serializedName: "source", + type: { + name: "String" + } + }, + sourceId: { + serializedName: "sourceId", + type: { + name: "Number" + } + }, + disclaimer: { + serializedName: "disclaimer", + type: { + name: "String" + } + }, + alertAreas: { + serializedName: "alertAreas", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "AlertArea" + } + } + } + } + } + } +}; + +export const SevereWeatherAlertDescription: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "SevereWeatherAlertDescription", + modelProperties: { + localized: { + serializedName: "localized", + type: { + name: "String" + } + }, + english: { + serializedName: "english", + type: { + name: "String" + } + } + } + } +}; + +export const AlertArea: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "AlertArea", + modelProperties: { + name: { + serializedName: "name", + type: { + name: "String" + } + }, + summary: { + serializedName: "summary", + type: { + name: "String" + } + }, + startTime: { + serializedName: "startTime", + type: { + name: "String" + } + }, + endTime: { + serializedName: "endTime", + type: { + name: "String" + } + }, + latestStatus: { + serializedName: "latestStatus", + type: { + name: "Composite", + className: "LatestStatus" + } + }, + alertDetails: { + serializedName: "alertDetails", + type: { + name: "String" + } + }, + alertDetailsLanguageCode: { + serializedName: "alertDetailsLanguageCode", + type: { + name: "String" + } + } + } + } +}; + +export const LatestStatus: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "LatestStatus", + modelProperties: { + localized: { + serializedName: "localized", + type: { + name: "String" + } + }, + english: { + serializedName: "english", + type: { + name: "String" + } + } + } + } +}; + +export const DailyIndicesResponse: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "DailyIndicesResponse", + modelProperties: { + results: { + serializedName: "results", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "DailyIndex" + } + } + } + } + } + } +}; + +export const DailyIndex: coreClient.CompositeMapper = { + type: { + name: "Composite", + className: "DailyIndex", + modelProperties: { + indexName: { + serializedName: "indexName", + type: { + name: "String" + } + }, + indexId: { + serializedName: "indexId", + type: { + name: "Number" + } + }, + dateTime: { + serializedName: "dateTime", + type: { + name: "String" + } + }, + value: { + serializedName: "value", + type: { + name: "Number" + } + }, + category: { + serializedName: "category", + type: { + name: "String" + } + }, + categoryValue: { + serializedName: "categoryValue", + type: { + name: "Number" + } + }, + ascending: { + serializedName: "ascending", + type: { + name: "Boolean" + } + }, + description: { + serializedName: "description", + type: { + name: "String" + } + } + } + } +}; diff --git a/sdk/maps/maps-weather/src/models/parameters.ts b/sdk/maps/maps-weather/src/models/parameters.ts new file mode 100644 index 000000000000..7ae047ef5c53 --- /dev/null +++ b/sdk/maps/maps-weather/src/models/parameters.ts @@ -0,0 +1,150 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { + OperationParameter, + OperationURLParameter, + OperationQueryParameter +} from "@azure/core-client"; + +export const accept: OperationParameter = { + parameterPath: "accept", + mapper: { + defaultValue: "application/json", + isConstant: true, + serializedName: "Accept", + type: { + name: "String" + } + } +}; + +export const geography: OperationURLParameter = { + parameterPath: "geography", + mapper: { + serializedName: "geography", + required: true, + type: { + name: "String" + } + } +}; + +export const xMsClientId: OperationParameter = { + parameterPath: "xMsClientId", + mapper: { + serializedName: "x-ms-client-id", + type: { + name: "String" + } + } +}; + +export const apiVersion: OperationQueryParameter = { + parameterPath: "apiVersion", + mapper: { + defaultValue: "1.0", + isConstant: true, + serializedName: "api-version", + type: { + name: "String" + } + } +}; + +export const format: OperationURLParameter = { + parameterPath: "format", + mapper: { + serializedName: "format", + required: true, + type: { + name: "String" + } + } +}; + +export const query: OperationQueryParameter = { + parameterPath: "query", + mapper: { + serializedName: "query", + required: true, + type: { + name: "String" + } + } +}; + +export const unit: OperationQueryParameter = { + parameterPath: ["options", "unit"], + mapper: { + serializedName: "unit", + type: { + name: "String" + } + } +}; + +export const duration: OperationQueryParameter = { + parameterPath: ["options", "duration"], + mapper: { + serializedName: "duration", + type: { + name: "Number" + } + } +}; + +export const language: OperationQueryParameter = { + parameterPath: ["options", "language"], + mapper: { + serializedName: "language", + type: { + name: "String" + } + } +}; + +export const interval: OperationQueryParameter = { + parameterPath: ["options", "interval"], + mapper: { + serializedName: "interval", + type: { + name: "Number" + } + } +}; + +export const details: OperationQueryParameter = { + parameterPath: ["options", "details"], + mapper: { + serializedName: "details", + type: { + name: "String" + } + } +}; + +export const indexId: OperationQueryParameter = { + parameterPath: ["options", "indexId"], + mapper: { + serializedName: "indexId", + type: { + name: "Number" + } + } +}; + +export const indexGroupId: OperationQueryParameter = { + parameterPath: ["options", "indexGroupId"], + mapper: { + serializedName: "indexGroupId", + type: { + name: "Number" + } + } +}; diff --git a/sdk/maps/maps-weather/src/operations/index.ts b/sdk/maps/maps-weather/src/operations/index.ts new file mode 100644 index 000000000000..bdb47cad2ed7 --- /dev/null +++ b/sdk/maps/maps-weather/src/operations/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./weather"; diff --git a/sdk/maps/maps-weather/src/operations/weather.ts b/sdk/maps/maps-weather/src/operations/weather.ts new file mode 100644 index 000000000000..5c93442aa913 --- /dev/null +++ b/sdk/maps/maps-weather/src/operations/weather.ts @@ -0,0 +1,486 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { Weather } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; +import * as Mappers from "../models/mappers"; +import * as Parameters from "../models/parameters"; +import { WeatherClientContext } from "../weatherClientContext"; +import { + ResponseFormat, + WeatherGetHourlyForecastOptionalParams, + WeatherGetHourlyForecastResponse, + WeatherGetMinuteForecastOptionalParams, + WeatherGetMinuteForecastResponse, + WeatherGetQuarterDayForecastOptionalParams, + WeatherGetQuarterDayForecastResponse, + WeatherGetCurrentConditionsOptionalParams, + WeatherGetCurrentConditionsResponse, + WeatherGetDailyForecastOptionalParams, + WeatherGetDailyForecastResponse, + WeatherGetWeatherAlongRouteOptionalParams, + WeatherGetWeatherAlongRouteResponse, + WeatherGetSevereWeatherAlertsOptionalParams, + WeatherGetSevereWeatherAlertsResponse, + WeatherGetDailyIndicesOptionalParams, + WeatherGetDailyIndicesResponse +} from "../models"; + +/** Class representing a Weather. */ +export class WeatherImpl implements Weather { + private readonly client: WeatherClientContext; + + /** + * Initialize a new instance of the class Weather class. + * @param client Reference to the service client + */ + constructor(client: WeatherClientContext) { + this.client = client; + } + + /** + * **Get Hourly Forecast** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Request detailed weather forecast by the hour for the next 1, 12, 24 (1 day), 72 (3 days), 120 (5 + * days), and 240 hours (10 days) for the given the given coordinate location. The API returns details + * such as temperature, humidity, wind, precipitation, and ultraviolet (UV) index. + * + * In S0 you can request hourly forecast for the next 1, 12, 24 hours (1 day), and 72 hours (3 days). + * In S1 you can also request hourly forecast for the next 120 (5 days) and 240 hours (10 days). + * @param format Desired format of the response. Only `json` format is supported. + * @param query Coordinates of the location for which hourly forecast information is requested. The + * applicable query is specified as a comma separated string composed by latitude followed by longitude + * e.g. "47.641268,-122.125679". + * @param options The options parameters. + */ + getHourlyForecast( + format: ResponseFormat, + query: string, + options?: WeatherGetHourlyForecastOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getHourlyForecastOperationSpec + ); + } + + /** + * **Get Minute Forecast** + * + * + * **Applies to**: S1 pricing tier. + * + * + * Get Minute Forecast service returns minute-by-minute forecasts for a given location for the next 120 + * minutes. Users can request weather forecasts in the interval of 1, 5 and 15 minutes. The response + * will include details such as the type of precipitation (including rain, snow, or a mixture of both), + * start time, and precipitation intensity value (dBZ). + * @param format Desired format of the response. Only `json` format is supported. + * @param query Coordinates of the location for which minute forecast information is requested. The + * applicable query is specified as a comma separated string composed by latitude followed by longitude + * e.g. "47.641268,-122.125679". + * @param options The options parameters. + */ + getMinuteForecast( + format: ResponseFormat, + query: string, + options?: WeatherGetMinuteForecastOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getMinuteForecastOperationSpec + ); + } + + /** + * **Get Quarter-Day Forecast** + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Service returns detailed weather forecast by quarter-day for the next 1, 5, 10, or 15 days for a + * given location. Response data is presented by quarters of the day - morning, afternoon, evening, and + * overnight. Details such as temperature, humidity, wind, precipitation, and UV index are returned. + * @param format Desired format of the response. Only `json` format is supported. + * @param query Coordinates of the location for which quarter-day forecast information is requested. + * The applicable query is specified as a comma separated string composed by latitude followed by + * longitude e.g. "47.641268,-122.125679". + * @param options The options parameters. + */ + getQuarterDayForecast( + format: ResponseFormat, + query: string, + options?: WeatherGetQuarterDayForecastOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getQuarterDayForecastOperationSpec + ); + } + + /** + * **Get Current Conditions** + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Get Current Conditions service returns detailed current weather conditions such as precipitation, + * temperature and wind for a given coordinate location. Also, observations from the past 6 or 24 hours + * for a particular location can be retrieved. The basic information returned with the response include + * details such as observation date and time, brief description of the weather conditions, weather + * icon, precipitation indicator flags, and temperature. Additional details such as RealFeel™ + * Temperature and UV index are also returned. + * @param format Desired format of the response. Only `json` format is supported. + * @param query Coordinates of the location for which current conditions information is requested. The + * applicable query is specified as a comma separated string composed by latitude followed by longitude + * e.g. "47.641268,-122.125679". + * @param options The options parameters. + */ + getCurrentConditions( + format: ResponseFormat, + query: string, + options?: WeatherGetCurrentConditionsOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getCurrentConditionsOperationSpec + ); + } + + /** + * **Get Daily Forecast** + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * The service returns detailed weather forecast such as temperature and wind by day for the next 1, 5, + * 10, 15, 25, or 45 days for a given coordinate location. The response include details such as + * temperature, wind, precipitation, air quality, and UV index. + * + * In S0 you can request daily forecast for the next 1, 5, 10, and 15 days. In S1 you can also request + * daily forecast for the next 25 days, and 45 days. + * @param format Desired format of the response. Only `json` format is supported. + * @param query Coordinates of the location for which current conditions information is requested. The + * applicable query is specified as a comma separated string composed by latitude followed by longitude + * e.g. "47.641268,-122.125679". + * @param options The options parameters. + */ + getDailyForecast( + format: ResponseFormat, + query: string, + options?: WeatherGetDailyForecastOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getDailyForecastOperationSpec + ); + } + + /** + * **Get Weather along route** + * + * + * **Applies to**: S1 pricing tier. + * + * Weather along a route API returns hyper local (one kilometer or less), up-to-the-minute weather + * nowcasts, weather hazard assessments, and notifications along a route described as a sequence of + * waypoints. + * This includes a list of weather hazards affecting the waypoint or route, and the aggregated hazard + * index for each waypoint might be used to paint each portion of a route according to how safe it is + * for the driver. When submitting the waypoints, it is recommended to stay within, or close to, the + * distance that can be traveled within 120-mins or shortly after. Data is updated every five minutes. + * + * The service supplements Azure Maps [Route Service](https://docs.microsoft.com/rest/api/maps/route) + * that allows you to first request a route between an origin and a destination and use that as an + * input for Weather Along Route endpoint. + * + * In addition, the service supports scenarios to generate weather notifications for waypoints that + * experience an increase in intensity of a weather hazard. For example, if the vehicle is expected to + * begin experiencing heavy rain as it reaches a waypoint, a weather notification for heavy rain will + * be generated for that waypoint allowing the end product to display a heavy rain notification before + * the driver reaches that waypoint. + * The trigger for when to display the notification for a waypoint could be based, for example, on a + * [geofence](https://docs.microsoft.com/azure/azure-maps/tutorial-iot-hub-maps), or selectable + * distance to the waypoint. + * + * The API covers all regions of the planet except latitudes above Greenland and Antarctica. + * @param format Desired format of the response. Only `json` format is supported. + * @param query Coordinates through which the route is calculated, separated by colon (:) and entered + * in chronological order. A minimum of two waypoints is required. A single API call may contain up to + * 60 waypoints. + * A waypoint indicates location, ETA, and optional heading: latitude,longitude,ETA,heading, where + * * `Latitude` - Latitude coordinate in decimal degrees. + * * `Longitude` - Longitude coordinate in decimal degrees. + * * `ETA (estimated time of arrival)` - The number of minutes from the present time that it will + * take for the vehicle to reach the waypoint. Allowed range is from 0.0 to 120.0 minutes. + * * `Heading` - An optional value indicating the vehicle heading as it passes the waypoint. + * Expressed in clockwise degrees relative to true north. This is issued to calculate sun glare as a + * driving hazard. Allowed range is from 0.0 to 360.0 degrees. If not provided, a heading will + * automatically be derived based on the position of neighboring waypoints. + * + * It is recommended to stay within, or close to, the distance that can be traveled within 120-mins or + * shortly after. This way a more accurate assessment can be provided for the trip and prevent isolated + * events not being captured between waypoints. Information can and should be updated along the route + * (especially for trips greater than 2 hours) to continuously pull new waypoints moving forward, but + * also to ensure that forecast information for content such as precipitation type and intensity is + * accurate as storms develop and dissipate over time. + * @param options The options parameters. + */ + getWeatherAlongRoute( + format: ResponseFormat, + query: string, + options?: WeatherGetWeatherAlongRouteOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getWeatherAlongRouteOperationSpec + ); + } + + /** + * **Get Severe Weather Alerts** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * Severe weather phenomenon can significantly impact our everyday life and business operations. For + * example, severe weather conditions such as tropical storms, high winds or flooding can close roads + * and force logistics companies to reroute their fleet causing delays in reaching destinations and + * breaking the cold chain of refrigerated food products.  Azure Maps Severe Weather Alerts API returns + * the severe weather alerts that are available worldwide from both official Government Meteorological + * Agencies and leading global to regional weather alert providers. The service can return details such + * as alert type, category, level and detailed description about the active severe alerts for the + * requested location, like hurricanes, thunderstorms, lightning, heat waves or forest fires. + * @param format Desired format of the response. Only `json` format is supported. + * @param query Coordinates of the location for which severe weather alerts are requested. The + * applicable query is specified as a comma separated string composed by latitude followed by longitude + * e.g. "47.641268,-122.125679". + * @param options The options parameters. + */ + getSevereWeatherAlerts( + format: ResponseFormat, + query: string, + options?: WeatherGetSevereWeatherAlertsOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getSevereWeatherAlertsOperationSpec + ); + } + + /** + * **Get Daily Indices** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * There may be times when you want to know if the weather conditions are optimal for a specific + * activity, for example, for outdoor construction, indoor activities, running or farming including + * soil moisture information. Azure Maps Indices API returns index values that will guide end users to + * plan future activities. For example, a health mobile application can notify users that today is good + * weather for running or for other outdoors activities like for playing golf, and retail stores can + * optimize their digital marketing campaigns based on predicted index values. The service returns in + * daily indices values for current and next 5, 10 and 15 days starting from current day. + * @param format Desired format of the response. Only `json` format is supported. + * @param query Coordinates of the location for which daily indices are requested. The applicable query + * is specified as a comma separated string composed by latitude followed by longitude e.g. + * "47.641268,-122.125679". + * @param options The options parameters. + */ + getDailyIndices( + format: ResponseFormat, + query: string, + options?: WeatherGetDailyIndicesOptionalParams + ): Promise { + return this.client.sendOperationRequest( + { format, query, options }, + getDailyIndicesOperationSpec + ); + } +} +// Operation Specifications +const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); + +const getHourlyForecastOperationSpec: coreClient.OperationSpec = { + path: "/weather/forecast/hourly/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.HourlyForecastResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.query, + Parameters.unit, + Parameters.duration, + Parameters.language + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getMinuteForecastOperationSpec: coreClient.OperationSpec = { + path: "/weather/forecast/minute/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.MinuteForecastResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.query, + Parameters.language, + Parameters.interval + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getQuarterDayForecastOperationSpec: coreClient.OperationSpec = { + path: "/weather/forecast/quarterDay/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.QuarterDayForecastResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.query, + Parameters.unit, + Parameters.duration, + Parameters.language + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getCurrentConditionsOperationSpec: coreClient.OperationSpec = { + path: "/weather/currentConditions/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.CurrentConditionsResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.query, + Parameters.unit, + Parameters.duration, + Parameters.language, + Parameters.details + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getDailyForecastOperationSpec: coreClient.OperationSpec = { + path: "/weather/forecast/daily/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.DailyForecastResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.query, + Parameters.unit, + Parameters.duration, + Parameters.language + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getWeatherAlongRouteOperationSpec: coreClient.OperationSpec = { + path: "/weather/route/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.WeatherAlongRouteResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.query, + Parameters.language + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getSevereWeatherAlertsOperationSpec: coreClient.OperationSpec = { + path: "/weather/severe/alerts/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.SevereWeatherAlertsResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.query, + Parameters.language, + Parameters.details + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; +const getDailyIndicesOperationSpec: coreClient.OperationSpec = { + path: "/weather/indices/daily/{format}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: Mappers.DailyIndicesResponse + }, + default: { + bodyMapper: Mappers.ErrorResponse + } + }, + queryParameters: [ + Parameters.apiVersion, + Parameters.query, + Parameters.duration, + Parameters.language, + Parameters.indexId, + Parameters.indexGroupId + ], + urlParameters: [Parameters.geography, Parameters.format], + headerParameters: [Parameters.accept, Parameters.xMsClientId], + serializer +}; diff --git a/sdk/maps/maps-weather/src/operationsInterfaces/index.ts b/sdk/maps/maps-weather/src/operationsInterfaces/index.ts new file mode 100644 index 000000000000..bdb47cad2ed7 --- /dev/null +++ b/sdk/maps/maps-weather/src/operationsInterfaces/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +export * from "./weather"; diff --git a/sdk/maps/maps-weather/src/operationsInterfaces/weather.ts b/sdk/maps/maps-weather/src/operationsInterfaces/weather.ts new file mode 100644 index 000000000000..1c61c1efb73c --- /dev/null +++ b/sdk/maps/maps-weather/src/operationsInterfaces/weather.ts @@ -0,0 +1,247 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import { + ResponseFormat, + WeatherGetHourlyForecastOptionalParams, + WeatherGetHourlyForecastResponse, + WeatherGetMinuteForecastOptionalParams, + WeatherGetMinuteForecastResponse, + WeatherGetQuarterDayForecastOptionalParams, + WeatherGetQuarterDayForecastResponse, + WeatherGetCurrentConditionsOptionalParams, + WeatherGetCurrentConditionsResponse, + WeatherGetDailyForecastOptionalParams, + WeatherGetDailyForecastResponse, + WeatherGetWeatherAlongRouteOptionalParams, + WeatherGetWeatherAlongRouteResponse, + WeatherGetSevereWeatherAlertsOptionalParams, + WeatherGetSevereWeatherAlertsResponse, + WeatherGetDailyIndicesOptionalParams, + WeatherGetDailyIndicesResponse +} from "../models"; + +/** Interface representing a Weather. */ +export interface Weather { + /** + * **Get Hourly Forecast** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Request detailed weather forecast by the hour for the next 1, 12, 24 (1 day), 72 (3 days), 120 (5 + * days), and 240 hours (10 days) for the given the given coordinate location. The API returns details + * such as temperature, humidity, wind, precipitation, and ultraviolet (UV) index. + * + * In S0 you can request hourly forecast for the next 1, 12, 24 hours (1 day), and 72 hours (3 days). + * In S1 you can also request hourly forecast for the next 120 (5 days) and 240 hours (10 days). + * @param format Desired format of the response. Only `json` format is supported. + * @param query Coordinates of the location for which hourly forecast information is requested. The + * applicable query is specified as a comma separated string composed by latitude followed by longitude + * e.g. "47.641268,-122.125679". + * @param options The options parameters. + */ + getHourlyForecast( + format: ResponseFormat, + query: string, + options?: WeatherGetHourlyForecastOptionalParams + ): Promise; + /** + * **Get Minute Forecast** + * + * + * **Applies to**: S1 pricing tier. + * + * + * Get Minute Forecast service returns minute-by-minute forecasts for a given location for the next 120 + * minutes. Users can request weather forecasts in the interval of 1, 5 and 15 minutes. The response + * will include details such as the type of precipitation (including rain, snow, or a mixture of both), + * start time, and precipitation intensity value (dBZ). + * @param format Desired format of the response. Only `json` format is supported. + * @param query Coordinates of the location for which minute forecast information is requested. The + * applicable query is specified as a comma separated string composed by latitude followed by longitude + * e.g. "47.641268,-122.125679". + * @param options The options parameters. + */ + getMinuteForecast( + format: ResponseFormat, + query: string, + options?: WeatherGetMinuteForecastOptionalParams + ): Promise; + /** + * **Get Quarter-Day Forecast** + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Service returns detailed weather forecast by quarter-day for the next 1, 5, 10, or 15 days for a + * given location. Response data is presented by quarters of the day - morning, afternoon, evening, and + * overnight. Details such as temperature, humidity, wind, precipitation, and UV index are returned. + * @param format Desired format of the response. Only `json` format is supported. + * @param query Coordinates of the location for which quarter-day forecast information is requested. + * The applicable query is specified as a comma separated string composed by latitude followed by + * longitude e.g. "47.641268,-122.125679". + * @param options The options parameters. + */ + getQuarterDayForecast( + format: ResponseFormat, + query: string, + options?: WeatherGetQuarterDayForecastOptionalParams + ): Promise; + /** + * **Get Current Conditions** + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * Get Current Conditions service returns detailed current weather conditions such as precipitation, + * temperature and wind for a given coordinate location. Also, observations from the past 6 or 24 hours + * for a particular location can be retrieved. The basic information returned with the response include + * details such as observation date and time, brief description of the weather conditions, weather + * icon, precipitation indicator flags, and temperature. Additional details such as RealFeel™ + * Temperature and UV index are also returned. + * @param format Desired format of the response. Only `json` format is supported. + * @param query Coordinates of the location for which current conditions information is requested. The + * applicable query is specified as a comma separated string composed by latitude followed by longitude + * e.g. "47.641268,-122.125679". + * @param options The options parameters. + */ + getCurrentConditions( + format: ResponseFormat, + query: string, + options?: WeatherGetCurrentConditionsOptionalParams + ): Promise; + /** + * **Get Daily Forecast** + * + * + * **Applies to**: S0 and S1 pricing tiers. + * + * + * The service returns detailed weather forecast such as temperature and wind by day for the next 1, 5, + * 10, 15, 25, or 45 days for a given coordinate location. The response include details such as + * temperature, wind, precipitation, air quality, and UV index. + * + * In S0 you can request daily forecast for the next 1, 5, 10, and 15 days. In S1 you can also request + * daily forecast for the next 25 days, and 45 days. + * @param format Desired format of the response. Only `json` format is supported. + * @param query Coordinates of the location for which current conditions information is requested. The + * applicable query is specified as a comma separated string composed by latitude followed by longitude + * e.g. "47.641268,-122.125679". + * @param options The options parameters. + */ + getDailyForecast( + format: ResponseFormat, + query: string, + options?: WeatherGetDailyForecastOptionalParams + ): Promise; + /** + * **Get Weather along route** + * + * + * **Applies to**: S1 pricing tier. + * + * Weather along a route API returns hyper local (one kilometer or less), up-to-the-minute weather + * nowcasts, weather hazard assessments, and notifications along a route described as a sequence of + * waypoints. + * This includes a list of weather hazards affecting the waypoint or route, and the aggregated hazard + * index for each waypoint might be used to paint each portion of a route according to how safe it is + * for the driver. When submitting the waypoints, it is recommended to stay within, or close to, the + * distance that can be traveled within 120-mins or shortly after. Data is updated every five minutes. + * + * The service supplements Azure Maps [Route Service](https://docs.microsoft.com/rest/api/maps/route) + * that allows you to first request a route between an origin and a destination and use that as an + * input for Weather Along Route endpoint. + * + * In addition, the service supports scenarios to generate weather notifications for waypoints that + * experience an increase in intensity of a weather hazard. For example, if the vehicle is expected to + * begin experiencing heavy rain as it reaches a waypoint, a weather notification for heavy rain will + * be generated for that waypoint allowing the end product to display a heavy rain notification before + * the driver reaches that waypoint. + * The trigger for when to display the notification for a waypoint could be based, for example, on a + * [geofence](https://docs.microsoft.com/azure/azure-maps/tutorial-iot-hub-maps), or selectable + * distance to the waypoint. + * + * The API covers all regions of the planet except latitudes above Greenland and Antarctica. + * @param format Desired format of the response. Only `json` format is supported. + * @param query Coordinates through which the route is calculated, separated by colon (:) and entered + * in chronological order. A minimum of two waypoints is required. A single API call may contain up to + * 60 waypoints. + * A waypoint indicates location, ETA, and optional heading: latitude,longitude,ETA,heading, where + * * `Latitude` - Latitude coordinate in decimal degrees. + * * `Longitude` - Longitude coordinate in decimal degrees. + * * `ETA (estimated time of arrival)` - The number of minutes from the present time that it will + * take for the vehicle to reach the waypoint. Allowed range is from 0.0 to 120.0 minutes. + * * `Heading` - An optional value indicating the vehicle heading as it passes the waypoint. + * Expressed in clockwise degrees relative to true north. This is issued to calculate sun glare as a + * driving hazard. Allowed range is from 0.0 to 360.0 degrees. If not provided, a heading will + * automatically be derived based on the position of neighboring waypoints. + * + * It is recommended to stay within, or close to, the distance that can be traveled within 120-mins or + * shortly after. This way a more accurate assessment can be provided for the trip and prevent isolated + * events not being captured between waypoints. Information can and should be updated along the route + * (especially for trips greater than 2 hours) to continuously pull new waypoints moving forward, but + * also to ensure that forecast information for content such as precipitation type and intensity is + * accurate as storms develop and dissipate over time. + * @param options The options parameters. + */ + getWeatherAlongRoute( + format: ResponseFormat, + query: string, + options?: WeatherGetWeatherAlongRouteOptionalParams + ): Promise; + /** + * **Get Severe Weather Alerts** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * Severe weather phenomenon can significantly impact our everyday life and business operations. For + * example, severe weather conditions such as tropical storms, high winds or flooding can close roads + * and force logistics companies to reroute their fleet causing delays in reaching destinations and + * breaking the cold chain of refrigerated food products.  Azure Maps Severe Weather Alerts API returns + * the severe weather alerts that are available worldwide from both official Government Meteorological + * Agencies and leading global to regional weather alert providers. The service can return details such + * as alert type, category, level and detailed description about the active severe alerts for the + * requested location, like hurricanes, thunderstorms, lightning, heat waves or forest fires. + * @param format Desired format of the response. Only `json` format is supported. + * @param query Coordinates of the location for which severe weather alerts are requested. The + * applicable query is specified as a comma separated string composed by latitude followed by longitude + * e.g. "47.641268,-122.125679". + * @param options The options parameters. + */ + getSevereWeatherAlerts( + format: ResponseFormat, + query: string, + options?: WeatherGetSevereWeatherAlertsOptionalParams + ): Promise; + /** + * **Get Daily Indices** + * + * **Applies to**: S0 and S1 pricing tiers. + * + * There may be times when you want to know if the weather conditions are optimal for a specific + * activity, for example, for outdoor construction, indoor activities, running or farming including + * soil moisture information. Azure Maps Indices API returns index values that will guide end users to + * plan future activities. For example, a health mobile application can notify users that today is good + * weather for running or for other outdoors activities like for playing golf, and retail stores can + * optimize their digital marketing campaigns based on predicted index values. The service returns in + * daily indices values for current and next 5, 10 and 15 days starting from current day. + * @param format Desired format of the response. Only `json` format is supported. + * @param query Coordinates of the location for which daily indices are requested. The applicable query + * is specified as a comma separated string composed by latitude followed by longitude e.g. + * "47.641268,-122.125679". + * @param options The options parameters. + */ + getDailyIndices( + format: ResponseFormat, + query: string, + options?: WeatherGetDailyIndicesOptionalParams + ): Promise; +} diff --git a/sdk/maps/maps-weather/src/weatherClient.ts b/sdk/maps/maps-weather/src/weatherClient.ts new file mode 100644 index 000000000000..29ab7aac07ab --- /dev/null +++ b/sdk/maps/maps-weather/src/weatherClient.ts @@ -0,0 +1,30 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreAuth from "@azure/core-auth"; +import { WeatherImpl } from "./operations"; +import { Weather } from "./operationsInterfaces"; +import { WeatherClientContext } from "./weatherClientContext"; +import { WeatherClientOptionalParams } from "./models"; + +export class WeatherClient extends WeatherClientContext { + /** + * Initializes a new instance of the WeatherClient class. + * @param credentials Subscription credentials which uniquely identify client subscription. + * @param options The parameter options + */ + constructor( + credentials: coreAuth.TokenCredential, + options?: WeatherClientOptionalParams + ) { + super(credentials, options); + this.weather = new WeatherImpl(this); + } + + weather: Weather; +} diff --git a/sdk/maps/maps-weather/src/weatherClientContext.ts b/sdk/maps/maps-weather/src/weatherClientContext.ts new file mode 100644 index 000000000000..2602fd161436 --- /dev/null +++ b/sdk/maps/maps-weather/src/weatherClientContext.ts @@ -0,0 +1,63 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * Code generated by Microsoft (R) AutoRest Code Generator. + * Changes may cause incorrect behavior and will be lost if the code is regenerated. + */ + +import * as coreClient from "@azure/core-client"; +import * as coreAuth from "@azure/core-auth"; +import { Geography, WeatherClientOptionalParams } from "./models"; + +export class WeatherClientContext extends coreClient.ServiceClient { + geography: Geography; + xMsClientId?: string; + apiVersion: string; + + /** + * Initializes a new instance of the WeatherClientContext class. + * @param credentials Subscription credentials which uniquely identify client subscription. + * @param options The parameter options + */ + constructor( + credentials: coreAuth.TokenCredential, + options?: WeatherClientOptionalParams + ) { + if (credentials === undefined) { + throw new Error("'credentials' cannot be null"); + } + + // Initializing default values for options + if (!options) { + options = {}; + } + const defaults: WeatherClientOptionalParams = { + requestContentType: "application/json; charset=utf-8", + credential: credentials + }; + + const packageDetails = `azsdk-js-maps-weather/1.0.0-beta.1`; + const userAgentPrefix = + options.userAgentOptions && options.userAgentOptions.userAgentPrefix + ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` + : `${packageDetails}`; + + if (!options.credentialScopes) { + options.credentialScopes = ["https://atlas.microsoft.com/.default"]; + } + const optionsWithDefaults = { + ...defaults, + ...options, + userAgentOptions: { + userAgentPrefix + }, + baseUri: options.endpoint || "https://{geography}.atlas.microsoft.com" + }; + super(optionsWithDefaults); + + // Assigning values to Constant parameters + this.geography = options.geography || "us"; + this.apiVersion = options.apiVersion || "1.0"; + } +} diff --git a/sdk/maps/maps-weather/tsconfig.json b/sdk/maps/maps-weather/tsconfig.json new file mode 100644 index 000000000000..0ec8659c8e83 --- /dev/null +++ b/sdk/maps/maps-weather/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "module": "es6", + "moduleResolution": "node", + "strict": true, + "target": "es6", + "sourceMap": true, + "declarationMap": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "preserveConstEnums": true, + "lib": ["es6", "dom"], + "declaration": true, + "outDir": "./esm", + "importHelpers": true + }, + "include": ["./src/**/*.ts"], + "exclude": ["node_modules"] +} From ebdf597f758da62e83d9995852e575b6dc92aa6b Mon Sep 17 00:00:00 2001 From: Filip Proborszcz Date: Thu, 1 Jul 2021 23:54:23 +0200 Subject: [PATCH 2/4] Fix samples --- .../samples/v1/javascript/package.json | 3 +- .../samples/v1/typescript/package.json | 3 +- .../samples/v1/javascript/package.json | 3 +- .../samples/v1/typescript/package.json | 3 +- .../samples/v1/javascript/geolocation.js | 2 +- .../samples/v1/javascript/package.json | 3 +- .../samples/v1/typescript/package.json | 3 +- .../samples/v1/typescript/src/geolocation.ts | 2 +- .../samples/v1/javascript/package.json | 3 +- .../samples/v1/javascript/render.js | 3 +- .../samples/v1/typescript/package.json | 3 +- .../samples/v1/typescript/src/render.ts | 2 +- .../samples/v1/javascript/package.json | 3 +- .../maps-route/samples/v1/javascript/route.js | 78 ++++++++++ .../samples/v1/typescript/package.json | 3 +- .../samples/v1/typescript/src/route.ts} | 34 +++-- .../samples/v1/javascript/elevation.js | 70 --------- .../samples/v1/javascript/package.json | 3 +- .../samples/v1/javascript/search.js | 134 +++++++++++++++++ .../samples/v1/typescript/package.json | 3 +- .../samples/v1/typescript/src/search.ts | 140 ++++++++++++++++++ .../samples/v1/javascript/elevation.js | 70 --------- .../samples/v1/javascript/package.json | 3 +- .../samples/v1/javascript/timezone.js} | 29 ++-- .../samples/v1/typescript/package.json | 3 +- .../src/{elevation.ts => timezone.ts} | 29 ++-- .../samples/v1/javascript/elevation.js | 70 --------- .../samples/v1/javascript/package.json | 3 +- .../samples/v1/javascript/traffic.js | 77 ++++++++++ .../samples/v1/typescript/package.json | 3 +- .../src/{elevation.ts => traffic.ts} | 33 +++-- .../samples/v1/javascript/elevation.js | 70 --------- .../samples/v1/javascript/package.json | 3 +- .../samples/v1/javascript/weather.js | 79 ++++++++++ .../samples/v1/typescript/package.json | 3 +- .../samples/v1/typescript/src/elevation.ts | 76 ---------- .../samples/v1/typescript/src/weather.ts} | 35 +++-- 37 files changed, 644 insertions(+), 443 deletions(-) create mode 100644 sdk/maps/maps-route/samples/v1/javascript/route.js rename sdk/maps/{maps-search/samples/v1/typescript/src/elevation.ts => maps-route/samples/v1/typescript/src/route.ts} (50%) delete mode 100644 sdk/maps/maps-search/samples/v1/javascript/elevation.js create mode 100644 sdk/maps/maps-search/samples/v1/javascript/search.js create mode 100644 sdk/maps/maps-search/samples/v1/typescript/src/search.ts delete mode 100644 sdk/maps/maps-timezone/samples/v1/javascript/elevation.js rename sdk/maps/{maps-route/samples/v1/javascript/elevation.js => maps-timezone/samples/v1/javascript/timezone.js} (50%) rename sdk/maps/maps-timezone/samples/v1/typescript/src/{elevation.ts => timezone.ts} (56%) delete mode 100644 sdk/maps/maps-traffic/samples/v1/javascript/elevation.js create mode 100644 sdk/maps/maps-traffic/samples/v1/javascript/traffic.js rename sdk/maps/maps-traffic/samples/v1/typescript/src/{elevation.ts => traffic.ts} (51%) delete mode 100644 sdk/maps/maps-weather/samples/v1/javascript/elevation.js create mode 100644 sdk/maps/maps-weather/samples/v1/javascript/weather.js delete mode 100644 sdk/maps/maps-weather/samples/v1/typescript/src/elevation.ts rename sdk/maps/{maps-route/samples/v1/typescript/src/elevation.ts => maps-weather/samples/v1/typescript/src/weather.ts} (51%) diff --git a/sdk/maps/maps-creator/samples/v1/javascript/package.json b/sdk/maps/maps-creator/samples/v1/javascript/package.json index 17abd7ffdab2..95fb9ce1dbee 100644 --- a/sdk/maps/maps-creator/samples/v1/javascript/package.json +++ b/sdk/maps/maps-creator/samples/v1/javascript/package.json @@ -23,6 +23,7 @@ "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-creator", "dependencies": { "@azure/maps-creator": "next", - "dotenv": "latest" + "dotenv": "latest", + "@azure/identity": "^1.1.0" } } diff --git a/sdk/maps/maps-creator/samples/v1/typescript/package.json b/sdk/maps/maps-creator/samples/v1/typescript/package.json index 799b0d955aa0..b37ccdde9d13 100644 --- a/sdk/maps/maps-creator/samples/v1/typescript/package.json +++ b/sdk/maps/maps-creator/samples/v1/typescript/package.json @@ -27,7 +27,8 @@ "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-creator", "dependencies": { "@azure/maps-creator": "next", - "dotenv": "latest" + "dotenv": "latest", + "@azure/identity": "^1.1.0" }, "devDependencies": { "typescript": "~4.2.0", diff --git a/sdk/maps/maps-elevation/samples/v1/javascript/package.json b/sdk/maps/maps-elevation/samples/v1/javascript/package.json index 63f9096463fa..0c38aa0dde77 100644 --- a/sdk/maps/maps-elevation/samples/v1/javascript/package.json +++ b/sdk/maps/maps-elevation/samples/v1/javascript/package.json @@ -23,6 +23,7 @@ "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-elevation", "dependencies": { "@azure/maps-elevation": "next", - "dotenv": "latest" + "dotenv": "latest", + "@azure/identity": "^1.1.0" } } diff --git a/sdk/maps/maps-elevation/samples/v1/typescript/package.json b/sdk/maps/maps-elevation/samples/v1/typescript/package.json index de2618430acb..52338ddf2271 100644 --- a/sdk/maps/maps-elevation/samples/v1/typescript/package.json +++ b/sdk/maps/maps-elevation/samples/v1/typescript/package.json @@ -27,7 +27,8 @@ "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-elevation", "dependencies": { "@azure/maps-elevation": "next", - "dotenv": "latest" + "dotenv": "latest", + "@azure/identity": "^1.1.0" }, "devDependencies": { "typescript": "~4.2.0", diff --git a/sdk/maps/maps-geolocation/samples/v1/javascript/geolocation.js b/sdk/maps/maps-geolocation/samples/v1/javascript/geolocation.js index 06a5d3552c23..7de54b7ddef0 100644 --- a/sdk/maps/maps-geolocation/samples/v1/javascript/geolocation.js +++ b/sdk/maps/maps-geolocation/samples/v1/javascript/geolocation.js @@ -2,7 +2,7 @@ // Licensed under the MIT License. /** - * @summary Demonstrates Elevation API usage. Simple CRUD operations are performed. + * @summary Demonstrates Geolocation API usage. Simple CRUD operations are performed. */ const { DefaultAzureCredential } = require("@azure/identity"); diff --git a/sdk/maps/maps-geolocation/samples/v1/javascript/package.json b/sdk/maps/maps-geolocation/samples/v1/javascript/package.json index 91117d036b1a..d5ee8c834778 100644 --- a/sdk/maps/maps-geolocation/samples/v1/javascript/package.json +++ b/sdk/maps/maps-geolocation/samples/v1/javascript/package.json @@ -23,6 +23,7 @@ "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-geolocation", "dependencies": { "@azure/maps-geolocation": "next", - "dotenv": "latest" + "dotenv": "latest", + "@azure/identity": "^1.1.0" } } diff --git a/sdk/maps/maps-geolocation/samples/v1/typescript/package.json b/sdk/maps/maps-geolocation/samples/v1/typescript/package.json index 8cfc873bd785..9acdc81c76fd 100644 --- a/sdk/maps/maps-geolocation/samples/v1/typescript/package.json +++ b/sdk/maps/maps-geolocation/samples/v1/typescript/package.json @@ -27,7 +27,8 @@ "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-geolocation", "dependencies": { "@azure/maps-geolocation": "next", - "dotenv": "latest" + "dotenv": "latest", + "@azure/identity": "^1.1.0" }, "devDependencies": { "typescript": "~4.2.0", diff --git a/sdk/maps/maps-geolocation/samples/v1/typescript/src/geolocation.ts b/sdk/maps/maps-geolocation/samples/v1/typescript/src/geolocation.ts index e2e6239e2f90..91f487566590 100644 --- a/sdk/maps/maps-geolocation/samples/v1/typescript/src/geolocation.ts +++ b/sdk/maps/maps-geolocation/samples/v1/typescript/src/geolocation.ts @@ -2,7 +2,7 @@ // Licensed under the MIT License. /** - * @summary Demonstrates Elevation API usage. Simple queries are performed. + * @summary Demonstrates Geolocation API usage. Simple queries are performed. */ import { getDefaultAzureCredential } from "@azure/identity"; diff --git a/sdk/maps/maps-render/samples/v1/javascript/package.json b/sdk/maps/maps-render/samples/v1/javascript/package.json index 044052382739..b89a2628df1f 100644 --- a/sdk/maps/maps-render/samples/v1/javascript/package.json +++ b/sdk/maps/maps-render/samples/v1/javascript/package.json @@ -23,6 +23,7 @@ "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-render", "dependencies": { "@azure/maps-render": "next", - "dotenv": "latest" + "dotenv": "latest", + "@azure/identity": "^1.1.0" } } diff --git a/sdk/maps/maps-render/samples/v1/javascript/render.js b/sdk/maps/maps-render/samples/v1/javascript/render.js index dbb4bf156e9f..83324282b6b9 100644 --- a/sdk/maps/maps-render/samples/v1/javascript/render.js +++ b/sdk/maps/maps-render/samples/v1/javascript/render.js @@ -2,9 +2,10 @@ // Licensed under the MIT License. /** - * @summary Demonstrates Elevation API usage. Simple CRUD operations are performed. + * @summary Demonstrates Render API usage. Simple CRUD operations are performed. */ +const fs = require("fs"); const { DefaultAzureCredential } = require("@azure/identity"); const { RenderClient } = require("@azure/maps-render"); require("dotenv").config(); diff --git a/sdk/maps/maps-render/samples/v1/typescript/package.json b/sdk/maps/maps-render/samples/v1/typescript/package.json index 0011cfe3aef1..e6498cd00357 100644 --- a/sdk/maps/maps-render/samples/v1/typescript/package.json +++ b/sdk/maps/maps-render/samples/v1/typescript/package.json @@ -27,7 +27,8 @@ "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-render", "dependencies": { "@azure/maps-render": "next", - "dotenv": "latest" + "dotenv": "latest", + "@azure/identity": "^1.1.0" }, "devDependencies": { "typescript": "~4.2.0", diff --git a/sdk/maps/maps-render/samples/v1/typescript/src/render.ts b/sdk/maps/maps-render/samples/v1/typescript/src/render.ts index e49b66a3423b..e65fcdb813e1 100644 --- a/sdk/maps/maps-render/samples/v1/typescript/src/render.ts +++ b/sdk/maps/maps-render/samples/v1/typescript/src/render.ts @@ -2,7 +2,7 @@ // Licensed under the MIT License. /** - * @summary Demonstrates Elevation API usage. Simple queries are performed. + * @summary Demonstrates Render API usage. Simple queries are performed. */ import fs from "fs"; diff --git a/sdk/maps/maps-route/samples/v1/javascript/package.json b/sdk/maps/maps-route/samples/v1/javascript/package.json index 8c28b2690703..c9ecfb43d32a 100644 --- a/sdk/maps/maps-route/samples/v1/javascript/package.json +++ b/sdk/maps/maps-route/samples/v1/javascript/package.json @@ -23,6 +23,7 @@ "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-route", "dependencies": { "@azure/maps-route": "next", - "dotenv": "latest" + "dotenv": "latest", + "@azure/identity": "^1.1.0" } } diff --git a/sdk/maps/maps-route/samples/v1/javascript/route.js b/sdk/maps/maps-route/samples/v1/javascript/route.js new file mode 100644 index 000000000000..05adb2889c4b --- /dev/null +++ b/sdk/maps/maps-route/samples/v1/javascript/route.js @@ -0,0 +1,78 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Route API usage. Simple CRUD operations are performed. + */ + +const fs = require("fs"); +const { DefaultAzureCredential } = require("@azure/identity"); +const { RouteClient } = require("@azure/maps-route"); +require("dotenv").config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + const route = new RouteClient(credential).route; + + const filePathForPostRouteDirections = "../../resources/route_directions_request_body.json"; + const filePathForPostRouteDirectionsBatch = "../../resources/route_directions_batch_request_body.json"; + const filePathForPostRouteMatrix = "../../resources/route_matrix_request_body.json"; + + console.log(" --- Get route directions:"); + console.log(await route.getRouteDirections("json", "52.50931,13.42936:52.50274,13.43872", operationOptions)); + + console.log(" --- Get route range:"); + console.log(await route.getRouteRange("json", "50.97452,5.86605", { "timeBudgetInSec": 6000 }, operationOptions)); + + const postRouteDirectionsPayload = JSON.parse(fs.readFileSync(filePathForPostRouteDirections, "utf8")); + console.log(" --- Post route directions:"); + console.log(await route.postRouteDirections("json", "52.50931,13.42936:52.50274,13.43872", postRouteDirectionsPayload, operationOptions)); + + console.log(" --- Post route directions batch:"); + const postRouteDirectionsBatchPayload = JSON.parse(fs.readFileSync(filePathForPostRouteDirectionsBatch, "utf8")); + console.log(await route.beginPostRouteDirectionsBatchAndWait("json", postRouteDirectionsBatchPayload, operationOptions)); + + console.log(" --- Post route matrix:"); + const postRouteMatrixPayload = JSON.parse(fs.readFileSync(filePathForPostRouteMatrix, "utf8")); + console.log(await route.beginPostRouteMatrixAndWait("json", postRouteMatrixPayload, operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-route/samples/v1/typescript/package.json b/sdk/maps/maps-route/samples/v1/typescript/package.json index 22be83693d1e..6129ca0a395b 100644 --- a/sdk/maps/maps-route/samples/v1/typescript/package.json +++ b/sdk/maps/maps-route/samples/v1/typescript/package.json @@ -27,7 +27,8 @@ "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-route", "dependencies": { "@azure/maps-route": "next", - "dotenv": "latest" + "dotenv": "latest", + "@azure/identity": "^1.1.0" }, "devDependencies": { "typescript": "~4.2.0", diff --git a/sdk/maps/maps-search/samples/v1/typescript/src/elevation.ts b/sdk/maps/maps-route/samples/v1/typescript/src/route.ts similarity index 50% rename from sdk/maps/maps-search/samples/v1/typescript/src/elevation.ts rename to sdk/maps/maps-route/samples/v1/typescript/src/route.ts index 5e1f91bd6989..e2131eb79e1d 100644 --- a/sdk/maps/maps-search/samples/v1/typescript/src/elevation.ts +++ b/sdk/maps/maps-route/samples/v1/typescript/src/route.ts @@ -2,13 +2,14 @@ // Licensed under the MIT License. /** - * @summary Demonstrates Elevation API usage. Simple queries are performed. + * @summary Demonstrates Route API usage. Simple queries are performed. */ +import fs from "fs"; import { getDefaultAzureCredential } from "@azure/identity"; import * as coreAuth from "@azure/core-auth"; import * as coreClient from "@azure/core-client"; -import { ElevationClient } from "@azure/maps-elevation"; +import { RouteClient } from "@azure/maps-route"; import * as dotenv from "dotenv"; dotenv.config(); @@ -54,22 +55,29 @@ async function main() { credential = getDefaultAzureCredential(); } - const elevation = new ElevationClient(credential).elevation; + const route = new RouteClient(credential).route; - console.log(" --- Get Data For Bounding Box:"); - console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); + const filePathForPostRouteDirections = "../../resources/route_directions_request_body.json"; + const filePathForPostRouteDirectionsBatch = "../../resources/route_directions_batch_request_body.json"; + const filePathForPostRouteMatrix = "../../resources/route_matrix_request_body.json"; - console.log(" --- Get Data For Points:"); - console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + console.log(" --- Get route directions:"); + console.log(await route.getRouteDirections("json", "52.50931,13.42936:52.50274,13.43872", operationOptions)); - console.log(" --- Get Data For Polyline:"); - console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + console.log(" --- Get route range:"); + console.log(await route.getRouteRange("json", "50.97452,5.86605", { "timeBudgetInSec": 6000 }, operationOptions)); - console.log(" --- Post Data For Points:"); - console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + const postRouteDirectionsPayload = JSON.parse(fs.readFileSync(filePathForPostRouteDirections, "utf8")); + console.log(" --- Post route directions:"); + console.log(await route.postRouteDirections("json", "52.50931,13.42936:52.50274,13.43872", postRouteDirectionsPayload, operationOptions)); - console.log(" --- Post Data For Polyline:"); - console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + console.log(" --- Post route directions batch:"); + const postRouteDirectionsBatchPayload = JSON.parse(fs.readFileSync(filePathForPostRouteDirectionsBatch, "utf8")); + console.log(await route.beginPostRouteDirectionsBatchAndWait("json", postRouteDirectionsBatchPayload, operationOptions)); + + console.log(" --- Post route matrix:"); + const postRouteMatrixPayload = JSON.parse(fs.readFileSync(filePathForPostRouteMatrix, "utf8")); + console.log(await route.beginPostRouteMatrixAndWait("json", postRouteMatrixPayload, operationOptions)); } diff --git a/sdk/maps/maps-search/samples/v1/javascript/elevation.js b/sdk/maps/maps-search/samples/v1/javascript/elevation.js deleted file mode 100644 index 422587aca96f..000000000000 --- a/sdk/maps/maps-search/samples/v1/javascript/elevation.js +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -/** - * @summary Demonstrates Elevation API usage. Simple CRUD operations are performed. - */ - -const { DefaultAzureCredential } = require("@azure/identity"); -const { ElevationClient } = require("@azure/maps-elevation"); -require("dotenv").config(); - -/** - * Azure Maps supports two ways to authenticate requests: - * - Shared Key authentication (subscription-key) - * - Azure Active Directory (Azure AD) authentication - * - * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate - * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. - * - * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. - */ - - -/** - * Empty token class definition. To be used with AzureKey credentials. - */ -class EmptyTokenCredential { - async getToken(_scopes, _options) { - return { - token: "token", - expiresOnTimestamp: Date.now() + 60 * 60 * 1000 - }; - } -} - - -async function main() { - let credential; - let operationOptions = {}; - - if (process.env.MAPS_SUBSCRIPTION_KEY) { - // Use subscription key authentication - credential = new EmptyTokenCredential(); - operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; - } - else { - // Use Azure AD authentication - credential = new DefaultAzureCredential(); - } - - const elevation = new ElevationClient(credential).elevation; - - console.log(" --- Get Data For Bounding Box:"); - console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); - - console.log(" --- Get Data For Points:"); - console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); - - console.log(" --- Get Data For Polyline:"); - console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); - - console.log(" --- Post Data For Points:"); - console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); - - console.log(" --- Post Data For Polyline:"); - console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); - -} - -main(); diff --git a/sdk/maps/maps-search/samples/v1/javascript/package.json b/sdk/maps/maps-search/samples/v1/javascript/package.json index a36bd49b6ef0..711622eca105 100644 --- a/sdk/maps/maps-search/samples/v1/javascript/package.json +++ b/sdk/maps/maps-search/samples/v1/javascript/package.json @@ -23,6 +23,7 @@ "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-search", "dependencies": { "@azure/maps-search": "next", - "dotenv": "latest" + "dotenv": "latest", + "@azure/identity": "^1.1.0" } } diff --git a/sdk/maps/maps-search/samples/v1/javascript/search.js b/sdk/maps/maps-search/samples/v1/javascript/search.js new file mode 100644 index 000000000000..6e1ba136b03c --- /dev/null +++ b/sdk/maps/maps-search/samples/v1/javascript/search.js @@ -0,0 +1,134 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Search API usage. Simple CRUD operations are performed. + */ + +const fs = require("fs"); +const { DefaultAzureCredential } = require("@azure/identity"); +const { SearchClient } = require("@azure/maps-search"); +require("dotenv").config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + const search = new SearchClient(credential).search; + + const filePathForPostSearchAddressBatch = "../../resources/search_address_batch_request_body.json"; + const filePathForPostSearchAddressReverseBatch = "../../resources/search_address_reverse_batch_request_body.json" + const filePathForPostSearchFuzzyBatch = "../../resources/search_fuzzy_batch_request_body.json"; + const filePathForPostSearchAlongRoute = "../../resources/search_along_route_request_body.json"; + const filePathForPostSearchInsideGeometry = "../../resources/search_inside_geometry_request_body.json"; + + console.log(" --- Get search address:"); + console.log(await search.getSearchAddress("json", "15127 NE 24th Street, Redmond, WA 98052", operationOptions)); + + console.log(" --- Get search address reverse:"); + console.log(await search.getSearchAddressReverse("json", "37.337,-121.89", operationOptions)); + + console.log(" --- Get search address reverse cross street:"); + console.log(await search.getSearchAddressReverseCrossStreet("json", "37.337,-121.89", operationOptions)); + + console.log(" --- Get search address structured:"); + console.log(await search.getSearchAddressStructured("json", { + "countryCode": "US", + "streetNumber": "15127", + "streetName": "NE 24th Street", + "municipality": "Redmond", + "countrySubdivision": "WA", + "postalCode": "98052" + }, operationOptions)); + + console.log(" --- Get search fuzzy:"); + const fuzzyResult = await search.getSearchFuzzy("json", "Seattle", operationOptions); + console.log(fuzzyResult); + + // let's save geometry IDs from the fuzzy search for the getSearchPolygon example + let geometries = []; + fuzzyResult.results?.forEach((res) => geometries.push(res.dataSources.geometry.id)); + + console.log(" --- Get search nearby:"); + console.log(await search.getSearchNearby("json", 40.706270, -74.011454, { "radius": 8046 }, operationOptions)); + + console.log(" --- Get search POI:"); + console.log(await search.getSearchPOI("json", "juice bars", { + "limit": 5, + "lat": 47.606038, + "lon": -122.333345, + "radius": 8046 + }, operationOptions)); + + console.log(" --- Get search POI category:"); + console.log(await search.getSearchPOICategory("json", "atm", { + "limit": 5, + "lat": 47.606038, + "lon": -122.333345, + "radius": 8046 + }, operationOptions)); + + console.log(" --- Get search POI category tree:"); + console.log(await search.getSearchPOICategoryTreePreview("json", operationOptions)); + + console.log(" --- Get search polygon:"); + console.log(await search.getSearchPolygon("json", geometries, operationOptions)); + + console.log(" --- Post search address batch:"); + const postSearchAddressBatchPayload = JSON.parse(fs.readFileSync(filePathForPostSearchAddressBatch, "utf8")); + console.log(await search.beginPostSearchAddressBatchAndWait("json", postSearchAddressBatchPayload, operationOptions)); + + console.log(" --- Post search address reverse batch:"); + const postSearchAddressReverseBatchPayload = JSON.parse(fs.readFileSync(filePathForPostSearchAddressReverseBatch, "utf8")); + console.log(await search.beginPostSearchAddressReverseBatchAndWait("json", postSearchAddressReverseBatchPayload, operationOptions)); + + console.log(" --- Post search fuzzy batch:"); + const postSearchFuzzyBatchPayload = JSON.parse(fs.readFileSync(filePathForPostSearchFuzzyBatch, "utf8")); + console.log(await search.beginPostSearchFuzzyBatchAndWait("json", postSearchFuzzyBatchPayload, operationOptions)); + + console.log(" --- Post search along route:"); + const postSearchAlongRoutePayload = JSON.parse(fs.readFileSync(filePathForPostSearchAlongRoute, "utf8")); + console.log(await search.postSearchAlongRoute("json", "burger", 1000, postSearchAlongRoutePayload, { "limit": 2 }, operationOptions)); + + console.log(" --- Post search inside geometry:"); + const postSearchInsideGeometryPayload = JSON.parse(fs.readFileSync(filePathForPostSearchInsideGeometry, "utf8")); + console.log(await search.postSearchInsideGeometry("json", "burger", postSearchInsideGeometryPayload, { "limit": 2 }, operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-search/samples/v1/typescript/package.json b/sdk/maps/maps-search/samples/v1/typescript/package.json index d23625e29e5a..9e8bb2b0f2ff 100644 --- a/sdk/maps/maps-search/samples/v1/typescript/package.json +++ b/sdk/maps/maps-search/samples/v1/typescript/package.json @@ -27,7 +27,8 @@ "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-search", "dependencies": { "@azure/maps-search": "next", - "dotenv": "latest" + "dotenv": "latest", + "@azure/identity": "^1.1.0" }, "devDependencies": { "typescript": "~4.2.0", diff --git a/sdk/maps/maps-search/samples/v1/typescript/src/search.ts b/sdk/maps/maps-search/samples/v1/typescript/src/search.ts new file mode 100644 index 000000000000..756450179131 --- /dev/null +++ b/sdk/maps/maps-search/samples/v1/typescript/src/search.ts @@ -0,0 +1,140 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Search API usage. Simple queries are performed. + */ + +import fs from "fs"; +import { getDefaultAzureCredential } from "@azure/identity"; +import * as coreAuth from "@azure/core-auth"; +import * as coreClient from "@azure/core-client"; +import { SearchClient } from "@azure/maps-search"; +import * as dotenv from "dotenv"; +dotenv.config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential implements coreAuth.TokenCredential { + async getToken( + _scopes: string | string[], + _options?: coreAuth.GetTokenOptions + ): Promise { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential: coreAuth.TokenCredential; + let operationOptions: coreClient.OperationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = getDefaultAzureCredential(); + } + + const search = new SearchClient(credential).search; + + const filePathForPostSearchAddressBatch = "../../resources/search_address_batch_request_body.json"; + const filePathForPostSearchAddressReverseBatch = "../../resources/search_address_reverse_batch_request_body.json" + const filePathForPostSearchFuzzyBatch = "../../resources/search_fuzzy_batch_request_body.json"; + const filePathForPostSearchAlongRoute = "../../resources/search_along_route_request_body.json"; + const filePathForPostSearchInsideGeometry = "../../resources/search_inside_geometry_request_body.json"; + + console.log(" --- Get search address:"); + console.log(await search.getSearchAddress("json", "15127 NE 24th Street, Redmond, WA 98052", operationOptions)); + + console.log(" --- Get search address reverse:"); + console.log(await search.getSearchAddressReverse("json", "37.337,-121.89", operationOptions)); + + console.log(" --- Get search address reverse cross street:"); + console.log(await search.getSearchAddressReverseCrossStreet("json", "37.337,-121.89", operationOptions)); + + console.log(" --- Get search address structured:"); + console.log(await search.getSearchAddressStructured("json", { + "countryCode": "US", + "streetNumber": "15127", + "streetName": "NE 24th Street", + "municipality": "Redmond", + "countrySubdivision": "WA", + "postalCode": "98052" + }, operationOptions)); + + console.log(" --- Get search fuzzy:"); + const fuzzyResult = await search.getSearchFuzzy("json", "Seattle", operationOptions); + console.log(fuzzyResult); + + // let's save geometry IDs from the fuzzy search for the getSearchPolygon example + let geometries: string[] = []; + fuzzyResult.results?.forEach((res) => geometries.push(res.dataSources?.geometry?.id!)); + + console.log(" --- Get search nearby:"); + console.log(await search.getSearchNearby("json", 40.706270, -74.011454, { "radius": 8046 }, operationOptions)); + + console.log(" --- Get search POI:"); + console.log(await search.getSearchPOI("json", "juice bars", { + "limit": 5, + "lat": 47.606038, + "lon": -122.333345, + "radius": 8046 + }, operationOptions)); + + console.log(" --- Get search POI category:"); + console.log(await search.getSearchPOICategory("json", "atm", { + "limit": 5, + "lat": 47.606038, + "lon": -122.333345, + "radius": 8046 + }, operationOptions)); + + console.log(" --- Get search POI category tree:"); + console.log(await search.getSearchPOICategoryTreePreview("json", operationOptions)); + + console.log(" --- Get search polygon:"); + console.log(await search.getSearchPolygon("json", geometries, operationOptions)); + + console.log(" --- Post search address batch:"); + const postSearchAddressBatchPayload = JSON.parse(fs.readFileSync(filePathForPostSearchAddressBatch, "utf8")); + console.log(await search.beginPostSearchAddressBatchAndWait("json", postSearchAddressBatchPayload, operationOptions)); + + console.log(" --- Post search address reverse batch:"); + const postSearchAddressReverseBatchPayload = JSON.parse(fs.readFileSync(filePathForPostSearchAddressReverseBatch, "utf8")); + console.log(await search.beginPostSearchAddressReverseBatchAndWait("json", postSearchAddressReverseBatchPayload, operationOptions)); + + console.log(" --- Post search fuzzy batch:"); + const postSearchFuzzyBatchPayload = JSON.parse(fs.readFileSync(filePathForPostSearchFuzzyBatch, "utf8")); + console.log(await search.beginPostSearchFuzzyBatchAndWait("json", postSearchFuzzyBatchPayload, operationOptions)); + + console.log(" --- Post search along route:"); + const postSearchAlongRoutePayload = JSON.parse(fs.readFileSync(filePathForPostSearchAlongRoute, "utf8")); + console.log(await search.postSearchAlongRoute("json", "burger", 1000, postSearchAlongRoutePayload, { "limit": 2 }, operationOptions)); + + console.log(" --- Post search inside geometry:"); + const postSearchInsideGeometryPayload = JSON.parse(fs.readFileSync(filePathForPostSearchInsideGeometry, "utf8")); + console.log(await search.postSearchInsideGeometry("json", "burger", postSearchInsideGeometryPayload, { "limit": 2 }, operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-timezone/samples/v1/javascript/elevation.js b/sdk/maps/maps-timezone/samples/v1/javascript/elevation.js deleted file mode 100644 index 422587aca96f..000000000000 --- a/sdk/maps/maps-timezone/samples/v1/javascript/elevation.js +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -/** - * @summary Demonstrates Elevation API usage. Simple CRUD operations are performed. - */ - -const { DefaultAzureCredential } = require("@azure/identity"); -const { ElevationClient } = require("@azure/maps-elevation"); -require("dotenv").config(); - -/** - * Azure Maps supports two ways to authenticate requests: - * - Shared Key authentication (subscription-key) - * - Azure Active Directory (Azure AD) authentication - * - * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate - * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. - * - * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. - */ - - -/** - * Empty token class definition. To be used with AzureKey credentials. - */ -class EmptyTokenCredential { - async getToken(_scopes, _options) { - return { - token: "token", - expiresOnTimestamp: Date.now() + 60 * 60 * 1000 - }; - } -} - - -async function main() { - let credential; - let operationOptions = {}; - - if (process.env.MAPS_SUBSCRIPTION_KEY) { - // Use subscription key authentication - credential = new EmptyTokenCredential(); - operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; - } - else { - // Use Azure AD authentication - credential = new DefaultAzureCredential(); - } - - const elevation = new ElevationClient(credential).elevation; - - console.log(" --- Get Data For Bounding Box:"); - console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); - - console.log(" --- Get Data For Points:"); - console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); - - console.log(" --- Get Data For Polyline:"); - console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); - - console.log(" --- Post Data For Points:"); - console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); - - console.log(" --- Post Data For Polyline:"); - console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); - -} - -main(); diff --git a/sdk/maps/maps-timezone/samples/v1/javascript/package.json b/sdk/maps/maps-timezone/samples/v1/javascript/package.json index 667c8566f1f5..9195f97717d5 100644 --- a/sdk/maps/maps-timezone/samples/v1/javascript/package.json +++ b/sdk/maps/maps-timezone/samples/v1/javascript/package.json @@ -23,6 +23,7 @@ "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-timezone", "dependencies": { "@azure/maps-timezone": "next", - "dotenv": "latest" + "dotenv": "latest", + "@azure/identity": "^1.1.0" } } diff --git a/sdk/maps/maps-route/samples/v1/javascript/elevation.js b/sdk/maps/maps-timezone/samples/v1/javascript/timezone.js similarity index 50% rename from sdk/maps/maps-route/samples/v1/javascript/elevation.js rename to sdk/maps/maps-timezone/samples/v1/javascript/timezone.js index 422587aca96f..4d55e6b4f853 100644 --- a/sdk/maps/maps-route/samples/v1/javascript/elevation.js +++ b/sdk/maps/maps-timezone/samples/v1/javascript/timezone.js @@ -2,11 +2,11 @@ // Licensed under the MIT License. /** - * @summary Demonstrates Elevation API usage. Simple CRUD operations are performed. + * @summary Demonstrates Timezone API usage. Simple CRUD operations are performed. */ const { DefaultAzureCredential } = require("@azure/identity"); -const { ElevationClient } = require("@azure/maps-elevation"); +const { TimezoneClient } = require("@azure/maps-timezone"); require("dotenv").config(); /** @@ -48,22 +48,25 @@ async function main() { credential = new DefaultAzureCredential(); } - const elevation = new ElevationClient(credential).elevation; + const timezone = new TimezoneClient(credential).timezone; - console.log(" --- Get Data For Bounding Box:"); - console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); + console.log(" --- Get timezone by coordinates:"); + console.log(await timezone.getTimezoneByCoordinates("json", "47.0,-122", { "options": "all" }, operationOptions)); - console.log(" --- Get Data For Points:"); - console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + console.log(" --- Get enum IANA timezones:"); + console.log(await timezone.getTimezoneEnumIana("json", operationOptions)); - console.log(" --- Get Data For Polyline:"); - console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + console.log(" --- Get IANA version:"); + console.log(await timezone.getTimezoneIanaVersion("json", operationOptions)); - console.log(" --- Post Data For Points:"); - console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + console.log(" --- Get timezone by IANA ID:"); + console.log(await timezone.getTimezoneByID("json", "Asia/Bahrain", { "options": "all" }, operationOptions)); - console.log(" --- Post Data For Polyline:"); - console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + console.log(" --- Get enum Windows timezones:"); + console.log(await timezone.getTimezoneEnumWindows("json", operationOptions)); + + console.log(" --- Get Windows timezone to IANA:"); + console.log(await timezone.getTimezoneWindowsToIana("json", "Eastern Standard Time", operationOptions)); } diff --git a/sdk/maps/maps-timezone/samples/v1/typescript/package.json b/sdk/maps/maps-timezone/samples/v1/typescript/package.json index 5f3b96967288..b160287b2728 100644 --- a/sdk/maps/maps-timezone/samples/v1/typescript/package.json +++ b/sdk/maps/maps-timezone/samples/v1/typescript/package.json @@ -27,7 +27,8 @@ "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-timezone", "dependencies": { "@azure/maps-timezone": "next", - "dotenv": "latest" + "dotenv": "latest", + "@azure/identity": "^1.1.0" }, "devDependencies": { "typescript": "~4.2.0", diff --git a/sdk/maps/maps-timezone/samples/v1/typescript/src/elevation.ts b/sdk/maps/maps-timezone/samples/v1/typescript/src/timezone.ts similarity index 56% rename from sdk/maps/maps-timezone/samples/v1/typescript/src/elevation.ts rename to sdk/maps/maps-timezone/samples/v1/typescript/src/timezone.ts index 5e1f91bd6989..e00cc5784835 100644 --- a/sdk/maps/maps-timezone/samples/v1/typescript/src/elevation.ts +++ b/sdk/maps/maps-timezone/samples/v1/typescript/src/timezone.ts @@ -2,13 +2,13 @@ // Licensed under the MIT License. /** - * @summary Demonstrates Elevation API usage. Simple queries are performed. + * @summary Demonstrates Timezone API usage. Simple queries are performed. */ import { getDefaultAzureCredential } from "@azure/identity"; import * as coreAuth from "@azure/core-auth"; import * as coreClient from "@azure/core-client"; -import { ElevationClient } from "@azure/maps-elevation"; +import { TimezoneClient } from "@azure/maps-timezone"; import * as dotenv from "dotenv"; dotenv.config(); @@ -54,22 +54,25 @@ async function main() { credential = getDefaultAzureCredential(); } - const elevation = new ElevationClient(credential).elevation; + const timezone = new TimezoneClient(credential).timezone; - console.log(" --- Get Data For Bounding Box:"); - console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); + console.log(" --- Get timezone by coordinates:"); + console.log(await timezone.getTimezoneByCoordinates("json", "47.0,-122", { "options": "all" }, operationOptions)); - console.log(" --- Get Data For Points:"); - console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + console.log(" --- Get enum IANA timezones:"); + console.log(await timezone.getTimezoneEnumIana("json", operationOptions)); - console.log(" --- Get Data For Polyline:"); - console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + console.log(" --- Get IANA version:"); + console.log(await timezone.getTimezoneIanaVersion("json", operationOptions)); - console.log(" --- Post Data For Points:"); - console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + console.log(" --- Get timezone by IANA ID:"); + console.log(await timezone.getTimezoneByID("json", "Asia/Bahrain", { "options": "all" }, operationOptions)); - console.log(" --- Post Data For Polyline:"); - console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + console.log(" --- Get enum Windows timezones:"); + console.log(await timezone.getTimezoneEnumWindows("json", operationOptions)); + + console.log(" --- Get Windows timezone to IANA:"); + console.log(await timezone.getTimezoneWindowsToIana("json", "Eastern Standard Time", operationOptions)); } diff --git a/sdk/maps/maps-traffic/samples/v1/javascript/elevation.js b/sdk/maps/maps-traffic/samples/v1/javascript/elevation.js deleted file mode 100644 index 422587aca96f..000000000000 --- a/sdk/maps/maps-traffic/samples/v1/javascript/elevation.js +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -/** - * @summary Demonstrates Elevation API usage. Simple CRUD operations are performed. - */ - -const { DefaultAzureCredential } = require("@azure/identity"); -const { ElevationClient } = require("@azure/maps-elevation"); -require("dotenv").config(); - -/** - * Azure Maps supports two ways to authenticate requests: - * - Shared Key authentication (subscription-key) - * - Azure Active Directory (Azure AD) authentication - * - * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate - * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. - * - * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. - */ - - -/** - * Empty token class definition. To be used with AzureKey credentials. - */ -class EmptyTokenCredential { - async getToken(_scopes, _options) { - return { - token: "token", - expiresOnTimestamp: Date.now() + 60 * 60 * 1000 - }; - } -} - - -async function main() { - let credential; - let operationOptions = {}; - - if (process.env.MAPS_SUBSCRIPTION_KEY) { - // Use subscription key authentication - credential = new EmptyTokenCredential(); - operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; - } - else { - // Use Azure AD authentication - credential = new DefaultAzureCredential(); - } - - const elevation = new ElevationClient(credential).elevation; - - console.log(" --- Get Data For Bounding Box:"); - console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); - - console.log(" --- Get Data For Points:"); - console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); - - console.log(" --- Get Data For Polyline:"); - console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); - - console.log(" --- Post Data For Points:"); - console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); - - console.log(" --- Post Data For Polyline:"); - console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); - -} - -main(); diff --git a/sdk/maps/maps-traffic/samples/v1/javascript/package.json b/sdk/maps/maps-traffic/samples/v1/javascript/package.json index dc474f099dec..f20c71f76f42 100644 --- a/sdk/maps/maps-traffic/samples/v1/javascript/package.json +++ b/sdk/maps/maps-traffic/samples/v1/javascript/package.json @@ -23,6 +23,7 @@ "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-traffic", "dependencies": { "@azure/maps-traffic": "next", - "dotenv": "latest" + "dotenv": "latest", + "@azure/identity": "^1.1.0" } } diff --git a/sdk/maps/maps-traffic/samples/v1/javascript/traffic.js b/sdk/maps/maps-traffic/samples/v1/javascript/traffic.js new file mode 100644 index 000000000000..d21dcdf402ba --- /dev/null +++ b/sdk/maps/maps-traffic/samples/v1/javascript/traffic.js @@ -0,0 +1,77 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Traffic API usage. Simple CRUD operations are performed. + */ + +const fs = require("fs"); +const { DefaultAzureCredential } = require("@azure/identity"); +const { TrafficClient } = require("@azure/maps-traffic"); +require("dotenv").config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + const traffic = new TrafficClient(credential).traffic; + + console.log(" --- Get traffic flow segment:"); + console.log(await traffic.getTrafficFlowSegment("json", "absolute", 10, "52.41072,4.84239", operationOptions)); + + console.log(" --- Get traffic flow tile:"); + let result = await traffic.getTrafficFlowTile("png", "absolute", 12, 2044, 1360, operationOptions); + // use result.blobBody for Browser, readableStreamBody for Node.js: + result.readableStreamBody?.pipe(fs.createWriteStream("tmp/traffic_flow_tile.png")); + + console.log(" --- Get traffic incident detail:"); + console.log(await traffic.getTrafficIncidentDetail("json", "s3", "6841263.950712,511972.674418,6886056.049288,582676.925582", 11, "1335294634919", operationOptions)); + + console.log(" --- Get traffic incident tile:"); + result = await traffic.getTrafficIncidentTile("png", "night", 10, 175, 408, operationOptions); + // use result.blobBody for Browser, readableStreamBody for Node.js: + result.readableStreamBody?.pipe(fs.createWriteStream("tmp/traffic_incident_tile.png")); + + console.log(" --- Get traffic incident viewport:"); + const viewportBBox = "-939584.4813015489,-23954526.723651607,14675583.153020501,25043442.895825107"; + const overviewBBox = "-939584.4813018347,-23954526.723651607,14675583.153020501,25043442.8958229083"; + console.log(await traffic.getTrafficIncidentViewport("json", viewportBBox, 2, overviewBBox, 2, operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-traffic/samples/v1/typescript/package.json b/sdk/maps/maps-traffic/samples/v1/typescript/package.json index 94479c477776..a6a780b76b7b 100644 --- a/sdk/maps/maps-traffic/samples/v1/typescript/package.json +++ b/sdk/maps/maps-traffic/samples/v1/typescript/package.json @@ -27,7 +27,8 @@ "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-traffic", "dependencies": { "@azure/maps-traffic": "next", - "dotenv": "latest" + "dotenv": "latest", + "@azure/identity": "^1.1.0" }, "devDependencies": { "typescript": "~4.2.0", diff --git a/sdk/maps/maps-traffic/samples/v1/typescript/src/elevation.ts b/sdk/maps/maps-traffic/samples/v1/typescript/src/traffic.ts similarity index 51% rename from sdk/maps/maps-traffic/samples/v1/typescript/src/elevation.ts rename to sdk/maps/maps-traffic/samples/v1/typescript/src/traffic.ts index 5e1f91bd6989..d355679e5246 100644 --- a/sdk/maps/maps-traffic/samples/v1/typescript/src/elevation.ts +++ b/sdk/maps/maps-traffic/samples/v1/typescript/src/traffic.ts @@ -2,13 +2,14 @@ // Licensed under the MIT License. /** - * @summary Demonstrates Elevation API usage. Simple queries are performed. + * @summary Demonstrates Traffic API usage. Simple queries are performed. */ +import fs from "fs"; import { getDefaultAzureCredential } from "@azure/identity"; import * as coreAuth from "@azure/core-auth"; import * as coreClient from "@azure/core-client"; -import { ElevationClient } from "@azure/maps-elevation"; +import { TrafficClient } from "@azure/maps-traffic"; import * as dotenv from "dotenv"; dotenv.config(); @@ -54,22 +55,28 @@ async function main() { credential = getDefaultAzureCredential(); } - const elevation = new ElevationClient(credential).elevation; + const traffic = new TrafficClient(credential).traffic; - console.log(" --- Get Data For Bounding Box:"); - console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); + console.log(" --- Get traffic flow segment:"); + console.log(await traffic.getTrafficFlowSegment("json", "absolute", 10, "52.41072,4.84239", operationOptions)); - console.log(" --- Get Data For Points:"); - console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + console.log(" --- Get traffic flow tile:"); + let result = await traffic.getTrafficFlowTile("png", "absolute", 12, 2044, 1360, operationOptions); + // use result.blobBody for Browser, readableStreamBody for Node.js: + result.readableStreamBody?.pipe(fs.createWriteStream("tmp/traffic_flow_tile.png")); - console.log(" --- Get Data For Polyline:"); - console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + console.log(" --- Get traffic incident detail:"); + console.log(await traffic.getTrafficIncidentDetail("json", "s3", "6841263.950712,511972.674418,6886056.049288,582676.925582", 11, "1335294634919", operationOptions)); - console.log(" --- Post Data For Points:"); - console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + console.log(" --- Get traffic incident tile:"); + result = await traffic.getTrafficIncidentTile("png", "night", 10, 175, 408, operationOptions); + // use result.blobBody for Browser, readableStreamBody for Node.js: + result.readableStreamBody?.pipe(fs.createWriteStream("tmp/traffic_incident_tile.png")); - console.log(" --- Post Data For Polyline:"); - console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + console.log(" --- Get traffic incident viewport:"); + const viewportBBox = "-939584.4813015489,-23954526.723651607,14675583.153020501,25043442.895825107"; + const overviewBBox = "-939584.4813018347,-23954526.723651607,14675583.153020501,25043442.8958229083"; + console.log(await traffic.getTrafficIncidentViewport("json", viewportBBox, 2, overviewBBox, 2, operationOptions)); } diff --git a/sdk/maps/maps-weather/samples/v1/javascript/elevation.js b/sdk/maps/maps-weather/samples/v1/javascript/elevation.js deleted file mode 100644 index 422587aca96f..000000000000 --- a/sdk/maps/maps-weather/samples/v1/javascript/elevation.js +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -/** - * @summary Demonstrates Elevation API usage. Simple CRUD operations are performed. - */ - -const { DefaultAzureCredential } = require("@azure/identity"); -const { ElevationClient } = require("@azure/maps-elevation"); -require("dotenv").config(); - -/** - * Azure Maps supports two ways to authenticate requests: - * - Shared Key authentication (subscription-key) - * - Azure Active Directory (Azure AD) authentication - * - * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate - * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. - * - * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. - */ - - -/** - * Empty token class definition. To be used with AzureKey credentials. - */ -class EmptyTokenCredential { - async getToken(_scopes, _options) { - return { - token: "token", - expiresOnTimestamp: Date.now() + 60 * 60 * 1000 - }; - } -} - - -async function main() { - let credential; - let operationOptions = {}; - - if (process.env.MAPS_SUBSCRIPTION_KEY) { - // Use subscription key authentication - credential = new EmptyTokenCredential(); - operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; - } - else { - // Use Azure AD authentication - credential = new DefaultAzureCredential(); - } - - const elevation = new ElevationClient(credential).elevation; - - console.log(" --- Get Data For Bounding Box:"); - console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); - - console.log(" --- Get Data For Points:"); - console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); - - console.log(" --- Get Data For Polyline:"); - console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); - - console.log(" --- Post Data For Points:"); - console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); - - console.log(" --- Post Data For Polyline:"); - console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); - -} - -main(); diff --git a/sdk/maps/maps-weather/samples/v1/javascript/package.json b/sdk/maps/maps-weather/samples/v1/javascript/package.json index eff07b322d5f..b9909406c227 100644 --- a/sdk/maps/maps-weather/samples/v1/javascript/package.json +++ b/sdk/maps/maps-weather/samples/v1/javascript/package.json @@ -23,6 +23,7 @@ "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-weather", "dependencies": { "@azure/maps-weather": "next", - "dotenv": "latest" + "dotenv": "latest", + "@azure/identity": "^1.1.0" } } diff --git a/sdk/maps/maps-weather/samples/v1/javascript/weather.js b/sdk/maps/maps-weather/samples/v1/javascript/weather.js new file mode 100644 index 000000000000..b52ce1248c5d --- /dev/null +++ b/sdk/maps/maps-weather/samples/v1/javascript/weather.js @@ -0,0 +1,79 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @summary Demonstrates Weather API usage. Simple CRUD operations are performed. + */ + +const { DefaultAzureCredential } = require("@azure/identity"); +const { WeatherClient } = require("@azure/maps-weather"); +require("dotenv").config(); + +/** + * Azure Maps supports two ways to authenticate requests: + * - Shared Key authentication (subscription-key) + * - Azure Active Directory (Azure AD) authentication + * + * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate + * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. + * + * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. + */ + + +/** + * Empty token class definition. To be used with AzureKey credentials. + */ +class EmptyTokenCredential { + async getToken(_scopes, _options) { + return { + token: "token", + expiresOnTimestamp: Date.now() + 60 * 60 * 1000 + }; + } +} + + +async function main() { + let credential; + let operationOptions = {}; + + if (process.env.MAPS_SUBSCRIPTION_KEY) { + // Use subscription key authentication + credential = new EmptyTokenCredential(); + operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; + } + else { + // Use Azure AD authentication + credential = new DefaultAzureCredential(); + } + + const weather = new WeatherClient(credential).weather; + + console.log(" --- Get current weather conditions:"); + console.log(await weather.getCurrentConditions("json", "47.641268,-122.125679", operationOptions)); + + console.log(" --- Get daily forecast:"); + console.log(await weather.getDailyForecast("json", "62.6490341,30.0734812", { "duration": 5 }, operationOptions)); + + console.log(" --- Get daily indices:"); + console.log(await weather.getDailyIndices("json", "43.84745,-79.37849", { "indexGroupId": 11 }, operationOptions)); + + console.log(" --- Get hourly forecast:"); + console.log(await weather.getHourlyForecast("json", "47.632346,-122.138874", { "duration": 12 }, operationOptions)); + + console.log(" --- Get minute forecast:"); + console.log(await weather.getMinuteForecast("json", "47.632346,-122.138874", { "interval": 15 }, operationOptions)); + + console.log(" --- Get quarter day forecast:"); + console.log(await weather.getQuarterDayForecast("json", "47.632346,-122.138874", { "duration": 1 }, operationOptions)); + + console.log(" --- Get severe weather alerts:"); + console.log(await weather.getSevereWeatherAlerts("json", "48.057,-81.091", operationOptions)); + + console.log(" --- Get weather along route:"); + console.log(await weather.getWeatherAlongRoute("json", "38.907,-77.037,0:38.907,-77.009,10:38.926,-76.928,20:39.033,-76.852,30:39.168,-76.732,40:39.269,-76.634,50:39.287,-76.612,60", operationOptions)); + +} + +main(); diff --git a/sdk/maps/maps-weather/samples/v1/typescript/package.json b/sdk/maps/maps-weather/samples/v1/typescript/package.json index 6a973b12c2d3..f60745a54342 100644 --- a/sdk/maps/maps-weather/samples/v1/typescript/package.json +++ b/sdk/maps/maps-weather/samples/v1/typescript/package.json @@ -27,7 +27,8 @@ "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-weather", "dependencies": { "@azure/maps-weather": "next", - "dotenv": "latest" + "dotenv": "latest", + "@azure/identity": "^1.1.0" }, "devDependencies": { "typescript": "~4.2.0", diff --git a/sdk/maps/maps-weather/samples/v1/typescript/src/elevation.ts b/sdk/maps/maps-weather/samples/v1/typescript/src/elevation.ts deleted file mode 100644 index 5e1f91bd6989..000000000000 --- a/sdk/maps/maps-weather/samples/v1/typescript/src/elevation.ts +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -/** - * @summary Demonstrates Elevation API usage. Simple queries are performed. - */ - -import { getDefaultAzureCredential } from "@azure/identity"; -import * as coreAuth from "@azure/core-auth"; -import * as coreClient from "@azure/core-client"; -import { ElevationClient } from "@azure/maps-elevation"; -import * as dotenv from "dotenv"; -dotenv.config(); - -/** - * Azure Maps supports two ways to authenticate requests: - * - Shared Key authentication (subscription-key) - * - Azure Active Directory (Azure AD) authentication - * - * In this sample you can put MAPS_SUBSCRIPTION_KEY into .env file to use the first approach or populate - * the three AZURE_CLIENT_ID, AZURE_CLIENT_SECRET & AZURE_TENANT_ID variables for trying out AAD auth. - * - * More info is available at https://docs.microsoft.com/en-us/azure/azure-maps/azure-maps-authentication. - */ - - -/** - * Empty token class definition. To be used with AzureKey credentials. - */ -class EmptyTokenCredential implements coreAuth.TokenCredential { - async getToken( - _scopes: string | string[], - _options?: coreAuth.GetTokenOptions - ): Promise { - return { - token: "token", - expiresOnTimestamp: Date.now() + 60 * 60 * 1000 - }; - } -} - - -async function main() { - let credential: coreAuth.TokenCredential; - let operationOptions: coreClient.OperationOptions = {}; - - if (process.env.MAPS_SUBSCRIPTION_KEY) { - // Use subscription key authentication - credential = new EmptyTokenCredential(); - operationOptions.requestOptions = { customHeaders: { "subscription-key": process.env.MAPS_SUBSCRIPTION_KEY } }; - } - else { - // Use Azure AD authentication - credential = getDefaultAzureCredential(); - } - - const elevation = new ElevationClient(credential).elevation; - - console.log(" --- Get Data For Bounding Box:"); - console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); - - console.log(" --- Get Data For Points:"); - console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); - - console.log(" --- Get Data For Polyline:"); - console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); - - console.log(" --- Post Data For Points:"); - console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); - - console.log(" --- Post Data For Polyline:"); - console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); - -} - -main(); diff --git a/sdk/maps/maps-route/samples/v1/typescript/src/elevation.ts b/sdk/maps/maps-weather/samples/v1/typescript/src/weather.ts similarity index 51% rename from sdk/maps/maps-route/samples/v1/typescript/src/elevation.ts rename to sdk/maps/maps-weather/samples/v1/typescript/src/weather.ts index 5e1f91bd6989..fa2f3789531a 100644 --- a/sdk/maps/maps-route/samples/v1/typescript/src/elevation.ts +++ b/sdk/maps/maps-weather/samples/v1/typescript/src/weather.ts @@ -2,13 +2,13 @@ // Licensed under the MIT License. /** - * @summary Demonstrates Elevation API usage. Simple queries are performed. + * @summary Demonstrates Weather API usage. Simple queries are performed. */ import { getDefaultAzureCredential } from "@azure/identity"; import * as coreAuth from "@azure/core-auth"; import * as coreClient from "@azure/core-client"; -import { ElevationClient } from "@azure/maps-elevation"; +import { WeatherClient } from "@azure/maps-weather"; import * as dotenv from "dotenv"; dotenv.config(); @@ -54,22 +54,31 @@ async function main() { credential = getDefaultAzureCredential(); } - const elevation = new ElevationClient(credential).elevation; + const weather = new WeatherClient(credential).weather; - console.log(" --- Get Data For Bounding Box:"); - console.log(await elevation.getDataForBoundingBox("json", ["-121.66853362143818", "46.84646479863713", "-121.65853362143818", "46.85646479863713"], 3, 3, operationOptions)); + console.log(" --- Get current weather conditions:"); + console.log(await weather.getCurrentConditions("json", "47.641268,-122.125679", operationOptions)); - console.log(" --- Get Data For Points:"); - console.log(await elevation.getDataForPoints("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + console.log(" --- Get daily forecast:"); + console.log(await weather.getDailyForecast("json", "62.6490341,30.0734812", { "duration": 5 }, operationOptions)); - console.log(" --- Get Data For Polyline:"); - console.log(await elevation.getDataForPolyline("json", ["-121.66853362143818,46.84646479863713", "-121.65853362143818,46.85646479863713"], operationOptions)); + console.log(" --- Get daily indices:"); + console.log(await weather.getDailyIndices("json", "43.84745,-79.37849", { "indexGroupId": 11 }, operationOptions)); - console.log(" --- Post Data For Points:"); - console.log(await elevation.postDataForPoints("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + console.log(" --- Get hourly forecast:"); + console.log(await weather.getHourlyForecast("json", "47.632346,-122.138874", { "duration": 12 }, operationOptions)); - console.log(" --- Post Data For Polyline:"); - console.log(await elevation.postDataForPolyline("json", [{ lat: 46.84646479863713, lon: -121.66853362143818 }, { lat: 46.85646479863713, lon: -121.65853362143818 }], operationOptions)); + console.log(" --- Get minute forecast:"); + console.log(await weather.getMinuteForecast("json", "47.632346,-122.138874", { "interval": 15 }, operationOptions)); + + console.log(" --- Get quarter day forecast:"); + console.log(await weather.getQuarterDayForecast("json", "47.632346,-122.138874", { "duration": 1 }, operationOptions)); + + console.log(" --- Get severe weather alerts:"); + console.log(await weather.getSevereWeatherAlerts("json", "48.057,-81.091", operationOptions)); + + console.log(" --- Get weather along route:"); + console.log(await weather.getWeatherAlongRoute("json", "38.907,-77.037,0:38.907,-77.009,10:38.926,-76.928,20:39.033,-76.852,30:39.168,-76.732,40:39.269,-76.634,50:39.287,-76.612,60", operationOptions)); } From 20fb619ed554212aa09025f613f9513b7a0be739 Mon Sep 17 00:00:00 2001 From: Filip Proborszcz Date: Thu, 1 Jul 2021 23:58:42 +0200 Subject: [PATCH 3/4] Remove SDK lib code - leave samples only --- sdk/maps/maps-creator/LICENSE.txt | 21 - sdk/maps/maps-creator/README.md | 91 - sdk/maps/maps-creator/api-extractor.json | 18 - sdk/maps/maps-creator/package.json | 87 - .../maps-creator/review/maps-creator.api.md | 1213 ------- sdk/maps/maps-creator/rollup.config.js | 188 -- .../v1/javascript/tmp/Data_uploaded.zip | Bin 0 -> 946883 bytes sdk/maps/maps-creator/src/creatorClient.ts | 62 - .../maps-creator/src/creatorClientContext.ts | 61 - sdk/maps/maps-creator/src/index.ts | 13 - .../maps-creator/src/lro/azureAsyncPolling.ts | 83 - sdk/maps/maps-creator/src/lro/bodyPolling.ts | 45 - sdk/maps/maps-creator/src/lro/index.ts | 10 - .../maps-creator/src/lro/locationPolling.ts | 32 - sdk/maps/maps-creator/src/lro/lroPoller.ts | 66 - sdk/maps/maps-creator/src/lro/models.ts | 52 - sdk/maps/maps-creator/src/lro/operation.ts | 132 - sdk/maps/maps-creator/src/lro/passthrough.ts | 24 - .../maps-creator/src/lro/pollingMethod.ts | 91 - sdk/maps/maps-creator/src/lro/requestUtils.ts | 194 -- sdk/maps/maps-creator/src/lro/stateMachine.ts | 216 -- sdk/maps/maps-creator/src/models/index.ts | 1742 ---------- sdk/maps/maps-creator/src/models/mappers.ts | 2429 -------------- .../maps-creator/src/models/parameters.ts | 629 ---- sdk/maps/maps-creator/src/operations/alias.ts | 445 --- .../maps-creator/src/operations/conversion.ts | 593 ---- sdk/maps/maps-creator/src/operations/data.ts | 1051 ------ .../maps-creator/src/operations/dataset.ts | 635 ---- .../src/operations/featureState.ts | 484 --- sdk/maps/maps-creator/src/operations/index.ts | 16 - .../maps-creator/src/operations/spatial.ts | 631 ---- .../maps-creator/src/operations/tileset.ts | 442 --- sdk/maps/maps-creator/src/operations/wfs.ts | 431 --- .../src/operationsInterfaces/alias.ts | 207 -- .../src/operationsInterfaces/conversion.ts | 276 -- .../src/operationsInterfaces/data.ts | 521 --- .../src/operationsInterfaces/dataset.ts | 293 -- .../src/operationsInterfaces/featureState.ts | 195 -- .../src/operationsInterfaces/index.ts | 16 - .../src/operationsInterfaces/spatial.ts | 338 -- .../src/operationsInterfaces/tileset.ts | 179 - .../src/operationsInterfaces/wfs.ts | 211 -- sdk/maps/maps-creator/tsconfig.json | 20 - sdk/maps/maps-elevation/LICENSE.txt | 21 - sdk/maps/maps-elevation/README.md | 91 - sdk/maps/maps-elevation/api-extractor.json | 18 - sdk/maps/maps-elevation/package.json | 84 - .../review/maps-elevation.api.md | 166 - sdk/maps/maps-elevation/rollup.config.js | 188 -- .../maps-elevation/src/elevationClient.ts | 30 - .../src/elevationClientContext.ts | 63 - sdk/maps/maps-elevation/src/index.ts | 12 - sdk/maps/maps-elevation/src/models/index.ts | 215 -- sdk/maps/maps-elevation/src/models/mappers.ts | 236 -- .../maps-elevation/src/models/parameters.ts | 222 -- .../src/operations/elevation.ts | 304 -- .../maps-elevation/src/operations/index.ts | 9 - .../src/operationsInterfaces/elevation.ts | 156 - .../src/operationsInterfaces/index.ts | 9 - sdk/maps/maps-elevation/tsconfig.json | 20 - sdk/maps/maps-geolocation/LICENSE.txt | 21 - sdk/maps/maps-geolocation/README.md | 91 - sdk/maps/maps-geolocation/api-extractor.json | 18 - sdk/maps/maps-geolocation/package.json | 84 - .../review/maps-geolocation.api.md | 110 - sdk/maps/maps-geolocation/rollup.config.js | 188 -- .../maps-geolocation/src/geolocationClient.ts | 30 - .../src/geolocationClientContext.ts | 63 - sdk/maps/maps-geolocation/src/index.ts | 12 - sdk/maps/maps-geolocation/src/models/index.ts | 150 - .../maps-geolocation/src/models/mappers.ts | 144 - .../maps-geolocation/src/models/parameters.ts | 80 - .../src/operations/geolocation.ts | 76 - .../maps-geolocation/src/operations/index.ts | 9 - .../src/operationsInterfaces/geolocation.ts | 37 - .../src/operationsInterfaces/index.ts | 9 - sdk/maps/maps-geolocation/tsconfig.json | 20 - sdk/maps/maps-render/LICENSE.txt | 21 - sdk/maps/maps-render/README.md | 91 - sdk/maps/maps-render/api-extractor.json | 18 - sdk/maps/maps-render/package.json | 84 - .../maps-render/review/maps-render.api.md | 378 --- sdk/maps/maps-render/rollup.config.js | 188 -- sdk/maps/maps-render/src/index.ts | 12 - sdk/maps/maps-render/src/models/index.ts | 1041 ------ sdk/maps/maps-render/src/models/mappers.ts | 377 --- sdk/maps/maps-render/src/models/parameters.ts | 424 --- sdk/maps/maps-render/src/operations/index.ts | 10 - sdk/maps/maps-render/src/operations/render.ts | 565 ---- .../maps-render/src/operations/renderV2.ts | 110 - .../src/operationsInterfaces/index.ts | 10 - .../src/operationsInterfaces/render.ts | 310 -- .../src/operationsInterfaces/renderV2.ts | 57 - sdk/maps/maps-render/src/renderClient.ts | 32 - .../maps-render/src/renderClientContext.ts | 61 - sdk/maps/maps-render/tsconfig.json | 20 - sdk/maps/maps-route/LICENSE.txt | 21 - sdk/maps/maps-route/README.md | 91 - sdk/maps/maps-route/api-extractor.json | 18 - sdk/maps/maps-route/package.json | 86 - sdk/maps/maps-route/review/maps-route.api.md | 882 ----- sdk/maps/maps-route/rollup.config.js | 188 -- sdk/maps/maps-route/src/index.ts | 12 - .../maps-route/src/lro/azureAsyncPolling.ts | 83 - sdk/maps/maps-route/src/lro/bodyPolling.ts | 45 - sdk/maps/maps-route/src/lro/index.ts | 10 - .../maps-route/src/lro/locationPolling.ts | 32 - sdk/maps/maps-route/src/lro/lroPoller.ts | 66 - sdk/maps/maps-route/src/lro/models.ts | 52 - sdk/maps/maps-route/src/lro/operation.ts | 132 - sdk/maps/maps-route/src/lro/passthrough.ts | 24 - sdk/maps/maps-route/src/lro/pollingMethod.ts | 91 - sdk/maps/maps-route/src/lro/requestUtils.ts | 194 -- sdk/maps/maps-route/src/lro/stateMachine.ts | 216 -- sdk/maps/maps-route/src/models/index.ts | 2287 ------------- sdk/maps/maps-route/src/models/mappers.ts | 1619 --------- sdk/maps/maps-route/src/models/parameters.ts | 597 ---- sdk/maps/maps-route/src/operations/index.ts | 9 - sdk/maps/maps-route/src/operations/route.ts | 1595 --------- .../src/operationsInterfaces/index.ts | 9 - .../src/operationsInterfaces/route.ts | 1118 ------- sdk/maps/maps-route/src/routeClient.ts | 30 - sdk/maps/maps-route/src/routeClientContext.ts | 63 - sdk/maps/maps-route/tsconfig.json | 20 - sdk/maps/maps-search/LICENSE.txt | 21 - sdk/maps/maps-search/README.md | 91 - sdk/maps/maps-search/api-extractor.json | 18 - sdk/maps/maps-search/package.json | 86 - .../maps-search/review/maps-search.api.md | 850 ----- sdk/maps/maps-search/rollup.config.js | 188 -- sdk/maps/maps-search/src/index.ts | 12 - .../maps-search/src/lro/azureAsyncPolling.ts | 83 - sdk/maps/maps-search/src/lro/bodyPolling.ts | 45 - sdk/maps/maps-search/src/lro/index.ts | 10 - .../maps-search/src/lro/locationPolling.ts | 32 - sdk/maps/maps-search/src/lro/lroPoller.ts | 66 - sdk/maps/maps-search/src/lro/models.ts | 52 - sdk/maps/maps-search/src/lro/operation.ts | 132 - sdk/maps/maps-search/src/lro/passthrough.ts | 24 - sdk/maps/maps-search/src/lro/pollingMethod.ts | 91 - sdk/maps/maps-search/src/lro/requestUtils.ts | 194 -- sdk/maps/maps-search/src/lro/stateMachine.ts | 216 -- sdk/maps/maps-search/src/models/index.ts | 2088 ------------ sdk/maps/maps-search/src/models/mappers.ts | 1893 ----------- sdk/maps/maps-search/src/models/parameters.ts | 620 ---- sdk/maps/maps-search/src/operations/index.ts | 9 - sdk/maps/maps-search/src/operations/search.ts | 2899 ----------------- .../src/operationsInterfaces/index.ts | 9 - .../src/operationsInterfaces/search.ts | 2121 ------------ sdk/maps/maps-search/src/searchClient.ts | 30 - .../maps-search/src/searchClientContext.ts | 63 - sdk/maps/maps-search/tsconfig.json | 20 - sdk/maps/maps-timezone/LICENSE.txt | 21 - sdk/maps/maps-timezone/README.md | 91 - sdk/maps/maps-timezone/api-extractor.json | 18 - sdk/maps/maps-timezone/package.json | 84 - .../maps-timezone/review/maps-timezone.api.md | 268 -- sdk/maps/maps-timezone/rollup.config.js | 188 -- sdk/maps/maps-timezone/src/index.ts | 12 - sdk/maps/maps-timezone/src/models/index.ts | 528 --- sdk/maps/maps-timezone/src/models/mappers.ts | 657 ---- .../maps-timezone/src/models/parameters.ts | 140 - .../maps-timezone/src/operations/index.ts | 9 - .../maps-timezone/src/operations/timezone.ts | 321 -- .../src/operationsInterfaces/index.ts | 9 - .../src/operationsInterfaces/timezone.ts | 129 - sdk/maps/maps-timezone/src/timezoneClient.ts | 30 - .../src/timezoneClientContext.ts | 63 - sdk/maps/maps-timezone/tsconfig.json | 20 - sdk/maps/maps-traffic/LICENSE.txt | 21 - sdk/maps/maps-traffic/README.md | 91 - sdk/maps/maps-traffic/api-extractor.json | 18 - sdk/maps/maps-traffic/package.json | 84 - .../maps-traffic/review/maps-traffic.api.md | 336 -- sdk/maps/maps-traffic/rollup.config.js | 188 -- sdk/maps/maps-traffic/src/index.ts | 12 - sdk/maps/maps-traffic/src/models/index.ts | 657 ---- sdk/maps/maps-traffic/src/models/mappers.ts | 563 ---- .../maps-traffic/src/models/parameters.ts | 364 --- sdk/maps/maps-traffic/src/operations/index.ts | 9 - .../maps-traffic/src/operations/traffic.ts | 397 --- .../src/operationsInterfaces/index.ts | 9 - .../src/operationsInterfaces/traffic.ts | 222 -- sdk/maps/maps-traffic/src/trafficClient.ts | 30 - .../maps-traffic/src/trafficClientContext.ts | 63 - sdk/maps/maps-traffic/tsconfig.json | 20 - sdk/maps/maps-weather/LICENSE.txt | 21 - sdk/maps/maps-weather/README.md | 91 - sdk/maps/maps-weather/api-extractor.json | 18 - sdk/maps/maps-weather/package.json | 84 - .../maps-weather/review/maps-weather.api.md | 636 ---- sdk/maps/maps-weather/rollup.config.js | 188 -- sdk/maps/maps-weather/src/index.ts | 12 - sdk/maps/maps-weather/src/models/index.ts | 1069 ------ sdk/maps/maps-weather/src/models/mappers.ts | 2159 ------------ .../maps-weather/src/models/parameters.ts | 150 - sdk/maps/maps-weather/src/operations/index.ts | 9 - .../maps-weather/src/operations/weather.ts | 486 --- .../src/operationsInterfaces/index.ts | 9 - .../src/operationsInterfaces/weather.ts | 247 -- sdk/maps/maps-weather/src/weatherClient.ts | 30 - .../maps-weather/src/weatherClientContext.ts | 63 - sdk/maps/maps-weather/tsconfig.json | 20 - 203 files changed, 53795 deletions(-) delete mode 100644 sdk/maps/maps-creator/LICENSE.txt delete mode 100644 sdk/maps/maps-creator/README.md delete mode 100644 sdk/maps/maps-creator/api-extractor.json delete mode 100644 sdk/maps/maps-creator/package.json delete mode 100644 sdk/maps/maps-creator/review/maps-creator.api.md delete mode 100644 sdk/maps/maps-creator/rollup.config.js create mode 100644 sdk/maps/maps-creator/samples/v1/javascript/tmp/Data_uploaded.zip delete mode 100644 sdk/maps/maps-creator/src/creatorClient.ts delete mode 100644 sdk/maps/maps-creator/src/creatorClientContext.ts delete mode 100644 sdk/maps/maps-creator/src/index.ts delete mode 100644 sdk/maps/maps-creator/src/lro/azureAsyncPolling.ts delete mode 100644 sdk/maps/maps-creator/src/lro/bodyPolling.ts delete mode 100644 sdk/maps/maps-creator/src/lro/index.ts delete mode 100644 sdk/maps/maps-creator/src/lro/locationPolling.ts delete mode 100644 sdk/maps/maps-creator/src/lro/lroPoller.ts delete mode 100644 sdk/maps/maps-creator/src/lro/models.ts delete mode 100644 sdk/maps/maps-creator/src/lro/operation.ts delete mode 100644 sdk/maps/maps-creator/src/lro/passthrough.ts delete mode 100644 sdk/maps/maps-creator/src/lro/pollingMethod.ts delete mode 100644 sdk/maps/maps-creator/src/lro/requestUtils.ts delete mode 100644 sdk/maps/maps-creator/src/lro/stateMachine.ts delete mode 100644 sdk/maps/maps-creator/src/models/index.ts delete mode 100644 sdk/maps/maps-creator/src/models/mappers.ts delete mode 100644 sdk/maps/maps-creator/src/models/parameters.ts delete mode 100644 sdk/maps/maps-creator/src/operations/alias.ts delete mode 100644 sdk/maps/maps-creator/src/operations/conversion.ts delete mode 100644 sdk/maps/maps-creator/src/operations/data.ts delete mode 100644 sdk/maps/maps-creator/src/operations/dataset.ts delete mode 100644 sdk/maps/maps-creator/src/operations/featureState.ts delete mode 100644 sdk/maps/maps-creator/src/operations/index.ts delete mode 100644 sdk/maps/maps-creator/src/operations/spatial.ts delete mode 100644 sdk/maps/maps-creator/src/operations/tileset.ts delete mode 100644 sdk/maps/maps-creator/src/operations/wfs.ts delete mode 100644 sdk/maps/maps-creator/src/operationsInterfaces/alias.ts delete mode 100644 sdk/maps/maps-creator/src/operationsInterfaces/conversion.ts delete mode 100644 sdk/maps/maps-creator/src/operationsInterfaces/data.ts delete mode 100644 sdk/maps/maps-creator/src/operationsInterfaces/dataset.ts delete mode 100644 sdk/maps/maps-creator/src/operationsInterfaces/featureState.ts delete mode 100644 sdk/maps/maps-creator/src/operationsInterfaces/index.ts delete mode 100644 sdk/maps/maps-creator/src/operationsInterfaces/spatial.ts delete mode 100644 sdk/maps/maps-creator/src/operationsInterfaces/tileset.ts delete mode 100644 sdk/maps/maps-creator/src/operationsInterfaces/wfs.ts delete mode 100644 sdk/maps/maps-creator/tsconfig.json delete mode 100644 sdk/maps/maps-elevation/LICENSE.txt delete mode 100644 sdk/maps/maps-elevation/README.md delete mode 100644 sdk/maps/maps-elevation/api-extractor.json delete mode 100644 sdk/maps/maps-elevation/package.json delete mode 100644 sdk/maps/maps-elevation/review/maps-elevation.api.md delete mode 100644 sdk/maps/maps-elevation/rollup.config.js delete mode 100644 sdk/maps/maps-elevation/src/elevationClient.ts delete mode 100644 sdk/maps/maps-elevation/src/elevationClientContext.ts delete mode 100644 sdk/maps/maps-elevation/src/index.ts delete mode 100644 sdk/maps/maps-elevation/src/models/index.ts delete mode 100644 sdk/maps/maps-elevation/src/models/mappers.ts delete mode 100644 sdk/maps/maps-elevation/src/models/parameters.ts delete mode 100644 sdk/maps/maps-elevation/src/operations/elevation.ts delete mode 100644 sdk/maps/maps-elevation/src/operations/index.ts delete mode 100644 sdk/maps/maps-elevation/src/operationsInterfaces/elevation.ts delete mode 100644 sdk/maps/maps-elevation/src/operationsInterfaces/index.ts delete mode 100644 sdk/maps/maps-elevation/tsconfig.json delete mode 100644 sdk/maps/maps-geolocation/LICENSE.txt delete mode 100644 sdk/maps/maps-geolocation/README.md delete mode 100644 sdk/maps/maps-geolocation/api-extractor.json delete mode 100644 sdk/maps/maps-geolocation/package.json delete mode 100644 sdk/maps/maps-geolocation/review/maps-geolocation.api.md delete mode 100644 sdk/maps/maps-geolocation/rollup.config.js delete mode 100644 sdk/maps/maps-geolocation/src/geolocationClient.ts delete mode 100644 sdk/maps/maps-geolocation/src/geolocationClientContext.ts delete mode 100644 sdk/maps/maps-geolocation/src/index.ts delete mode 100644 sdk/maps/maps-geolocation/src/models/index.ts delete mode 100644 sdk/maps/maps-geolocation/src/models/mappers.ts delete mode 100644 sdk/maps/maps-geolocation/src/models/parameters.ts delete mode 100644 sdk/maps/maps-geolocation/src/operations/geolocation.ts delete mode 100644 sdk/maps/maps-geolocation/src/operations/index.ts delete mode 100644 sdk/maps/maps-geolocation/src/operationsInterfaces/geolocation.ts delete mode 100644 sdk/maps/maps-geolocation/src/operationsInterfaces/index.ts delete mode 100644 sdk/maps/maps-geolocation/tsconfig.json delete mode 100644 sdk/maps/maps-render/LICENSE.txt delete mode 100644 sdk/maps/maps-render/README.md delete mode 100644 sdk/maps/maps-render/api-extractor.json delete mode 100644 sdk/maps/maps-render/package.json delete mode 100644 sdk/maps/maps-render/review/maps-render.api.md delete mode 100644 sdk/maps/maps-render/rollup.config.js delete mode 100644 sdk/maps/maps-render/src/index.ts delete mode 100644 sdk/maps/maps-render/src/models/index.ts delete mode 100644 sdk/maps/maps-render/src/models/mappers.ts delete mode 100644 sdk/maps/maps-render/src/models/parameters.ts delete mode 100644 sdk/maps/maps-render/src/operations/index.ts delete mode 100644 sdk/maps/maps-render/src/operations/render.ts delete mode 100644 sdk/maps/maps-render/src/operations/renderV2.ts delete mode 100644 sdk/maps/maps-render/src/operationsInterfaces/index.ts delete mode 100644 sdk/maps/maps-render/src/operationsInterfaces/render.ts delete mode 100644 sdk/maps/maps-render/src/operationsInterfaces/renderV2.ts delete mode 100644 sdk/maps/maps-render/src/renderClient.ts delete mode 100644 sdk/maps/maps-render/src/renderClientContext.ts delete mode 100644 sdk/maps/maps-render/tsconfig.json delete mode 100644 sdk/maps/maps-route/LICENSE.txt delete mode 100644 sdk/maps/maps-route/README.md delete mode 100644 sdk/maps/maps-route/api-extractor.json delete mode 100644 sdk/maps/maps-route/package.json delete mode 100644 sdk/maps/maps-route/review/maps-route.api.md delete mode 100644 sdk/maps/maps-route/rollup.config.js delete mode 100644 sdk/maps/maps-route/src/index.ts delete mode 100644 sdk/maps/maps-route/src/lro/azureAsyncPolling.ts delete mode 100644 sdk/maps/maps-route/src/lro/bodyPolling.ts delete mode 100644 sdk/maps/maps-route/src/lro/index.ts delete mode 100644 sdk/maps/maps-route/src/lro/locationPolling.ts delete mode 100644 sdk/maps/maps-route/src/lro/lroPoller.ts delete mode 100644 sdk/maps/maps-route/src/lro/models.ts delete mode 100644 sdk/maps/maps-route/src/lro/operation.ts delete mode 100644 sdk/maps/maps-route/src/lro/passthrough.ts delete mode 100644 sdk/maps/maps-route/src/lro/pollingMethod.ts delete mode 100644 sdk/maps/maps-route/src/lro/requestUtils.ts delete mode 100644 sdk/maps/maps-route/src/lro/stateMachine.ts delete mode 100644 sdk/maps/maps-route/src/models/index.ts delete mode 100644 sdk/maps/maps-route/src/models/mappers.ts delete mode 100644 sdk/maps/maps-route/src/models/parameters.ts delete mode 100644 sdk/maps/maps-route/src/operations/index.ts delete mode 100644 sdk/maps/maps-route/src/operations/route.ts delete mode 100644 sdk/maps/maps-route/src/operationsInterfaces/index.ts delete mode 100644 sdk/maps/maps-route/src/operationsInterfaces/route.ts delete mode 100644 sdk/maps/maps-route/src/routeClient.ts delete mode 100644 sdk/maps/maps-route/src/routeClientContext.ts delete mode 100644 sdk/maps/maps-route/tsconfig.json delete mode 100644 sdk/maps/maps-search/LICENSE.txt delete mode 100644 sdk/maps/maps-search/README.md delete mode 100644 sdk/maps/maps-search/api-extractor.json delete mode 100644 sdk/maps/maps-search/package.json delete mode 100644 sdk/maps/maps-search/review/maps-search.api.md delete mode 100644 sdk/maps/maps-search/rollup.config.js delete mode 100644 sdk/maps/maps-search/src/index.ts delete mode 100644 sdk/maps/maps-search/src/lro/azureAsyncPolling.ts delete mode 100644 sdk/maps/maps-search/src/lro/bodyPolling.ts delete mode 100644 sdk/maps/maps-search/src/lro/index.ts delete mode 100644 sdk/maps/maps-search/src/lro/locationPolling.ts delete mode 100644 sdk/maps/maps-search/src/lro/lroPoller.ts delete mode 100644 sdk/maps/maps-search/src/lro/models.ts delete mode 100644 sdk/maps/maps-search/src/lro/operation.ts delete mode 100644 sdk/maps/maps-search/src/lro/passthrough.ts delete mode 100644 sdk/maps/maps-search/src/lro/pollingMethod.ts delete mode 100644 sdk/maps/maps-search/src/lro/requestUtils.ts delete mode 100644 sdk/maps/maps-search/src/lro/stateMachine.ts delete mode 100644 sdk/maps/maps-search/src/models/index.ts delete mode 100644 sdk/maps/maps-search/src/models/mappers.ts delete mode 100644 sdk/maps/maps-search/src/models/parameters.ts delete mode 100644 sdk/maps/maps-search/src/operations/index.ts delete mode 100644 sdk/maps/maps-search/src/operations/search.ts delete mode 100644 sdk/maps/maps-search/src/operationsInterfaces/index.ts delete mode 100644 sdk/maps/maps-search/src/operationsInterfaces/search.ts delete mode 100644 sdk/maps/maps-search/src/searchClient.ts delete mode 100644 sdk/maps/maps-search/src/searchClientContext.ts delete mode 100644 sdk/maps/maps-search/tsconfig.json delete mode 100644 sdk/maps/maps-timezone/LICENSE.txt delete mode 100644 sdk/maps/maps-timezone/README.md delete mode 100644 sdk/maps/maps-timezone/api-extractor.json delete mode 100644 sdk/maps/maps-timezone/package.json delete mode 100644 sdk/maps/maps-timezone/review/maps-timezone.api.md delete mode 100644 sdk/maps/maps-timezone/rollup.config.js delete mode 100644 sdk/maps/maps-timezone/src/index.ts delete mode 100644 sdk/maps/maps-timezone/src/models/index.ts delete mode 100644 sdk/maps/maps-timezone/src/models/mappers.ts delete mode 100644 sdk/maps/maps-timezone/src/models/parameters.ts delete mode 100644 sdk/maps/maps-timezone/src/operations/index.ts delete mode 100644 sdk/maps/maps-timezone/src/operations/timezone.ts delete mode 100644 sdk/maps/maps-timezone/src/operationsInterfaces/index.ts delete mode 100644 sdk/maps/maps-timezone/src/operationsInterfaces/timezone.ts delete mode 100644 sdk/maps/maps-timezone/src/timezoneClient.ts delete mode 100644 sdk/maps/maps-timezone/src/timezoneClientContext.ts delete mode 100644 sdk/maps/maps-timezone/tsconfig.json delete mode 100644 sdk/maps/maps-traffic/LICENSE.txt delete mode 100644 sdk/maps/maps-traffic/README.md delete mode 100644 sdk/maps/maps-traffic/api-extractor.json delete mode 100644 sdk/maps/maps-traffic/package.json delete mode 100644 sdk/maps/maps-traffic/review/maps-traffic.api.md delete mode 100644 sdk/maps/maps-traffic/rollup.config.js delete mode 100644 sdk/maps/maps-traffic/src/index.ts delete mode 100644 sdk/maps/maps-traffic/src/models/index.ts delete mode 100644 sdk/maps/maps-traffic/src/models/mappers.ts delete mode 100644 sdk/maps/maps-traffic/src/models/parameters.ts delete mode 100644 sdk/maps/maps-traffic/src/operations/index.ts delete mode 100644 sdk/maps/maps-traffic/src/operations/traffic.ts delete mode 100644 sdk/maps/maps-traffic/src/operationsInterfaces/index.ts delete mode 100644 sdk/maps/maps-traffic/src/operationsInterfaces/traffic.ts delete mode 100644 sdk/maps/maps-traffic/src/trafficClient.ts delete mode 100644 sdk/maps/maps-traffic/src/trafficClientContext.ts delete mode 100644 sdk/maps/maps-traffic/tsconfig.json delete mode 100644 sdk/maps/maps-weather/LICENSE.txt delete mode 100644 sdk/maps/maps-weather/README.md delete mode 100644 sdk/maps/maps-weather/api-extractor.json delete mode 100644 sdk/maps/maps-weather/package.json delete mode 100644 sdk/maps/maps-weather/review/maps-weather.api.md delete mode 100644 sdk/maps/maps-weather/rollup.config.js delete mode 100644 sdk/maps/maps-weather/src/index.ts delete mode 100644 sdk/maps/maps-weather/src/models/index.ts delete mode 100644 sdk/maps/maps-weather/src/models/mappers.ts delete mode 100644 sdk/maps/maps-weather/src/models/parameters.ts delete mode 100644 sdk/maps/maps-weather/src/operations/index.ts delete mode 100644 sdk/maps/maps-weather/src/operations/weather.ts delete mode 100644 sdk/maps/maps-weather/src/operationsInterfaces/index.ts delete mode 100644 sdk/maps/maps-weather/src/operationsInterfaces/weather.ts delete mode 100644 sdk/maps/maps-weather/src/weatherClient.ts delete mode 100644 sdk/maps/maps-weather/src/weatherClientContext.ts delete mode 100644 sdk/maps/maps-weather/tsconfig.json diff --git a/sdk/maps/maps-creator/LICENSE.txt b/sdk/maps/maps-creator/LICENSE.txt deleted file mode 100644 index ccb63b166732..000000000000 --- a/sdk/maps/maps-creator/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2021 Microsoft - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/sdk/maps/maps-creator/README.md b/sdk/maps/maps-creator/README.md deleted file mode 100644 index d9d4bd1ccbb1..000000000000 --- a/sdk/maps/maps-creator/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# Azure Creator client library for JavaScript - -This package contains an isomorphic SDK (runs both in Node.js and in browsers) for Azure Creator client. - -APIs for managing aliases in Azure Maps. - -[Source code](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-creator) | -[Package (NPM)](https://www.npmjs.com/package/@azure/maps-creator) | -[API reference documentation](https://docs.microsoft.com/javascript/api/@azure/maps-creator) | -[Samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-creator/samples) - -## Getting started - -### Currently supported environments - -- [LTS versions of Node.js](https://nodejs.org/about/releases/) -- Latest versions of Safari, Chrome, Edge and Firefox. - -### Prerequisites - -- An [Azure subscription][azure_sub]. - -### Install the `@azure/maps-creator` package - -Install the Azure Creator client library for JavaScript with `npm`: - -```bash -npm install @azure/maps-creator -``` - -### Create and authenticate a `CreatorClient` - -To create a client object to access the Azure Creator API, you will need the `endpoint` of your Azure Creator resource and a `credential`. The Azure Creator client can use Azure Active Directory credentials to authenticate. -You can find the endpoint for your Azure Creator resource in the [Azure Portal][azure_portal]. - -#### Using an Azure Active Directory Credential - -You can authenticate with Azure Active Directory using the [Azure Identity library][azure_identity]. To use the [DefaultAzureCredential][defaultazurecredential] provider shown below, or other credential providers provided with the Azure SDK, please install the `@azure/identity` package: - -```bash -npm install @azure/identity -``` - -You will also need to register a new AAD application and grant access to Azure Creator by assigning the suitable role to your service principal (note: roles such as `"Owner"` will not grant the necessary permissions). -Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`. - -```javascript -const { CreatorClient } = require("@azure/maps-creator"); -const { DefaultAzureCredential } = require("@azure/identity"); -const client = new CreatorClient("", new DefaultAzureCredential()); -``` - -## Key concepts - -### CreatorClient - -`CreatorClient` is the primary interface for developers using the Azure Creator client library. Explore the methods on this client object to understand the different features of the Azure Creator service that you can access. - -## Troubleshooting - -### Logging - -Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: - -```javascript -import { setLogLevel } from "@azure/logger"; -setLogLevel("info"); -``` - -For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger). - -## Next steps - -Please take a look at the [samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-creator/samples) directory for detailed examples on how to use this library. - -## Contributing - -If you'd like to contribute to this library, please read the [contributing guide](https://github.com/Azure/azure-sdk-for-js/blob/master/CONTRIBUTING.md) to learn more about how to build and test the code. - -## Related projects - -- [Microsoft Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) - -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fmaps%2Fmaps-creator%2FREADME.png) - -[azure_cli]: https://docs.microsoft.com/cli/azure -[azure_sub]: https://azure.microsoft.com/free/ -[azure_sub]: https://azure.microsoft.com/free/ -[azure_portal]: https://portal.azure.com -[azure_identity]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity -[defaultazurecredential]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity#defaultazurecredential diff --git a/sdk/maps/maps-creator/api-extractor.json b/sdk/maps/maps-creator/api-extractor.json deleted file mode 100644 index 5fb5b21b56f2..000000000000 --- a/sdk/maps/maps-creator/api-extractor.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", - "mainEntryPointFilePath": "./esm/index.d.ts", - "docModel": { "enabled": true }, - "apiReport": { "enabled": true, "reportFolder": "./review" }, - "dtsRollup": { - "enabled": true, - "untrimmedFilePath": "", - "publicTrimmedFilePath": "./esm/index.d.ts" - }, - "messages": { - "tsdocMessageReporting": { "default": { "logLevel": "none" } }, - "extractorMessageReporting": { - "ae-missing-release-tag": { "logLevel": "none" }, - "ae-unresolved-link": { "logLevel": "none" } - } - } -} diff --git a/sdk/maps/maps-creator/package.json b/sdk/maps/maps-creator/package.json deleted file mode 100644 index f60bd7c01534..000000000000 --- a/sdk/maps/maps-creator/package.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "name": "@azure/maps-creator", - "sdk-type": "client", - "author": "Microsoft Corporation", - "description": "A generated SDK for CreatorClient.", - "version": "1.0.0-beta.1", - "engines": { "node": ">=12.0.0" }, - "dependencies": { - "@azure/core-lro": "^1.0.6", - "@azure/abort-controller": "^1.0.0", - "@azure/core-paging": "^1.1.1", - "@azure/core-client": "^1.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-rest-pipeline": "^1.1.0", - "tslib": "^2.2.0" - }, - "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], - "license": "MIT", - "main": "./dist/index.js", - "module": "./esm/index.js", - "types": "./esm/index.d.ts", - "devDependencies": { - "@microsoft/api-extractor": "7.7.11", - "@rollup/plugin-commonjs": "11.0.2", - "@rollup/plugin-json": "^4.0.0", - "@rollup/plugin-multi-entry": "^3.0.0", - "@rollup/plugin-node-resolve": "^8.0.0", - "mkdirp": "^1.0.4", - "rollup": "^1.16.3", - "rollup-plugin-sourcemaps": "^0.4.2", - "rollup-plugin-node-resolve": "^3.4.0", - "typescript": "~4.2.0", - "uglify-js": "^3.4.9" - }, - "homepage": "https://github.com/Azure/azure-sdk-for-js", - "repository": { - "type": "git", - "url": "https://github.com/Azure/azure-sdk-for-js.git" - }, - "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, - "files": [ - "dist/**/*.js", - "dist/**/*.js.map", - "dist/**/*.d.ts", - "dist/**/*.d.ts.map", - "esm/**/*.js", - "esm/**/*.js.map", - "esm/**/*.d.ts", - "esm/**/*.d.ts.map", - "src/**/*.ts", - "README.md", - "rollup.config.js", - "tsconfig.json", - "review/*", - "CHANGELOG.md" - ], - "scripts": { - "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", - "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js", - "prepack": "npm install && npm run build", - "pack": "npm pack 2>&1", - "extract-api": "mkdirp ./review && api-extractor run --local", - "lint": "echo skipped", - "audit": "echo skipped", - "clean": "echo skipped", - "build:node": "echo skipped", - "build:browser": "echo skipped", - "build:test": "echo skipped", - "build:samples": "echo skipped.", - "check-format": "echo skipped", - "execute:samples": "echo skipped", - "format": "echo skipped", - "test": "echo skipped", - "prebuild": "echo skipped", - "test:node": "echo skipped", - "test:browser": "echo skipped", - "unit-test": "echo skipped", - "unit-test:node": "echo skipped", - "unit-test:browser": "echo skipped", - "integration-test:browser": "echo skipped", - "integration-test:node": "echo skipped", - "integration-test": "echo skipped", - "docs": "echo skipped" - }, - "sideEffects": false, - "autoPublish": true -} diff --git a/sdk/maps/maps-creator/review/maps-creator.api.md b/sdk/maps/maps-creator/review/maps-creator.api.md deleted file mode 100644 index 9d11f13508b1..000000000000 --- a/sdk/maps/maps-creator/review/maps-creator.api.md +++ /dev/null @@ -1,1213 +0,0 @@ -## API Report File for "@azure/maps-creator" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -import * as coreAuth from '@azure/core-auth'; -import * as coreClient from '@azure/core-client'; -import * as coreRestPipeline from '@azure/core-rest-pipeline'; -import { PagedAsyncIterableIterator } from '@azure/core-paging'; -import { PollerLike } from '@azure/core-lro'; -import { PollOperationState } from '@azure/core-lro'; - -// @public -export interface Alias { - assign(aliasId: string, creatorDataItemId: string, options?: AliasAssignOptionalParams): Promise; - create(options?: AliasCreateOptionalParams): Promise; - delete(aliasId: string, options?: AliasDeleteOptionalParams): Promise; - getDetails(aliasId: string, options?: AliasGetDetailsOptionalParams): Promise; - list(options?: AliasListOptionalParams): PagedAsyncIterableIterator; -} - -// @public -export interface AliasAssignOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type AliasAssignResponse = AliasListItem; - -// @public -export interface AliasCreateHeaders { - accessControlExposeHeaders?: string; -} - -// @public -export interface AliasCreateOptionalParams extends coreClient.OperationOptions { - creatorDataItemId?: string; -} - -// @public -export type AliasCreateResponse = AliasCreateHeaders & AliasesCreateResponse; - -// @public -export interface AliasDeleteOptionalParams extends coreClient.OperationOptions { -} - -// @public -export interface AliasesCreateResponse { - readonly aliasId?: string; - readonly createdTimestamp?: string; - readonly creatorDataItemId?: string; - readonly lastUpdatedTimestamp?: string; -} - -// @public -export interface AliasGetDetailsOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type AliasGetDetailsResponse = AliasListItem; - -// @public -export interface AliasListItem { - readonly aliasId?: string; - readonly createdTimestamp?: string; - readonly creatorDataItemId?: string | null; - readonly lastUpdatedTimestamp?: string; -} - -// @public -export interface AliasListNextOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type AliasListNextResponse = AliasListResponse; - -// @public -export type AliasListOperationResponse = AliasListResponse; - -// @public -export interface AliasListOptionalParams extends coreClient.OperationOptions { -} - -// @public -export interface AliasListResponse { - readonly aliases?: AliasListItem[]; - readonly nextLink?: string; -} - -// @public -export interface BooleanRuleObject { - false?: string; - true?: string; -} - -// @public -export type BooleanTypeStyleRule = StyleObject & { - type: "boolean"; - rules: BooleanRuleObject[]; -}; - -// @public -export interface BufferRequestBody { - distances?: number[]; - geometries?: Record; -} - -// @public -export interface BufferResponse { - result?: GeoJsonFeatureCollectionUnion; - readonly summary?: BufferResponseSummary; -} - -// @public -export interface BufferResponseSummary { - readonly information?: string; - readonly udid?: string; -} - -// @public -export interface ClosestPointResponse { - result?: ClosestPointResultEntry[]; - readonly summary?: ClosestPointSummary; -} - -// @public -export interface ClosestPointResultEntry { - readonly distanceInMeters?: number; - readonly geometryId?: string; - position?: SpatialCoordinate; -} - -// @public -export interface ClosestPointSummary { - readonly information?: string; - sourcePoint?: SpatialCoordinate; - readonly udid?: string; -} - -// @public -export interface CollectionDefinitionResponse { - description?: string; - featureTypes: string[]; - geometryType: GeoJsonGeometryType; - idPrefix: string; - links?: WfsEndpointLink[]; - name: string; - readonly ontology?: string; - properties?: DefinitionProperties[]; - title?: string; -} - -// @public (undocumented) -export interface CollectionInfo { - description?: string; - links: WfsEndpointLink[]; - name: string; - readonly ontology?: string; - title?: string; -} - -// @public (undocumented) -export interface CollectionsResponse { - collections: CollectionInfo[]; - links: WfsEndpointLink[]; - readonly ontology?: string; -} - -// @public (undocumented) -export interface ConformanceResponse { - conformsTo: string[]; -} - -// @public -export interface Conversion { - beginConvert(udid: string, outputOntology: string, options?: ConversionConvertOptionalParams): Promise, ConversionConvertResponse>>; - beginConvertAndWait(udid: string, outputOntology: string, options?: ConversionConvertOptionalParams): Promise; - delete(conversionId: string, options?: ConversionDeleteOptionalParams): Promise; - get(conversionId: string, options?: ConversionGetOptionalParams): Promise; - getOperation(operationId: string, options?: ConversionGetOperationOptionalParams): Promise; - list(options?: ConversionListOptionalParams): PagedAsyncIterableIterator; -} - -// @public -export interface ConversionConvertHeaders { - resourceLocation?: string; -} - -// @public -export interface ConversionConvertOptionalParams extends coreClient.OperationOptions { - description?: string; - resumeFrom?: string; - updateIntervalInMs?: number; -} - -// @public -export type ConversionConvertResponse = ConversionConvertHeaders & LongRunningOperationResult; - -// @public -export interface ConversionDeleteOptionalParams extends coreClient.OperationOptions { -} - -// @public -export interface ConversionGetOperationHeaders { - resourceLocation?: string; -} - -// @public -export interface ConversionGetOperationOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type ConversionGetOperationResponse = ConversionGetOperationHeaders & LongRunningOperationResult; - -// @public -export interface ConversionGetOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type ConversionGetResponse = ConversionListDetailInfo; - -// @public -export interface ConversionListDetailInfo { - readonly conversionId?: string; - readonly created?: string; - readonly description?: string; - readonly featureCounts?: Record; - readonly ontology?: string; - readonly udid?: string; -} - -// @public -export interface ConversionListNextOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type ConversionListNextResponse = ConversionListResponse; - -// @public -export type ConversionListOperationResponse = ConversionListResponse; - -// @public -export interface ConversionListOptionalParams extends coreClient.OperationOptions { -} - -// @public -export interface ConversionListResponse { - readonly conversions?: ConversionListDetailInfo[]; - readonly nextLink?: string; -} - -// @public (undocumented) -export class CreatorClient extends CreatorClientContext { - constructor(credentials: coreAuth.TokenCredential, options?: CreatorClientOptionalParams); - // (undocumented) - alias: Alias; - // (undocumented) - conversion: Conversion; - // (undocumented) - data: Data; - // (undocumented) - dataset: Dataset; - // (undocumented) - featureState: FeatureState; - // (undocumented) - spatial: Spatial; - // (undocumented) - tileset: Tileset; - // (undocumented) - wfs: Wfs; -} - -// @public (undocumented) -export class CreatorClientContext extends coreClient.ServiceClient { - constructor(credentials: coreAuth.TokenCredential, options?: CreatorClientOptionalParams); - // (undocumented) - geography: Geography; - // (undocumented) - xMsClientId?: string; -} - -// @public -export interface CreatorClientOptionalParams extends coreClient.ServiceClientOptions { - endpoint?: string; - geography?: Geography; - xMsClientId?: string; -} - -// @public -export interface Data { - beginUpdatePreview(uniqueDataId: string, updateContent: Record, options?: DataUpdatePreviewOptionalParams): Promise, DataUpdatePreviewResponse>>; - beginUpdatePreviewAndWait(uniqueDataId: string, updateContent: Record, options?: DataUpdatePreviewOptionalParams): Promise; - beginUploadPreview(...args: [ - UploadDataFormat, - "application/octet-stream", - coreRestPipeline.RequestBodyType, - DataUploadPreview$binaryOptionalParams? - ] | [ - UploadDataFormat, - "application/json", - Record, - DataUploadPreview$jsonOptionalParams? - ]): Promise, DataUploadPreviewResponse>>; - beginUploadPreviewAndWait(...args: [ - UploadDataFormat, - "application/octet-stream", - coreRestPipeline.RequestBodyType, - DataUploadPreview$binaryOptionalParams? - ] | [ - UploadDataFormat, - "application/json", - Record, - DataUploadPreview$jsonOptionalParams? - ]): Promise; - deletePreview(uniqueDataId: string, options?: DataDeletePreviewOptionalParams): Promise; - downloadPreview(uniqueDataId: string, options?: DataDownloadPreviewOptionalParams): Promise; - getOperationPreview(operationId: string, options?: DataGetOperationPreviewOptionalParams): Promise; - listPreview(options?: DataListPreviewOptionalParams): Promise; -} - -// @public -export interface DataDeletePreviewOptionalParams extends coreClient.OperationOptions { -} - -// @public -export interface DataDownloadPreviewHeaders { - contentType?: string; -} - -// @public -export interface DataDownloadPreviewOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type DataDownloadPreviewResponse = DataDownloadPreviewHeaders & { - blobBody?: Promise; - readableStreamBody?: NodeJS.ReadableStream; -}; - -// @public -export interface DataGetOperationPreviewHeaders { - resourceLocation?: string; -} - -// @public -export interface DataGetOperationPreviewOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type DataGetOperationPreviewResponse = DataGetOperationPreviewHeaders & LongRunningOperationResult; - -// @public -export interface DataListPreviewOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type DataListPreviewResponse = MapDataListResponse; - -// @public -export interface Dataset { - beginCreate(conversionId: string, options?: DatasetCreateOptionalParams): Promise, DatasetCreateResponse>>; - beginCreateAndWait(conversionId: string, options?: DatasetCreateOptionalParams): Promise; - delete(datasetId: string, options?: DatasetDeleteOptionalParams): Promise; - get(datasetId: string, options?: DatasetGetOptionalParams): Promise; - getOperation(operationId: string, options?: DatasetGetOperationOptionalParams): Promise; - list(options?: DatasetListOptionalParams): PagedAsyncIterableIterator; -} - -// @public -export interface DatasetCreateHeaders { - resourceLocation?: string; -} - -// @public -export interface DatasetCreateOptionalParams extends coreClient.OperationOptions { - datasetId?: string; - descriptionDataset?: string; - resumeFrom?: string; - updateIntervalInMs?: number; -} - -// @public -export type DatasetCreateResponse = DatasetCreateHeaders & LongRunningOperationResult; - -// @public -export interface DatasetDeleteOptionalParams extends coreClient.OperationOptions { -} - -// @public -export interface DatasetDetailInfo { - readonly created?: string; - readonly datasetId?: string; - datasetSources?: DatasetSources; - readonly description?: string; - readonly featureCounts?: Record; - readonly ontology?: string; -} - -// @public -export interface DatasetGetOperationHeaders { - resourceLocation?: string; -} - -// @public -export interface DatasetGetOperationOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type DatasetGetOperationResponse = DatasetGetOperationHeaders & LongRunningOperationResult; - -// @public -export interface DatasetGetOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type DatasetGetResponse = DatasetDetailInfo; - -// @public -export interface DatasetListNextOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type DatasetListNextResponse = DatasetListResponse; - -// @public -export type DatasetListOperationResponse = DatasetListResponse; - -// @public -export interface DatasetListOptionalParams extends coreClient.OperationOptions { -} - -// @public -export interface DatasetListResponse { - readonly datasets?: DatasetDetailInfo[]; - readonly nextLink?: string; -} - -// @public -export interface DatasetSources { - readonly appendDatasetId?: string; - readonly conversionIds?: string[]; -} - -// @public -export interface DataUpdatePreviewHeaders { - resourceLocation?: string; -} - -// @public -export interface DataUpdatePreviewOptionalParams extends coreClient.OperationOptions { - resumeFrom?: string; - updateIntervalInMs?: number; - uploadDataDescription?: string; -} - -// @public -export type DataUpdatePreviewResponse = DataUpdatePreviewHeaders & LongRunningOperationResult; - -// @public -export interface DataUploadPreview$binaryOptionalParams extends coreClient.OperationOptions { - resumeFrom?: string; - updateIntervalInMs?: number; - uploadDataDescription?: string; -} - -// @public -export interface DataUploadPreview$jsonOptionalParams extends coreClient.OperationOptions { - resumeFrom?: string; - updateIntervalInMs?: number; - uploadDataDescription?: string; -} - -// @public -export interface DataUploadPreviewHeaders { - resourceLocation?: string; -} - -// @public -export type DataUploadPreviewResponse = DataUploadPreviewHeaders & LongRunningOperationResult; - -// @public (undocumented) -export interface DefinitionProperties { - name: string; - required: boolean; - type: Record; -} - -// @public -export interface ErrorAdditionalInfo { - readonly info?: Record; - readonly type?: string; -} - -// @public -export interface ErrorDetail { - readonly additionalInfo?: ErrorAdditionalInfo[]; - readonly code?: string; - readonly details?: ErrorDetail[]; - readonly message?: string; - readonly target?: string; -} - -// @public -export interface ErrorResponse { - error?: ErrorDetail; -} - -// @public -export type ExtendedGeoJsonFeatureCollection = GeoJsonFeatureCollection & ExtendedGeoJsonFeatureCollectionData & {}; - -// @public (undocumented) -export interface ExtendedGeoJsonFeatureCollectionData { - links?: WfsEndpointLink[]; - numberReturned?: number; - readonly ontology?: string; -} - -// @public (undocumented) -export interface FeatureResponse { - feature: GeoJsonFeature; - links?: WfsEndpointLink[]; - readonly ontology?: string; -} - -// @public -export interface FeatureState { - createStateset(datasetId: string, statesetCreateRequestBody: StylesObject, options?: FeatureStateCreateStatesetOptionalParams): Promise; - deleteState(statesetId: string, featureId: string, stateKeyName: string, options?: FeatureStateDeleteStateOptionalParams): Promise; - deleteStateset(statesetId: string, options?: FeatureStateDeleteStatesetOptionalParams): Promise; - getStates(statesetId: string, featureId: string, options?: FeatureStateGetStatesOptionalParams): Promise; - getStateset(statesetId: string, options?: FeatureStateGetStatesetOptionalParams): Promise; - listStateset(options?: FeatureStateListStatesetOptionalParams): PagedAsyncIterableIterator; - putStateset(statesetId: string, statesetStyleUpdateRequestBody: StylesObject, options?: FeatureStatePutStatesetOptionalParams): Promise; - updateStates(statesetId: string, featureId: string, featureStateUpdateRequestBody: FeatureStatesStructure, options?: FeatureStateUpdateStatesOptionalParams): Promise; -} - -// @public -export interface FeatureStateCreateStatesetOptionalParams extends coreClient.OperationOptions { - description?: string; -} - -// @public -export type FeatureStateCreateStatesetResponse = StatesetCreatedResponse; - -// @public -export interface FeatureStateDeleteStateOptionalParams extends coreClient.OperationOptions { -} - -// @public -export interface FeatureStateDeleteStatesetOptionalParams extends coreClient.OperationOptions { -} - -// @public -export interface FeatureStateGetStatesetOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type FeatureStateGetStatesetResponse = StatesetGetResponse; - -// @public -export interface FeatureStateGetStatesOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type FeatureStateGetStatesResponse = FeatureStatesStructure; - -// @public -export interface FeatureStateListStatesetNextOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type FeatureStateListStatesetNextResponse = StatesetListResponse; - -// @public -export interface FeatureStateListStatesetOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type FeatureStateListStatesetResponse = StatesetListResponse; - -// @public -export interface FeatureStateObject { - eventTimestamp?: string; - keyName?: string; - value?: string; -} - -// @public -export interface FeatureStatePutStatesetOptionalParams extends coreClient.OperationOptions { -} - -// @public -export interface FeatureStatesStructure { - states?: FeatureStateObject[]; -} - -// @public -export interface FeatureStateUpdateStatesOptionalParams extends coreClient.OperationOptions { -} - -// @public -export interface GeofenceGeometry { - readonly deviceId?: string; - readonly distance?: number; - readonly geometryId?: string; - readonly nearestLat?: number; - readonly nearestLon?: number; - readonly nearestZ?: number; - readonly udId?: string; -} - -// @public -export type GeofenceMode = string; - -// @public -export interface GeofenceResponse { - readonly expiredGeofenceGeometryId?: string[]; - readonly geometries?: GeofenceGeometry[]; - readonly invalidPeriodGeofenceGeometryId?: string[]; - readonly isEventPublished?: boolean; -} - -// @public -export type GeographicResourceLocation = string; - -// @public -export type Geography = string; - -// @public -export type GeoJsonFeature = GeoJsonObject & GeoJsonFeatureData & { - type: "Feature"; -}; - -// @public -export type GeoJsonFeatureCollection = GeoJsonObject & GeoJsonFeatureCollectionData & { - type: "FeatureCollection" | "FeatureCollection"; -}; - -// @public (undocumented) -export interface GeoJsonFeatureCollectionData { - features: GeoJsonFeature[]; -} - -// @public (undocumented) -export type GeoJsonFeatureCollectionUnion = GeoJsonFeatureCollection | ExtendedGeoJsonFeatureCollection; - -// @public (undocumented) -export interface GeoJsonFeatureData { - featureType?: string; - geometry: GeoJsonGeometryUnion; - id?: string; - properties?: Record; -} - -// @public -export type GeoJsonGeometry = GeoJsonObject & { - type: "GeoJsonGeometry" | "Point" | "MultiPoint" | "LineString" | "MultiLineString" | "Polygon" | "MultiPolygon" | "GeometryCollection"; -}; - -// @public -export type GeoJsonGeometryCollection = GeoJsonGeometry & GeoJsonGeometryCollectionData & {}; - -// @public (undocumented) -export interface GeoJsonGeometryCollectionData { - geometries: GeoJsonGeometryUnion[]; -} - -// @public -export type GeoJsonGeometryType = string; - -// @public (undocumented) -export type GeoJsonGeometryUnion = GeoJsonGeometry | GeoJsonPoint | GeoJsonMultiPoint | GeoJsonLineString | GeoJsonMultiLineString | GeoJsonPolygon | GeoJsonMultiPolygon | GeoJsonGeometryCollection; - -// @public -export type GeoJsonLineString = GeoJsonGeometry & GeoJsonLineStringData & {}; - -// @public (undocumented) -export interface GeoJsonLineStringData { - coordinates: number[][]; -} - -// @public -export type GeoJsonMultiLineString = GeoJsonGeometry & GeoJsonMultiLineStringData & {}; - -// @public (undocumented) -export interface GeoJsonMultiLineStringData { - coordinates: number[][][]; -} - -// @public -export type GeoJsonMultiPoint = GeoJsonGeometry & GeoJsonMultiPointData & {}; - -// @public -export interface GeoJsonMultiPointData { - coordinates: number[][]; -} - -// @public -export type GeoJsonMultiPolygon = GeoJsonGeometry & GeoJsonMultiPolygonData & {}; - -// @public (undocumented) -export interface GeoJsonMultiPolygonData { - coordinates: number[][][][]; -} - -// @public -export interface GeoJsonObject { - type: "GeoJsonGeometry" | "Feature" | "FeatureCollection" | "FeatureCollection" | "Point" | "MultiPoint" | "LineString" | "MultiLineString" | "Polygon" | "MultiPolygon" | "GeometryCollection"; -} - -// @public -export type GeoJsonObjectType = string; - -// @public (undocumented) -export type GeoJsonObjectUnion = GeoJsonObject | GeoJsonGeometryUnion | GeoJsonFeature | GeoJsonFeatureCollectionUnion; - -// @public -export type GeoJsonPoint = GeoJsonGeometry & GeoJsonPointData & {}; - -// @public -export interface GeoJsonPointData { - coordinates: number[]; -} - -// @public -export type GeoJsonPolygon = GeoJsonGeometry & GeoJsonPolygonData & {}; - -// @public (undocumented) -export interface GeoJsonPolygonData { - coordinates: number[][][]; -} - -// @public -export interface GreatCircleDistanceResponse { - readonly result?: GreatCircleDistanceResponseResult; - readonly summary?: GreatCircleDistanceResponseSummary; -} - -// @public -export interface GreatCircleDistanceResponseResult { - readonly distanceInMeters?: number; -} - -// @public -export interface GreatCircleDistanceResponseSummary { - sourcePoint?: SpatialCoordinate; - targetPoint?: SpatialCoordinate; -} - -// @public -export const enum KnownGeofenceMode { - All = "All", - EnterAndExit = "EnterAndExit" -} - -// @public -export const enum KnownGeographicResourceLocation { - Eu = "eu", - Us = "us" -} - -// @public -export const enum KnownGeography { - // (undocumented) - Eu = "eu", - // (undocumented) - Us = "us" -} - -// @public -export const enum KnownGeoJsonGeometryType { - GeoJsonGeometryCollection = "GeometryCollection", - GeoJsonLineString = "LineString", - GeoJsonMultiLineString = "MultiLineString", - GeoJsonMultiPoint = "MultiPoint", - GeoJsonMultiPolygon = "MultiPolygon", - GeoJsonPoint = "Point", - GeoJsonPolygon = "Polygon" -} - -// @public -export const enum KnownGeoJsonObjectType { - GeoJsonFeature = "Feature", - GeoJsonFeatureCollection = "FeatureCollection", - GeoJsonGeometryCollection = "GeometryCollection", - GeoJsonLineString = "LineString", - GeoJsonMultiLineString = "MultiLineString", - GeoJsonMultiPoint = "MultiPoint", - GeoJsonMultiPolygon = "MultiPolygon", - GeoJsonPoint = "Point", - GeoJsonPolygon = "Polygon" -} - -// @public -export const enum KnownLroStatus { - Failed = "Failed", - NotStarted = "NotStarted", - Running = "Running", - Succeeded = "Succeeded" -} - -// @public -export const enum KnownResponseFormat { - Json = "json" -} - -// @public -export const enum KnownStyleObjectType { - BooleanTypeStyleRule = "boolean", - NumberTypeStyleRule = "number", - StringTypeStyleRule = "string" -} - -// @public -export const enum KnownUploadDataFormat { - Dwgzippackage = "dwgzippackage", - Geojson = "geojson", - Zip = "zip" -} - -// @public (undocumented) -export interface LandingPageResponse { - links: WfsEndpointLink[]; - readonly ontology?: string; -} - -// @public -export interface LongRunningOperationResult { - readonly created?: string; - error?: ErrorDetail; - operationId?: string; - readonly status?: LroStatus; - warning?: ErrorDetail; -} - -// @public -export type LroStatus = string; - -// @public -export interface MapDataDetailInfo { - readonly dataFormat?: string; - readonly description?: string; - readonly location?: string; - readonly sizeInBytes?: number; - readonly udid?: string; - readonly uploadStatus?: string; -} - -// @public -export interface MapDataListResponse { - readonly mapDataList?: MapDataDetailInfo[]; -} - -// @public -export interface NumberRuleObject { - color?: string; - range?: RangeObject; -} - -// @public -export type NumberTypeStyleRule = StyleObject & { - type: "number"; - rules: NumberRuleObject[]; -}; - -// @public -export interface PointInPolygonResponse { - result?: PointInPolygonResult; - readonly summary?: PointInPolygonSummary; -} - -// @public -export interface PointInPolygonResult { - readonly intersectingGeometries?: string[]; - readonly pointInPolygons?: boolean; -} - -// @public -export interface PointInPolygonSummary { - readonly information?: string; - sourcePoint?: SpatialCoordinate; - readonly udid?: string; -} - -// @public -export interface RangeObject { - exclusiveMaximum?: number; - exclusiveMinimum?: number; - maximum?: number; - minimum?: number; -} - -// @public -export type ResponseFormat = string; - -// @public -export interface Spatial { - getBuffer(format: ResponseFormat, udid: string, distances: string, options?: SpatialGetBufferOptionalParams): Promise; - getClosestPoint(format: ResponseFormat, udid: string, latitude: number, longitude: number, options?: SpatialGetClosestPointOptionalParams): Promise; - getGeofence(format: ResponseFormat, deviceId: string, udid: string, latitude: number, longitude: number, options?: SpatialGetGeofenceOptionalParams): Promise; - getGreatCircleDistance(format: ResponseFormat, query: string, options?: SpatialGetGreatCircleDistanceOptionalParams): Promise; - getPointInPolygon(format: ResponseFormat, udid: string, latitude: number, longitude: number, options?: SpatialGetPointInPolygonOptionalParams): Promise; - postBuffer(format: ResponseFormat, bufferRequestBody: BufferRequestBody, options?: SpatialPostBufferOptionalParams): Promise; - postClosestPoint(format: ResponseFormat, latitude: number, longitude: number, closestPointRequestBody: Record, options?: SpatialPostClosestPointOptionalParams): Promise; - postGeofence(format: ResponseFormat, deviceId: string, latitude: number, longitude: number, searchGeofenceRequestBody: Record, options?: SpatialPostGeofenceOptionalParams): Promise; - postPointInPolygon(format: ResponseFormat, latitude: number, longitude: number, pointInPolygonRequestBody: Record, options?: SpatialPostPointInPolygonOptionalParams): Promise; -} - -// @public -export interface SpatialCoordinate { - readonly lat?: number; - readonly lon?: number; -} - -// @public -export interface SpatialGetBufferOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type SpatialGetBufferResponse = BufferResponse; - -// @public -export interface SpatialGetClosestPointOptionalParams extends coreClient.OperationOptions { - numberOfClosestPoints?: number; -} - -// @public -export type SpatialGetClosestPointResponse = ClosestPointResponse; - -// @public -export interface SpatialGetGeofenceHeaders { - xCorrelationId?: string; -} - -// @public -export interface SpatialGetGeofenceOptionalParams extends coreClient.OperationOptions { - isAsync?: boolean; - mode?: GeofenceMode; - searchBuffer?: number; - userTime?: Date; - z?: number; -} - -// @public -export type SpatialGetGeofenceResponse = SpatialGetGeofenceHeaders & GeofenceResponse; - -// @public -export interface SpatialGetGreatCircleDistanceOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type SpatialGetGreatCircleDistanceResponse = GreatCircleDistanceResponse; - -// @public -export interface SpatialGetPointInPolygonOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type SpatialGetPointInPolygonResponse = PointInPolygonResponse; - -// @public -export interface SpatialPostBufferOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type SpatialPostBufferResponse = BufferResponse; - -// @public -export interface SpatialPostClosestPointOptionalParams extends coreClient.OperationOptions { - numberOfClosestPoints?: number; -} - -// @public -export type SpatialPostClosestPointResponse = ClosestPointResponse; - -// @public -export interface SpatialPostGeofenceHeaders { - xCorrelationId?: string; -} - -// @public -export interface SpatialPostGeofenceOptionalParams extends coreClient.OperationOptions { - isAsync?: boolean; - mode?: GeofenceMode; - searchBuffer?: number; - userTime?: Date; - z?: number; -} - -// @public -export type SpatialPostGeofenceResponse = SpatialPostGeofenceHeaders & GeofenceResponse; - -// @public -export interface SpatialPostPointInPolygonOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type SpatialPostPointInPolygonResponse = PointInPolygonResponse; - -// @public -export interface StatesetCreatedResponse { - readonly statesetId?: string; -} - -// @public -export interface StatesetGetResponse { - datasetIds?: string[]; - readonly description?: string; - statesetStyle?: StylesObject; -} - -// @public -export interface StatesetInfoObject { - datasetIds?: string[]; - readonly description?: string; - statesetId?: string; - statesetStyle?: StylesObject; -} - -// @public -export interface StatesetListResponse { - readonly nextLink?: string; - statesets?: StatesetInfoObject[]; -} - -// @public -export type StringTypeStyleRule = StyleObject & { - type: "string"; - rules: { - [propertyName: string]: string; - }[]; -}; - -// @public -export interface StyleObject { - keyName: string; - type: "boolean" | "number" | "string"; -} - -// @public -export type StyleObjectType = string; - -// @public (undocumented) -export type StyleObjectUnion = StyleObject | BooleanTypeStyleRule | NumberTypeStyleRule | StringTypeStyleRule; - -// @public -export interface StylesObject { - styles?: StyleObjectUnion[]; -} - -// @public -export interface Tileset { - beginCreate(datasetId: string, options?: TilesetCreateOptionalParams): Promise, TilesetCreateResponse>>; - beginCreateAndWait(datasetId: string, options?: TilesetCreateOptionalParams): Promise; - delete(tilesetId: string, options?: TilesetDeleteOptionalParams): Promise; - get(tilesetId: string, options?: TilesetGetOptionalParams): Promise; - getOperation(operationId: string, options?: TilesetGetOperationOptionalParams): Promise; - list(options?: TilesetListOptionalParams): PagedAsyncIterableIterator; -} - -// @public -export interface TilesetCreateHeaders { - resourceLocation?: string; -} - -// @public -export interface TilesetCreateOptionalParams extends coreClient.OperationOptions { - description?: string; - resumeFrom?: string; - updateIntervalInMs?: number; -} - -// @public -export type TilesetCreateResponse = TilesetCreateHeaders & LongRunningOperationResult; - -// @public -export interface TilesetDeleteOptionalParams extends coreClient.OperationOptions { -} - -// @public -export interface TilesetDetailInfo { - readonly bbox?: number[]; - readonly datasetId?: string; - readonly description?: string; - readonly maxZoom?: number; - readonly minZoom?: number; - readonly ontology?: string; - readonly tilesetId?: string; -} - -// @public -export interface TilesetGetOperationHeaders { - resourceLocation?: string; -} - -// @public -export interface TilesetGetOperationOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type TilesetGetOperationResponse = TilesetGetOperationHeaders & LongRunningOperationResult; - -// @public -export interface TilesetGetOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type TilesetGetResponse = TilesetDetailInfo; - -// @public -export interface TilesetListNextOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type TilesetListNextResponse = TilesetListResponse; - -// @public -export type TilesetListOperationResponse = TilesetListResponse; - -// @public -export interface TilesetListOptionalParams extends coreClient.OperationOptions { -} - -// @public -export interface TilesetListResponse { - readonly nextLink?: string; - readonly tilesets?: TilesetDetailInfo[]; -} - -// @public -export type UploadDataFormat = string; - -// @public -export interface Wfs { - deleteFeature(datasetId: string, collectionId: string, featureId: string, options?: WfsDeleteFeatureOptionalParams): Promise; - getCollection(datasetId: string, collectionId: string, options?: WfsGetCollectionOptionalParams): Promise; - getCollectionDefinition(datasetId: string, collectionId: string, options?: WfsGetCollectionDefinitionOptionalParams): Promise; - getCollections(datasetId: string, options?: WfsGetCollectionsOptionalParams): Promise; - getConformance(datasetId: string, options?: WfsGetConformanceOptionalParams): Promise; - getFeature(datasetId: string, collectionId: string, featureId: string, options?: WfsGetFeatureOptionalParams): Promise; - getFeatures(datasetId: string, collectionId: string, options?: WfsGetFeaturesOptionalParams): Promise; - getLandingPage(datasetId: string, options?: WfsGetLandingPageOptionalParams): Promise; -} - -// @public -export interface WfsDeleteFeatureOptionalParams extends coreClient.OperationOptions { -} - -// @public -export interface WfsEndpointLink { - href: string; - hreflang?: string; - rel?: string; - title?: string; - type?: string; -} - -// @public -export interface WfsGetCollectionDefinitionOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type WfsGetCollectionDefinitionResponse = CollectionDefinitionResponse; - -// @public -export interface WfsGetCollectionOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type WfsGetCollectionResponse = CollectionInfo; - -// @public -export interface WfsGetCollectionsOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type WfsGetCollectionsResponse = CollectionsResponse; - -// @public -export interface WfsGetConformanceOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type WfsGetConformanceResponse = ConformanceResponse; - -// @public -export interface WfsGetFeatureOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type WfsGetFeatureResponse = FeatureResponse; - -// @public -export interface WfsGetFeaturesOptionalParams extends coreClient.OperationOptions { - bbox?: string; - filter?: string; - limit?: number; -} - -// @public -export type WfsGetFeaturesResponse = ExtendedGeoJsonFeatureCollection; - -// @public -export interface WfsGetLandingPageOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type WfsGetLandingPageResponse = LandingPageResponse; - - -// (No @packageDocumentation comment for this package) - -``` diff --git a/sdk/maps/maps-creator/rollup.config.js b/sdk/maps/maps-creator/rollup.config.js deleted file mode 100644 index 9be1955eb7f1..000000000000 --- a/sdk/maps/maps-creator/rollup.config.js +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import nodeResolve from "@rollup/plugin-node-resolve"; -import cjs from "@rollup/plugin-commonjs"; -import sourcemaps from "rollup-plugin-sourcemaps"; -import multiEntry from "@rollup/plugin-multi-entry"; -import json from "@rollup/plugin-json"; - -import nodeBuiltins from "builtin-modules"; - -/** - * Gets the proper configuration needed for rollup's commonJS plugin for @opentelemetry/api. - * - * NOTE: this manual configuration is only needed because OpenTelemetry uses an - * __exportStar downleveled helper function to declare its exports which confuses - * rollup's automatic discovery mechanism. - * - * @returns an object reference that can be `...`'d into your cjs() configuration. - */ -export function openTelemetryCommonJs() { - const namedExports = {}; - - for (const key of [ - "@opentelemetry/api", - "@azure/core-tracing/node_modules/@opentelemetry/api" - ]) { - namedExports[key] = [ - "SpanKind", - "TraceFlags", - "getSpan", - "setSpan", - "SpanStatusCode", - "getSpanContext", - "setSpanContext" - ]; - } - - const releasedOpenTelemetryVersions = ["0.10.2", "1.0.0-rc.0"]; - - for (const version of releasedOpenTelemetryVersions) { - namedExports[ - // working around a limitation in the rollup common.js plugin - it's not able to resolve these modules so the named exports listed above will not get applied. We have to drill down to the actual path. - `../../../common/temp/node_modules/.pnpm/@opentelemetry/api@${version}/node_modules/@opentelemetry/api/build/src/index.js` - ] = [ - "SpanKind", - "TraceFlags", - "getSpan", - "setSpan", - "StatusCode", - "CanonicalCode", - "getSpanContext", - "setSpanContext" - ]; - } - - return namedExports; -} - -// #region Warning Handler - -/** - * A function that can determine whether a rollupwarning should be ignored. If - * the function returns `true`, then the warning will not be displayed. - */ - -function ignoreNiseSinonEvalWarnings(warning) { - return ( - warning.code === "EVAL" && - warning.id && - (warning.id.includes("node_modules/nise") || - warning.id.includes("node_modules/sinon")) === true - ); -} - -function ignoreChaiCircularDependencyWarnings(warning) { - return ( - warning.code === "CIRCULAR_DEPENDENCY" && - warning.importer && warning.importer.includes("node_modules/chai") === true - ); -} - -const warningInhibitors = [ - ignoreChaiCircularDependencyWarnings, - ignoreNiseSinonEvalWarnings -]; - -/** - * Construct a warning handler for the shared rollup configuration - * that ignores certain warnings that are not relevant to testing. - */ -function makeOnWarnForTesting() { - return (warning, warn) => { - // If every inhibitor returns false (i.e. no inhibitors), then show the warning - if (warningInhibitors.every((inhib) => !inhib(warning))) { - warn(warning); - } - }; -} - -// #endregion - -function makeBrowserTestConfig() { - const config = { - input: { - include: ["dist-esm/test/**/*.spec.js"], - exclude: ["dist-esm/test/**/node/**"] - }, - output: { - file: `dist-test/index.browser.js`, - format: "umd", - sourcemap: true - }, - preserveSymlinks: false, - plugins: [ - multiEntry({ exports: false }), - nodeResolve({ - mainFields: ["module", "browser"] - }), - cjs({ - namedExports: { - // Chai's strange internal architecture makes it impossible to statically - // analyze its exports. - chai: [ - "version", - "use", - "util", - "config", - "expect", - "should", - "assert" - ], - ...openTelemetryCommonJs() - } - }), - json(), - sourcemaps() - //viz({ filename: "dist-test/browser-stats.html", sourcemap: true }) - ], - onwarn: makeOnWarnForTesting(), - // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, - // rollup started respecting the "sideEffects" field in package.json. Since - // our package.json sets "sideEffects=false", this also applies to test - // code, which causes all tests to be removed by tree-shaking. - treeshake: false - }; - - return config; -} - -const defaultConfigurationOptions = { - disableBrowserBundle: false -}; - -export function makeConfig(pkg, options) { - options = { - ...defaultConfigurationOptions, - ...(options || {}) - }; - - const baseConfig = { - // Use the package's module field if it has one - input: pkg["module"] || "dist-esm/src/index.js", - external: [ - ...nodeBuiltins, - ...Object.keys(pkg.dependencies), - ...Object.keys(pkg.devDependencies) - ], - output: { file: "dist/index.js", format: "cjs", sourcemap: true }, - preserveSymlinks: false, - plugins: [sourcemaps(), nodeResolve(), cjs()] - }; - - const config = [baseConfig]; - - if (!options.disableBrowserBundle) { - config.push(makeBrowserTestConfig()); - } - - return config; -} - -export default makeConfig(require("./package.json")); diff --git a/sdk/maps/maps-creator/samples/v1/javascript/tmp/Data_uploaded.zip b/sdk/maps/maps-creator/samples/v1/javascript/tmp/Data_uploaded.zip new file mode 100644 index 0000000000000000000000000000000000000000..6ccd256623114fe8c582426ba2d296a459914b17 GIT binary patch literal 946883 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

ZWPOP8NcY=a* zgnG?%DjiNq)i5LOI?>K#kjCDC z)GH*#W(#PBQN?@c>O8;%#!IU+?Gse04G#{PTUYt@J54R4=#rlius-WF(Wg>!a>&em z&WJgO<`@+wYSay(>@K?V9&B;_7BM)qvC#S^&kv*j=V#8dK9BZyy?wS|t^11)z@z_9 z-SfAoO*_&rx1IA}%IuU~EWL{fBLpM3fgL{SSG~0Clr3{FV)- zhACbPUr@(n8Sfx=gN$7~wOg7e0f8fI`@2*;vY)&?ge&Fodm(JHLumE$JUZ{Zb!4aG zT-L*hT~bV0=zZjUxSd+@c~CR)LUF#>;z1;AS6ET*Tp+IE>j*%NO%#S>Qj$~E+`9FM1gVJjBoXORMcKMe|cygVUAD;C%gb)4?%4+0+~-)=S?D=Wc3-j!kZyTbY~8w z>VA~%eT1f_;vR1YJ?mji*Po5?og1~;GF#o0rESd?GOK6jP-bqnAf?fRgk}}EV#bJm zqW+vFqAEHh{4)fX;KOK0o4i1$3Zzt17U+(xoW}|l$IV@^PxtmBi{|vopp?^#Ueh)$ z(p_7ba%d6dJqn?n_A%&c&F^9z9?9Pu>eTmnNfFq&=^Cn{081jYGqbl;{v(;o)lD

ePJ#2k9u6710Mcb-MHq-iS%TVzN1>(7ge#!bSBEN&Y<0x(dbQ= z=}iNooH>M6v^MaKf?dci&6TN16(tQ^Yq};*wX0?YfN1ktrsb*5r&5|!6+Y3KYfY&B zNivY8IQMIuB~BHn4y`tot>xR~ED&IpgzSkF`}RVNJ(Io?n-rY-_1Y5kk+p&mCnBTZ zfcTzHL}5;jJ)yZEJ7ITzW_;^hVFH}5qQLT1*aI>q{(ykjpepWFDj?$k#bo@L)+;PjH_SOOLg$QtPuJbwig;B^7swYB>t1C%fyG8y0n> z57~gUhm}=&T()yG?aqaUig;?^crKN+O(a>Md40B$x>2u)R>e_C$7f5HMg14NgFoS} zTT^H}I-BqWQ((+s8m&l2-%Q=u5%5U2jbUnzFt!BRl5TR1DVCX>W9a1cXtRY*NcUpC zd07(9)+RG?Df6szNk9o|;xS;5akfmE{SJgPHmc(U#(O~-SD;A+1iUML?WT2_zvnB> zQ^?^L5P-?=5KhCM_w_vNWc5Eb!XZ z{=3eIJOpLjf6N&Hxwc!*1N0w}KWPB8;wwSjz6&B<*AVY1Bw|a(jXGh~D_5akQI!E^ za23FA^S8IWM1`Xu@)nxOxXc z&#nyYwgJE@wp+0F_WD=(c|<*tGoJZG`K8I+BAe{_+}m{QtuI&Nzh>dCT+G`gIO9tE z?K>LG>aM4#@r`qG?@WtpEfh=dcH-i^6StIReRZKbW`C?`EAYdK zpN*_9G3;Z?z=9&!{e5F9SCl^ z-0pG^t4Lu*;3Y3fxA2z3ojR=q?tg1uS>$U(-S9W1f2ER+EW%{E0ijwIZgh;}#dD8e z_yn}Ydc!31Y@Q$t&b>9%{85-MW%BxD2VK9K@>1zAKBOY*@Y^)AaMNU_Gc6W%tr08s zCy957^0+$n&!enjMlgmE97Sf7X*!92m=d&zsZU`J=`m#6<&fmg#JG=0V&~|c&lf&G z=e;4~K;0{otDM!BNSsVFl>w5FrOj)PHRAOA6o8F3;>@c@h;vUd_9!U;c8g&`(IZd% zCGmZ_#E7uGu(3o$VDm7X(y`w}frZSwMgUS;Fv4xIt+M3U^Hqc61veex-pZ@vf2KRC z8PPEy7}bK)B}Ws`_xvO`@Gl%qM@IwP^q!zShfM4fk%@IOGO1TWeR>Telg>agktNBb zVsGlx>sSuTB&gkkghY7uA>L8K6F!u$0thlQ!mJq+GRAxb#$TXlNiu!_$!oZ2FqE&~ z-PCln!DY!kV*1(=rZ<4kJk&o`eKZ}V-CRRn9Z8wJi19)WSqJ`ita2UakCc|0Ki<|OB+bMMMjfTn0l^6&g4C;lT;V_lSI4- z<3p(!s$7*OQW~Ek#bz&^s+zx08|c~SLOmO#oZ@>(!t6zTydAH?IC^j^NYxy)wQq~R zFYAtS`bXII5t5JR;P1onkwi}zrJ1-RxstwgUObt1W6CU#Zj{B=erFu&g1~h4;La*d+s@9{MWp{oyd+5of`lC-@sjk38qs4KfpCt7F^IY^Qty`F z+SA)Dv?7cM;+><9u$MQb&7QhJw`S_88v2pl^F>zUSDOgzq~_8lQ6w0NcT`{AI6CG0U(HbUCOYZbvZ!aN#O}(-{bEyL~bAm_E$P(pU-ozN(=u z)K02Cj9U-rQ$d?8w9CnM2GN}%Y@^!O5l!oYMF2Zt;5O2=6X?I~ws9~QYeDAbUo3v4 z_E0F6W2sUpr!4SQESQEx{`n)SC;4*V9VbqP*Z|?{|2@G3Pao85QE~^3a#HCLf9GoFaGa*>teLOIi`1fY1E%igKhtF z6#D=FA@WpS2`=Ov&9h{7zvytnK-wOV-5F}Z*#sEh?dM^<*Ea)!zbwKNifjHR=~N9; zE_Z7pfhV-1XMc=R6xV7O-!p)yR39@+q-e9`ilukPeDFY#S3$hB?WfL3M7PuYI;4Zg zU-#B8chdk!)AZk=Y0i^K>U+TmH~SCv?znS7(HCL?;fWA_XnKw9qL31J;uRK+PWB#V zZl|wZshXqD&I zw;5kP^~V@rZWxshM-twH_vN1ni3aGh9T{Qwh3z6uwk| zxp8BaW3#PZ!Z*@JRB}|Vv2Fs$?&h0mPg}8^hjHfYgkYF)W{ZV5PdQWeMj)5>-%UI7 z&BgN;GQK2vf?`52%sfkKcgydho^jhfxM%vT%6W8zdoD8L9`4z(4=+Rw@CI|pPgn~) z>@!vO*x~&eM;y-Z@^fLSltNXHu+9kijPaFPazH9^AaQphVMjvGlhCge6~#bVnIj(4 z;q~|v4pb|}OM&3mR5a(2n^~u`cNVP!@ntfcmw{W1v|xmhW=@kE=ka_rF)Rbow>arQ zffzM7kH0t_$elv);?C33xTiI5QPUXTtaf6yOhPq&Yp<-GhVdkQPVKIzt5EYUDW@1p zDZ16P#WjMFhIKrO@y$BIV$*qkO(!UrFWlm+*>O)ITYOvoh6(KgD{3Lz`_o$_k2ho- zojcCK6#I)je!*XJ+DA{_rnH;h%UgRFrG10L_;<}-9ly+rC$yV_C3{c@#XHf_%ffhQ z?XrK|Cbf%Hl$@uukwxmmli4)>xAA${H((D$GdF8f(4uJcVVAwOo23rN&D6T*W6*Y0~s=>bxXfx>jVy zzY-k;=ows57sh(RydR-rjVkJ$YY$Ozsvy(91&VF$9YDI@ExS$QjN@6HmY;4q_)Q;3 z0Nwq7I(a&#LMA?)Ivua1LnpFn)5Qf>kW%ps_MukFKG#hpb6x_X8f&{snVX43SksMVo?Oy@L=4}Ezw6oCx&sA*UOp8eoH2fy^JbbVuR ztMCihhTxGdI+W#O(36?82W>IbrM4NA^^m-*#^QW?X1!ju9V z-I2)DCsJ2^K|1}lw#nb<9c;Bxyr}?6n*1e0u{YzE#m0COy*gz%1)i)(p%!+VJhASS z_mU0Sj6m(iqVm>De;o=e_IdomFt@O)_Y`BSzDX^xN7J+`9(K}s)oT_?(&(dUz&qpr z9?OtbkN`3dBMH;9qNvLC7+q^JUD<&p*j1RetWMIHvIzVco6glOD2%F_WF>y|#yPrs zEV~QY-}L(0AX{?cKX>NjNTbS(#4vS4HyI`AQ?D3(-c;~I*-Wov^12Xu<~VvXb98%Y zh&C%vMLX?k+qk$!p;nYC#AeJ}V%*cDlfd7_pvw_H}J=ijkyBhNh$*PgvH6n{C^KCPVKfDD_G#|Cxc*5H=0!wno2rOE) z``N7cwuy5>9fiRfZ1>vb3eTV`$sL2Pm_t*zRIJO(0Oy1vl%k#MbkA21jfJNWEWbV2 zigh@*SYJY5CB{h<&ceN=cCd=>$_DcG_TL|wB>SC_Ne`r20yVXPG!=+@V#(ODK%P!|#Nap<7?aWE2SNQ&JKA06Rd$zurJN?o$iD zK$B-|+3>aqOjL%JfK{bE7}wMU7 z{+z|VHDEA={(5NuW6m*_US-Psb(wi|ywjAChb%WwXCv|Uc=YJON0{6Q8lQvhpwmL` zj(TTY({SFaw~6j5ih8jKaujx`Na_=mu@k#4cn)a?gK2`uM^~Fi>s*xl8qPWv*o{;{ z&oidMgH-h6_(_Ah$5(n#a+_DBcppgX!^uw(&*3(%&bx2EU}WH(M)0!^^7l0-uGy9aHzy97hVJ=Dt__ zYDk?%k&o2}+nK!3yN1&h1>bWx-4TtzGn$UMl=9Jc5_RbJ7!SAT-b=LmqWHE;kN)za za%}3rpeFeTx@V9W_BPVG9|R-bM*4$)V$|;Im>(5>4F~l79BIEZXv_bAzyK(^?~45H zFQjtH3ID|F!?op(ia%e6`uU!fvyi1=VP0WNzERbmq(y4L2WWjTzG z=ZsbWaoMxc*at)fx9NuQYwNh;8r3z4_Q>m$cUlEq9~}Mcrw*x&Ugfq7(%%MHMGpGI zgj1C?pmOA`vALg-5{VyuD1h(``5G0IkxCy6l+aJTW!7b;MpeBPWMlV*wDpbN8{$g* zmvJ!UAA;7cTJ4k_hKED^gmj)7Db;}~JH+oLjs!A(Y3vU2pBJ3Q^iK4fA55F+jwz&n zVX!Vfny!eu70B39O81u1g{8Lx8IPC#P9Wp!rTyxf(p!OyXG(uBkdaRA8;NApKG3)R zz>6!#Zw98~Ms}Z{K=$!?%1ONuFA(RxHdA#3&bHKr7{3X!`m5_B>CWsJR}=lsHt!?! zwLm8KC;GB^g+bIXgJ2~Mv@sCvhDCWdSiaJp8BOn~7c;5`rfW3)^|n+loSm?v(wMP> zTGxXy)F|A;M={%TgKT!1y6kU^b&N50*3-J_NVc()>cx#95=0d>G6IT^bf`2JHL51Y zx*yjpYLr+|{tHE=F_}54<+1$0;>C?P>4P$zCFb}X=6Rh$%*e?ECAeW=&Bvz~l(bCo@{aWhHPRr$uR)P1vAotbiJD;e2Y zMVYMinE`{#NbKb$I^69$V`T{mM*dQNuJ%^PG`0r}R*Sz|F)~Sp)R1gWpVbNc1D{v- z9>hJfUZkFDE5X^eHs!O;yr&pDNc#3PD~B3M+~zCTGd!h5D&C<5Y}cQZ#wLu99HApS zB7O6kBzMG(D4%ZTthi&0B;(HUq|)@&^D2qg2!4RgR%5iuD%6w9HQWn+wg>}jH2z|q z=yxVmeX`~wZQ615=+|fNAIF5o>94)Oe7X)ZBp;tI0WxFC@q?q)$iN2&rst95+%{)6Jb(HDO>Yf9TgeRbgnfZuBhi90y#`Zh5*bg0n! z!jVGjSLpwF)qD?+J@3sQ$1i=>*a%|(56q)s_W^7Eugs%ykC`k+&i(z#EKpYMsM{9g zkx}AXGg(+VMu~5kkNBauJIu$UaiUw(SiBP#89Jr}mk-ZjFsnaGG-q3zF`aeF2U^ZzuHMebO|uO_m{UG&H1v5?+1k41?{GBS|a zIqeTlWifltTmL(AS$Kd|dn~HrsrNw~_ZwX0x;MED59$f%pjFFz>>b zNmk;j3D;|a@)fK)DA{H*WrWg~e1Xs_Cr5hM{6fRjgN=};Z^pjFZ-~cPHmeJN3GrPW z;=}d_JI0#o1bT6}6?f8j0Ma6_1Y`7(U@W5MeLr4@q~F#L}0{h^+da2PlWrLO&hg4VqM%a94P{N z%oM36EVPnVgjZ_IrfHS7_+0NQEdXjaox4D!;3GHr2+rBqrvB+^lPv72aMEnwDaEkY z?}*~OV?1*m2E1wE{il84P1`&Iy!rM#95D@0d=VFl;q_qO+=WlIG9AVfb=Kqq*$5F-`WSq{sq)P;D`uyxm z*)*;8hB3Dy`kK+c-86{4sE`t0iVtYh<_6|ED8Ctj%F=g^VBWtOnm_L(EbAH5*Yo3}jv2j1oX`HV18l}tBFcd>GwD*SBY7vL;DldGH5m&`{aN!XM0Sh|Zg zownrD9b?eOI?IAUmW5V@t96#xdHxnn;dtGA|0*xKZ4AaML$m|U^bn17Ae~FHh5m%I zhC{l9&K=M6>FK6X(zd2MU@*qR;9zVd6maTisqt$1!!!is-cxU@q&xIa#W-n>5!{MP zKANmvFa|;PdGAujzzKZMg zp4l_bz<_{&d<=?&iaO|^qmDW%C?e))sHms|l44=vHyPGY*g?XwqLURC78RLw=tLb$ z>R4gNii*ymbErf0?maUgYIb^_^}Op{>s^m)$uKhv48!bu-`Dm3U%x+N%Q>UbIQ`*Y z4v?JrVZvW^%9Qqtln5|s%XBR-+IE+%v#y%32$75v*G&_-jmIc$`isksA7)hg!pXSY zpBiO7#%FWf1$n8|`v&82({%lhGJf~^j(oK9m}$##Ighvdk;s}O2%%*47<^c#&!^05 zWc(H>qfRIGIFI#DQb*8G;EfFm^GOo8Y{x19(9S5pRg`2{y$Yt=pWkH^9LGk%acrda z`+FS6SAiJ#2)4uD@CFx%fb#drv79WH--|-7CmqcGADVf-J%a~=4K9CUR_w695!IS- zqY2KSfi(i<&KX}ZM;Vg^*xos{QkYmpQW;TSnBBwh%J}|dv|$54s{Uk=8{)+DC*vZW z*fj-z1VhF+%l8)E3&dr!yl(=w!1!iTBDNnf9Y$RXijGnl5z}UZW5gCvQx-F8LZ%3R zoX)?2hgfEgmWp7SH2B(GWN~w|H&C?{aGlHKzr6qaFndsG$e$ep|2S`UoKw|hQ77q; zCQ+K4pwlxihMISwa?5ql#rP5%3{3T*GTwgGGkh)Te^cxpz82%+IPb+OYr5vW#1*JJ z8(Y)4;^Zm*$gm78PIp=-EUa*9b!+2nsJl#-IWl^kn3F~|XkWNP^apCbqh?;rDftvg z{+K!?2+_+L5wcY zsk`F_Q#tG19RKm7H75ST9L3aRv@ajFFG@X!_5JqZ~W`MfltM_Gf>Rk(hFb2eGW z3C6fAi;O?p69-7s9xISH+OF$p$^7oEHgH4j<>Kl}sEh>b_CCc%VLz>}GDxD$+5$l^ z#+^T}X4cP}tL=({;79ws33ess=0MUuPu-cPE>W@Lmeq}H@8tiFa z??1A>e1~wf18}f(9yQ7>3&9Ih=Y^=I&Qsz`xiGzL?u0UeX>Gz&a~$fG0e`I zM|m9@wi!`+kRmh`UV(qCoy{aAtHo(3G?xKsT-Tdii`gv0maWk>9J0QRKn^p&zX5Vk zK?;+VsvgKewOVH299#oxgnyn^2b!wMt#n_fNsd>#5by?R0$%bqvf z#@d;;=Tbd8vtds66#mU{X*%j!g1eM4xlNF~G<{+YiuqtV1;^z!aCz8h`4ZCnXRVlN zDoIvu#N8p>wYS*Z2K7Fb5*-O6gnJvOGXv{{PlR{MC%`qVusgRw)>>zhy(wMRJk`ZHpLKL8?@7#r2T^Vt2tF- z*ZfcRd)yc20c!7LiqfLHUZrfwkeJ@PBcv(25p}K?3R5w1?AG_c%KzD?H78UtRH$zb znc>ylaM!-K0_Q9F17}wNcvzaWSY%e0rb&qVCa?VYho{6PYB}J4AaQNpxv_VzQ6Q+b zMlrQU0uWg~P*f(8h{CJh`sp79a;94){7_NX>8%qLe^FMkofDP%F*N$q`@j5TM12>S z?ir>Cel=y*GL4_0j!iKZY4RZ1SXc_{^r&|V|C|2w^LtF~Jt*fG0Rj>q3(N^XTsP?e zdlRO|8>h%c#2Y{{ANQY|tcQ5^WB{TzgaBo^h)m~9pcqER{`HQOoWrWJzasjt!~BKS ze{JVJ_?Us?qCX+LXrIUZ4h*D}r?MTX$eJp0%UifLRdEA2A;ol5Rd*B_j*8sM8LB=i zAFZ6xz6Ajgct0s3VZ?Gd{VeTc4uMMwC>ZerA*Ox3$HIs+Vi;jlz{Dq{zT|Xf!}NzM zQU3$!KA;+jXCxc~d#3!vZk+vt-thp_^CZL@XHSEBOJ~cLPxkcdu4!wc2%%xeR?Ws$ z=YmfK??d);0o+7vw4#oaV!5fK4oE{$N0GMUNz&D_L+$@yOQ%ZBP*5OT9lHXtyJNRz zKz$a)Q`Yr6TG_Loc&S9E0I&bPQd9Z!0t zGhe?U(N@j-Ws=ZyPeQ0?n&DBAc|RQ(ABqNF3MdZ^P==B&*HvIiC_H-X4ZWxf9a z5=tMxkgS!x1ROO`{|*(5pVE5+)chivj%};Y)rdLsOEl3a4m=FhhL<(}F|(r^Hx|96Z`!D-|9A92UNsji&VrvhUqt0PnuwVeW_pkNw#3{-44oTb;Q&Ic%q#H3w_Mc2cY{v#Utsr4~5u!e1ahY${2TKs^PKWxhV z0ssD|B<%w+3-`UYe$a!WfvT!6EwlYQ7zC1)3Q1qu* zMoNy+D(=od58@`}^_Zck^H9HBRF&DS%ra}Tj*Pb)Q5lZZ6E>M*sxsrfwVol2llrp? zT6&Sal%qQP0a{BF_}iQ*v{Bg-8rbSb%PaDC6s?Z~(*ib3rS z&Uk$Xe+q%x`pGb2Vv59eoN**F0}i$?LB8jMbHfs-(%|!82sC;>h{d1N5-OzNx#TA| z-fQ}P{HHbk4mzwnLFV`AkM5RvtG1sje#2Wr%ft1T9-to#)yw8pCJ{%->BgFk`kL6J z{vgyC3q^w{IFw@s5w1I?8w#T3)hiM37ygh8j*k|m9;-yOxO%0&Dx5zt6ypbu@k?Y- zc`*T^z`ujG7dIyv0uoiT9Yu6t^}N8#^CHQ6PMi;d=fb_INuLZ8$^N0QrH zOatOy=Ym1i{J+bIYl*pD9uyd9TopO*(1~r|Lc=*(z zZ<_>u+a{BVYdr4yvHB)9=}49ijf)MV#gkVMHnc-?p+dVa%L@fg$~ODpA}tdf-EKjX z;sxcuD}t@cQc)UhMON^lzt=R4!5}OU8yg&F0#+0h8oR8&uzSZykUAD?rP|Ug_=cV2 z=%GO4JsvYX{@!k2G)k^~HZ70elhhi{9BB2!$t}~%^MxBWeA~Vu`1!jiBQ1&FqcSGi zc0sQ*vC70f?Sd`du@}-!P}n29|DA|dwFlz%z1RKkKX9>u&GiSGXflUZo~qxc)a}rf zni!__M$h{L$=5ya)>P=X^Xq(LrOuv7OF}E*;&>3~y#+3&$fSP}P<7QIqx=^CbF){C z{{m36P)o(JgInnd-D^~K4!x5?&_s7MO3FiLtfk*GIy*Aw;g%^({7d>aD=xzN^Hzz* zIbMBsiiX;*X;YyAtNz+jjm}Pk+IRRJL*|4mTG$`|t80xyOAU9NB%;x3!L5u@(`+dy znNgVew6!pE&0PNfs+E~*`0I0R$Gc9Itcef`_`=D2#UdZY8S59?evXeF&J`q}9OVR{ z6;K%Z{SS@5(BIkkI(+N?bk0s6W0}De|9MCxH_gU>{cyV(2CK!enX=2}1q8#Up3&f*URE!8fARP5%Vk z&FYFEzTBd&@OR&W92c4W0C%$lB;0+A1jOHciv%R)A1%6B0^;um(rQjREdNxXL4VkD zfUIntBQo;$g_+d7O0WEUeiw1Q_{gCF_2uK9;-ioG;h1>co#Irm@Yu|G1xF>w;P&k6 zr^(w5Q{~bHRW=j<_96)h`J0usV7XuQ`%3Hosj(xzlo1MFcPT@<>R%I~*z@M#2*k#Pl+svddAE8W^}7hXEq@R;1$#5qU@RvT~I&kho(2hA~)8r=W4N{aPs0Y zK$9OiI9E(KdR6(6wB<)=7jDdvi0t)o0{2N2Mc9w(=u4ZS;*^b!SaadA9kMX9bMZ^=KYTFo0`A^49s3q~@ROTyjD}Sl2in ze zGXhuptNX`T^;PdmhGn+%?~3QXn{~XIf4h4%{uX(Yf9FN~KJq4UO(ArPola+}7?7@} zv5D~Iw^h!Exdv)!Klp^qchqdq|0Jc#*AZ#_Q6CM$$>joi&}K&_|Ed(yUr6%4g5E_;x8cGs4=EF z;wGo7Z*58}n3x&}8Y)h)Uxa>r`6GVGf$Fb9`LZAGy%s7H$9cRYL3%iDV!g@(iw`UC z#Yy8-j|RYvMPFO5x*V*c)7Y$%8r{&o&T%+Zg{wkbHrB6fU&v?|9i!$c*+S%_aw2b) z%gmZ$dkB@$BEijC@qWo);Gr&p>D3@p0OdZpy9Cxp(x%@mtzJP*0R+DXBP`y2{9!RN zH0KTpXw35a^DUYxE*M7wVRX(y``$1)CjNLZ4Do-r|z(M6MQwUw2_KYY)Kyl zvgjYSYyJ5z9xbP$HYF)+7bT^>)J7rJQ$3rG(zBu;elXO0?|K% z9bJe&iH{+^o9xru;qcMF6xl>`pw?Sm^mlIkGTt6N> z>ayHWAu!_H7((D7Dr>rtcNuQoJj!+ht^Gv8SrO&u^@WQDUX$Ldu@&Q*6hKd|c=RR)qRya8wy@Ea@o@PYtvnRF}%V-{>Q`NR?s~tE02F!QBuLYnOQz1Y3Qxl)KD58+#J($y(v_b zW=)g0TSAwVRoaVbXwUox2aSGNA~c08`^nsPb2bDdEZZ=aIX9;ky}oQO7d{VNsG3gzn4!1Nqe!`@HZwC4lP~D76wwCxgysHVry~H{LP!Zeq>qD1A zupMlpw)YQfw~E2FVh_??dv+h1ZUP@N;k2rCA8NJppO|GZq^eStRErz!oU;ta*LDtJ z??6Vc0vHj5z*MOG>QGVBS_pLFmQ|((LX4-=YAP_yR z3wnUh&04RzfL}lvSjcad{NNqeq_0Wlff~C$Y^#jhkA+5&_z>Dw!LP*{@u3)dHPgNk zwTvYMU@AVhakr(7;FsRV8b7^00f&Z+Pp3CPwzLY?&KA=>SV^> z9(Oeif**ZctWiEHZrYibQUzW?n%2j))l<3D2g>JZA3XbY>q!v`zQzKe2lr6b6zlE*AP z(h=O1I%_s6I7zxdSJ)C@c?Fx|yWeDzbpbl!(L>|ON3-r9Pdv)-S5)IgkM50=;fpb> zBzhWu56T@69)-06zN#b-cl*2eRoaQC0t%#y zG|cNs<)35bb>Y-g;S>p+8gq($KkEMnO4^_C!aw-3QS-)r{xnpwA4W>bf?$LI2Zl%7 zXUZRmX>(Fy&)M0*wh@wz=^POKs^J6z-QII^+~+u8?rVXOy>W1+qH}Zdgd?l7V07nd z7(=Z|=eLF#fyplsXC$SLns!~)YGz=CzV47Vbv|lc4ax6UH0TFbpv)BnO2ws`Skr`cjrdPTofZA)t>!}Z zPt8H%K(%~NWk9_YIr15B1cxo41L~w)=`nTaBAVoAq+C>xh91l#YEVZt;llemS4-S@ zUm!)TKN2gKA12VZKipq;GT>}5et5sRhC6eH4(N)K%pvcbGj?qrofr;ic_)%x=sP32 z+o!O-X1-3bCX->tE!c=2-oWvPL-PtJGOSgFK8^~ON~VnC>s6b4j7C))dJU1UodhhX+0M1)&ZiZez)Jp>%_f<`YXbJhc(NwMKej1;sO&NctWg#2el~;YBy&4aF ztG^^O-Hiv9cW!sSP_&&JS{!&d24yWo&UJB3UNl(~1A$lGL&X7A$|2x&(lO%UnzFWe zVkjUL{O8RMYB70_jc|yeJQNi8z;ppV^7GFg%IXK&Ye8ZrJ-KL~);_fcUco)kDi6dtmA#&?Jb1mv&r zRf7U_-VU^X3oA0Bzu5)CszvE0tU8NumXf#$uo^f~CjeF-2o?aVer*C^H7UpgSWVI? zzol=+t3GgEz^hgT0cFm0w(RXOt6iw%ZuHlP-IvV^2&I!)F^aQF?R+WJV|-hozduOC z)CHmV-O-h=BX86Y6vjGU$Ic)`ZRD=dgkXNdXZKV`wM9}HX?-3c?hfq}n*>Cw@eRRo z+{c#NQEh-*g;R&VK?3R!j87E5L3<4<@tJX`CWH{AH*7A!<_P}WraG1I&vmwB_M^^h zRZk}^ZJNOE@ZE}AfIZZgz0kSut?~^td1eCF+1Zl7qLYWri4C3Ms)kMl8j3*i8%#&^ z&d%gAk$!7uGGw-N{zX;R**TH1oQ*B(oLecVXUZ1T355w5Hm#G?Um{l(5cN5AQHMS(3`$bo*aMiA_U%NL@;uhoR0slOEIF5CA4(I z#Y$h8*di7ClCDlgK%WVUd_Z+TV_t%j--~W97aI6i8-CFD91r5saDT8W_axIFOp8M1 z0r^;^V+P_3L_5g&5LvDax9{n|hUv3{il)}iUVDX(1QE4WRd<`F&TqiKp$ zmvp1rK+ZG+4;t7yJ*xi$9W^jD;HgqtkG*4=+3#j|`rtFO*y0mMo3Jg3bZHYX;{GvO zex(M9xe!KJ_|V@XCQs19U`@c0;$9$0-kFsVk zTc6J)*t5^k9A-kezD(O*q)F1!)w81^wdq|tB#YGE-hkNx+rCN4PD!QZz zSgx3Bgje91Ga?mrIth&}D?H5c^eTo@JqH$3B;jF-A` zt$`_zMTQml)eVM#x;T=rnx_~CKPzfKLr{MEXZ7*x(^60q5FaZuVMeEl8lcdX32fIa z%uM3Wu7!8bkV!JhlI4O2QkWBPSs}4;1C_B>o=*HMo(lGndP#l{`7s3 zru87+zTKa(e$NgafY0sRzSiWl7C~kCcIb6ky7M7L;OA5KjqNI7OaC5hK8M@((W2g| zq-xfEiW;;!D_C!*C$7%28NSb)61zGpR9loKAGZHn_)>S2B4Ao21tlvAGxu&T%$%{Q zFmuf-D>K*d*H7;_Y1_1A+ehG_V6Y$6Cnkq|_U&M#O*~9Oav^OzUE*ONk^zj&2}nHN z`w9mb850;rFOBMB6E=_Y-v&n7*j^szzfcN{{!Khj4(_s(K;mMuULRu^?jkLo?K=E+ z&c4N@f5npTY9v{Ggdab;kz~!6__lWQ& z)ZbCy<7q5;-OyMvFJ9Kaco}owvRl0R4vP;V^p>o|tZsmu?Zz$XS9Yc4Q zEZ5UO;dimnEc-?3n z>-z>MZo)C$Kye!Mp^T#xgK8Scr~DM*iEjI*V0@Q9Aw&VAlqBH5NlCaZL9Yl>ietTl z2q*vERn@1dqWvX=xxtHonqjn8Zv>L|7>$K4_C6&q{+)lsa!l)15(uKWJgVy8MaqNCV)uSTpdEry~4 zWPUUN)Tp39Vbo-F{9D>Ak8yiu@5`6sS@cvEfXtaJ)Dy(qGnR6qlIg?F?Q%+0ib~et zG8A`K;j(QP^rh8G&;^EQH3xT8qKiyTWJ@3JV#@nkD^WLp!QTj(XokXrutc~r1k3x* zXmH&${x~+@k_*!p*2r$K)W^GwFWfJr&S-NpuyY)MQWSn+%DW4i4 zMN=;>KYrK;-x*vu8C3=ItHZD2qP=d!MWfz%YQW(y=Y^S2ICmp6y2xjQ8I7!=Ld`9x zNjPV|>Rhy`@NRR_jfxWg<)fqQqyvnU_mIud?Wp4D(Y=XQ1sy+jc<`=~A+U zwX;Y8C5kpg;x%eq~0=-%8wa{}OHLOi1FN8D9CRMl<4 z1|bd2|5JUaV*DriOgyNG>DAw8dL7@Z*I!A1bgw=-HBq?W+S6eWe{m+WC|$TNypo>) zvG+{^JhCsjmAb9`eFD7pnjUJCV&tQ1LkJ!*?@SmQEqVDcYT1dJb`pZbt%~2wG20G{ zS)BtWBmqk#y0=2&FLBA+tbIF7@Fr^_<^EIsrX0Huth=MV<}tl~HK|!S7tPe4Ekw*L z;6wa22$Fx+(Z5rX%_fJnMAtCc&drY>1#5-b*-H%O^2FW}*QOThtehbq85S{GYp4V} zRsZ*}xXqC(whM8j%i8b#XRnlV?qYVtNsUZ_?F}4Pj1T+f#T27*TVZsj;Uu8mQxw)E zr91y)0x7j_Y|$L@OX(Iz&7IvA!ObeOZAUfnIB5|+qh_2-)qV4db`-_N0jb)_X$*_h z+;Y@yiDs6gs(E_2993&QmN(S)BzKJyOmBw0ap590qic)hx{_M&9EwFPg(MJ>X#f?p z0MW{o(~M!(H)ko&l=%(!g(o9rt2%eB&7g;c7Fr)(*fAd}%_P%g``3J};%-e5~P{qP!I%EL&RX z?LZ$FvLf8IMRq+vStnazi-oLsg}glSp<&2F0FtiQWk7d33z;fs2@7a3(*=tElLtTk z_ZbCl3l;WtYu0FEAjj4Pie1Bs+&x8vuX}RwmpjjSP#AvN;3ISby0!-mth4pF2dLCN z`#sE`q8aF7kq7%z_hQjouAY6ZU3<_B-SSjNR&G{}y#vCAmx^abs7Oob1h!{+G z;e)}()ro{O`H)QvBWrDlT8-f(u?rMr#!JHuaXz|#6ovZcu>D2UXwrqD0{DV*lk-1_ zf4|AJPZ^r8%CexI`NM)=yk)fDH;lmefu!O$wTSnp6vU`nVo+AhFu=Y(<_1MFp+yBF zPD?>TaE!N{eJx+9L@oIV0PW|%31sRcW5o`^l-CY4Vh7F%%l|SS6+MjmcB1MK zH(v=7{duITON^_>?H3{(3Wm1zW!*0-9YWXmuMsjF{xYO8e$_cd2#F1-H*nX-(`r+= zsz`TW!$lRW?IPHL?YJ(I;BRrfJAwbU1*QpaE3=Nb9|0 zw&88toMaB$wM~9Q@<7DbQJz+GEfT(mrxo2D1gX0Y@MkTJ5D^feSI&XsyfYK6DKMfk zj0}$N{6b*-!^X}G*Mop*jbw9j7h`-(SC)@+PbIYEr-aXgt4jEncS_5v;4kDdPy@87 zE>^#bZmxZzoG%hIwspD>N{<{@h{MpmpJS~I9nNDM8wq$3hyqw92{}H8loLoD!lZ07 z1DptK$7QQ)32a-4 z*CaX6JBukp$z@&jX~w(|%70kA+x5IZE4d6ERi_i`c0%yNGpGGke>|Npf!1eE=c}mG zT*+wzzeme%JuUm7!@~rESN}4znBTU)3(Bh-BvVNOi^;^F=RT1uN)moXi7SEQ$myBn9Mc;?LjcM)H|Z zn!_7z%4kBh_s_R$fzFhSyYAn#8Rt~pbyF~t`7T5@C>*8~Lc!lYPoglQ&IW-E^kMBy z=}bil=v)3U?ksAUzrjJ472HJ#>FBq~W@_I)oXu1hcjhFDzbFyNqx|Y9#4{D#h{&v- zAmlSGdQ-?}(lu^PxH+H6_m+Gnoc8Zui)R{vVSf0NC!GnEbqVQA1)I%(iw_k`hC!Gp z_8o+Fy)!zV$y`AQXwZ>_CKvwFy7za7H1!=pv~nb+$(Bj94~I0>zRqO@Q)kKFU|QZy zF)D^W`!@8yF`y}xzA>N)^**Wom4K!VzY);H1}`!zL(0WoBP7c&{}H5k8_Ct(@sv7% z%5p(bn9go|`3dmzFB)1+x*{ua>JzFVmGasw6`}U$|9^^iszB^?7O2@Bs(_>XEzLp* zoWK%h3H31*slJEM12v4lvyRPyOp+SvTV90V+Y(M~(4~}csFCwTgrWYi==tw3#rDFK zyEzIi)3qZmoDi_ADo&ZQnX4w7@LODM;9Jn?Uf^r*-ahx8uB#+@|oJsP;9OzcT z&ZHAhH5=)Kre@){d;dF;ftEBkS4snYX=!qZq~^0gC?aCtBBm%8ybu+%;YG?wXP<7a zroksI%_6t9g}SYzB;Q;y5O7f&(yn6bx57!Gz~`1R{@?OO`-DrMwFgK+Zg64d*NVc- z$N2v<$Yq%``0Ksd<1;^67{5yF`9_8?ATdk>QE~MEn&$$jx>_?1JnN@A=5fY{Grwu= z75;|qj_3%CeiRF3q$4W493B>m*C-Z>rz2_{?ucF|yHt*}YmH#IT{{A<7q(IEcCB-y zT}y-EcCC20T`N#s;GgZJ&^z?BS1q%EXp~8hcITsWW5}hy)?}4H# z5uwS|Qj12Yf}uK-mi+Z@s@JG)D*ubw`^>Usu8t}m(o(kTEmhT!7KpAJ(A$BV?&Ev6 z7B!9k)t0Kr)l$9JGIUE1wW4H+o(6Kik3Sd&y%*@d(~I%n^Pwb+W?cB)3;IHRzFAQ?+2kz;qvpzR=Pb8uu~G_XrbaCto_VQMb9tkuURHSt zL&WiP68Rzj^3ojbEs5&JKS-FhDOKJ@f+E&Pl&ILtJj~SU!Ky_3B0L zW(YH=Z@QCd&Cq{uP;!HdI72kK8e&YvzeZPivnq5%|P(_(is5-c9(@;?Y)h^J>AWew|ui%@ekiBweC+aSKY)L`Ff~B>U2qed8ZJ z%CBDLH=1E!=n2xV!DMM{&uAx+e7 zouD=ZZhU;it)98G7OkAMm%}S(U8pJ!fEh7{719xmLBV`vTCq~$a;mFb7=!-@4)tqa zrP_SczxHh|8k*ou3`nVU%g=i1wC{A+rn0k?;?xCqBX;^^WH48yB}VMI%%eO{MmXc_yAXCf*M2{Wr|MKU9vuT4;VCG|U8WeJEc9 zCV~;jUn~uVd**4OK>kZ<(Qq(nOx8@H;V3J1@RYrrc)1YO&>)s;>(CtnZ1_*wJD0Z8P|(^t=fQ<4DXcg5_P zzFnX_;vbJ5T8N}zh5bETfDjwWE$9(3T;$33__s9N@*b`FXo&)w zCg4w&IMtslF(LB=b|^}HYHfw-DkDZNViz(oE@W59I#W^1VSQ1yOAJPRT-mzVg>n4S zDdvjSl`Jh?ho>t^hDp^EF5mU6WJz;QW@8dKT|LDyB~rBOBhtVuxc3R)zP-F6xnja}gy1}0szz{s{-IwD2l z+U1fFB@%8RTuNjvhU#}W3e*SiLg+mSYh?Z}A4c|jB*QbdD*Jfu+TBOR{!?KJ11ynj zd5uea#O7+4%5P?(WPb9G+|px{e(GFO)55CSrl@nG(4CNIhUyw{R zY4Rz#)loCCQ8#Uw>`x3|#$gc67V63{lg-xV>&yl;plAA`Eqa`THGfy12UfEmU_Ni$Wct!8G&GAe>8(ra3m3I^)drOeOqG6y$v(HO0FC@~jG#N62x zq8#~iIcuNMU0M+{1!QJr#-0HAeR7dIchC`V*eg8(WaX96MRMxd7t{X*_zk0@W^4bu zOnxCzl548P191gUcrfBc^VP~EODRJq4JoRgS2P|Z|f$L5zxtDaYHqqdEd}+OtpfY}#`VDx3$T8NO7+iRGta>mNH#TpXh1UIr zuN`r~O4`U2WU^gGD6e}Fcq{&s3LN}9RbWj*;u5}CO;uvi91U?NR?d+Lx?oJLKp;k^ zH`eNA=4EQ0*eDG0wAG_C!Tjkmte9)7cTLx7{!pL2@HDm*qQOb7k)HAK8%bf<_9Rq> zZxmF*Q_x$y(KSPuP&#SiH>KwNDMcF984b$Opwoxc*r}0>XloY_$wq< z@L7BkwpnInh}6J19hd+|H2chX+~Pm>k=c2cJ8 z^JmV@k+Nog+#j(1a-8PLvBju+PC;*US1`73Q()t8R8Ij(!JW4GC(-T92iJ(7PHri zuTL#Amx^y1TW%{+iPxg~l3_m4KnVyQJ-PfF@JrD6pHfHKLR8{VR3G9=9T^B2ojRfs zk^^AGzr=pvd1li(0c*5N?+xU8vfiIdekrXow%3$gewsfNlFsT;N!TRs=a_mmGDk+Y z>CrP`6l$`fmPO1->+aZgz0O`Tsa-#)fIc01gMrl#MV0mUT}9<8kGyaD>+R(I(sk;_ zrO00m3Rup$)Iu}WYIJrXm&7sk2#_fbAk4f4oaG8*?1ic zJOijHlJqx;*Mt!YdCw8|1O@Z)O6m%ds4g(hUj3_-1a~jCC!DI`P`m$*no567^?r6= z;(e&0WPM|BXF>CIvf;+IZ95y=wr$&Xvaz+XZQHiZUu@&eQ~#>x)t583d%EV{nooCn zy3Z*Oz4d$+GzsFuRa%SYP#>am8QVRZ=c-&mT%T_@AkErRKbh(0X#Rp8tJNYXcE*QJ z9j`tS*fnyQroz5g@J4@g3tWtziVsHk&3J2{?JSIL=6cy6=a#V|q_XeDCCDSu^Ior! zU8a^H5yla)Q+Dxy3V*K+-l!(H6w|1CQlvyD#>nCztbGG@cCGZUSyJmil7Z4u)~PPk2XSCRURM zeECF>{)_-q^v?Lp4#cEQT?4FR_UE* znoKq_Ql2qcrhSr!+4FwsrF{}CJ#XC4casbj1AB$InL+u-^~fP2ZETv3_>(UH#DGM< z!DpNKaR7fYd+igeHoo#5RU!D@S+@aJP<$Us8VMV{5PHwhVq?-*7eA2N_AeJ%>jyEl zkBCw92f4b(`zE+jS*QjK!^pI>`aj~0Wogy&FRw!PA*(ww4CgN&vyjDMA#ymm-)rRL zyuU+Y;=AeX*TZ zS3=DbWnrD>R{CD5E$W_UJ84#VF)dbCOCpU7qe0%M)4tvU3T6)SbTmPQf*LrvvcIY9 zC1BzMSK5ZkQQB=yC3qvU*r<_7e3BvKg{e0kX|dTHCD;Eu2lVvjki2fWXDuR23g2d zWWn}<$B~gV(_N@|6B*5vK{+FP4GK$l~v$XYamb zZm>te>YP=!wMr%?r07JRUx^G)v1sHE+ugY~{^vjT_0)J1?4=7r5bn*F0-0HmEO3rDH+L&i#g3Y?%oo=>KKGMGdx6 z8Su?kf77H}hrlYpta9MY`F2?DAgzq0PhJx6r^qO|S|Zm0?X23qe`NlaWo|#y9ZgWO zS9(}Gq7wByO&mkIm->bosLd4R3SXN=iJgU(V>1eT;2V!JgYx}uTs$d5`!WQ;Z6Pu@ zU|AqykKSz0MomVp@S+hK7vnN8>xbvE4# zl(}Vj6gZG2V_aH6VKK1m+{rZ`I}!yd{1M09o(pe%er1n2wVyqY;m!A(O;~yDfczne zBhvZ}sM7CMEuw|>O=^b~9aif_zUAIa07m>6l?P5eb^X1t0`;`Ok{?~6@7R+`!N?masjQ(v!?n6^)v4ZFhf098iu zHlNCMn|78-yW7#kNg{t+LAk$O6_(!kY*_F`_f?Loq#hYF6L!w@ZmyOWy=Gm*SHCO7N zb`mw{{sml_?22NtDiP0(ZF(R;XfUhYcHqyAcI=NpZ(hBsz>Nc~bRH41M(;S%f5@{7 z6+#(HN~bKTmf>%hgt_1GE&~*PUX7H9|9in_a$FQ*;NO7}1BK^7bs>jY$eNUc5Lq-U zg1Bn6G+Rc7ZYHCH-SMe8#)AMu2p=SGYt?MWZ!`}|(UJaOREmI8-b6)gubV14nWBPz zgW0UOR9NU@hUcm|#g8D-cLLo5eBo*i8ihraKRT}No2S8PCj8cKK^WSx;Sr-OE%(se zJ)Q3$F~)R$y@z+uu4ouKEsMw4FYHd-J?>bj>2V%#hfE8@$_1N@3|7wT6EO}EMS?8e z96jNm32YqEVJl^`#{T`oQRzNLXvF`7--ng|%>xyi!n6tc8yj%I;o{BoI~4ZRB8$=+ zmB6~_C+IO`X)4$BD;yL;U)AOP@S99WlgCFanbc2<QP3)3ScX7|GmmmF;6g&Rsf?Wm=Zv~j7mGhx?ekXt>k7j`-bf;-Sz>`8ExA0ey(0_^=sE}4@Y#4rr~TJspc9Z55l7~_w``9( zEfYOOM>s!HwSop$IbC^;g|!^Bjr>wYosRK(-WzgEz`6e!-qf1tBPlE>G!GK+H~Y~< za9Z-;R&c8j?sM{3+{OrrRB8RTO%VT!l+xt6xe>=6KxWv;YvALGAQ$S=iz5RN|*&`{T8gEG$d>vDrv6lbot>#6sC*urwc&t}Gqk3Z5E1S^#}?R02; z1c>(NkSXe@*#XEuvbD7EftZ$3zZA(lTW@BcJM}0Z5WycCUDqYIS<2YIXfB=Z3-KJK zlQ(@8V>9Xjk4l3JNZoAS8hVHV`D|6)cG_=~W$9-D4p>HH^Dx$xH)s+U=&{100h6G2UfVEE%y-Nt_M@aM1bhSdu^g zfh^U`P)lY8wph0CMqCAuUrorjEmdAA^iVc(h=K~GXX2eU3H*i};g~>+IRPj05wRlF zKNqHgnW)){oK_yH7YVCC7&bAaFQ2`@&g%GGLyEW^OZ^y4CTPdkb9JMQD4eEy1C_LT zi?wR4K}Zm}-tkzWtXWhnSr)X~efogFp&xA5yq5 zxq_c2YvtU*h&5`5zX<)U>&C)m zS(M=jAcni$W?t&q4Nu6+6?xP7X-0w}zkK78xK<8ws0nS3HQE-su7CbX*j2Q7;aFxw z<-r!lt>ibML004ERFH}rrG+#!wVWg-qCJXoLlMk2i7fYukU|(-WN{h8u#pY+{KO!2 ztc_-D;=w?TuKKHNQe>&op-`n2!9|2I{CDCP=GQ&dUkfOOZ-nYy*$@teOg=yC6%zjq_RO;`L(sh`@wfs|L9D{2Yp;v2jjfD_zNUL$8~Yw!FxM_oc2j zy0+0&*|Vvx>ZiSJZP4LAJ^ZQO)@ktAgQ53o|U7^fB;K*wQy2ibL=G#jSCPgcyl!g2+ zW9kCeuh)%%L1JOociw+dI@x3L$rT3yk(@DS50=L)IaVNdb$;Dx_k?uoba(b^G4uj$ ztrBX_NHj-yA&4WO|D*tv`EB*}?O>zNFx^~P9qgiBWd38cW;oDWWKG%>W21=H&cf;6AZ-NDRj=1y~oO#m4@O#-ka>r+bHP56oxdJ*vh@-#m208t3yot(DnIP)cj0ua z2X&x1NxNb}4w9Sh|0Rw4Ct_M8RYY4;-0PBz7Aw<3H!t{CqA_U64ZjoaUF2OnQGW_*nGWkAX z3|HLl`qjy(38uY8=@1VDEFveM0z6r&ZjOLNoQoM zwwKODWZrtj-Xud&_0vqK&CR+Ca$dwyk>R+Q`RE>o3(L?BED0vAQ0sPWUUVRs3o$9& zNBzDqsje5>xon%WdN4a27iJ&)Dw^>ZML9$vwJ(s@O3&30`eif!7idf~gDH;;Z)sY2 zaGr*-gnNXZjlL(xtPs;DO=)T$SSnDH(>#7C*wb&?z0(T}I<;JNXbYqrr{S!B;u2ujN|< z?N5)UXSSGoA>$r;vP)#Uhp={kP(-Q-gQ|RQxg&FC3V%qb_u%VWYnfb&9&-FO)J`?@3x?;=AQ4XudiIbfppH39IqLto|8w9 zX^&~ALQZr;;d=--TXY+A(Y1E^@c7iL!V$S*OING;2ioPvth<**3(B(8Qp?^t&bE+G z+%?x_Lpikj1vM=d)`o6D#9^|iA|iQ(MPGMy!yePX40BXlEtQa}^-C{9_d8unJgJQx zobAgrO+MD5VLq-C9ZpsT#*L0aGMwU(C%DYO&Cf9B^*e|TGk}WC*;2$AiG^A!16iLn zGWyqcCLJADgR*q{cw~eJs^NT@` zb2uta>&Le-&)7vdW$&{1DQ|oQ+pN`B4ni|vsZdN`4>)&2R}1KRWA4YdVDpsdJoWUg zvOM*loM$gnDpj;bWIC>i?N>gB8JF)Sj1{M7h@!_l?E*k;I?65iay0^vb>4}> zOPP>_CKRD}-cLCBnvdP@Hu$n zkTuR(@Olkr%(>uyY$)(OR!sB51Pk%E0*ip5FjnxbPNI zD?zZNJH_I$c3z@}!`AWH-{k!iQhaSo@k~gE_plvZhtQc%=gVU6F}J)M#yfC1Z|*Ft zo}5Y1^2^+gr%~Cu*h+}W2I=H*FL`RtzV7FN87HzUUZ{tRc`ToMiqvnMS9)yhQPWR5 zG)Yxl=PNYXYp&6wl}J$Wa|)()b9umMw;C@@eP1}XzZ>i8e*n&^3*Q$(abVy+*;P}xF|p$ks#-lN!$_dI*W4r z-P|q>AkP)GTs7gge-C%-SF-rLd;2*${i1BpEvB7o{;(i!cdKZrd1y1wZ8AaZiX$vj z&D}=Wu`!x2pPrq`H`KORJh?&?R}pX*3Q#8kdWV-0KV(Ecnl>pBPVx`pCI^eGZ*_Vo zV)PIb^}c6QcTEO=rqA_zfBP~Svhbt7!*eJ&)H=B``?dRLbbe;|OlL9mPiHKr&-^ON zt5xQstIX`+)0MW(+x2i#3#xM0-YeWY99PxcagH>-#Qv5K$tV6#A9hz!r|Dv8%3bJn zge61c@X^~}G_>O8tVi9J4UKzl#>OieS2W7IR5rI(j30q(>tv-yt{K%D#41cPA2(_+ zA~T=C@rVb<_VHEL7mf8VuX;U2qL4s0bQ5Yo>K9q`Z98T@RW77y!OA?f`hM5H_Zra( z*43+sH1kj3jgOrnh-khFfM>VSR({o0Y+$iXGGs&>+PMx`|B7Jr(x3KEDMkl3P{=%5 z_K1jUa)tt}9yH_;l2cp6Xd!lJqh#?%5C8F{jNq0tQR&y;MIKQt{Xw{=a&)4dE0F88 zvuS$=vKtG`DN-XVI}BcAkCVwzsk6}cm0Jgw^iy3uQqpg}CyPFUdrQ&+N;ik2qJa6- zhy7Gh7u2Vz3v4lbEarQB#`=8 zBonCAEzPkGwyKVlGc+lio}nD}3PV~Rg-n1hbu}i7{N0csWsfa|SgrPtVv`AYxO*=w zGx7TKZ|#T8IUep{u-EOqf&m+9z z7&wW8$>({AW3T_@>ix~G|8mtT&i+=y(#o_cxTec6?^2WO;%T*z4A)fWCpz22!7JL5$pg&>TS<_If(ps&lf~^$2iQd^$dU?$C4<3mSo_2o? zB;?mHX0d+lxe>fRf{x0!Wb5o;r{c($c#*2{mTDc$+g3W4Zdn5@(u(D)bz$l~h`Lpj zk|&pX^`#hiA!0!q^EX(yH*CUoNWs0Fm~uv0K4XiygDtL|?M^p0?`7NETDF&DzE}#> zxDK&5H>;zQ*$9o6@3{l_j@A+T_o#vYY&RjjdBe0Ib4J8JPp${HqA?6A zB6!y4*lH^cJ?e|AJURa<$njupxX7fxnS8dZaWU6lyMKDq59?(V+bcMgapp%m6?f@Mu+1fz@6c^GlpyI|OIn0pldmQww)f z?=o-~sT}l5DurggvW8@AyMDW_FeK-wEj!m|f8zUm2QL3cPy8VK-XiGUQ=VPyl7EvcbUa;E_fb)i7sDy>%-UwPdL!QjZF_vZ$J5w zg&#B!NU^&@3-{E3iz-m?Q#WnCdEi&(N>#l6oT+BpRa~BRH-HpV9A4RkZLp2QrJ{t$ zMY9m@sV{N`A=7vO5u^Q5K;|k76iwxZm*t3KIx|Fh`w#ngEX<6M*el|z4Iaug5uz=H z|DVg5m|Ro?`pv~WRR00LtF8dy(eX&nv1k_i&RYzr{B5I+Nwme%!rZe7dT8{qA&cYnxMSLJoHc!w#!?<9XSGzU8HJC|S~Lzt@qa8!}~pDGipj z7St~_2zz-z@?l3E*!9=4Qa#-AF7A1t)qu-O2VT4O=(mqtD7s~AW2xr3z`dYFu^CUa zC5^hD@y3Xob_?={Zu^p_PrQHVZ_-Y;r-y|Y-{Wy-#wV9sw-ZAfp~5{XSKM+j8#2N)MY!Tmd!M` z$0Cn{UrUW|Z)FEATb2uWIbKaV(JR_~W`iWJ*4{UVL@sYj%UENu_$+tPUK%HNK?bqm zf`~hdD5NzgAuzhxXFC5y&?QA*miSIM{Pc-xuJgLDvEuOIcEhTyJKzyVyq75~dWD zcg_N30?=i%YuquVwUlPJLVY{jwujGpcu#ty$LN`7`eN($Q*|GQ=Tk6egFAzr%;3)v zIi2%;CXyAdrF@bj<@>X3#zuC<>?(yN*w`<-5SR@=wb7TJQ@O)W_|FKvN|Y~p6{N?= zYrpcu5BN)X6+-qyKRhwMD>0;Mid**MMCycq_nC#UbmsH|Fy{1+ltXN)v~9%RFELo@ zxRfZhtnCb> zKlRJLTHt8tU97nZf5>e*qlu~)Ql`h69}8UEHnzpt@Y1Dc$iFstUr=Yb^OZQ#bKQ;h zR;DK?9ug1}FMkvykus%|;-_3K3~i$)l7$zmT!=gKSIX~?wb28lxb66$VI`8m^)(AG z^YKOWMUs#lx0bGvTncm~yH1(U^JCbB_qv+bh)67W2+zV}_iNd+5tnTC!MaEvs8mj( z{YWrNB%SA0NOx7dTF2GXFigEDQaKiQ=>=|6Es>7&a%>dsRQ1f%-+a`zs7<-`*)~@x zkJZ+?RL&JXbXbvwcFN-u6-%NYYh5>zDt}uOh{#Gc$*pnD@fLaLHc=J^N$$dPr_Vn@|94 z3^Kt=cFU9_{HgaF?~%n8m|5*)5`&(rqRwSg_2P>a^6`BGHV8(NJ2+5aNMt&B(;MHF z41)Rwyw9T-GTus8+fdLAWthHG%EpE6n@hE4Q;#2r7H{Fr&|cr+V&^v-MLcyuJc4D_H=sU1yepVHebVzHm?z z(A($eJZUdA8gE6yZ^VeB#$UZtjw&7)$8k0X23N@=U2yenb0!L4 z8!>^Mn#P#K3Lw@!i+*@J;skLWOA%Fm#L-MKpw^<%w8G$8P~z_>k)l=dbQC=?1Fw=^ zm&ms?RutMOPULjj+yKNMeRE0ba%ryR#B=d1vFe}}HYR$XOZ7G=SX^G|k!9nl3>N#S z8i0!d&OqH-$FPItt=U;x-&)fw`5_Qn%=Loe%}y7q zw6>>fBy}evZoMUJncVmxr5JV+6@57td#Oe2eG_oKM>vdYZX+Gbj=ZFfX#*)|v1QOQ zox1L-t;dIXFcpVW6w)=;c!4&i)c z#^LenPEmDdS3s?uzb|P>)cx9Z2-?uy25xjWX-{`-`Ofr-H%aF>Q=Ned(9=YxOo4M2 z-&#nw*~m#>mmWZ`+KsADne<>TY7=^i_Q%$dF9mkrZ0BusksH(X~i$zjPqx+SW`NYnuDKmC%CK3~B7|h$- zYm(?DV4g}d7ux7iOti3#tFQ+!ss2Y<{d#PRkdokrEK;qRa9tMtNipf|6sAd zifC4PfLp&SY1mz>h?AOh)}`n#9{G=px(IYz{Er{b=hz2yn z_IO25(XooKi*QHfZYFmx{#!(Q3n00G4iOEq>r7-|Ufv=B)mc)wu@* z)S}r9ZU5=+7Q$Jm48<=RG5#~U^|cpn*pL8N3OE!kklzS0Uicui!UZ>YAQI#8hbf20 zlvdm&l}*W;T!1j*mcN?p9K5llnAmz>#$^T_itLurrNC^u12sAj_b}s6k1uF8zgpA? zcu-$89l>|LfVx}667b<|2GD!_Q`;r}1e%kfr&@90nawEQ6N;*=!<)w0vMownc?lc{ z?V0er?4lg(P+qY>UuVAdS()kSHu0CO)!GW;ImjJtNKnHNs3{&Jzaqb!_oHyZ(Galn zosMlKxT$qnOtPd*uHGEjrD7&!Oy6GO2$SJRuB7oZQAozb+96|XDe4rN%+-wg!04`< zA4J`5P2m8lriq7<)QOrZk3|jJVbUF2qLwoc>FtkwLU5@#qZG=!KjO_9@X8eP(xpqAGBs6; zXwp#RI+GCzY6?yhqLNTed_tLBw1^5}n5k;Ye=yr#i~n?IqbZ$pXn3c~+pD*{{EyyW z&BVo0sbw?f=RWX3MI!I>5XhHn45+)0MTGFKz1VgBeB*~* zfoeVsmDB^SGFcYqS4?=55piYjjAZEu4J5iq<=X`535aspZ=FC^Q{t3a$7ssFYfDOb zA-|tmJ>{0(!#GhV@q_L-GAHqc?zqe2xXbq!?q||J4fJ~&PW=rl+b>q+n-BSw7aVJ2 zZDP30ZJYY$wkT#6Z`g81@Tr~|s8Uhd?7!6^3P9=*sLA=Gabh%bc8~o>9nx+Q9kcRv zW8qH;2zO1jt(rtRN%WIsBH>QcPk8b?amS6+BX0ZDHR?anOdHl~2KBg)Xk>*b?aakY_Vo+?q?q-a zY)F076SfL-vj}LFy$x2ppg851Kmp{nyia-F48kmljIS1Hxkd89+RaD-I9>YKyP!g> zP8i*ip*4oV8!c1oN{EGRK9RB9TFtr(-K{XcIXe+!6r@z?w5}oz_me?6iz&+k8bv}_ ztS2hCKnrfZxcM*+A9DbsK5$HeqnR*BWZiY;X%5h?IrcTp?Mbe#a)KtpBPWlBUnM+NpgB*WT5U z_VuwyasmD8Ca>rp+-_)}8E=!R_c__wsgT9^PUs(2rc47TmSBV=#V$nh=I zn9HeoDY?Dz6Eg(vT_>)ov)VDuom z{JUHGPW_lEIqs@1*v22piU9Au*_;FkFI?5I;$53=7$@K|8Ebp@UArj@ypf2FGNJ*f z4}2+9X1s5zraz|wJ8GSZw$8QMsJ4#=bIyS?q?R^brcoZ0*DB+F8G4$Mo!buAe)}!r z_PVI>PDG^bet=W#?+dReT8a=a^D0qZ;=^BZYJhXr(9zxSe0hhaycC3ewSiE@gz-_X1$Sbln=&aQ&u3EZ7m{cp2`w2FaP2C zhe6gkQfUfkKh=5bgUHuwZKZ5%u1${XPmcn5A$eoLulj%+N$F@tKND{lTuZmLHoPpG zj+eg6>xMU#r>x>^QIeFEn)b$kYRV(i{e zo8C`@(DSmhNT^qk5cJi`eLU2$(Cg=|l&BWaYU`DN4QmBg3>Yv;AB=fGD2NZIIB{I% z)RK@!bR}QgG)#-4bx$$IwV)ZU`-g+wfZSsjN;w}q{W@PJD?=$g@^ookKyLWTuS_6_ zXj~zf?K=#E2;6XZ4`L@e#w*wyxJC|&x*;GjbmzoJ&!4K4VS@xzET5(L*iJ4DeKChFpA{1}BHXV&vqVyqtScV-cZ+q$UP& z5{JwEhhRV*8NUOe5gP9=!`NrG6I9{8E*uL zj5*EPB>7l=z3^ON|L_ui1Pg2#`NP;b7=XoOtO7l^Yoi_NK{_LZRq;_<5Hx%q#(#IU z5A}xBRqM~|S?XY1_mk_eE;8y5x(&M14|_3gb2CpIjf>9pR`C9LAUw5VXa+a>4*-^T z7g%4MWnh)_gbDmlgBT#-UYWSix#+o~u|c?ii4hyZ(?kXjNc6v9UPz!&SNKfi|A6fO&l9`%u1_QQ zSdNN0u@t4=75*PUl@ovrd?Zq*|1Z=)A9SJifWZzEYt#2X68%8cj-yQa5oPYD+G?@# zzgCEiYRV0iUIgE2N{qo9);a&Btp6Q!0AFu6`|0X&;fnU~W33%If^CXhDO+ ztZ>P3gV24p7<{omJuobNLF-});gtQ$+*AKd1`_nCK7JTnCc%1b2JEWR;naZ=a`n&k z4Abgj$YDOVz?=LF&&XHDE;w36Pg-|MPB%N}!M9%G8^<-FW5?A`%-bzWGbE28;P-2EbH9>MNPNp=zL06>!|^JUA2d^&P&&J zkz-fDi4@xfEs<%G375yAT0JzwHKx$FnD=5|v3O^;E4W&B zD1t%PU+cxHz#vZTYe#9s5(6|_3NCk9km_5E+qDi9`peypfS>+T1Ku8KfSl2r>EGZz zQ-b0wm?e_SY8!GOFjB9r2kz+-atoxQ3j10-QE-IvZ$(lO;B_~|d4VD+l+J&0tR(K{wK*A&~M5MlF(J+Hb z9PyHJxCew@eV`!VXx@mqpDp{@H;^TW$22lkN-!ON_Ycp&q`Is*u<-Q`A_E!|XW+o1 zXt)7!3@J=6wPXe~My_a)e)YjqhUnmp+DHNe8UtsHnBcnLIfEBt{}fymt3+*&j$gn# zpzY4_g2(*)m)h|}XmssBef=U~28E?)S9t^?G}_J>Q7Coxa|Rfcu7+R4A~ae*i=fn5 z|2WPUjV$N(wG0acO4S>G-lD#g??WYy5ru|3{PQ`Q&KRQoGa#|Sb>=FM_JJZ%vShhm zpJs|zl+R1|d?2rwRyR$#72$hkcg&s)_LpXNF_3Nutt2jD$Io|`C25)ER<)kU*uOca z;_bAp$)6d5Z0a+{_=XShh>0e1z}KZD^-XnhkD174qecFip+3%9ebsZ>1@dBw%wk2O zcnDYl#ETe^u`>;*Z>b>$@MU8nN=Lqf5Hk&l*l?p)y^S{jCwjp<`g>P^*Twwa>JC-! zx?kVQ%M_J>^r+MUI%=C`E@X4jPn(2x^oExeV5Csk+q+G4@^Qg+Ts$}DEGu0@KSBb-)6=~fvD^Ug&QH{i(sDb>PC2%*?^Vn5&L@u zjEZQLVTxal1#llzD%ORfuk9`~QK}_N0H|`Wi;vMWXF04(NXJ4iUG03wLe#q|@Qg-% z3Diq^v*$nWsE&oBsld{w^ymlJ!%+w>n5RX*I;h#mvCKav9du!<(lzY=sV89(j7&K@ zfu)YMLPtX?sU3(bCUNZr+|QR5>&{bmx#)r9RZso9Hfg3-8O2WBu5Wlq5tFjx%yw?$ z!rF(t0HjRUfEQFeFp(Fq&^Y-LFVs^TP{3d8-Q`@7HZVA0TMSE1Ko=zCVrVjJ(5`e^ zd*&~02|}wG(8H5GZ9q9t$&_>Q{!(o1&AA$27W$;a4R|T7u!?XM0|Aa~I&Iy&&U)D9 z6YTpt+QA1)g#J8R$alfU-zv~%MbIS^z9`bwqz@_%dWEIFzYNeJ2NgZW>5OJ#y!_%= z>^l%2rXu{3*Rh_c2D~1i8*e^Jn6$#MS!PPEBFyN~iW1uw`kij)0Xq!^+gw*(I@RWG zaRNHDWcfpcQW*}WTzo<);e8#iQX~P@0RuU!sPoToxrH`XSBhn^JaZj_mR3(9EmEDm z&3OZM?Pgrpj#AbF6V+a(ujb#pMjKBW?_~|};2Z(?yAY--H@`0JOqz7JhsKs*$o)q> z!2afFU?TBo1RToI1$}ijnDyA{FyYcv!OalOvWXzDLEyv%)oT)vX=IX3%QSGbJSta@ zTW=_+KvSZQsZ;tsC*#ilq&{RSYLT=SI1GgiR0v=x2#ybGlHJpZr5A)x=%(IYDG_A< zP3kI?I&|%yywz$<<)YWRlg^q0Z=?jdVSa|D=p^H#^9#0mr*>`{nWwMhXv!Q$PVvY)l&+E|5Dj&>?%6LzB`fdlnUShQjU0j` z7Rw+a>M2JhgMSxeWo#0Bt@S%jdDAp_tM%JTeO`fLULt?S`|MUtBNh#HjFnlfD-`T{ zFr6{O7K!x)$XRgX-GS$>R<}KO#pK(q(laJnhKw8d&B<$3)q1Y>ymTux^>eXC&|drM zQd`UW^iX+JtG22<^6&*LLuIP$c-^P0KxwJ$xW&t@K*{u#WDc}=D^OoxJe^p-R;#X( zik_;^|Jm!}whTdIRGdgkMOlLKQr^jm@~c3-LLl}q{cS`Kzf+;B#e6*~dMmrs0!W6i z3SnDnInZrZT`hTgvhgTaZ58v`pY?hIEW19g&*iva4|%EVFe~6MK|PmsCkjn#?)^J^ z|Lp8pgnF*%e%9mEqjoOsp1FQ+Q{^ap>$XW#p#D?(=IhB`qIwgBI68AVn@UrSiihaN~JoNn=BEBK_}=TxEMsrVe|T2!L`E$yB!Z?Oz1D7QO)vT5o!Dz`JhDntES z)}1^AzXa8z;DgbGS=C+g5!d_ZQFAZ&%DhQ- zQge@U>3P3ntx2#Y@@vZQJ#TTRd}aI9aa;5jZ0VVjyH3?z;n9bAMV-2nM0EfC`{wKg z@uAPqBvY6k-C@;USqYtOtIgW4&h=n7s8+m$LhJjK(cffvFXL;yYu)vf>TN3-SEPn9 zJyy78bzu!K|KSVh6Phzo9hk$Nik?!H4$t<;Um9f;Yg#)YYD5HaI&Ydm7{+2m$0Nw- z1J7B23G^0U5O%7EO#J6+njCOjeo6Bbu zdy_u@URJafo@kVZaCP9lSRWT>adm>*FE?#m2$u&X9VOx_g7!0u)aOl-6f!%F&fS!^ zM6`6VsYiee6JLW#xtUl}edh8!hEXR{7;K~9l3IpATk|Hh;w|&`1+``X&+0dihXMkp zM3AKU)S%D_1-Zp`KK7B2V{NjweZMJ7DRH&os+%?<*qAWo+gHI<;}c8HSPN;o zRlKcxi8DJX>K8QHo&I{zLC~>MP%kc(fs40TJLw%3z!{_}+gBF4QzNyKTUd~gHIkKq z)NtvkMm;Cg`*4*nqmb=`f9p?n_a*?Y2bT$5VKWm9lyI$HuR4v@)P=lkJ&{yhT9WTy z7T{r`k~1u?NZ4NCJi$zE0w8)p(aXN+P>6Y!-NxT+b5$p15rjVKQ*N4BY(W@<825pf z_LDyoozzkR=o9Z#HMS*pvYEU>kc*Z+W&mqq9b=81b_QYW(j8oOu!HG`TZ=@YG->GX z2rkdFde<7VFl{ce_CvTYF8$hJ=V0+v++O)e7{{A%*g7jTK6}^QWZ& zw)5m|d@E0hc==RN*rpq5K4(IGSJ>-!7ORf-$bJj)Ht*lJG|@20$$Bmta)9(ikF2;q z*C{~|7i)Ss)llD3FOm4Vw)8H~^r5TyPJ1yg~T;23%-CV|f9 zsid(%GA0ZY5c}QR_*1tR8z;1Kgl+o|bERq$!sELFMf`^A%g%=w^_V=lZmisf4-l+2 zIw~UY-m~?XqxRgYF|IHFK@jO|g7Cx1neRHTLn>K=L935914sDZ@V7=k>A)wkIxV<58gtLFKtbmi_*AC0+D^O^mbMt+-4%NQ6BQ&E5}As4EbSapdr&N8289 zA;X}xiD|}~9MMfMNe4HkMXNZ%zz`81+Q*6sNd_mPc?t+~@0}{&$!7z3;6-boMg4Bh z9@qVJo_KhWk?VQ;Scr}Gh>vlQUa*LI3Lww|L1S1LA+C|Xhk~&Az_w$&qouYiA2gjre|l{GBmdxcK< ze$?cP5o658GkJ&1#WaK(rJ$J=j>44qLO@id=-epy_x>OsYxDyk{iH`RnEEM7FVJ+g zGiG?AjfE(Z-ewc%&%FEZdLkY)TEnt_O3qIU`eCeJnOR z-p=+}i>VoTmxXJ?+;g1sPR4VRpI_zC>j9(^**ul#n?CyOCvKSxw|e&`JiQD4iuX$GPp^(5Oa2_}w#7N~u)r;+{mB>>_;ZX#;4Ya;53AH9A>3nkDXg*yYUfbZ3VBIPkl zsc>{RL!@1&!TRT1;cj)n=L?Q{iGTG~)cX%glOti&djmEec=enqh%3T}SngvtB+hRF z)q@qi`SXse9}cF9lz`RTAB5Ge+DhoVvJ}gTV2~=)dD^pIe|WIe)w8j$QUUDH&om~( zYc5~DFZhGW>aaIbzP>Y(pQ871vhFKvlF-Rpg9}b@ow?W_1+SHOXJp44ViXuS%z!y~ zm%~OmdIiFw|W&A@WizvVLA>?Tx3YUL=ey5(rn{!vle4$E;$jrO#}fcoUDl0AU&Bd2&pgSADfvEAG5cr%9>$vgU={ zgAYG)G}pE}mt^T#O?MWX6OZY1SImPhOzk+*G7>*h4=`uoQ_ho&>6*q~Tb36~J|zaF zW%a6JlzuZ+$+v>!1$CcQ_Rxkt2hpjkw9~;A)aO?9w~F5ei)>cRN(2sR=3y0UFv~)- zmlHJ#Cukh1LWoA@G7E`JRFT?-3HpKx)vE4usHzG+Iha(*Kb6F9Bwo_4>S!xgMXl&16>;BTI)EQ0twAG&2uK~U}F zfVT$nI`L|!s(!#!C4qB6x^sc(T#)Fj_};mIIv1ok7o<8D*qkK`-+C_!Mq#US4)VpU zBFk(*mW4>+mRz%GUG8gJ`BK{u&lX@HXZcp%**V0+;&copcbyZkv9_%4g`t#n%; z48rB;pw3Oa5{o`n-zHX$fiPL8BnCnes8Ke8Q5F(9JB1*ln9#siTSKh@d^=fXbz@}p?TkJn@>Q|2JA|lv&e}Chn1X0L z8X&475aRiz-jF-q!!Qw$D97)x#8pS#$76Et*t>W{vLZGl;EvGT&_Hqv+;s({xttuA zvsM$Qct&nZHwR+e1+4}WqF4iUVZg=8$j~C87|bvM-#P}<)+z7BMnFvSge_~Wp1IAD z4eQ;bFT|1vIX>X2=XGGlSC3I*eTj3Fn96Cl}(KJOvGrZpHH(ccnYq1DIX$h$3v> z4~h{kSaaK=bP>=5+C(~n~lAlDQdmi@C3 zBai8X3l$>U5JxXX^=IaL$bP+<4vAR*lmsawo)-dGM<6Z`FZmL3tud?-n}rc*XbiTF z{_B{Ku=7XEqv{w z1Q0bDta_m%X08$ow)WJypCp1UawHbV9f^vgSzCAv9*BsA@4_S2J&*vgqpCS9(J_UD zQ&p6(p4;4xoF3g3>y?l(H)Fe?6Qg4kdMcy3Ci@D#5|PydV;2%d4E2!A9_We4EHq!~ zpg)fcgpRzBQqTkK5p_y#^9V=387oWbVK*tJODR1^vwSJJPLe&8lvB;O zCuONsDR0P>uFIqumXHYSKw{*CKst`8>@{nF^SL-E<&z)m(5j9UHKDhrjM&nk*da}dQ;VA37gfpjPCIb7pOmtUR+#o zWO~n+;&UbCSaMSL>Qu43olArAYF*aVC6r{vjJ`NErMFaMTXCF@47Pw3j+(OXZjX>$ zwOMWDJz)hEWmhc0NTtR8l=Rd| znM3B0f$|e4Qhau|LN6{IA=c8eshLjFVYr|_VM)D|l;tXOTvFlX7Gi1{$vxr0$|QaV zUDpnJ-%?+#$**j9y7K_}W zqmhRc{!u|*7N)t?TV>F&@N=>2e&JC`d<0T2Kriz1gV2j|Ma}ZImLJqJ(VXr{8%E8B z2^M*>jrXhDj<0W;{9)4YmgucB0!p=o4P~z)0bAfvNCC*t9tdtw*3Ax{*K{-T{6#Pe zzaIvNj($bE=*tP4Ltumzc7AB%#a-gAZIK}%TUj4p&4P8_Sv@3Kp#)K3LQi#y z&fg&u|2V6jUTILZVAdoi`v?!9lOJmFng%3yEiitgU*p#y|6%kSMU$5UgBa>&42nq% zRl-C|Mkfk!o?`U)kQ)9?kU)|}*u$ET0etyGeA zJ|xY^gK0!=%Qhn8?cWV1(KuiN%a|q@z|VO&=QckcIe0439mBnaiJgbjH2Sen{QUxq znv*Oh)&7we#EL@xGy?mLJg6Z#$B1U7Vj2h?u;e-(B{GcfAX;*aRq$r+jrA>g4Bq)T zw{T8j&NNnc_^1-!Xivsj}g3kLbN&9@R*s*eGeUQ?;YoDSI5>u<5$qc=m7+Y*Ls2gE9w_*|t6 zW0`od(cs%>n7J`LwkjSpm2G%YQ~WZy^=>6_$CI6W`_m|r@C^w>-2qRlpW4qpq%fpR zX${QOGj!!s(Ty5t*Jl16xCX5zN>%?tUW`8dbPO2xenFeHFqsj>zTq8xf8Cn<{JkA% z-it}Qe$+`#5A4eWs`O3YaJAU}w^5Cfl9{F)=bBdCy6u>yhQ*xA8B^r|TSmL2d zsEmc-<^4S9n#z!;2Bv;FX<1GVEGGdU3F%{=nhN#M4NdSm99#CY49C1(+@Il5Ea%rH z-!tT6EOuMH5Hg5Ge>XOQ2AGPnzNq~M_EepJ&?JLv{GagASG=!;%9zXZ?WOI`ZD&57!tQ2vq0qN)kb`^O5#$KAm0pmm)V0z_ zh;%WWhwC#gKe?Bv(-#xNY`vCj&kGQ8brSQ;#S3A@PoBLo`SJrNx8-RxvX=pu)d;yL z+ylyMX+>Uaba&JuBWR!YY>ty`ZJZdk-+K8TiI;t@j!^Y@<7?Nh4$s*9dXn6kGYg7r zIWwU+cP2Q|mF2nstwn42uEbb2za&H5&OS(t-%F#;lUImK_&$ZkzYF8E*` ztPE~{Sb^V5U=8|8E+ET<;tIX+G>iOiR3MHHJq=7C1lu9<4A`pb#om&&*N#p5ptV42 zseg{ zCUpdp>XpB$AFCZ0_n%R6-Th;XAIK*v;ya zp+30XIh|`N_`4UVaXiq@o zE*U^iQ!#<*iyV-Hqgz_Kx)MD>-D%W8{1SJHQ!RKnNk84uOX##y`a$+0+f2)x^KUA9 zuhx_*YWsjKcFr&P@L;2|`GVsIO~HBSmc|F-&vLzvbP%S?Y509V0{yCJN5^;|rhP5;H>NYZ#8=gOlVa^>$1Z zSoUV;{KaG6EmyZH-8C^dC1jmot2m=+CjI0%R_V;k(G1bghB{vd&>LHjHb6TGBquiP zOWe9Iam%%)F%e)d3hahK9^^A}D2l$JN~*oZ{$NQ_lAG7u*^d#$$j^W9vJvhDs;tv} z;I>!mxOZ%L{k%-;-_XWjg@{M)Jw&m6+naTpVdpzZZUb<;p_5nlVX3>o!xghS|Bm0y z;gGWY&k~exgQh8+oO?{Bx*MfQHR*B~A~eNEM5dYDiT}O{Ti(56KQxloK%ixr4ezXN zHW<|t^fb?{YVvccu?*75XyFKmvf1Uf6}hJ9)U6$@2)&>5dVUWEP>7qHQFl@W?XUC; z>c#_3=0&cLmtOvWbMdtEgOEPX&IPx=2&9F0+@WA4#~FvAIj$G~eI>D-C5fFS;^7Iu z5@E((Ind(sac+lK?{eipDDRFiaBvtt$Nz)Eo7+aN%VHlRO@YAnClQ>Zx>CP$Pgl!$ zUAke%LwlMIKh)LacjdZeebqz$BRY%r_*YGbkGb_BWfpyPf&Yl$jC2bYwt@l6>Y(}b z%}moRp-0j=lV(2`;@z()QtkC>K|vq;h-|A#53$MUXWmw=p1NY))tteovq5#pP&<@S79~90MHY@fqpW@NRNKk}p7L zAG5Dn)n~cBmZBOsCqO1dRAf9&KN5H(_;n~du z_leQ&Z}g(J4XM>2pRu>f2?L$)AA%YT+j<%e(o$q4;aS95Y z-q#31*+&gKe ztixpTh!;~jGoH5q?f8TaSX%QSn(69lGzg(fh0rB!-xu#Q-QCpGwstDI88p{st3leful?=N!E{ORhbqixshdo{mGJIY~fee>L_de-~G@mI4# zjr-cO@Z(d< zX79&;--Pzg5})7S8Fx3jdup}65Y6huaTAPCsZ{52j1dEn7d`=_3 zhy|MW1-<^y z#0BCNn(>M4$``hm#>NMvyia^q8vg}-STM_iCz5{j#{fMdfS?YMiLw+}px>Qc}BsJ(Q|NOK9YG-GsJ($N1qCT%`3wz(Xg~ zO8ocv?>iW!r19S#C3#0l%29Zu8(99^Ykyhs(2g`;n{Q*<{VvgCvtODl>f0Hzd>T1H zhb+=h(bHZ_le60yz83=c>0~-u)3lA4P8vx`BYDTuczEL||LwMeU7cIfHjAmFH7hNJ zgl)s&v7b=ikA)L7r*@=SO|S@IiyO=KvR&)gN-}E;d#YMXwk`gAt$NqGqV-$Y z*YJXI7wK(ftE2R@v!CC(o}3f5$jZ_=H@{zXA>@=+z~0o(dvyv2M%ujyjNVW%DMpm$ zIY55ej~sOXWhjg`4VVHPz1qhOs5bG9B0aWC!+}mz&y=61HOeM>bumDg7oYN4y-}QA z$BVr^-;|Ql^3wUGYf5WN_mzG=*)%y}a^~dSlMhaQa`N+&znx;9k~3xIlqFN1EE~JB zEPs0G^Ul}GG_|FNOaC9n-Ucp;YK9YtbCE?? zT@`c@P*5}w)&K`YMMGT*(+Ud{6}(njR@${%P0JT7G&M_0EWBD-A=hr!?d5;YV7Gh! zpWpBE`N8fm%C(NpZ`+2rVX$p^u{=Pt&U!sqc_3P zJIv8L($PD{(L3JJYj^afJ9;NMdZ#*iGabFzj^0_0-now6Tt{!7qqoq}TkPmv?&vLZ z^!gmVRgT`Zj@})P-o5#&&VgsORnnRYtcX=}A1j&*)Q*h>R0YLTaTH#qNPWpvXwOCK zTF^q>LFIrhqedN5IQ_@v6AN9_RcV)Sr=;I>PV%@^6Eo8Z)M4ojlieQLk(`}goKaIW zn?5q}(~N`ZHJ&+!w4WVP_QWF&DbFF5IhMGxC|s4@j(M5I4xXk})b*&dXTh@tNpC&* z7&ZGzN9~m)G6z-YaDtu6X-T4fOF!aBPS32&<<(QD;VIO_gYG1Hu0twzNL744iPB%Y z5kY*ZL5=!1@-LFA3zn*!Nqpi`gXYPL4y{c2QNu8+LJ8%rWLi*jDyR}w3%9ZAZPhT9 zal^TfGUrwu$j(T z;B6D(T0fSlrp_;h1twy2{`5ySQQvqd!aVKNjw)i2Hr|ZAy%BxmRS?)>^Cr~+&FGt^ zXfXaM3H^VK1(dEvjvJ^MsGGQTz?x+A#ivkF@gp?^Gjq3AiEiCwg(t!Y?Uv_CeU#v` z5!$_X7W=3e=P*Lwuk)RyiJM|v49TXyd0~!^8GstBk7e6^6qm0bosd_i=kSMBKfK5L zm`L=Y_La0(d`y%}Pq3Av-&;|zDIy0sa`~e;pT6H5eQ@k^HT}ZedO|<(X?q!Cb}@v0 z=I2wFn=QDM%KSB@Rg?+M(3*bMx2h=CttVOS0PAnQ;2;nBW`6K?9}`r-5LJJy`O(K1 za9zrWyL^-`U%&p5&N97DDW!Z(PZg!XrNml8t0+b(WoY+VUoeeJ+4fenk5Qpgs)JL< z`WOnb9HHNPT;roi7h0sh((&P9s^O1(=G}*nEe{4t(?96U_c6cY%Y8J=x|nJB)rE@G zj9xUhiu$)3eL?&1o)n+{J}&+GB%6=<8J9kQc+JQBguCRU_H-ZhBkB_E^`;Fz>Rvwc z({tN=RIhs^q5a{`4j^dLwHNM!;z+NA73th}G;BO8e^;N!p=v_~l{wt-pPo|5{3Ju+E zv_B#CK+S+|B!|@xgWf9r4ctpJZ>3gIT}7yR^Y@1M`h9^*ewcd7M}3CQFidlom+3!K zy5T2(M-_Dy*I~lw-U1}psF-OfDOJ>!Wt1jgtjYZZ7qaZ;Pn8U8HB%;5cgs4hk`i0Z z#Q0l}J+5d%WxwNl`wmU$H{vs-3C!x?TG15S@L^FuLid67dKGgPm8<(Cue*vmlk){} zeA|jH-{@1gQp-x0`lyp`q$l&=Tvet&i7O?)vL?QYdLLIxemC_YpZ-1k%`G1d^ijuf z^;iFML7Dy-{$>W#`9T%+E^4vvrv=|uQSTrzWc7@&*8F#T$_t~u^D#$pU(R1!U)Jvk z?#ownKl_*?xc@UoU(T$e-b5$s`z_3_qTX;GAlap#Oxo%TKInOq&@uj4AM+|YyK-Cl zs0Ipm^~AlO)XaEoHM6(wdtdMYRGhBg^WXZYm*?np`PDVwzm(6EXB{tN_T@9{$F8di z`x~y~>H&4{`s>8`?)oRyK4u*{rYX;z zRYlc#TL|rH{xhF`jmu0JevoxOss;_J;isdZOkbmndB3JVe9UUpbw=jxt3IY$>ALb| z;u)c#Qt7(&%lcO_t5!4HmL+0gtln~}=6X3E=DkD9s+bBS&>69x8GTV@xchJE(Lj_H z=!weM`d@v_WBAxlkG$!F$=MvzMwhfV{&oh%2OuzD9fE zsDCF+{QH@*e)F*2zVgU3Rn%;>r`d8RvWl98_O#mu&-F#koX-Tm8M=1v40Nh7Kk{xF zUYnI>In_gaKSIUlu)Ig ziVNQRQnfE?%6vx8ytv`b$-;XR_P?;rx|5xRFLCQff0;hr6-*d^ifvwQ&QLC~ZE{H8 zC93+J@l{c2xVU$}%c!DKaB&}e7v?id^O+!~SUi)^AmJGycJf3YGXeEQP`~fK@=@a# z>0^(r{bJ-2YV@Rss=`L*581o^6Hy)4Fbelb)tghSUx$x!no%3pe?e5~M+^$+p&{4b8Z@(tN~orO8dP)0hDKuPPeg8+AmZXDPWr;97Yq6k)gMiTJ_h1rGlyO9 zQT_Av`4?1W`u@28<&QRRdToGWm9Bquqly`jGlD1|sx9^fM|ku^Q2AS@(R8^)KmMm` z>p4@T(wTcdZ>nOVmW^7urC$7ENJBWPhvuWN&sH&E*s6YVJJi?Dg2q2+y>F9`u`FS# zf0$<75oN;H-$vAw=|l4MdlRyKlp&va^LO|1V51^TpK#(CM}tu@+UwuhQ^f?~(O>rH zk5!Z&S?%lX))2FHnO=LVU0gJ@fk7WGW7fn}>G59W`XHZgfC^vXll+njO1L+e2>KxS zXqlc=Oz#hy+o~waYbNABKFaaw0j}LoBiah7Cxp=nLAM@Tk@CdvN+sU>QQQ&zgjkwD z7-Cb^dFH;|(Y4(b!9saLFryQX#5`dwPxxb?-pBkaYd~W7mYI7O zR_)yK&dTLa{4;;~3;EyU9aOs)@|Ufw(%(gUJEyIVsG@$rd%>%B`l7yH5;b~((FH#0>wG3(U+JT6Bjc+&;G@1o#`i!{S>#uW)P1mLcAx3a*p?(d z$~}SS$qD73Bv&!YjCp<0W}o>6YGm-X9mziGx|`7k@0~mJ8};sxJn4z+HrGR1jOeR> zKpY8E8{uRXbh@cNTxD_G^9D@qhbbkAKD=BQzSpQw8Mfr0gGL3q7k2NVjwzgr@VO^J zu@)vTg1@f71v>kmm+D{S~xvliSC<5Qn*)@WB>zSICqa)Osi5P`A!(}`(A|)AqyA@Lej!^%H zB2dumSuuj$46~la6oJG4n<8-dpA><^|Dp(7^rS}N2%J(m2U-pmH9Bj3b86cfJ;=Q^ zUtNgW?b)}yv8AQay^m5W9D(rlN_M+$dGi@D@UE7B_&@Z3J+1)^0OyJH&fRFBoY^1l z7{0TB(P)Bi|H%Xx%I1?vQf8?QPO1L=l%dU2r+_K~anY+6R_Cx3FtV1pI`^5jWZ#*1 zPnHe<`S<@Ikcsjlf=W~M;{gGvqS++o@kj}UVfGdq1LNKY;eT-{wQ?9}a|$7X6QBc}ApNB*-K9#T{S-?jQml?2e;?@f?XD^K z59te^&H|M*^-OBjBxG7)7abKzNR3 zP^~3=gm^zBzSeSVdt!~nV3jTIP1c`77Kv4sX!pPVmuqi0=Gv?H6FXP?-_W_H#B!ke zzhLLWMNb=KI4sO6CWbu#&LuE#Zs?ARUxlQD4?uI7zd&>0;-}W|aBJ8k>(gNvG?!FB zb4B%quOBui`yL?Xs{ezSE9~zFhJfM+41532khu@o^B(-+HAz6Ty7plw`Mr7uXehC{ z=fbs+8GL_$;Ezez8XZ2Y4#JBTksknyq68TVbupqRBDNBaa3K;O^)D0qAAyyw}<7pYKaeDwu6FFKs;3>4JZ<*^2bMgbV-#0Fk6gJ zVU0Z$m6PbTCgenq&L(*w^?hVQJe;^gw8s`jjVo2fI-e4GFw9TU!CgT1`%9d9q@B+?7Fx$2-#xEL^em7=W*`87-!kRXnpFj+?3- z2j_)sh!Z>^Im_Y-1|M#6uN3Owr%iI^Fd;CEC+?^p@bf^{j6^=*`3uo{JOK=<6FF*{ zB9<#8Jx@bWD15+y|3$Sf+B(QH>;Xs5>Y*()U1GMWE7metO$YbkNi&}CvY+^&1JrgZ z0560+S>qI|{}tX}ltbfB$6>mjOSz2I66*Svh>X{*ZQ3=L7=Ei&ey+*dW7@sPHADgg zMlOH28PE!Qj>`h?-)hnOjiaK0waZe#0R8IjOfAssM%E&#JmX4m95Rc?~y7lDwNp02--B zva7DaE-N6dcIQ3~*a^Oj0bfS2OXFui69nFt|jYYpy%Mw6CVQ2J||g6ZA34xGgJNfJ?}$Rfi2^kFU7oE zY6^OqE^+S#kr;ac=c^(U!qXBhQ8^S#c2a;w|5Hu{dm)kXQ#{&}y#PRfcAPXz^K=fC zh=Cd?iRRH3P!iLL3?R)iPDWDq;3O6%QGEcAJS`@@X1cvefv@6KiHroR_mQ$WWpj@j zUfUlO!09bGbQoO_U|R;$ULw^!46latA)Q1Qcb4LybBWIFF`cW+IZb+84yb%TiVhJa{jKdPwN37VWBHjbIbFdHlx7yI{>Qv zi)(jk1U^}NPW5mAfY&!UUGO5zVYMcH?|lHm4x*XbE_962CRzRffV_;XqkO>g5ACAb z7rFqL{XUv3CqRRVZs^SV6#)G#eyH%X@a#T5MViG=Ji;4i^HbW|dA-nPeT(NiXY)eK zVZQix*FJu8&MbcN5x!s+-*}i8>48W13}NfQ5l8rs-TX;AH6)Z~6SU+b2^vx?edwh9 z4SX~zA&gF~aM@4u`)Bix+oMBiI8;L>#Hcq8iBTV#&2MnFED&AhqqRdVw3s~p?b?3m z1c7(i&(*TC_<^r3SmVrGaOU8G22?6VNodwJAK~poc(qs&_I53sFj!-)klwBpP>Jh= zw(xgqLugcokc13_bRQk7OW@TsA){GA%e{VLf3`j12>)2NU3lX}Ey%WS-eV8h=3iY9qDD2KjQ|rrjD7KDy4%g4-o?-2 zGY>8>B@EHT9G=CSUbioH^B>l(ZE^F*7JP_K4@*clNCMa2`nr9&o43tn&A4?_@W+q1 z`M`o9(}O}1l@H>JYvCSy#(`}6ro;S@G{X?|z1CU$@I&??37QQ<3QR-FEF%-3I;9i$ z>O0x?w1W#k?t-oDyLcgKT3~_j(k*!KrYv+#eRTm#y6mV(VHO|qhCM9@)f>6uG%cZC z(2d;3LyyaTY(X~anIVf!Au~{UC&&UmP7d?&;=u))JbOJXwE&u~-Kw%DPXW2W*N1Kl z9>EA{o|6U)ap_aA@CT!#3xtk;ka@rh_*my@Y7(%cW7mS1iJ%M=qNC`Pp3~~3=?~bSCI@Qb-a@`)QU0svPJZ5Uem<^r*X# zmL&o|&PIZo7@Eq_8qz?XaQ_nuKmOu@IOUXj3A#!Oe&P#%y#yGX8HORb*+VP_9am%J z4xl|hw8W6=F0C%rJHlA1u)CLmWdP$ir=B-8uOtDE)HdB|u{6eq$0q)rW?h|XR^0;i zF*KKCKCy?vxS=vQK`>KuOi=8mc`zKo6aGrH#%qULJ z6s}(l4@8>9-4@3{%kGwF)7vWpChJa4__c%YS4F2;O5dfB)guGsOovm=&Msv5I@-C6 zOeDML2-qF!kb?0%L zrWDN(o324;rxBz7g{CPusSDAzWX}N}xSnyn0`FgRWw^^JdzKU~MG9H(v8A0kkI_At z;e=xUs5?cd#kwz@E((pWOO7xXyy%{$P|CTr5DDXbnb6K%{= z_#+xO@GVpS)@2EVeTMv8==qdnBqVut0p6ks;`Ir}P}9EG+X&Z~Z*C0(_r{Vko0rJI z16Su{CerqrT*7pStgQ#KaOWg_irA0FRaEeoB}2XTs3GY~FeLK_@!9W6%&*tA5PF+w~0#x48-B<~@@K-6I#8$50}6#$3* zpsj=x7^3m$;Ya&Om%*RIhad1OD3i(vvIu9yZVWhm`x9tn`LM)YA1cPbiYOjY8C@<92L)FpuTjsco{^uOI7V3mv* z%tjDGV~dlc4iroTrcN4HGEwcsrbofrz@|ruFZhq~Svo28yl1RIF+4aKg9E6cvIqI9 zeYp@JE}YHwADdDz-+*Ho`ur3nn!%gOV6zg6vtQbljzxwk!m~`xqqUdPuKf>Diik;W zqejuqkp|Qot@1Q5q#1QhvyuSj$7UxLSsa{0*a6NN=~eR`%6pM#-eqd}Cn$`B#-rD{a?A#4`e zbDpRAtgCBA?~W5h_gGpnr5tciE7?M#UQ_$)r-C6RBtT=!{{`Pka|Xhqq$iL^|=cgaK4d1IMFN?H|?Q<7hqX=L2T=^_PtcxlN6HD+-NmCTYkdoSt! z2-%eYlgO{?H0X{JhtTgu1x2_aP-9f5BI`aC{bnOWYTpWSI>hoN=>_i3sW2{7vUmCqScodFmf3gcMVWd;W1=;PEL zBv+{Rb&0AHC40(G_o#4+mM|_-^&kxmxIZK>A}Q$P%WoSfQ!0ie77URvI)dcEOpt4B z3Z=7A-xh+>l8a1e05wiFNufaWMm|WRYjIyTVnxJ;PK9I~<0$jxexuHY)$tI{NJH`^ z)`c272nJ(*PE}a1&X$3M@r$sqDT!utp%ot0G{=nO8Q$Orcj|1 zEU4xdC4H~~?TLgRCR_OO(*~Vy-b!23P#v;QAxfTJsEp3+Sh|eK;mglOj9)(IicN|I zG)_`%LFSqTt%N3B$;F!i9KyIH=Q#p<9g9jiG|60!V4LK*uwyjlc|$4~QPDwSxL2n* zF(LyL35U(oJ68f&5zDVEiKSCArD%zhge%FxQUo^NfOR=ltjbCIRX{9?pe@7+WS|eB zzBW)n>0mkXR-Q{PMn0WWvNc68=Ov32ihM*1h-;3ZoeY}Y)SZ0Ij)-AHlI<`qooYt% z#AFEjBL+I`32}D9gzS=M1z)Z+9?B8!q{E>ZGKsvQG@ZHxRW>GEf%OR&%=U4FW5^)m zB;YM7=U2uV>9j^<)1qZ~EuD@=Gir2zo1QCapdq9FidrwTX*sCIJnVi{6OKApLRxZ^ z=oCDWd}X6i3xAum!a5}hb|lexsFUST3I2N^>-ED!k3unt_vJl02EIP&lpxz-!t_%@ zLDu$<4eAV}?$aL-=cHVKp^-A|c!-EXUL7BuXdHadDGlzNnNZ^5Lytcaf|NN+#bW;# zwF8F7YLM8gd1TdiHIMolcG`hHT1nVsktKAYw;mJoOjN>Ey=brPlA#pOv0X^zohlwJ zmie5@M-8ccDO6}yMT4UO17#PyVh3~y(gZ(RP6w1^dncOwP@|*8SF%Zarw~3%9jXK% z8)TNxxiW_`C@TcPKbyp{bNTi2fC|al$AFc>&|G1WF_j&As02-Y+m?6IU2yyCU`En1 zIEf((IFOj7A=jDDeP)h*h$m8YpfB!~5I>&Xj67h6ot}uk`-PZu(Y ztGXD#`;K|WY{(@bNP$}mrwAtt8-y2^YNiSYSSky3#}okNI4X_B6Rwa4!<{!8WLS{` z=qP}*@LfV#ex;EWGTUB0~$_>lVPt%0`ZCEWH?5&=Y2gMighAOlq(z^ zN#m7U0^qG{qrBGr(*R*_0%j$y7V{jjhtQHr1-~wnU`)Ac?n-p>Tb}WfU|0ylSHiO? zhk%@W)h}*G7a|zU2Vqz8eeu2Fl#c;2EwN|fEC5a~=Kx>6GU@~ir%geA9bDiEFtGb^ z;h!EF*$~%a!ixqIZe6T~B_7(T1XKI?a+NbpJn9&NtOIf{0$c#6+GbtpQI$aFAdz;) z<&@Ksl5u^CFV9I;1v`~Uz?T<0M{dt0WmHrE@-uR-2qmfXG}OE4;89^i>O|4CcwonJ5{YLZ8hXa_6;;ly z@XPWZHSF04E4RSiYeL{_<>QEOF}rTM;Ik~^%TtXhO)}hE7$HM;lO_sB{maO#ujS#P zLW0ggi-xz#X6Vmp>U2G$Yve7Vi2T|T!s{&*ug|JOqJbe%aM{#qCp7spp` zZ)C<#QNT-^2*04;gxp@CacjL$w2DFn)G$DvAN|IxYLisvaL~td_#a? z%%JCK73SK&soSukQ7mW_G;u+8B|tw{A^9r7w0L}ZvXM-+p#FyJ)`1`{ws>(K+%}R` zNn-J0QMeroU#~mN*Ay=fgN|lc{B)jhs1An28!qd@xezI7ncWk-@({)Ye#~X4w<54 zNLUDUYQZ^J`UGEb)nIo8V!w+>AJ`Egw65W+TO+Jry<7-Zz_0x-_uKHtLRqYffG!@s z{|b`ZORYTb+h89rUU`{p#cLMf-@6VIerv}XWQ;oS^2H^*yJk9Yh@}w(M*N4~jf7q@ z0eJqUD8Bs15h3;S#IN=tzX$G}hFo$X)S-r(pSMjBDxcT66n-xasvb=w%^a5iQiO96 z#eDfo5$WQw4V*Bp4*t3THa}0`G-pUhs-h%(XEt0CJaxL8i3*fC&Uu$;IC?QlcM8&6 z5}9#20S=q1f$vX4b7#$vNK=+jT~!8PM+EdPhUyo1Fxa_YozfKOBS;Xq$N-f0lSozb z5+VHpY~I8BVuEHlzf{Nw8U(}J@Jb^*aR@dX)*evE7Y-vA*-5~tCp(CsIX9<+Y@sO< ze!YK+;7dspMvqLn7!YpE4Z!X_e1Fdp-u}*!kWjJCGIV=T&Kj#} z>c>FlcPqr2I4^8|2Q7nSWD+Glw|q&uD*#KkCmslb_bkvov#K`I*k|;jk48g`St-GpXgm#Jq)|KsfL&iB=7v z0od~r#Rg1h&Vk{l1mkA45J;t%669*heEGAfvoz4XM`(QpiX5qs$p~+bY9%`1o1;*Z z;l)uvrGQKj3`Qhyq2F}iM%$G0&O5OeN8wCiQ2Gl zXF4!>rDai<0j;D z!4W?q*F^|huRg$+PmN4~->vI}_va}$>T*AAf~7rhxbIN_@2rETn;b)sb-T5h!vZqo zGJDB7Yo=Nl^fU6-=H&9~1JL~nY`&zy&p~sD!KnV;<)39WJZAfCXDeUY)MMRnniIf} zqVTf@iHB*E90}`B6Ll=zB^X{rJ%0fCZhp~QWbJ;BulXw0lm;OGGdwX;Jk-e3<(zOUfEv zf9(yH?$L}JbJ$X{kjhnZAE2ig%3IxE!;lkvzei|1sg$GNn2e!g~qNH~6 z7BQMn855N0TYx4_18gpaja#>i8PUk>r|&vkc#{?no=vy5=+8Vo4i zNRSA4p{_;zb(-lg%aU{$D~w?|mMRTnLtiw6h$T7Se4&8+f&daAiD(ixO(UTE>>z`MWv&IW>gEVO^b1{z1x9}> zbZyc`qcu~1iA@K{GQ#;wIW#5T%M@eIBDF8H1;J!@ro2MvX_~cmnNVdeg_2FnqE%`L zdb6dhN^s;5jKuJKSacMxcWVO+@05)1ALVljE$_jE%x2-&^`(l`lw{@zWtN zIupM1A_F}q;Gsz56PJKxBRdUzE<9@jrh)-t<`$y<^UXEdTg1+qGg#B;)~%JE6iiEbTLZ8J={?&=m=tXX7eI z4a_{ND-D5%ZR{FdY~~apXKPTCLLuZvPHYo#4eec7NfLp=^PTX-DBTQX($m3ANI1NjP1y|vi{>&~mxEKb=`Ny4I{PPJ*uVAEVsVk$JMP0M4grc(wO{xm!g z2iwyu;>Ado_zJCj^30Bb{K~iD>@(ohU9xcWZ6dve?h%fTD!3X~c(%a&sjZ1GXQH&T z0ZiTs<#{B&6`Bt}k9-=ccF8Q&kpwl1gv7J7s--V)Xnzr3J$M&2atc}(*9q^fkcq>> zq{r)p3PFXIx>=~|c7Z($bN-PaoV5g^h5KiCIsS2zN}P0{Q)t?t>OsXEKvvVFiGhQs z>v^<$K<#AwR14Z06RAB3Am zvF@9iKx6>3a)nF%C3y55wFa1wzt>+1g5XsGE$qY1E)sqavBtDtYh@$ZtjQVY zqJ^Sk@Mw}4n5aBHFttpDcYcCLzBww;n@9yy3SJ4(Bas@6LpX5Y|kZ z58wS6Oa|iI_N<{7XFe1Zqkh!f7*Z@;spIV#o6RT0G(PTBbA7dmW`qr^d!Xf)k-6qB z_;4g%cl~ox4Bz(Y zLqNR0VI$}Xyk6sA6AW(KjTDjB`dlPS8>fkbBT`9LRZ60zEbpYhZze--wKv{+cf}7k z!M}-(Ah7v!FYOw2_d(tz&ZrFjE2HvFK0*XKoK(r1S^$nj3x-|m#iT^Si#l!I`&j_C znoYo|E(QD0PvZ&Jv?rbpn3$Q2q%wUl1AE~I^VKFtCdsM;Dq#939j$82850=4$ukp# zt8;>K;@Qt@+0SblufE!N^?2j;R~xUt)p#B4oN2s%q4D}>>)#OvGke2ljlDKxAN3om zkWBGWB{UDv&&)eus1!y&ApRREg+XT+9~K1Kqs8XcaK8f@CuN%_m8=jhu7;um{{Ds& zz?K>A0VdxJpZQ8Y02>#9Ve-&b@Er-f!nVuyG%>bEjo)FsJJ)67y4txLHtt3{_oa>dvYq?N#(mY!b=$b^ zcJ8K)yV=hD!^Zuiox5e@Znbl_ZQSj4?rR(ObvyTsjr*pZ`_{&N+s@swad+Ce?`+(6 z?cDb^?)!G`2OIZ8JJ)05dfK_WHtuda*K6Z?+qr+*xPP{D_iWs~cJ4dUm-JL(h(OSe4b!|Wrrwjnvls29M zb)$2<_7gk*6;udZYXgC`n_FquNG%)`vu?{iw*iFlV2Cn}K45!Xu&G7fSi3VumlGr#cm=bM50VUWXm*xt;iK;HQU8QN z*}>aa#{*|A2&|EDdh#Z$ChMNwr>mt7Z$#?C$Jg$3v4orwL=5L|O*ft<-}(%kq27_@ z`l3b^j4Z|Qh5#he0ZO6(P=ZWal^~PC#i)vr-Kf6nj-Wd4e0ee|Zpo7^ZSnvAgE=ao zLi=KYZ0s_21xZ0UG(g@b&~+J$5{wvNBPd4|&~zy&Zc?7A>v<|Dr$|lapaU(gWH353 zdwNNzW^{~ZG=J*yLC5Ijj>|_J$=Qy}Z#$CH9hZ+elBYT@pLC4Lb6h^{m{8-me9qxs z>$rU0F~R4!{K<1YRp2OY(V7*oOlWk?r`GP?hkCTYHsTIB#0kLoc-`9U?36$_&0kw1 z%qinPKPh-r{Ecj3&Q|_Ls4!fx~gDro3$2{_YvIkG=a9Q37ytKxD2Y`6u} zYT=zn=+uv;erR1|>Yhdh0W{kP;dUYl9TMfUAUuBGzMM!lh-8C^#+lPMUT7Q}-|!9E ztbhN;L!g~#1c43TBbggsuXU%AHBOfp1Dj4lDG$(p5}PKHbQJoN|d@E@@bQ@ZG<|vOXrr!2dEq(iVjY()Jbwt#)Uc zQ!*V$Cc-5R5aViy@Bk;l(^oktEusTaGNuWHaZRe>ppV>95MEDIJ7Ld4IPMfsH}z3F zwo37TQaiqIm&gax^7?nT_6I~QS;MbTHT}uyINn7Bgu}len#)WrCTG}zW= zJ_tihsbwz0@_5?5z}W3+#49^`pW9&bp0W+uO0vAEiG<^R;6tm(y+>mK@$UEO3KC}h zyu~<~H0uTN>uPHJJ`Y7qTm3hGB?X8HN+M~&4<$Fe>g)8|vb^?m_O>?fHV{`kxGi4u zhQe1^!y@f+hVJM>)1BOs#y=o0M5E&f!72L0tS{8)%aL>nQa@?NJVUMKys`F%@ze$5 zSo)ZeJ#VbLV2p8`H_kq93_ovN*JZpJx$3-;KX0r*Z-h4^pFMAkJ8#@58`XSVIF7yi zd|ce^3-Lrc7@Acm+?!l60zbvi6AnLN zN~$)UFhi$g5$6)AY#>57ux0k=5rK|`jqg=~v#E_@bw)FmruZ6FG;C!F)1WTZ+P+@C7epW86vkhyyY)klAOdbthq zS@YUkh(osJiPkpt&St$hKeH4R)Y+~y2bdc>vdnXKaUim8(9kPd>S6!~NjNpPcaXai z)jbU4PRkvGsupc+QyhCs5phu(>gwa{#sp7uQvFQ4%KREykSUHz+_o`BC@tcoKF$6 z{sCu14p$Xf2qGTLm>pglSwyWct>w>~W+%iD;Wtce z36NM}5Is@(as6w&urvB)o?j!RacYa)l0zW7JQt2D6b`MRkPCd6XciAYYjv|8%2pIX zB0WfRnwA#Jtan=Hjt_&5v4`WJ7(GdpL^y?}OB{R^9&$%Zw z)j!Ndz)}&ae`dRfr4zLEl<#%3z12*nWCg+l&@%|OeZ)i|gV$eTn|jo6M}gB^-;eG> ziypt0h4N5x8dwMxn%gs`g;u)azOkp7hjK)S@K#8aBz`zJgdRGBpmX4$D0L?T_uXc- zLc^@L!!xYi-hpq-@^=fY$t*NVYUlk&DSFH}oO^$6eXBs8qzSlvs|cdi*T~e1foNb3 z_!gQ?m2a5u7sJZo6f0W-A+E7r;!7KyJ?43W2!{nR=B8Ha08vM#Hl5)7sm;-(h?ct- zh3271SG$RC2NA}soLTU|Lc)ip8&iu;boW=61OJbS3{WN3KHS5YlXA6cCnh?gc~v5v znd~CIj3q3|4TOK5Dd{yL7x-^pjFwZMkJ2K$Xf8Excz$WZ-^f@!hFLxx4k74x1x zF529;;o$q(g_XkSf+>WN)izbAr+{T>h3-X$No%NNFd=m~j&(`*m{f_xQ8YjM2~$kv zIN|mV1^akwm?hau^gfgx!fN(cHAnbMR=y_Mhg>AK&)ghMrkdjB5)pw&AiS0=M+BZU zu_sKPzq8cQ*_dov&8j7Bi1X9!K@aQIy zJ|P%7jwHF@$3LM4T8myIkVlf@`auXDBu9X4-?6Q%(6EG%)V!)C15lb>V_CzO=;bf? zrt#`*^g=uP$x=F>SkQR29(WmIW8>8qn{`vD1qPHJ#xdb>0+|7oH>gOh-B)W+ zJ)eVS)0$5y*fT)ofGu>*tnby(JyE54?HcldLiH{))l!QJ$}2SZ3e2i_l{5*kfQHX= zbd6X#mOd3qr~@((Ugk_xfstI(;!+h0-u^mMACd4Bh1}SbWX2etdMVtxeFT9)X$Ptu z8ek4R0U#f6er!&v9`xO-k{}%mU=GG5lUR>7*>XG2$*sC%nHVwz?dX>1lTwuQ_N8l(y2}j&T2jbH# z7+Wh4DfdC~;#)is5{JKoqh9gzdRIX0#L(&LfUb2?5s|0_QDUg?Qlbc>?+^{jL-D?t zo=$Ys^ni6;xv~?zmx0Af9Aqg-0l8igjQ4_lelHHi>QwVMmY$AC?&JAJWt<}Yhx$U< z5;0s31O5}qm(Ulp*Pw)_1^xtZCUkahzaUJfjGsp4;^&bdty6L(X)F>a;YYy83>HyA zAs}21k@}(sl^dx^ZG=JRPwVOf1ENEciMj=&b@t)U5dMPD;oAw#U#!-w-wZ4|f75@( zoRL6@i-`Fzx^gAvf@fYtuJq6(DzSnfbpBS>9RWV)Zhp4W;jEG@naNs+D?1d1FeFp^}S5%3)wnp*LabEql=nSShjz7@xIx5eSxhXFO~-Tb65iEa@L z4h7nMJ1Pyw&eb0fK@fF#LLHTiUagU1TO%I|-u)(dg4!YlHr&BbT(Z{PNYs?7QPVvR z9`g$IGiizlk|sBj^dg*wtfoWiizt_RwE+xn$)|xnu96_gUXolyCO^`oHk{Ig3CJ3* z>6)4|>snDMq$_^$;%v{T`H_H1DLxF~r zGbQODzc_~iG>Mv)vYo=XE+rI?wtk9NWtU)z2@4;6kB|N*T$88buWfAxG=J?W72jnY z6Aprg?l`akY$vt^0vo==*-YD=6@bR~9r-aLs%ykb8sEU#nT=+Ox<-A^yV5tcr^bWy z->cYrFH~e3{K>^?LFP-+`^R-|f;YVWiT`RAhN1b-&L=GKCC3dR-%YV~i3>X6j z-q?cShC-b!Mh!Db!#Ga0+;xn$I-bAe2Kv#l-6K=LCc+O;5#EDIzg0#oNJ>e8MJ5U< zKAPd-H3%#bKmc*l*aB(nqIBkrPG>(7Z$I*|L~jHnF0{YKoG6~%>Xy@LP|Vkuz$ z_~VaX#=oc2tO|W4Q$TCfljybc_v&51PgDowzr%Cp$^xMzR0SL| zk~MW=MI<~NQbua6YeLA$s)aX+v3J|=_bsXfcl>&7mkm4#>HEzGqVk!yACsZ*S zp__A#S2y7B8nni|W=)LLHQ}fcCG@kC=v+oO1KCTGIEbwiPKm{Ebr*?1p6aNV(BSym z!wQhr(R@QEIIv9BLNpbr=7#x8gOL4fAu#OYekE2NlQB3!2S(STZxD{1O#f%tTAL>C z5B8URAhu2p)D7=ew-4LOKX!!-3dCsgR{xu=0z=mVRBx~P@F0RdnM7o}FM4JVty6i@ z0M)51_8XK4b{zVC2wm#7@FRDicw(oJID|y5EjTJXGq|JLNgVLb0xC4`lF?LG%}!MI z%12)SL+b*lZ1H_wr5#uwQ(E?JbQ96FY{g-sL;NxU$nf3(Z?WPPjQNlNvOp(z*2DX7 z=K4CKvv^pO(3w~nxxbbq2h&|Ou1T7kudGAWStke9UWUD)C&$2U9`=MX$wke`jx0qR zF)^~Jt%P9StGj7;?jQZAE7W>`uTZ%NP44j(NP&lw@&zg`DU8zSTH3O+ha5HmZ8VWW zTtctmF`DW9W@5b?R(Kf*)kpw7+~yKzhXQKgSnlwa)mM?}$x#Cfpqt3c`{XFfd%iU`nu z%p!>&uAY6jrvsEoysMCX=G}LSHt>d*^Y-f8W0|f=E8b|K){X_3ASQpNR8us7GN{Dh zm@YR-kmLnWd2e9b06-ZSQP(2tbdkCN9~z6mz^6c9%b>t6#>L#kIl-oy`<`Gx0TA87 z$LXk%Z+-FWFOTipa)AUOvP2D#gB{1}T2=uWl-9?~F|tjb0K!2(^qv4#Q&_u5BLg~} zoz6ePrv4113@}}cI}t*=;yP;ht=ZLaQ z!+X9s8uZM4=c6E_qhor_?T!ElerJD6|EH$VSCF!$u;Lrj>CceUSu;wGkogTVa-1YJ z&}frM@-wipMHXdVW>KFCX*?QxW%GRatH^3XNJR6GTop(rn09F7fPi!N5_EJ zC#1mo4c%{i;ZnPn0(#NHCLIl0cDC&Nqxk)uU<=uZjOq7K711Ej5uSILG2z(Z3d*R7 zhtZI5AXf_xi_eY)knVa{`WBMWCU$DD`zo>ALZ?gKy9tEmanKEG)6&QNbvrS#!>uC$bF zt0tmtrQ@_n*K~gZdKPJop}KvIP10XDonnDRDv*v4BpU*Kfj@udwm?^k0Vi|lGWtk9 z!X*xKpeq=f(ekn&4PYhAlA&aj$Wc;+a4J#Xpp(E-p=ms&KyBKG93W_%*Kmbs z%?YP4tBn8RkdLSwh8I6c*QK6MD5lKbF~AT7`Vx5J_cdvEf?F}*Rs_4u#(o-yQ>5EG zK)YJ=>jLmPu|^84d3Dw~zjvefJ_{zTSOEIPmWGuq+h0zIlCr(9kZ|tvm%+q`t>Pp? zEopgi$Aqldt&>xQS@wlFPFVS<^+GCGA%v&WcGR+bu&iK?suUEUwZSB(cz9A=!6e~T zdw5_r>UQXQ1g)(tppVcdvzjX+NfxIl2+a?}YmZ>?>?mn$O)_7Q>O-|Wlj?gRYIA=u zaifeXhkS++(OTHd0Y+AUYXdR=A8~IU4`uj2df&4cgTdH$#%&v8U$ezvEZO%gV@Z-N z$(F4Q#!e{vPLdRqEaDSk)#q)wifE#qwnvW=bY#Kan9@Yyk3u*F`v0-uDPzy z^|?Qbxv%TZ`k@S)hEMDe1!1~rL|W>&^L(!iUKHUP4n+W@gbx7*Kq;u7(*xLW2;w3P z0m}}7KY$H|AZlT4s7TK9CP<{W4 zI8=T!b21iq$zy0|1PDraaKd0TZ#E1{o}P+B%}O#G`ly`V=Eu1DXygmS0GcoHWC0}k zVE`fu!3nb?+S@r1nw#rtF>vht8wKbCC!XK{IT(I zKGlr$J)$z8h@|D{?sJ}Nv7+YzI<+}~2MuK>NX7;VzzF-3gJ6W^Q|=X#3=UQ(hqKl> z*s&%t@}FX1kSY{~nuNhV;{aH1VgzdkH~tjsJCzqeYCdZ^KWRnugrZJ@BJ9{YgRm2WQe>~sNPkV?2jq~H9GxQ$P|upf#M#x^zhn8JBPmP!ToamJWia88P zhH{U;BO_sUMe9h=TnDC%qA-B2hXI5#s*S0Z4I3GhkzP*J0pz%dITPY81UsUHqu6uI z-sxk&e9u|I`JR9iFhGla-3Q6YhS6=??AYmAZU1flYevyG5&bl^9jDl1lvvL;DqZ7{qVo_I#0A^%lj8njp@T!E@;*BJPOJ&? zo{5j6IaI`h0f+NRtWb_949`f%KUD!FpaI?qG|ZP=;6dPuBG%I)03gzsRhfMN&6$yY zy!jso{EkmPgDWlw6r1nS^9svP2?>MmbEH8KN_@dj-e8C}=%mVk-Cx{Dg-LFyQzhhe z0B{gS=SWk}Di*81FKv>N zerAlvVvTUz@pTT~Kav2Od)04aI6{#z`Tye}=1l0OGJ$6|fx%^*_Xq!h;0 z)XRSRji%s8DN@m6QQ`srM14|<@!zsoZ16vkOiDS@`zscEa=)QCQcB{Zzp>beeW{d` zQnkPni#@$B-6o}UeyESd#_daEq?D=qda>BE`_gw(%1*aJEH-(+Q7V>1IK_BvDgdyQaOoQ zL(PuG7VS%oBwCl*_=FHMlB zGdUMyv6XZQzCfaWye5?iR_{w+Nz{!3sbgX_`>*^(qW*Qic1pF5ZY#)C6e*SEN@*;% z{-4N6O6BX5h{ZPSzf+WyD$$cUb!q>N1X8L}Vo8+v<^4mNq*Ptg%&DgRLq?=jv+sOS z;?4VqY)Gk&&!xsWukIgnC#8BLyQ9Qg_K*3KQiD%tPPOhI3MZwW7C}adx9v-3NvSFC zEMl=Y_FtGqO3f3Is*}96FBOwgD%@>K@vi-2Z%L`|5mHkI5B8;HQtDbC^m#pW ziFuop`ukVE9UU}~=^_zh%zlQxoCph(hb6##_OJHBXmA^WXiHGp5)?K9;0ga$%)#^! zpHNi3N|ME$+TL)U!vrYS5NIN`7f;bU#4elfE+U= z*_@0-q0k`o%%gM>J9Tv0OnwIk4j>|END0>pfWQQ6Kmt@weJZDc)yw^@Tr>8X^Rb-h zbm7tcFWoZ*_rF^YWIvm{4aA+N(Xww!q6(8}0DzLHw58)c@JV31xy<3ycuI~RBj_3C za}Ev9kQi}c0su0Fa#5MiNddx`08;>tEeDpSc2!0S52EY-}Gw^wYGW0wa zM&G|T42Jb%2UN_F6loZ`Q-ow-?i2t)cnO+#4( z13>?Vh>-}NhY|o~1T=(Nq)H3`m03ijK3;h3hDOLcb``=S+s9e_?0NC#N4e;|qHQX@-)BlUHD{0I_FqSa}ANVNh`(j95u!aJ6(| zXZ40=9tJ#@e+&R{Sb3?xofklWexsP64%forX!H2;@?8MPe<*C>(F5SbaLS1jN;Ffv z=gvWNA#A;VsPh-ybUpw>5rEp_rwKs);is_DA?y45Au!R{ zDF`B*0w+Sl06@bI0g3j9FghC(TniVbp~?IqaE5&{CR8(dfH+SKldZBkgEW~+7L*=o_XL?F2G1}E18g+IK*UNTEbXq0sQz{2Y{80E&}7 z0Ed!S3LCJ$t37?QKj;yLHml^MOvV?g{1-e^0uxspj0QmEu9_3vfFOvx?{~KQIGpIj zd5MDp)~1}Wq=C8dBL0b@#KH(C7Bb8K#L<*P04#J6Rj8T(EkucmB;%d0@hemUiYPb> z4adR?X9p)!{foGW&dJ;d-oi0}Qv-|@nt^tH#Swsv2W_4S5>>kpvx56zO}%R{r;uGi zy%8XCp6uKuKn{1(AOqg(!Zh}fi;=I#_*5GJRT7M<=l9NKM~G6%lVCQ>t#u7h_k)ET z@ZtN~mLZdD~gWm{t8@Jb=XcT#B#+Ynm{4U>uq>a=o%JoyDl=2ZKIcoikEf zYZmY_VFPv*$w#&N0mTMbqySl0YXnf1M1XqSUU*SJYYb3rfZbsc0z@QK#)Jwj{b*yV zbSj=7OtAr(zy~$dc7f`rlmk;A1KKg_4X{niNWm_QdOLE=ViQBg6Bao;COIW?IvM_p zx*56YR3XWY1^x5bDNaK2vsgOZPo0c#I;Xx#SIhb|*v>N|qO!=Oz6}29mJ`+1LLL%fUXk~RwD9xB2KQef;tUAA@3}U{H&;#y#P^iMO3j8 z*3K@SBjBYW0_e2^V5LwM3kR4ZgMemGgeVM_zC+RegXg4-m5^DK$ifmxZg5u!bQ1Q$ zGtr#fz;lvlK*~xu2dzaChI#?R$%L?w@j6bJN(U$1LbLyZa)Q_fP`M5Uuv0KA*Oe0h zRc_cnFlR2F3mlV`a1sM0pMb6(74;z9>$C%^Q7~+42$ljSNPx2~va19N*u}T`TfZMr zErdx*a**koRp+QwUJ>+5n7!G>syPCvw!_XY3KGE(VJ}wbomR?lVaRU?NoXyCo2ynN>(ynZv{{tgUN34hX&JWojLooPQ`xuoJ)!D_`N0X!bAZP0Nhp*tN}k;tN)1Q_GWQ~jDix;ME-$IhJ9}ES5NPKj$KkK>bhU%%U*wmBF)8rcfiYgK zcA$$-H3TN_B;nMlY{d+2f-w3ep=4%gc(dGTrB3dd;`%eYB9dw`9~xI%IlCb@Hx+_5CrO_Dn|$(^6%E=Y3cC8@t- zo|25UGnS9BLl!P$UnR~a=A!)MK0(rVNP3Pvi!xe-q7}meB+bo*azN24tx^)jM@OWDo8uGGWhPK^fGBZfCV-N)B+w!0(WCA{4PPNodzDZ@5M}+rXcWt|rbIfwMa9kAI zE>111q+giAyq2`9gkp>oos5iQ`41P_DHg{X0@I^&PuqFGC(`^hCkiOcsYduW~HZW9qB@M z0Z3vVWyAr8*0R>YThoECR>}>SeITs7un3Mp>(D4g9f+)+WG()reJ4j@E@WvVVA=N z^0|`jV&IrsVISzJT%|^{8)F}112c@e_z97+TEYa#dv#&E?kMU>tFAyb+=_G;ml9H3 zdeT9bXkWRHqLop-YoY81-+v((W&!#Mfn**MI^$^Kzw@1GLo1tM|12FB&Xo9mI*4LB$o#7l6> zB{;1Fj;0Vn@iO%c767V#n21CqK!j$8NTU<(jW}3O?p8~dnUUmU%#j{~kjNN$24yUd zHfQwUgruCCHN`MLNdP6fh>|!)0XQfy3NM8_!0H$W4JxFFOkhJkWK%6-Say3LcP}zHolhzBT zaE6HiRtmhAY;EInW~zw*lt)8lKUDhjdwL2@36Q6U-Jm-41Clx4M$2Rr*) zArG`j8M$)WVdIuGbQLz_T0S6Qy|+0ox%P*PoQG9!qrna9}WeQauE?> zw(Q~A$!P%(SIbF9)7F(c6oNy) ze0w5!X_7Lyvi1^n#+Tqu`+(v7W8TfQ*pQ$Lh36(SSog1h;$@O$k=-4k@`aDmP?Qb-4>s>@UISDBB z%{+2Ywf83ByYV&E43$uEcA>?TyyD{v_iI=Dm-$=ZeoB|zd= z@Fh<0$*kI~ChdN=?=`>gb^;BZRlmJ9ACr|g(uFs3?&!tVsTw{%(Yukha_>_~sfAzT z>j!(TMIlL<=nwp=Irxts4qiNXSxGWD^C`{yg$CiT@dtt3S5MeJzNrBJeB;0AQk%zk zg`hEfvzmb?_IBf6z==NFwPz8|#N$mRGzSy<7vmg&2meep3pBM{;m`VN(MXQSU_Tv` zcuRdb4nt$4TMDl9tnalD(VOAkb{zwn0+GLr4jnZhs%f3Sad)W6O#}MqS78dsdJBV* zQZ|k!pR6q84_VxJ@vXJ>h=HJR&_LNh+Soo8=1rt2;62XeWFZx^u{_vGhXlqftW_&0duqJ&`8(SiZaF&opb zNfuZ2qN}kImS>2~*E=3JeX4bM-~FR_^+{oy-3#ycHbsYd0?i*&j6Izm9H=E)BL*CY zS$-~k!VDJ}iG+rT7)Aa%|HbTBjl#C~70u&U^en7t-h)Qb-!eHjtJd?n-9uk3UeYDy z+pm}?RdoJNzVabz=vYq7dp&6t18{eA1M$#na@)ts?$mD5Se$CjLViUeQ%R@Vwe;(_ z2H&&t!}i+T!M$DB&jI`kdeYRI6cnY_Pst{C?|Co<5!$7Z879SgRRb^G#BY(mIrvKr zdvBTO0onUr3)f%#tzVD3fMY>n(p{D8hRjT-4_2`Y|=FzJ|me1?bb zwn}TyvQ9`=N!S&wohNfN?tdr0ln<80w>(iQjcu zOx%$=JNb%RdFDXDFnlQv8u%=mXLrzM*wMUdeNm3H6U6G!zj|2?rLqI{;NDaHbDU3f zUdWB|W|Gg}-|2H;WXPO!8{@y#Y>ODUV=W~wlvX3gC@Az+pu}xCCR)9>%JG@?OP0^M z&8#7H#miCzu`3>DR`e-_pLSReTME3(hTJg&Kmjn&=ThVV?iU4CBRO{Y1=)7btX{BK zV@B;+Y;5dChOP5Qup^^(RwLGI_Sut7tDh3$N=_HZ0|CB+cN*O)}zMyZF6zY}7PcJ5~MSWVL#Y5%(rldHrG z-cI7U^i_TXJL<(|-OD(`e&FL|6#q(gExXW9=fvJ5%N)Mor*94?kgr@xI;8fsI8Q8u zCEH8HX6R{g#J8$LUeX>PR6A)-8)qJ|(__`$ZvZTEHqV!fNCYr68h`*jcfPE@%NIvdl2M3@C;&rpZq(aX9pOEZllf)vcyYGh4DZ>^Jy+SCA@1xR9_><2 z=Ht_BK|!ch$gaLidOl-dm#sZW$U1KF37cL2)FHF(0N+ub_dhg46;RDvgZen3mg@9^ zKE(|f*Hqp8Lck5Ua4J%Mt<-L0h4ou5W&6E>)7s7h_V|U81er6dC2eVNv5fH6UY5cz zFP?7~cX`Y<4`m2G-l(C0M8W$XBC=zi@BXsv9GEpsgnxq+{B-O;p%}{fn9tOv95RDZ z041nYW0h*>!69={z`viOnaT1p*Ehn$kjIvD;hp*PjKLslK`b`4{YsjXeX_fKdl2T+ zf?JF62lJ#?svV^Q*rA=nYaiF4K@LgER+!zZ^IeJfX|wa})KIsQ+ERj}c!a31``ecC zffi8IFEw;xe zT8{bHoyMG+D{LVShZBydW2;x0|dgydnccVPbZ?{ZapmaGq1T4&mp1v-sH`v*iA<;m3!?U!mO6v6h?3_=Tz{{8*=Y&y=@KwH$g>9% zIZ?H@cEwwN__d_e2qz~YO_RUb%p)`|oqD?R)&qrCsB=LgeYTp^V$__a?stlCDTHn>=$Z{VIMh=5AU^ z<#@ze;5wTnV?pPzEz$!PWwtK-3;X;7bhjK)N6d$eYU18xX!~-ttFQwJ}N(SCas4vfU zWNEbT)IRuiaZ}_(vDoXV!Az@@QO`~W2s)QBxZIJnp7ZH#L_8O5%3k~Gprs?YrZIOC znuXaf4wQ-`p~RYwEzg7G4t8!N|IX3oS?U}faBNn&-7xp@yFaEN`R4ssonQYFpG4YS zl`OG38_6$m(J)Z(HTN3Qee=h7L-mriN%+jL#ctd{1IyV3s>XMaIp-Bc{Y z-B(>eS4!7ZY9wo!gVUDq^N_z zU;G4`g+Kn|dI1B$jbESIzj`Ssd{26^Tf}~K;-uz*j6UZxJ99!$(}I4=A%fPD&1c?d zANBSexnJ9HKFRd#m1abBW*#tRy|uVJt=-*GT3t2yJ~2+M@xr6axyLQnq))szARO6l zHt;wiJ{mQt|HfE_TUX9L@Mfa>yPzhAj{{-n&nC!1mN@KiCo$^#jbw9Sd06W^<@Mr( ziw7((*rry>h&s13XAeZUJCU4i;yZ|cUiu*@liOX+j#UqUtkY{>xIQX}!{X+enG5DV ze$fc%cY7_v;FK5DeIf&8HM)37=6UYKN^$S=sEO0v<}=SrCfcL;28HF{Ss%B*US$^Q zXS?*n8p8+mV6uI<+R`;E{q(H$PL*UetBC(ICFXknmD@V5B7p53&DVEM2IW3>^U%$7 zn;@oSe!JLpnWvnYVNcl4X~9y*Y@xr#TXFIr`Rn)Kn^Nr&4F&U+y$#m7chg!wkeVAk@+GeO%%SXj2uXHMv2 zWYTaa@NrcqFQljD#B;?Zt5KMSfj(Y8JK3e#x!{!CIS=NutDGUo zHY2eA;?k*7egNQ>dLRo(4C+Y=8%v(~#EQeT$s#>Ppx0G-#`5M$?h^4BDYTJh@}?iu zF)Wd&ISNNbg1uLfys zrDZMOpW8a~&^+;_H?h=K5(AKm@Ds&u}bA2FBSk^2{4@DWoxcjux=N z3zeY^O5hETcgBV+t5%ZH4`A1c%Gtx`Qy9)~#XOoUf~wHA(UobAjE$0CYiE-f-^=%Z z%C$3b(RC~R@DMtaK6|MUmv0qTYyZd|2)fE!YL{eRn0??%ypMu>zlRz@#Og5~PBCwO z!0tVidJy)7P?Y6X5USz7nY(Jo757TuqY3(K30^b*d;MqeACevY9P%q;R|K^4Cx2cR z3{J|EY+-*B{5w+XLy3*{75=wcx<*44d+K@QorcTxpBrU;1t5j~jSFHAf@2mha^teX z-YXS8%Q;usRUqC#Qa8~z8{58Dv(#`c;gm#c>u{_bpElM({g_fh^-*b$ZRZ-wzuZS! z%Z%AFeo&+YDnvw~8=Lw(iwcGb0T~WtVxxy8NQwYIRHYh2RjPPQ(4vmX(W8dp6TU3y zu!~qL#ydkMMcIE6@;*g;)YJ-3PnJ|B0>XB=r48zY&Z$z~db=XA0V`Hb2QQQqTs-f$LWJJpc?E%?DfajLMNc=p2xS$`5v;+9;dK3jCeo z$Ve(6%;$asjZy-;c`s;43!yH;f1gPJNkF#0y6!`e{$7!*&;7PXC$sL%Rm-`YybX+j zfx_uFauRUoVWd~?=w>Ngg8Oyx>IO#k$v}n;{PA_JwJ9WZhE?Wq%We-#;6j3_h6h>a{ zzAML4e5U+@5AL$!-4kXnw$vYv_8}fg1dENHl{hR8jc4jxbq)V@Ikz^y*WO>7T?H^{ z$@R(hb?EbVlKm~DO~u;ozQcGd|CM;+@#pgA3ck4e+@7o7{EB?@;L6co3!feB5C7u7 zP%*|ypx83I@*Tk2Le&9`MgiFMhLxajDj%uWPPKChp#s1G38yf~nh^#jr$iiTWi=b? zxfS9|g?dJ#*~>krlUlT{eFIiT2n1((vN)4+B9ip9#ktV*7-(e^Z#l zFQ_0sw|@LYj7gvQ;Lx-%?ph3P<@*{oxf&YF*El4%t^du3?N#G>7KVA=MB=OaJq)2# z7P|nS@e_O7#wZb&>N}GM=E9hSzZw$O`DQbHHhAOPG{1S0*oJ053mtlM9B@>qW|5V? z|2hgg%_+9l&^|j6qWt5Sg0oiy>%GKA9%q-Si^Cq_e@~W4|0)oxt}blo*-+&SNv#n! zhlcyI*k^O$+u`jz-5W2R;qkQ#b6=O+W{!5hmwb#nzw&7-N!yBnI-Q0!EQ{fBQ`+qZ( z8FOX!{@wTUv;_?~0Nr>&d2Z06I)+bC;*==IP*!Ks%+gRgU;^vb?xLzm-HRSD<IJ16&{uAVm?DwH#K$!T`u+S&K)Xe$!(B@xAweXD$4VpZ@ibNx zn%;E|3We+!5(;AWNan0q(g zt@sSD=4@hbaUYyzc2Zu6{PXbHcYIaHV@L;o3IhEJL5=l6{+fn)V@Q{xn#VZ_c`DD2 zxchcJmd&ziE!RKyR;yyPmU#ks*&Ly`hBhe6=g_WJ29XrK(bg=c}vpG{-KCU)tDcU>#AimZ}*0ci&eleBO{+?c2s}Tn_Hii4x>buXiMu6Vqlw*r)9!V4mW^CMQh}^#CKD+ud z!yKko?0q|^yz8;{lfYEjC*&Tk`ZGdCg0dX=V$7vW$38>_C#cy8v2t{veW&hwjOzS_ zrDYog{1gsw7ItY|0-H%le~zDbntm)W;vqZuRmLitgDwgp-G5a+{9r))Tw=A1`|;9y zx+{e-Zv&V&s{E4+x&nz7vU}$y9c*o7A@OTvAqN&?YjSqXuFruF9a|7`WYuh>P zma8z^MXcb)>KK{nC$fAvWMJ#@8uOqV%$VM2v~c4bv*hRo0IB9?XmdIZRzQfFj#)ygE z!3L$oq+jYUPV|v@Qf+84=;rf#)mE+_FRa`LrrI_2SD#^}e4A2Pn7;%qcnV*a&-MNc zS>jTVg@sY5`*JhJO=3jj>2hN-E^(Rx_Vgw?XX)n$^^WzkDu*^4B%*3_BUcJhs-Jy%GkM}Px^9w(u!Xh`9oHcZwbS=U00J=e+GGk@mZ7Y+7VN7-Fa z3n<>oF9W1aeUx>d86hSrzsX%*OQ`V$IiXp2@7pdG7X2|kYr#v0JM^RXK-=?mI@y+ud6GKr<^CN9O#PPCP>BV>}+t#Aak=o-H2|>s3(p{@@NnykBY9zh->9#&; z)R$LVZO86B5PLw(_H9AhnDgIUyk#wp#QqWO2e`v)GyRtJSHJFZe)M+Ph>3r>Om0=5 zii~;v_kX)(#Ef1#M!!tbi&YqP$1Gov0k|gWZ}>9E-;f2mU47|ecomXyI@z>HpbrE5 z|MBDN)17WIPsqsR$RLULACR{V)%fuP@d=u{na>Mb#U?&TU)suyIt2*x;H;exSaIW)Z)tdGDc}WMvrGGsgEOL%mtxvk%mKzvNd3x%7ljCJ=ggFis54bQ`I};h%#F1~dp2Yo1H6yIj*?WSOMa22@?9ab)97kMzb1QV@$m%`O-2=KgUu(E}%J_n! z#``Sak(?~cTtZmbPTfx}VKP3^GA9nak|JL_&Us2`K-WmxzKNZ;z4~3x++{}7i&cBn ziuVSrv5+U7#$Surc_k;}jl|AT^m{yC@yp{wp%6rBqDR3E9(A`56RCC9j9ep+gSPER5K)zF2;Ux@#?3GF_B>HJY5; zX^K*2oj>^1NHj}WCja!aRD#b+iHj_8r2KN1cwN)XgiL>qRj+?GKI^*T#%+Pws_d-p zo@MOi?>r`OGz^Wr=KS~zVeO=w+jXTYntby8M-val&yF(O+$QH;E$jQH^d-u_+(Q+( z4Cp2*P)KIoII8(Ut%%heZiQ*pn|Z;HO+r%r`#m5X>@Axpoqlt??GpNe@w}PbFIj_Z z_wubWXTSKs`N$cwKWp0J4~8Pfeu+Gc&oN%xsXuTwOqbS&$go%YO?cE|%cj%1wd^32 z_l~3_Uk|ED+`LPW%lheLZHM%6U|>y>{(8Jn>aYlJc%IaRQ;Uzpr{}L6d~Y{aM7Y#p zQT-FgPC~x?Juz{o>`HTieOx*g3rAZe{k(}LUXZPekYpTFkoGq^cI4u^md{tukY7C` zgO!Ik@aI+JqJRxG3{EXtO{(Rz)Eoc1d0Zd%Iv)}9WituoTbFsF)VRT)6^GOuo`%Rj z_VD~R+_@=RMGWOnSAObI!}C4n_g=}zSY=mD(cZKanC|GB z*D~|sxy4SXooS8HIg|ugF-ul^x`%I5w;7Da83J46%0gq`L=-NhzHq$szESR}+r;?m zkdJ|tB(@K|<|2ySCvVx!+~SFwNZVn3v-Q@vOj{}g)31#4Hzm5FS3}R46CPa{S5&%s z`nE~_UY0-9gSSjRBof((#jCYsJCrfkYO=O6nL)bv+80k%_Yn$^JZQ4v;?Q8}C2#%i zOM#zcaCB4$`9Zbj=jh$KS7@D4=j_jdn?_Q5MA)G6IU+({{E;)yt=_kip&b{kY%^*j zSgu=+EV|retT($CRsPis?{+6youlWZaX+?d_o`M?2mNehmlE0mV z&B`TTh^UMHc_2O)*9?XQYxk&`mS}!a61}BlGyT&qs73DDy|!C=&YGGp)OjN=8Z@eh zc5y?J>ID)>=L20S!|SOAG-ITzYf3Fhx0N!2V4) zZ;_#n-rt)m&N2G==~0+-Ej%$e>E^?=y}xS+erca1BGXr(9{hN>v|OKznH_ctKHCOz zaGm1N^*Myv>vLfpt04yZ5^f1EU3ts))(}A?P6hE&Edxy&`;{YM@{vaR1!MP>bEB6J z6KID_d^jD#9lgfl-dvCJmK@tUlq6?Tv^f#|>wTHyzEV5?;<>$ohFOZ*`20ec>%kOOAnMu;)OQ+W2d_Dw*j#vS{9<8S{$`D( zz1eO4R9~Uu8YhM-YYlY?cZ`X7S>a}CtD!eXzw^dJ9&0~EvAT0lJa2SW-ArO;+= z>;KV=Ebk8^_&k6aoTWD36^Nzs9TfRAdH&IRKH=mDcrQV^UaGx)KzbhAvaI;h{rwWZ z2z=nKX``3*wPkvSGDRfy`g}Ehc(jBy*!EWepZ@VDDKnc#;w~P2U3wt@`W{DVI0bSOt zlgMYY_B))i^4%PX12;Tx-&brV85NAHyhlY&m(2$k2vwK{A+PwG1HO++14LPYq`!vn-UaVPR zZkd`TXw9U}(*R@#eT=}3749|t*)wez-j0UO`y1}tXCLYq^=FiFD?uU?cJa5%X&e+RG88Y^7ie4E;G36Zn!XBR$v~~5u&U;0&ec>?P;W#y>#AC)aX0^7`_1?DFV>O2&OZ#K1u`Dbl zmQ6#;oIB@*TjU@+*#67>^vveSYdFP7hP$=SPg-Zv=IABMM0GJj|9t$qfuD672sg|b z{NmI~PS`$pSnyugZlZgTLj0?WPkowwV&gB-w`EsnL>|$`Z*+Kc zec}H0L&G2T)uu~&xJB4+gUDw5wYBYqSIy05IFITo7lh>YnbR4gLVV%dYnI?|PPuD7 z9gcxXNa2T!QX*Cw(l_Id#k7|;EZBQG)lGj!^WxAa z_USE$LsUWkC&mqsC4T+jA>>-OZcc_PpP7qi{Uj7vWA=IF>go|b+u{1F4I-8o#^1!f z>Rt0x@~7e#~{Wg;8vGVZ3a+(S*q_P4_2W&sUrHsn(DOa%Ir3eQ9YQ_IdV)Q^eWZn?KZCsC7n zLa$?4Mb?u191r;D(d%8D+q&JXVB|ZcRBq2t?`@8-saOjyaFl77L@RWSN9TQ+oPGUv zCQiFo?YyZchhjwm_bf3ZXGx(|xO?-r5U3%FEuKw56H85%I2tH~s)F}N9k$%>vj&}d z(`xsbaxdsgMaH;~3<^c5Z|-ijwO3)p^2FqPdtPw#ZAz!uqz%1ZC_J&J`D-n+w!2!8 zrQz0z-}sX6 zuJ!3>YRJsD%AODTuh5RQ=D$jkt#;drZaU$9y$~Dm-ot} z3s2A_s*l|g_B?C&vO<~3{YNm`+Q;?C1Ha8|?`h>#eEoaNrW`fx9=n~cv34<%Q{0Y; zLpHh4$E}__@Y(W@o2ceJ0go%ZR2TQ*f=01Fe!$ol_pEo4+&S%IwN#(}^@WI(7v-Lp zBu7t7z}B}Nu- zGwFs=t%46ZUPp?xyo7b(6Me2l?n=JeI&xC#mAG7H-6GkCfv6{N?Qx#Gnc+KSg^9P- z{^X99p~FkQx?!d*D{fE^hS#UFvSUBWxg9pmaD9jLjPmg?8b5LDeca#JT6KtIu)flU4-J#(#(aE)YQKZTfY1nyu9oYVmqH^^Dbsj@e{ef3LorMn(OL^Z}jjA=shvpkGj<#x6fkf2p zps|o3_YCv=D~CV5O;Ymr4dRr#meOEhLm@mGBT+pq9_j+O9W}zltLp9sTBmJ$Ut$-# zYg>5guUjp!EvNG2zCr{20?(n^l(q*{;6U-h?THJWhYoJa%%w@($=LCu zeXsjNh&fd>!a+H9ZO3;v+P8QcdUwNElGjqV%1 zLCFnI!sWufBMp*8%dcF&9is!y!kgw5ncdul)G@Y|H-qmVn;u$WNJmH|yeashsOevCX}d1B>O*ss~pZs9&xF5xw`IO{9x!xxFPf|QtfO2IXqMo0&X7TZHL zf_1XrNz;5MI=;wrqKBJOJ6f)moXNl8SxM8NB|DAx>B4NU9>d4IxismvU9q{WefG#^ zLw3Dpp#sPJ!Z+BK7_qZC>{FsFx#{!ntrshNkNHk>7Ao8nig{|PVXfSM(BnaLizQC+ z$<^Dhtu!BCKj@m{Ze$T(U(-(Tgmmz^zV^x0?U5O;;=Ul&ua;Hw>f#650{L=LsR^}kIor5tm5!8z9?*$f11vV5?I|^^#4W&|5^2xFqv}kZ3F)T-O+YpuCX!K)HL7y4o zU!=?}^lxEpaocv<$n`*)32JZrCJRKcK_m52S(=_L|K$|D38v$NxwA(`&c!yA6JeSN z#CF15yJ~xdFZZ4^(qVu8+Km1rXF;gdb3mU4M|J0jgD|(hu3f{{Q#ObE%@^X;iB!&= zF^S}dC%%?fV;k<$R%?C%b*@Fq$;yJ=cp4^-7?S;^MS}2Wc|sn2;*M*G!)iN~1hTMN zDX3U_ z!8i9?8`htMWpje0r2|GSrk8+Z0)t4SZ)< zLwMW&*seGwF?^q#D@=vGQ~=vCnEZ>QCe!A%GjOJ@-H7Tlm*+MXLvG)xB0aYId4c($ z-ivmf6z6243dx{Nd?gQ}b%PMo5e2^(o1^I5gqN1qTz6_;EM?2W1C_YBh1Pa@Wd z-4|m&Hip_I@3cgoS9DPW5diGK0_mhN1lxYG`#N%cMlDC zaa_1XIk}Y)n_d3wY9#y9$o2CnL4{dNQ{x-)Cy>#;5QPxk?QQYz+6~vs=%yvzR$?-dY!{j0Y6%~jEHg0Uh5IPXLYV|UQyTyW=uB~BE{S2 zunPP;Nw#)OJJcOGi22*|*0Dzt6P4!ko?qNWB8eKhIzO~wba6bAOv{+GQ@%B6JlJ!v zw2}XHNHL_unh9N@(BO7Bh$&1*ZTzV=Ij}<6#bIXiwyZUa{8Btj(Z0F}!6cU0qAa6k z5?`bp+haPf=JVb+_6^%)5?-Ks-61g05ZMj+A(jsZhnheyiH`~ww z5sbTWOAz{6Gzb!Ijb{^lCYy9-`YYldiodWm*xv!_p(?<>-ai8uHFgae=6izty=~~ca zyBH1F(<`S5jH>B*i(RMs{V+E9Ma$?^_*hDMo5RV;qWacq#+xy!%e=-*v0z916i z7{$-_ZRcxs>qxGGpB2*_Zy?(Fy~hWuZzfD$7|5UDbqNd3zEu|+w)1@LXH`w>d$sT^ z*`pMz?Z_zY;BY}vJ)0io`q9z(_3wR}VsF-qfh<4?Bv5Es&xSh;#J1yxIbJX_ix1|! zCdY=H-$1KuCG@+~(j|Xfaa{anfiB%Y3w=~~`yks&SdM2ukn^LplGoRDJ|lcy6`KkeK&+DxHVfBcc|_TG2!o%#NZ zt5y#>bu}}~-)q#1GmD6+*7{QWo_I|pjfc6LcL9Ac|9S6RT}HLQ(>96`k*7qFfOuEy z@mn9BhOqnL4%*j0k77U@1dn#82A3Ne7rTw_-(~z<+%;8GJOQrI*L)xkJ(XrCPTU7q zP2_Y?#pqN)zsAw&xF#~4ee^s(I0Z_ zVGIbl0CVCXuIGx=C@WQORFP|#LLsJ!SnQE+MBvLv1=yh!9?L{yja3e$j-7%+tjjL-d3<^S= z?$yNC79S^mGwzu%vA*rod2*(U-@9&otGpa?8}lBJg~N1xuf**a(du}KeWQ%%rbsO> zuUfh^(Yv-(Wu)l1hUfGZp6;$q9Wyb$cg;);MGU*C_?)@KBe#NS!=_9x)mtP8N2D;O z`h~c{UW>s_w=9gMrRvieUWtb%aGS>%i)g7%7s z^ra5E&VfFF#uLW7-pk@!plgcJpZ|^lrbotSL1QbE*&D-7eJo7nF)nqUhG6Qg%#yEt z)sg>!nO&`)9OnG$;X=@vhmzu}fM*r;^=dDD89=MwiJx3~KXgvTy7W;ps`gCWr)Ky3 z{)6yYaduM0dHGke%RbsY^&0pfo?@Xx-@Vw#9zLRrpL7kgW)SAk%j74_S;>I)gFuCY z%JH%E&SU+CQTbXKnfCVf0um$6b~=K?vF%3JrO9-!k{r_;XRmp0%+bbhbFC$~bH|IH zE&368vLOqVRo3#m7aaH2+&p2ky(7NLsw7>&z;gXsPl}gA&b$ikFnG7&P7e+#zG^OA zzEmTh=oKIfGh{=DCFdDQhUe8?Q*##Y$8>NJEd&&<`jZjaEHhV7dH6}+ z_gX&*+wf0XZMkCxejEd#4W4woQpFxu-!9HQ7F-aY7#rB37KvxeT`Amlw|Xy3Rk;EOhP9MS8T7ejhHc zQeas;pTalI+8bQ!flSlB(9P=$W-pjp0m<+&0vBx=AcFpbPiP7&=Y7(&*xI$?zHgpk z*SGjdN#0BeO$_Tt6J&Gq-&FrfS+sya1)Yf&x!$y*#S`**R%^~xZ;wg}TOxWD9N_Li zmM*r#*4ownN;+&m+Bt=jYx%~Jw^649X>XpdoC7ckou&Dm8r7cpoY(Ab7%o^WEmr3G z`k(A`w*!@Utg_4N`h{LdxayBQGZ2fV>+0hxQt=@fz?a~F=%IZbym(k;8;i7u4 z(3uY%z29tL&esqA?u2a`#5>0uNqt{TYe&~CvzYASSDO!rx4S-@7lhr8@3=C@{=(gR zYyMU52gUhlq6%S!aQm*<1fs_lwKpo;azQo(CHY@dj_y_Vbc7(k_0Q~kwa2(9`Ub*6 z{z4>z!<;!`O7WDq%`4_>mD7>;8u7|l_og5+E5{f65&@p65_j(<(yY$dx8>na@D3L^ zX*YUUwj~yT2)b9ADJE%SI5T^F!l-!3gfwrKV&=TK0@llA0_ML zvf5}jGqrenM@t($<#8<+l4)m=d`i7D*;{oE6%JWR-bx^X;|*bolV{xJdy(VQoJA>9 z#cf;jIbJwVr;VMBb$wQoNoy@7gTiYxgrifl5!(vXZ@vzHe&)rQ-{6&A@iphJ9%UH; z<3L29iel^SJgX-BY^sizPNNDI4yMPqc)HI<{24`ytJ8IFebGcAucx=_^t8Q=>D*~E zx@G6dL+7y_3smCdDQTQ`M$zE<>y{y`RKK>8PlFCoOKJghQz%f9b=yumKDveKEA|$T zipfkjHprx}e@!t+9Zl#Pr?gB=d!yz$JKis2UZ)s{OO2Uk{sw66hNJq5VrAA#-etOk z3KdHE=>WUUY31rnaZ2-9ju^)Pi^wXrmBJbuS!U#?{WBM@7t{}{GUFt=Vm#KyO;{f& zi_X98u>PEEO4pU1AI8%DRO$94&=u9m&WbsyUdKz2?U*;JDTYD5X?I;Du%m2tuTVQ| zYVlO%wxjnv%3Y8hyurwBkt>zVVcOi#nO>F=iCkgZl0_YMXS-%|7AsK8gBQ6!m-1GM zv&&#C3On1yMuR!#oDTer+U)zLQpy$~tAyX9wJ~27W+OsDD4>`aB(&=zN!;;#>ofbd zVd|ofQWNApI)q=XFG~dv`BC${Z75gPzuhu;z^GFd`IWX>Q)@_cuy>|v&nZEgd-t^@DGJL-?9SMT0 z(lW%uATQg~TcP54ih7lyQYeX$lZAeuC#h6O7EiGBtETg3CPX8d7FjJ1WYAI*aWyi- zq(I5alx@q%Yi)|CZ}I;3Pg}8#zmYmABRu0uK9=-PNBugQ^eTVfyKQ-KSc>+fJx0o- zT|c&v@B8L+0%0Hv4HW3ESkB&yi=OxPU!Ldsur*_mHg{EXmv~i~%}%MJuT0T=ys2(V zj^F9m^Kj$!=5tnaQdezadBvAh&e$!ra}u_dzQ`#Elb&j~8MG2!Ki)*VWWCdQMfMTyya8jeW{(}M~yC^rF+=U#PijoI@(`+Dtt+p!o4N-}9zqEj`WR<(EP%HTfgpD83Q&x;SkunH1Q*z@|N@##!=#j^_+ z$*87yJiy`$ksm)P&<8D6EFu{e?{nseLvs8oI`glRsOk?sh(?iGkJCEcGG5l=HtZ=jh~$%ARv58Mp>rE#WvE6U06EGH{#cm@E*6(1IrX!;N;jSaKPBEYj0}r zMd5SB+WS4nWpT23PDAI7c?*3JncObU@!kR*fm+*My%B~)=#D@iG{|m1_h;7_vY5U; zFiqC|Sa0Gv>HEQB&K;*MR+G~^x6;15Pn*P+Q6xStD5#!2sL9c_ybLFzrB!hhX_;1I zVz1%p{E_y(Lbry%-(U8D!}WwZq6Bka`m-y{r)H0yG)4sB7hf}g;9(bsi>?+CTva&M%?YR6 zcsI8pS=QIZkhVk{-c{)GuC8|L0NbAJ8DtC5{Z5e~Qny9AsP8r~8fVbSGh<(|2HsXN zNdBzwjQUlz^pJ9-kpfhZ6)VSc;<(I`n5aX?JqR69nB(_m z1WraAle*d`hTYdIfk7Y;q2}#au9#=^@q|!t5C{=+!PWnj69Iet7it9Y zZ{O$#>TvOmE~5@V4q!B1JiY??OXcD6_xOcRxQOqUgBkeDg{JUV&-%d(Ts#W|Lin@g zi-Qdcxrku+2Rv~3dB6DpK(wIWeSn__Iu!at3;3HBVYjjW`pheJzdHlJG}Im_5V4h7Y1f{QI3;z-a8e+`un8 zjDI%r*Bius9@hf?#VP!{T`cl9A_eADe(WB*Krt_NkNw&TwhZ)NwDRjlv-rP1lZ!0i zK!0t9vEg4dGyMBbwae}NIG0~`tz9~o>qvh#0<2K}`*!}^?e=Ciu^B%;MazLiUzVU_8(2bZo>MtDS^QMQB&=Idscd6 zKm_|gH#Ys+7zi!spLF71w)V?l{W-hC?CXL4*$fWU82Fc4?qAF|zc%*I_5<}3)&bKE z2!sqlh7kAzA$4DTgai3qD*C$%(ElD(^v8qCSP|sz@E>hlh(#l??fgy`{di{d?+<d{mMk3i)|4{^Rn?WQPA6W@Iy5Zd>aAp1af`7BS)J z4q^*BQd|H_mUUTMUkInWk*a0a`SyLh=&ACxqcXuKVK%n9H=_5EfGqT* zN$Ym^@{AGFs=7f{gQeMa^H_#lN^c(Z_uo~a2^zSM6JuqtB(Er%v!HEb7?zvCCAVZV z`YO`c$ltlr+$+tI^tv)GjK6I}jDGB;`k}G!%Ej(>FX+3>n`0CV{72!aO%IzXIgzKtkpkE$oM_0?)RLk|4S6+oB%Er33u?>;0&>p9H^n2#chqYy zA|N0&3S*!0eV}<{^;A5sAlWY|Eh0zy(R%TE;R18gTOAA*!Fw254kf{Et*NX#s_T_n zZ{BFrJ*m(1vkarWzB9sYw}lXnipqNL?p}8+T7aQHUJo^P_6@F158p*}Swvx{;mLiE z20>2D)FJ7oR1UN9$?{D^9CzrVNOeTM$s0?WCiI-Tq3Ek(AqgZx|@{<0b* zx}c6CQ20J*H+xPM+NvYC_24}U$%_Xf=t-M7v@Gk}oLPzfB<}NISAXI?mB*X9qD5R0 zUM8Neo4#=xIh(5$=xnd;H zFsf~Ji7>DjPPdPG96fr>ew;S}_M}xF%F*7UHc^^+aeAlR>4kYv9v10;xle!+~CyQDH*c{lp`s5G%v0T5%!oSMFZ&k%(wtX=lGmzC8+W65A z_h^|iy5cV^G7Lo+5C;dKRB>kbwmrUOxMivJ_Qq;*_Pp!OZJMEPtrm^!9}He{QH6o6 zHgMiY2x53!H{1lW(79=HdgL6NW7gP!!#^O7f5Jb6fn>by#=sfroyZ3gRPNT$#C31| z;UsZeA_~@%{&bR4TA8&sM&ZPO%tED(}(FKAGL?nii)U z(q5Ej zUB#6wx@lho*z3OU$A*m$bx;sS$d4C4|2S8_yw(xZF)&!}M5zs%kx~FXzGEKfsT4jY zcVF$}=&STKv@fC3pMg3!DpGO6De?A`j8@Ht5b3;1JKP$LZbf$tVLMsiuIoG#e-ZCh zXV`6+{%mqKWpJL)SR;}4+1yFQ)z?MJ!w%v@+y#|#G0pa`TpyxIhdFO;24MKo6NY6h zPApFiDwYKZ4?Ja-#aYW?8)pb1;g9C^sJvxHK$MX|qs}p3iDEtuT%8B-Bur6q$XjEy znkicNte=Y)XAT*EMtC-%-XO$1ud1NR-_fn35Kr z9v`R3b#(stpcH`t+x1mxb6;bxe8CU##Dx*14e5HZW^{>&Me@EtB{rTco~G*KW2|yN zAtDQI^VFI4HblNJp@+)JcI0@Ci=G=Ph(jZ^|DCtIT|%M#zT0)1iL>1WCI6+Swn?&Q zSP3qe>Z2u!%mOyuZ@$XIcrtc@RTrL_eo7NI_29JNNKXA z9HEVGaj!2;9--y)5p=BGR!2BK=J+Z){_1Q(`vfxc!DP!zMm>-K$U-ZPfJ=S4irAn8 z)3vE;Jdnoz!N#3~1#>HDb}ki?O^%KmqUGbB&X5Romczn#2y81Lf#%(6~{~{k*-X0A?e>EM zowOKVLVL@@U5ARylx_L37o*hUuP|;POUi}H+ugVwKJ6J=b#LKIG*AaicCrlQU_Y-X zl2oc>2=#HE&N|7St_l?d1gH;k$g;AK)9RA08AbBVny6)RJ!{-hn6$xqL^bo6DU0wh z96g4>(sYWmSY(@>Azjc$ORVa~j`o|~eG`AT&*1U#UW*~ zLXht~Z<;(^+1_U~;Vqv7S!i^;>8Ar$jKI@m5RAwi?XOSMLNBRp_!&h5k5_Mn2n0P#u z+|%ci*taf2dP~x;X~|@(hu)5a$lRyBa;GEvYIqSdL2*2fCOBEz#vO=YGde|`EU!=J zL#4DGzstgUH$s`%ti)cBtIe8lV7Ov3*5Wy$`#m;?PKG~5B>5$VnQX>93yv0~Nf`)IgQHu#U15v@& zDt;BbT&L@wqp`6|IjCl;t}ATlZ+nqeSebQK6VH3gE5;+>E)_g5SfDR(3|)ILKXiH< zVvh(dzbY(sKHp>9d60SR435h+Xlz$FU?aqrvbC_aFI{7m=4|T z>#A>FT;(z2zui<4*{@F*;iI3n&ML5Sj%&n?o9wKZy#7MDQe#VL6PKQhQZpUwHo;X( z`nF+GT1dpMLIxw7&OtgCt*W-e(1d20XGUtofH&j&SFD=!F#na5x38ISCYMF>>0LH@lhp)i{#G&?;L7HOD79OIXwOj{I_Ka(8$IgHEe&ocq zlG?L;<`~?j9XxjAZevw{e0HUP!L(b~A$m-h%Q=g=>UrB_{z-BGYQM+nU7nAT=PBvj zd(H&sDbXQqH`k79_$!B~tX|J-8%76@w~6PK4KhhRl%Kpe=}~1expMXf$in&5vQmMFS1@c#4F_1lgNH<6GLTiX5&(KvITR{t%g+}>L+~S8QPqNAR z7aphKF%Snk9T!W;>|wFIk}%YRPL@YZvC3U3GRtdj?nrF~S+U_6NO3A_huf2klp4)& z+$$hK>hPOiYQo7keMf}q@&d@htgccZ>iOe=t65S`0{MBaMRyMHc}FLdF|HdX^;QYY zDLYO(2J^@;P$oYRb}V4PGhfnOG|Mz#sXoG0&_oFF$V5e8ab?!T6S~<*7`?cY_F+s0 zcVYKq;eZRaziz|x4&oY(xE@2rd!d-Q0-(4XLXVVZ_a~9E$6i<&dsTIo16f$jXI1Z= z#P6#T6sU}Lkku7WL}?XQqqcXl>`S6P4D>d0V0u=FO^n<*q7lA_j{a`V==$`kVNB{- z`m=ch$ZM;dmo#U`t|pdsZkDsJ6ZpCL`%XOM9R`WM-nmYV8z|-f#~Sf(v@9SC!~byI z@#`H>*rm+no1g!9DRXhV6POdnF40j;GZ?2qIX(PGKb?K!MPxiFF|ouU`;1(?y6K3ww=vrzBj)j3 z0sAJ2uFT7mldK!s-5r8(47M>MovFKO=H8zDm7yDnm}vs?j@+$I&oH_34m|(Ff7>oB zrl7Y`a5~=GkH=V&$+-fcsFHcb77UnhsP&WlSI@GUXngO%|4hX6Brf!_Qx8)SZ3p~nqDztH|* z=rKE!WB= z)Ao~KaQkiouaIC7a}UDSNlvH*-Xm!X`cQdxVzF)?521jB;Np#ZZv`j!^{dW9eaMYM zxg%#Ag}UZNV9YTZxt`6jqOiM_J_$S)`jEu^ripFGkOU=u7`B%zn|>#V+QUz}u^CkY zD|a|{>cWh_MlHR0m}W%ga|&DgX9}BT@wZW})j_y;bkSAuFB(`!2KsPJ3C`0~K5qsS z_`c#sg}aoR0j^?3IvepU5q672_j#L`8DlEO?CW!x_qvkW!ZSXkSqR?vZh=67Lp_Jh zoBT}t1#7gVjA+(%UsET}la`N_etu6!y)7JHz^;j1d8R{Kn?4Sb{r5*l$2;VI_@hxw}OLlCpRAPovPxeTOK`~fw8 z(NO;Js5P4gTs>(8mM(rTu-2Pv2?(Wp5#|3xg?&6WSBlfI%2yr)e^?a=Jg6W?1asCL zPr!0dDxG0=PbANbTxNw*>-Tv4Evmk8MRY1Yo9?Y2sp}9lypSB4Zn67^$}9h%=cQwL zeS$De0h3x$CZ~Mkg_Rl#u7eX+6zqlS&&Ds>7~YAJDW90dh3tuwDUbsDfhHsKY*xHf zg`6CahgOAsn z#Ql$1DkV!EGQw_Ex@5nSS+50daHClXoOC*1&jzIV)Fra1>)klobVfQFttq&O0)qLJ z3~CDVuj3$L&Oc_8bxBwX5Y_g}lb?oEECzi3EoQC}%)f{MpTnR46Um%l|1$x;*f;va zGId$2%1Et&3>$6$IZd5LL<3NUEQS!wWGM~aEqXAVH90K|yizFQSo z+?!~C@d6MSSpFZX-QKGT9O_Rr5CBE7SL?&?OEl=Mg0(}tM1}%?6y(lQWi$d%oc?mJ zG-#?LT@@wh)dZ6cAnWtTI)k02UM2gF9{&GfQBt3<=4jE-07dV4 z5P;r40ApoAVgN;{5{!8Wu>f*i;y!w{3jlYpp(JA-a!;Qo*u#I9a-D`XLaV__2LfyQ zw?K=5{0B6G8=+kzKz|XR0suJzpvmPH58yl=EtD%0Ho#cI0KgOU|BxMbp5B2)_On_3{Zoo&mZ!?=mMPa=kf=5-vJM>w*m$TTQuMT zg@_FRnU0}kT~zXa=7j$j1}=cP06=ei2rvMF{D=O#z~FzZJOKXG|8=4OI*$PeQ4j{u zCJjg=jb8vjF&u!w=N9e%VtyK=1{mh~-!Nd*X=)94z;uWn{%;cO0ooKG9svA&|BFP) ze+mCzn3@5CJ^n)km;b+FmpTMMz7PQUs)@N(>l-uxD0U$R(82;lg#&FHfQZm9O8}_m4I~)}VYmTk7LZi~H9h}EXmlWeV5BSnRn-6T z%Lxd(>wi?kAf2j=82^tzgZ4k=A!Y#OOMnSCgiVFtO}#pF2lHQR#E%eI2W-M8&$l@> zCO70g#KzsoUw^)`4;;;dlK|lNTGhIV`+=Dt?RS3FI{h4XU?v@%Y(c-`zyu$pe3`B*B|01W<&pe%-zFJneXqeY*q??=>(%#EgUm7lxCJ zzed^(j?Z{gn(*Py7efZ)>qUwYnc@}{J%YejCMPr_OmhfuK1)*^3Sbff67-K38a27A z^vV+u4`31iHSngSzxBY~NiimrPU_3qqEW-C17eX~)8h`qe$OzVjSmHg3MDI=oSK$hMxT8p= zzG(qTe1DUM%ECtm>37@nuZXo(z~d*G4D9R2R#Nb1IMJ#n_8Mt)*%9>1=6o6JS3;w| zrC_7qyW+xF#K3O1%F5I#jqOxv-bi$Gj3!BB0l_ufb94#9Z!ajBe+;%W*SV~1+=b|K z&TX^8b-8AktsVO_q&GqI;R_>VSVYQR20CmHGYNh3*1z7IB(-jgctcU{b;Se4Yz+kV zcdn%gVd^I@Xsm2liVerns7pm(ci5o2zmBKH0sq_la(J~x>^wd$gG~D7a4^=7B8_uq zfy{)`{e()fUK2K!PMk9z$KUgEu!jw)yQwH*no9nSeQ7=<+a1~w_0PGFZ>ROTTpvbv z{_)SHkGAVgm)i;rqL0fZlgUE))poo_bgAysl+5VR@+!6d;10b6yJK&sna1Fz97y{Y zKU1MfzMFXPcMR5&MZoERg=xvmsejz-23ibOcC=~=Dk!t@ycF()mH4q?mFo`laBbY+ zG+YfV9~hWOJ|U)pLcLCI+TtKl0!iDD+nsp8^Cm4S52lzK#=#b?>f-o1V*S5J5=q)P zz6H4^@IUW%>t*f~tbfQ$!jjphiC3#$U$@+Au>KVpP-O|6-INE8&E6c}4%UB6iqXBM ztP*=Lfy6N{TY(%7vkI$}KaP^8v3^jADL+kTNoQ|%A1WCYs{;0PWT)s%tHVb*yyay! z;mvj^cWG<r2`t_n5Cr+h6Zc zJ2KqxzwQqFTV}UCq0EwgDGaS6Cg?>DxtsEg^3{js>l*W+3i~7vgI!y>oh5W302ERo zyDgcG3zARnzSRT1Y}I_zf_uP3rNWAE24fWo*csm;cr(62H9?__PEeZAJv-WpK1*P; z7E?h+hc?8&KT|o&rtFjLR+alc9y?`|uvfItrf*}Nd*Pq@`PaLr2w``J9lL>daAdxU z#p1h7E}X-BJs-5~(@gkZ9<$1s_rt~syPs-U;k%k+D9ET=RGUoS?WUMhcnjs%%39k( zi0;HczN3;e%Q5F*lkJqXTSo;QU+jKnX^h;qMGf>D8l~{{N1`X0fAuhABLxfyrE_)b z!im~cnQ%HGDGb4BH3#@-sD^kbi*=*wV#p}x%i9$^zQ;6QnMTPY5f@bhP&&@^YQzZ` zR+Q|k0Wcz)bHW07s@X+h257ep-KBY)-@ic&^m9HwgD@S7CN66fBy~Q zgpV_s*4dfPTjqmpgHC%>mPSrc7t3?6zY2*S{((pZYZQUey4+71=u9^+S zd|j_u!6H`8z!o6|I$ir0z7235CS;1={%*$vs`@d0sapF}&DatQ_SVA@MCRG*-Ohqz zshc8(e-jr~h_B_f-`Tb~O{zqB?i_D=H4gV?GtVSzhmC!M9{GzZ4kN7M?0buLE!gAk za%C<0FWAi2QFwFE_{kX~Qdr{R#mNX|jtz#rBkRnYi8V5YjBSX{B3K6@@cyqs(2UY5 zArMZj5}B>&$FkEhawx+1p!l^=;3CnKfU0THhlAsMzH*)CMBHjg#NtS}WWC-6Ef9y6 zge5Qh9ph|bQ3v~$w%hq@Dc9319%)|KHBF+0qb{ckBh==&e>ay-+d&#BZhtKFTt;5=xtU%v=cN$77qbV)bMw+yACd^| zvII3zcV3QF5m0m(k1+E^Q%=muaFG3rac`J6O2D*b7d!88su-!?k;2uJCcckG zTrfgiS;szIIA)_TD|ijHrXBP24W3w7e8(-(`Z6!kH55h#dPM~;BST9_=b_f~ep;BBJVn{PNjM zB8E@sRDkc-%MvF-DtvmM5k+LuJZv^AsfwhY8p{w_Dz9D-#OZ!KLp`%%8W#oKeKwnK zuK(Tw86L}2LWRPYNSwEytGCyHOY`$3aC2IlVcvHF{Y!JYY)A!=7i!MKNSI=owP-qX zy7gGb`vW@|#~NIi?TX9}FDYA#UUwM!h+plZ_Pw!0E){&3u7ZdK7S?!x(GIUr>1>v% z*5&NCz@4Oy+J?xH@i6^B=V_>Qf^{F8C%hA}!Ls#SQ;yH8zxko0}VyS}UlV8{9Sirf#6N|L!$f6-109QQ}aP_j}>xRGBrvM-c|HJXQ^E1P3#(BU?<0`%X2_I~|K8a?e7pvR)J> z3~9M`6fok2ME8byZ?^enHm}@Qk3gU7NFxH-T^YUdCLU+U)j-2Al1=80qBp!e>(?rR z>8RSRX!z>G#De2Zl)RKf26a0BMP|Wm1k%C#pi*0dl$4ctB_p#Qjo?Q%R_QZ(W!5<2-N6yD91F`WVFYS z@b|juvbf>w7mS$EF$^Emg9o*?lv-|lIBlWzUfHUNm$AbcM1Z4ow&IpL4YqB3@IR%+#P z@<9irg?0Z~1d9j8HI6vj7btkkv z5Ar#9Siu(`2F9{DAc9thK+wf3REQG{4nxmc9h-F({GEi#spL|~*hM{0IGNGkvU9X| zUS3f<#>gaZBgbOzQ&;e+AO(`=)Wz~)^XWXzUY{brPGY_)T^V#l5x6ufXlrWL+}+?n zRPbb12k`+byUYg^)fBjoCJGlZK1)5K^ptam%hv84%p9S0?5cq`XW=1?Jy*9bXSACu zx24;O*DWT+`3^D)`Yi`SuEs4ZH6n2}noy-ox_RjVhL4|g!(vCYBlr$_bMT+(N?$K? z8*pvBX4NU(zZ=EBou)KCXsnx0w<*itMKiMZ5e!gv4!`)fIC#qR79-1sAYR=?O0yzqH=k@Bo1 zdELqVeHVz-i*Wn&k+IkZ&S%St^&lbK{M%X6?Ninq0R-j`M`*Tmrgl68bFMGwh^*K!|dzHdy6tj4b>W~N>IC$|2yYhGwdva8< zd7(q2-!Gg+;3uV($Uf^6JOpMrYxR%}TsQd=cF&ccu2)je0I#7rLI~-5C1Q+av;H&N zmfd~Oc)k{r49BHQB2sytb<|i+?|m;lSd?`Phn(vmm3TS^1j`Q}i)QYah8VjWkas>J zZua<(tfau!sv^iX_~dSF&oO4Q$A|Ie@#L-Z>!Yx~40ZmRcg*khCjG;W1=rD#iImZQ zGc}1vAQ|;gYTTq)#IJX}s6^yl4jWnmQm|P>x)SsqgCCEY1^Co&TYinYVjL2PP*Im9 zK9DPbb|vyF`u3;qMjJs!u2Kq`A5N#pP9>O_B^$Yz^Bd?EyGAF+rwJb0&9}lfETvCE zq_i&v4OK`g^ip#?B`WW5Os(@EPt583f`lrT*bKJonoPkZl2>!n>^dMqqhc zs9!NL@opf(QmLrpOH8F@?X#q-MsX*IK7@i>rrh|>L^lI`vQ5(NJ(lV4g@t(22?N}(zP*a_!+g~OV zFP;^dKbTJQPYgJ7P@3bG`*W(3bt&*U=OU-8E|NXO$efmNA15ZWQ@~&HBTnnKE^_La zf;5(+GxLl*Hvy@PtZ3GW%=Q2`dck<#zt5ys*bdR{4SKUN7Jjn zr?gx?rLawSdh2ES99LbTBrK@Gt(Hn<#MjTW^>gcty-2aw>h2m6!gi&g&0eq*y*kTX z;Liu$ZmEdE=}g(VB=*&Bw$`2@^_UAp3P*~6zLYBcd6E<9$3=><&3a-+$v-d+3)QW!b@xdl}PfJL&-UUU`5V;M{pc?=J@>LN5{XjKYQ1W0tZ88+1+ies@6EEKzee^LOEK z_2$x7W?}in9$jfVbX4~mUq{@9&jFBW&0=s z(`bzfllTM=zM@5j{IOq#NyM7p+8On2MY!S5cd;dlmuP}oe)|{Ib{h>?D!~%i*>CtRH1^)ig89i?BL1cpa?wEjy%Wv^` z05ujP^zVtNcs*0r63^-Z*?-X9!<^G{`O5LYYZ^xr<)9|F$s|0+=;?lDI5b5{LKQ$3 zv(LVb+SiunkVsP~Q@2Fzcq47KdysqCC@5N$0Rc*uBy`n`K)a@v^joyREtGVEClb1>V>Fl$jRmB*WcM8xKtY6 zLj3K1I!y1kUMx#^ULtxVPdxu;)FoEivXICdk*^J^(tq&qo=_@}6&s94+4ZX|PGd!q zJo~MgMuXiZ&vXcMxxRaoH>lnm27KdZb8jJz}g=7o?CZkXLmOr ze{KdOrWx1bo+d=v$=l+j(Z5*zxrvu#BU7W2*20p_@a8d6p?{k2 zhQ%VjyD{}-kqnM@&12f}?L`Y@8Ew%%#n(Ca*6!4U*J!c0JpcSH&$w?k+BSHKt+5zr zCy2yF&p5s%Q}1s)n#-N7rNz2MPEJk#Wv}rGG)^ub}dVLTbeze?NP^JS(|?@9k2ZxS+nI44aSIhZLWh{G-WRAs;f6jQgDa-rn`Gd2&M{Ok&7xBYafrmuYwLp-mrM)MD z+?+6e$irmCLx?jF;jdj%H{68qaT!M>W-t;>qeY=Fw@~s-E{YLFQfumC2wuR7L{E*^g>LWHM(>fnjAx##!Uvpn1VNuygGNC@OhncqpWE zyh1L4aog0@7-_)$ApvC+vv=IXs519Mr-v5Hoeh4X#zI^l{EDoDA+9p&`Z5m@Mm zNtBd~J|~yBuDH*gpnZ1>+Fox8s4J2GsUb{?C8zi9JxjaM*Ns|i?-{!OyNPq*PZ@F( z$lZQx@_dJef`o)Na(F9;_hpa9gvT2!HgJYv?2oo`j~&jUCd9O^)7TV}mwGnZ4?f*x z2f>uWjy(Q6WLr9I$P4yh;qqi-ZQJhe$tW!U)*jY~nw=p&j?t;KC1Z@DaZ@GaTFfY= zqGjE%&qF}5TP*%CMD_PK@Dk-Mhc#+tFyv|`(jhNvHu{qSbgX~b6;4k63uN*i@h**= zA%CQoiHWPs?sM_h#>SJq+3-^unGu30IWy}g1!C|up}-3& zJ&@yUa@z9^yULC_m|SNS8Hs) zHJ0Qr>f#RTH1Dov#M7p=QZHfJyMO1nSOfV7`Lj*e;4l730T z&DChYKw>+pmQ+S_ zPsBXeVYF2yNS;UfDf#@SlWsB_M&=Bo|A6|Jl8qN{qQPn& z!jsZeO5V=dYZl3Pm(Jd3git!b!Wva{Klu3iPMA^bQ08Z=MNuQ4L$zAgLtT{aPbro_ z6|y^kfc6r`cl}Zs#eo49DFY6Pl118JDN*9x(wVZhALFX%2qA!)p!)Zosg#T$xS3@` z&9XWt-OXbPoDTclX0qeoUr`f3$=1%Fev)I#VaUt$@O!ui z+=B=y>=}%0l}UeY)18vKG<(^h&gU~;Xc+M?2$fYRCCQYsf$Le4cuMQ!X89t!4r*~U z%=+TykoG74DeI{o&gT;q)ZemhRy%~LI@OxZSgR^xD1VG+x2etfejAJ9X23Ktq-;>6 z#4+~y1xl$bn6`J#%e~R%hrQCl&4z5FMBwn17yE7WU>7-}dW-Keh@MK+1Ir&rRfM`C zg+dEe3zKteMg(!pJ_m^Goq&(DzFGv}xxRC5Tbz&%99VXngvUDqzjbWOh6LpnoQDC^ z{{vA;6cccCweUV44L#vS3Z7zz>S=OP=a%(I1Wx_)yn96S=P@49IEad{c_YgADA7&B zU%44$k+*%2^!Izz*F6IIa!bgrAR%ykD)2u@PCZB;c`@O>r7UdL5E4w*p@a%2@=gn3 zn-bnjg7LAGRkM1O+?8}=+St=RgVL?C4u~^Oir?tNo$*vjQ3z*Xq9DVgTqVBQKDcVf zoqH>CZCDtx98XE#Aai|nO!yP;ts8_Y>}~liUrmZy{jsxZGBmQkfcUz2KvgryI;|y< zseMrW>0yqWT&E@BIRkgL*^wN&n>n5hwf~lx-Pn=o^eL_Iw((ZKW?WBgCIoF#@s+Vc z_I4y7S0I!OMi1HZjw!iij!YYSc(uoz&I%abOBEG1Pd7tbtdsenecF~>$cgE?&$%t5ttqZR!^5+E#}*@b^Sr=G&f+S%a|2*ca_k z0X`I=8FR3z*O7(@FL$#zF$5&TI%YFd`<^ArvPP=-EtsRAvxZhheR14h&=eYJP7CiD zOWuQ3xTfvgp%+qDK3+u7BPS^*JD2xZ2;R%WHwM8|So(O`bi}2VHqt0>H<3B9EeazAhBEjDB;G(AYjB|-$2h~_+i zeV%P`j}7v2e?RTM*N7W?g_5^RuwXzkNQP62wz3$%Ab+GfHBm#c$nq?G{TEl<)k=~e zb1^Xyj+$j@PnAgVG(^r>2t(XF&Byvu-hN!Is7=c)6F0ENH}H|mvswDsO4RozVY=Ix zA|%vx1!nSrT(wx)UsMrBVfE)TqGHBQ2dCPc6CV;N;XXn;4_fysH@P71AKblEL z|M{kv)C#P~W3FlMlfP3jPaA`vbk_c*BuT3K+s`nau*Je>gEvGXmQsrh`io0XOQd{x zY2;f_{^75%3_9IU!1=Dd-HqOL1LkWJL-p<(b?ZUia`9^H`ckeU8&9Dh@*X~> zyvDyAtqIQHL?FBrf2DXfJ{2ok(0)C>|m`8Kd3r&&R(0ezh0VH>_J+TFM?wTf?Qb+vCoV*PUaD zt2)+sgrRAnvBs%t+$2(>iy;mR^3Zr^dO8_ws8S@cLO~8uybnJ;p_N&tlB+)O_5;0X z;(x&8U$ZD&r70YH$Xq7g-LR|I={lDnoT|;h35{b3Jpo#N_eM*gWORlG++vckVUm@$ zm7{cf%!A3}ID>!LQeLZIyN+Mlp~S!L$waP>e1u&qB|f(X_7;Exmme_1)Bb8-9Qs}B zCeDBNy&Q5tFJ6a6dUQSnsnyz#+kiWafwuyKn;PaYPnTZ22=%*yZL`8V#sKm$k|{pb zY{!sUzF%1GpRmT@T&1ZO;NieYt-=!LRZmA~Ns~ z+$~}kiAP#jyd|+VP>cVm!<}i_0eS{XjQg;;t3oC!sx@Zk{MfXa#qe*5|3*3D29Vli z`)`Rb=DL^a9vpvx6P<0`6kii6W#o`e%P_$Ywx)(7QfU-qO@84~i>u~}4|))dGzF&L zi%TK$6SSNR@bP9I!FWZ3{enMd9ypMHk?&8sy&Qve-_4CkaC2^Oky1Phk`GpLe+dq> zsx!@c*s^dxC_Bkk9%GftAM4vT0v8?1WK{^oQ+|?@*X13tPQ}&<3X@P&BM~tkNlj*{ z$odWMr_3?DB)>%p=xOQcB^LuZu4OPJIf0fnRos+Ehli6J7y*hS`+3{1R?t%Ul+}(LA|choE~b^CqkoDa&L0zWCeO8x3m#Ts!=cf?Uqf~ zeR4Ajh;CP3FYhsRo+eCp9V&t{<`k~Le(+qNg{mPiP!Yiq&AHs(p_EUs=irZafE?WD zq5JbZH^au#r7udPSl8K}D*!X^D~o-XCBc=ntIPc<1_e!6*uS?vGg~*g3Qr-uD0!i( zxA~VY+(IM5p4mO;RHGfHYTbqnR=5(dQg6?wf7&iN&cIo7zFYH=-=6=#BWK8Mba1*( zMej{X;J;8kf~*vZ?LSPUAe`qg`{H0?^kY@Ojv!06)Hz*e_4Z5}$>a4@-8cmVM!%MQ zk!93~zk~H50>OvA43sLUyp2f{ooWd-7zxOn@lN0Ui^w^(neZg(&~h*i_mzjmrFh%MgA7Ihy_V>6LhCR_)_~k3e%mAD4~`qbIv$ z+}aZ;Sb{Pbl|2XY5F4*q(!XDKitZ)8YN<%;n-Z}7eZ1IWnj^B(S?^Ibc8;_ zLs&B-8yid(HMwPPQf*i3ii!xa8ITFXK(7Y$okOfHnfM9Nn6)dUqH!EMo5dvR5Recg zLys?o51mklD8!6#?XGK+Xoi^{L%%i7>DARYST?*Wvu8kVo$ZC_%13?v{kpwl3G5O# z>7mzW@ zs2J*?G1G;uc)^j}wcL|?Qu(|l)*upMUk5l@kS6!sMkQlT@@F&71s0pJzM%U0;p>T1 zIsk|zNyhGX7VSnsT2H`TQh3wS>O*njzHYYLM^#?<`zpx3I9$$6=HG&ZCN?|@Td>#J zQMYQpidn57AxsB7tXYk-}wcA>i|#?SeASlUwo4iap>Wl`IFP9wJD& zng$p}=;^LsK=jVi1k`J`pgWy#Zync47hVjN8APVA(!v|PRNLQW55<#ol0me*Kur%z zU2|}{bc1V&lRER7PM#N()Rw|jV>b^kH8(p>`3JtP>~8m@V3h(-G|Dq<@_%l%tz*M29QI z8-(Qo)`X)=0Zn|Vvy_3nqhp_F(P(S_o+yZ*skswY(?tZ|*9w8>!2kG%!eh|_4ZM`9 zg?6rn?lP?7nM6|BX;%m_9NEl?icuMzai39k^&XE68-j#-nU~3r?M+_OOoN966#d}z zyT_=sF?O_&bbn2(nx4sm-XB;z?}fHd$R_cXU|r+HfBl|<&Qkjf=l$pEU^3jjkvHD{ zMSS*gaHf|Nx&560x>~FR7Q-bW#)UP$EfToC=IE5^Pv61!)II*-j$dv$Ys(|)iZ`+_ zTdr{Rl`VlNz-dD@KdSAb77@{ML}TDYa+O{&9j zZ2u3i)V4OhBtM&`Y!}o%Wb&YIiX7<%CiEZTeWZvMYQV{9>qqzLTT<@3oN;(ZXGwq+rgL%D3w)ugZgCC{hAizfB@; zjvYsn@qH~eXFz#4U%F5mpbjJf5EVVL<%;4{?$f6AVg`oDG*PN|m7^4#Vb?|9C3e?( zJ(rI|Pd^{$=VcvLLka>3x(2))A2E+xZ-%#o2PqO~%z)YE=9rLkZhP`XFa#(!eSTF~ zcBe)p{EnYRkHDnzCDaSg^bX+uKC7pr2ebyEF+k~XgdNwFfv~W!fyi(y6g-WxNxt}; z8ZDUp=I3%P!JwGnB+fgC_zRsgdaM${e1G6QSSwJ88T7udFD=du#Su%@5AZlfI8RJ;DSKTs^)*AgE7LNQf3_&ov0L z9Y_@7RoiSD7T* zV1l+(s5bc|$E9gV*C9pFLM}r-&VQ?WA^jsh%dvO&7?b63*_u|oW66BJFN5YT{lJ4N zwh_PsgZw^U{7BXqpNwwu(Fi(-Wa0GxUWHbZxOlnc(KaU-^|yR4uPJtTyPT>$xTc$U z>>Be~F-HNM?%E!D!=DmW607%zA2&mdNEMhCiOR9vbkjFNQf6NfHyI;>{0{$736AW; zh}Bze*!xDsN(h?Ct3f{bT(7N&jO&~51lq2G0l2i5Do5pGdWfV8sS&3umb!yodhZ*GjXM$&fks#lP9)yF_bzI|+J7`u!$gfaUXFnPn1$Lz@0 z(kwI@M;oWOH^DQ>pPxnokLZ`z?;qW4-9@sJw6iqhG~i?=Ql}P%pMtidklH_nQm5nO z#b0r{aaW2=m%w=V?Nj;XGu4rgmg4Jh)AnYOYV_uPmQ-A^;o=9Z*Yfs6v*ChGEW=(| z=_90(jJE!?8F)ua9e^ZgXd7!~Bc@-~)gA!3$;Ze;_g6`2%QZwxkS{oB<$y{Oq6&fG zSJ@D8e7&_m(O;l=gb6b(K`%k+gq*giy$`W)ScvS8MEsHS_piz7yH>PbVSP1=ovt7j zmB6)Y)z7aCn~zj1v+bL4g_P>g704?(rlv7Odr)FrtY7wj3hXS2hIlbk@u)vpdXBI+ z1m;TPKL3G(+E%@uohL9N!n+QJX7Lf|7nj&g;IKB!`R|+jTiR05O^vXXZ`jmj**-L* zO|;$1#GppAfAs_0y&?B_VvS)3u9}4UCePLy=BE9PeR8){C{4$Z>MT*%NjaqBJA&?A zB$LWJOO;sr>;0?5+L4F}AfQvCPZfDPc=@JzaBDWoWtc<>V za8MaZi)>Z=&*q6>~ z54=sKO~H~A{mYm@>UESr4ebU+>HdQvUC&QTO*N^i0O5%A1Fj|6zDPY361l*)IO|Vd zD5PBQz<(l2#3@KZ^3I%C*d0bjx`d7a$^|d@WiqnvK#_Fl?!MinUoR0o?}~@8z3I(j zjUDE?UUvOTw5W>FM0U09j6PoSLYtFImG*Gg-K|sp)8(u=IRmuQcP&PNb(AUT0$X!J4cv*>ttUJU|@x$To>|q)<`=_7oTpT-K0* zYhuoyBY~agut$vKc<$^22E7Zcxn{qcJDD_%_pv($4A)$xdOi{mU6-&&{`Z#Q^bd&X z;l7E#r@9BMY#a+jn8A!b&@o5u`ozS?$KKwhPLrOLjbyFrhNKB3#D}{264&Lp8D|V- zGdS1ed*z_%hJ<1`CIPS|WRVcK*_2YjKD7gqX2Rj|>jiD4LC!X)e!?Si2KVG@b(n;OuSST3<_zM<{r5jB5WFUcqgS&3?m)!!w1qp@sUu+rf6EnO|IP(H zqE>Pxwv-kFJ2Gd3DxWT$K|KLdGqEonvCP1w3dvvaM>5IV#|x6?>-1wM8ktwg%36$p z!*TdaGU(()`gz8Kt{9yDB}iW%_D;HP!r928%IyryRpN#D?&N>F>N~$7B##{zPpsNA zkAhl-Zy7#7{+3}ylUZm&Sb+zohgg<|rQeksA(Z!n_mduh`LM%Rukbe;3J6HEf^U<* z9jg0GZHu0xT>LmZEUtuTb+y^j1JchnQ@^Y1ib~ zC-I)krt>*3%(2VOJ0fO`1uMOv8@^ocxj!J=HIunS6_b>qUU>qf z9Fp_6KkNDks9}U14#&|n*=Mdgs;1Z@Hj*nj(J@tWBk>gwaA;v+tvuFyM?plwK8mk2 zLK@nZCEM+X4{`{&Hov=n4wa5Wx~vzE1Uq`48u_HA+eZd6bQ^07o;usxWxyVT7!2`{ z@aF&p)bjSd*xAI^p7uJD56d#P2Cll#*cPm|H?G_md6g~;5ka>Ob9Y{j+zPN_LH&X* zjKaFdQ!2!2#18+YjEbB19w65`YpCWLEs_c>j6fR~=Zwugt|3=MWKUx=Z2P!#_HZ0{ zC6C;uk`#%iM>iCnf(yibx_Ef}kQ}f&bVc_1w6(EnwK{!W0V_2<9!UFYtBVDRS#alV z*RdJ0#MYRi6G>&sYK;C7TX0c7iYpd^UhOwrwET0JQ!h}PXA2P@M=S4MNAodA4&450 zdrOWOH{`d{my!y}STBD=bX7c-qB@8AN>Yj~el6YrAw8wuu0cqN>HRtJtg|w^@{di; z)wRn%KZ_hId^V8n2vlabl}Bx;*+?DMKzDF%4MBhft zAtX))*3V>NgGA$_(zYx?&aJOT4tcvWW4LhX_E8?9%kc%G44)V&W{^UQPI{6UQ>P1u zDKAcZBFcozxU7l@aJ>2Qc{jfI?Gx|>rW~gr{zWr>W}LJg9yS-W;%ay(zC*R0_b>ZF zRgB83hZW)PkKz&%LE|tGggXXj=k%1p!Ah3$d(37xd3-v$rJL@~k^`6EZ;$ zO#Jzm80g|o{>Y}*abCIF{LHYfC#j|xNyo@IY2{0ci=e`socejdQ{?CeS`soY1r3lf zYpXhHl_LtvnF(Ad#CtYyGRHJg=O(HNciq1jbu zIRtQuQp+M8U_I}DBSvgOC2=4%i8C0TE}&iEA};kzyc98?CH$UH@cK%hGg^4M&Ps(O zy@&QX$-c6n=KA_QTLV}xO1CFctX@+8E_A6n@qL}sfSGgD51c69L`0hg75&OJokn%c zA;YPwOz#7Y^tV@7cind zIxWNSczRB{6S9__LISMc1dkX!Hd3Ph`}`wlXXH&WcmL*+r!MWiDiIwi67m}2H#2Rs zsB{vdTufdssWVjh=$t;PzH1GuYSqM_DXzM-j!YybdB(r05w=B3TsyECioTfTx#V2G z+dXr{8DBhAdm)KFaF=?p_ho<^xW^JV{wXhcDt|HGb-89B^o`RD_+H+%ztJS+TsbHf<^62OvUo0PB5=*)KCYBJkld|Lp^N$`H&_$f&iJLu+oHzYL0GHP6&A=-w2XR z5hkb!Hn9$&9&?e48Xlor-i2aMJC&@`VD)^e9KF3DAxw!qp_IHcS3hznj3;U+XSK)aH(`c1W?~|6- zv76Q474~xCqq98|cQ?(xSHH%=ZIaQK5e{P(I$#Lc)5H5YBM?90N>NSfE?ceL>tvcu zG?61te6D|x)vok1SJSL<#EiDopB)Z`FJWCwpwIyS1B)D#pSeyp-}u~S@LwnZF;Cs- zc(ZRQNXx?2qZ08AGqZ$QF&oZFj=E&r_AZ{NRS5cf3LBP89v)BNxOrbIPMZW#Ea*ZN zhjb3rB#J<@!=P=Vz9hRm&eW&9Ki#n2HZj}PTe+!kzPDb+qS<$-JWo3ytiu9RtK zm|Xr3%ACC*XM0d8ejsVe4Z_HY)8q0#q9^r-mr-W_)Um6$k2vOD_^V|ieXzQi=$wo6 zq8S;l9&i~Ru?h*)LAXDAt=7=22SRKM?jG1Mrbzp>R6*P%i^X=KL(V_rH40?$-^nF5 z%2hyFHlL3?3J(0zJ0FOD%CY2Fi7J$_)$(?ilhnK&@Ir#yA{{B>Zd+DGQy)IGRyZ&& zwB~!2G~8WrBSO-~3d%F!4#W$`CDrV~qZQ54hbB=LyR+4dgu$b#Ufoi`vYBw<1Oo-- z@UASKTukQTWu<6#@YFYq5XJ_*cFgl!ZN~dXZ@MTj^y_+5U_ow4T*Q~-zn&VQT7n~= znKOkF?jJ&lJP2^(tfZ24^6x~D!kw5&WAuozyK6{wPkjoOlaWwE+_Wk#RD zP?GzSnKPEGc`-D@m7O0P3usvOo;jG86RB|`{&<-{3o(YfHyn*-Qm*I08WE`^%X8(uoBy^olwsX^sD%I#@}MN3k5Z2U~OCKMXjoD|n2{a|Q# z0$Bn%$3u5j)V9q=AF_$SL$|g{ob>#`fme{+ETr|P?v`6gE5y5TvLFVx&ovM+_#_hG z6#aPgJG57)&-OR(7G?_(zi89O3dVl<6@mG4R4)|m%Z2%&Hnf^NIxBsU)Id3aOkuw1 z4Bs)Fz;t<0#OSxG_Lp!s>ELdHSKoU7WvnDi4L`Ao0$Ic1NAGenYFMN0qPZ?>nGT(S zKFds;3QS??pPV1LG10OuieN%3sqCg^wWsR%*9X*~NeaA3GZXxlm(Vs0T^tZF%&L#w zJSc`YG1SRIy8#ky#2^O=4tA;F-7+6B#0&Zqzu$bIKs~jEiJEU759|cfWl>t%Dxb$) z3TwY*^A?FG%g_+GIWmD!06_{#K8)Dnzn81$vgrAS6T=k?{?qM$5}@7dLuttcVnB?7 z>$0z=#+ndzBpL^p^8ZXPizTzVr)9){DL!7vV31M%_T>=jXQlb>+-v(Kc4kX6yJ5zW z?l6k4T%Z0uueO5a5QXPtXxuXGCC8$|?#0ACM^@|#>Vcl%VwwOhJ`rI~%=eCyKd<{o zPvpYn>5E6lR-qZH}AaM62_IEW(K zzKdDH?XgRkMFh~!>Jr<=PEE2~!hpUM2=g-vV()zzdyB^_f_!SEek~JII(UOJW~R=Y%z*54&cE0kk3`b16q$TN~QldCyVBT0X45!%Z9aJMCnvXLnDh63izL}&WBXz6A{KRWh&2S-%JI9#_ z^eH)RNN%M@p5dy4qJ=uz2`O&o)Jh`Vu=3eR6JI&WS^Xt}`_22qUb!8_dNkn%RlA1Q zY@6_S{yOO25&wD(es$NZo%?Y;Wh-sX(17h5>KB_xX9!Cha6y)r5K%up#w5V6TRG@E zTv(qE(6ye*Y1Vtey@IaO>I~L1F{;$exNj!sg&AEg2En#HH(|Snl(TnmdmhdSJ{bpF zQD0*f2;%xTp83UVOQCJLnJeF6X&=vqjsyY!EKM;FcJOfsH37O?7amVhm*jDkLgsJ) zkI-z211kd<`iCVd<1gk$$CrbJp+krLSh3(tJBoYJe?U2M9I2x|gQk;v9=kRbokI-{ z-OTHBGU9$qCD{r^1pwx^LpeTf|31A8ER}w$_9z`qK_AE%sZuMe+-UH{U#~bEGpIZ? zQC^`{Hf7saa9|*qVNDYcNj3Gn7Pj&AM`X13)1qJ6!@S@lKhd{5$Tu~oYg4F3j)Fn0 z)m0)fDa*6qgQy=Vd1aDCv?GvtRvrIDsrC@jz+^tdQ(A!PEN}XU)Ar9Hn#)gR!X&>@ zjxAA+(u5^rBPLE*g57jdepDs2j0WjMY^Q2#8U1Q%gL1NwZE~^8CC5pI#-$R9qmAhk2y~A0QAdsE8!z1!b?M3V%a3%0}dAG4bNMip%Swq-nC5wgFa#D!yzq zc}${tBV%>18ZNqI&FEn4)M4g916R2)A|X{z4Q7(3Fb`^!|)7BL=P zut&&IUX3=wI?iYpD)1k?(A+dxwrCC%4A&T2glg&Ud50V;$@+Z4FlS+Jr=fJ6j<{R@ z3p0W#MbwKA%tZsguqEH38{tEQM~2K{_=yC2nqLIzRtawBVx;a`l)$7YcrRc;Afed4 zw`SrP)h!J(Hf#K_^&troS0&HH6z2vL|;d8{FJr3bDD!-v9GNeyB8QkgVL18+KdY7L5+n^8RCD2g-NeU;&j zCY}`~%W1uXOCx(YmiY{2YK31~L1kM^UYUg+otHhww1Kgh7FI(w-Qs+6n2srJwH+uy z(OR{u@BGLP3;)KWNw1rNx%(6_{1Jn?u>=>*fPxyhGBd$8Iat{kX_%&Vf;|aCFF|dV zpO#VX$F44VscUo-OJxDW4*9g_S_DYgEDG;=jS|UvcC6&6(dSqEIb*FZz*H~VOR3)S ztg)eADQqflh_Oq1)^M*Di#0OKnoF!Pmq*PAIx2KFA%f9V@9gl>6wo*|nu>{)u-N`E zU5#?rMZODbiiW?Pc#7Y3zI)sx6TPkU+(G}6Jm#FC1G=-Pmn;66C_L|TV0)ii{pk`z zC4<@i@%n!EKVD3E+|^&1bLX$c8X55On0WuQK)x>^6ikHm)`tGQ4|GSE zllFc6q4BTe=NRUP{QKvW_|?DTdji-9X|GQY2t5}S9X%a5HZu5Mpxj=-&M{CwMcBmn z@n$8EeJhTAWX~Ez)bYp{X5l5q< zIpG&Nl+m5R7)9!0k%`;n2I<2U>BB6k>YA5dE5CAxEmc@>kv8mX;gFLX5FbT%c_tIJ zC59;Oeb$C^atBJ3r&${;A<%(%D5Ov>L69K`x*NDXcwV9NpANLB4$Ct5JZM-V*$;gL z9GJ!zlJ{AVHe}YvcX1YAB#1xR$>oXBVGfThn2dr9NIijsK^fTYCAk6YXsG(xPd(_( zzc8trmnS{i$U+xkXj~`-Sh+*kHmtU3i-ANQ8U+MZEtGPBL{t%xbAeRn`ugtrc?HEV zXjc%ic&^IF4GH=mgoE|$3?Z3uZAkvePXJG&(cqz9dH35dz5AL@UyPLucefn~0meL& z<71vUi!-nXHk~V>r9T4tKFqrVogRS0Nb%m$-CZ9Kl~`G^jJ=4CoxugTA+ik9DdCKy{syseY$*1X_zNe&C&A`vaW_$kR`57e##?2f_~qhtxSk z5zx?tfCXrUTlv97giLbVKjBb>E@g9Dl^zk4rBw0{OOI-c-%B(vi=7G+cUQxjcF@Mf zApp&N+9}lkbLa6yzQ&?NUlTjsWKc8~7VIaF6G7&PbBUwN!?lyW_hI5gjf>!Pkg-zZ@jMund?(>;%jUm)v}yv6 z!uNsWin&@ljnzaR>F-)2_`oVRjWKyGQXOX{@2F*QSjpmZ+mPnx*DCyYi?Aczojzh&DrY7< z8Oya;&UJ^?0a+&Y9H<9=H>Zn|bW0`#&1ZA!8CzT!%FW!XKy)xe)th6`Q{4RKMhDM;xH(16c%;PEY%ux1qhy$1{e`x(s zf?Br9IX%IYyv&J=oqdhgBT2~&yu6(R{uGEq!YynVX|ihIS`;U1`KwAuiFVHQpe0D$ zsL}S!TfP3;2^F86p%@j?wV>Ins1TBia|d_xc9idg+oalHDib+pTx{8gVmNhHhn50| zG~YpE6CiZ*&)(K{#XYj^$v5bitc(XfU)kTo9m|Y1`(Zl4%c}^YZQ;Axc#d}eBw&r+ ziG`7s2x-lDJ&c19#5{r)Bvcv0*aJ3{C!LTR866#uog}6vkC`MTorBJ6Rs9PLrsu~zu22P@{-<#t#)srHaHC+bt|K=pgqPhh%gCnz z!PPyZ>JmhpBS~FEro?@LUATD|jf*3Q_hRkf!D2bq8E$mIr4i~naOB@1*w}$G9N-1Y z7CHrfj0Gg8gH=QM2LW$0Sa4*gZ#bOW#$V!7r1LH$;mj0OMnG`ob3%2KDwvdsDBT

s~Vp!)3gNbd$SH$rX z6BnkTL2<1HAA`l==#3~81c6X`r-+fyjP*kS8(Ky(_+Cr)#u_?UQzF~n<~ax4zI~}F z$%MFu?Jo`n#xw*ioDm9IH_*>6s1?j_d|jfQ-Dhi7DVz~|U6z8rU9t`2W|9iu-p`7< z6<|3w{N3DPQlNNLlm=!y?f8}9_y0Qgv_uU;n3b}b8?;yXqRUKayj%{kRikj@RiSzG^;^1RNVmFAVAep;!l5b8QQW{1T= zv{H++U`>xTA`Zi_nvmlu-jO*}ibPVkAZp(J+FO@y2K8q}dgc98iDztJ>$j~xr(8H} z57PU;(4YOP6q=#POQ(VssC98LlYQ*plgds5*5|uB4!2b48Hn<2;fLC_S4)Vo*|;Qd z4|O*`M4U{ojyDS&L%ottQ^Apr!?)KRdOi>W#Ilz&mUE+ejF}t>7g;Mv}T_jqgAfVJS{$C;e()mjEK>ME+Vik zIr+@U9J}zCl3sZ72}+0R;WOAA6|z-JAN_OFjTIL~iF%3ex3m1G7IO8L(hs=ouUMep zJ_T~TrPMF?Kllx5^^2w{@V|!+J_wE{m2YuV<;*m@&VtHR-Ms{8W!6{T{=POGq>c98 z+f5A(=p0&VJJ7B~qiW_8zpKKqIBQCZEi0ZGEsySA zZE0xZ=U8v|)*94#+=C#o%At;IW~Pr2LBb*ZLEmwl7}*cBjLH%arvepPGRL zE9(U(&yaYvrV$&yxqwlrkq9#h$EYhevp<_NSGoM={D)Wdru=F{&~Tn%7bA5S6|a?l z#a+4W+Q6qXk7Tx6<09<<&E?p^sLRlo0Oxo@z2st2xytq-YPL8;hd!6~Y!<51qFxup zw}DvjK|C_~Vq8`&;49%rcdaZOQ#yjf8>fn*;G78^A=168wqj27t>qiR1}W)ib|pI} z?U5F}>m7>?jGd`RIGR#B<-qK9p6>>{I9T1f*<7BrQ}sRcEQnB`=1=(b-)CYrW}Gha z35?=US>JTFitcV{E6c~!hRBxAL+)rkYlj^JV)yG6dIlT%e^46V;Y`eGP5JV&r1vu! zFMnHL``}#CT_&yw)iv?W0j(7+8%-fF#v0D!ks5ab#WTrvu8nkDk`L0X@yn#!dtG(p z;PuCNbn(_3w19C)xx2JAV2kp!iHO@BBbU&GYnJDIBR}U9t=|jEV86uee&7X)JrD_{Yjgp?f8Q;~p z&1S8(n0cNr(BK-)|J0vqCaGXfUF>QT(|MEkN?6U5NY#e+>*8-Q_d5jDBYDJ#=E(bb zDe-~GO`(EO>FJ_#GZ?*5S4`~Q$3iX^g}lJrbw3okrkGk zR-e8tAyyx)PTccNiMOh%>|YG&;|eqrBKT!Kw1S0b!oX?W635k{(+Sk_Kr|2e5n@qL zRtfB@p?Q_&=8_9xk(-w#9M7fb;la?*B0Pr5Jc2Hh+ymF~l^H87S+Z^ei5#@mNeOkF z0s&2(nIv_M2mfA`ai)uOfu|@DUzNm!Wb(5xBiT+7rWi zSmgr@cGH%mg4%)Vy2Hy8ys9Yq`daVxBVz4D?^?<7lM+c|`Z3r*{%q=LYa-J3j^me| zD*mz6w9C-p-0w-HhPIt{%szQEeV2mRTNYy-ik<0vk%x4%xXG4+VfPqiSEnU$m#0G1 zNUkL-R{KLzzUM2IIq9}rR(+8o)TnZSG^uKM3wrSRUFI8HfwC=(U2%oTBUw{REfylC zZ^IN%wLXi@qlg;uV4xS(@tdQ|rC6a8o+eLbx(;^F?A^O+zd;SO6*n1FQ$$btQ8Sl_ zw}{%70Iza%z%y5@YbBPvT<j zBj=y~`l#ReSE18e{Y$&8zX(%uO)O>YyN;NU#^xXMhDm0D?Xh0Bm_%ElLc!0SyI)+>mU_6`_%`t{k*5rh+mzQx1hfpk5 zEUUBjj6I@GLDHPW{~I^2ziynBh9W23n@P@)86sJx_D(^2q%Ql+>EE5^qdVW!j)i{O zGhQe_Mn)5PI!|$7~bv`6tn&sgYWnK zpae_Sa@`ExNAO;c(RcS|$tAn}c(X3qo3Y8StUz^K9dT9 z)L1|hMeRJs4MGt@;rI#_GjfcRgS4;KX(DP?7#8kijnF-Ts>NMPnve1L(IpMJQ$k3) z5jqbEg|-n%Iz7F*^`P8)>T5t9bX^xTL`(j(&aVN@&O8krnSSwbPZ_OBXzIX(VMV&J zK9m8)=~0;;VHErW1ZqfXqh@H5xFs>sUvCX8K0$&=;9n{ZfC=CZj^>a{R9SB|Fj9TvE@GMwSMjZ%oq<<8XvyM zHTY;PYNB>O3tz7;%{_0o=HnWNAgI?E*r-Vqj-CqLn2xqM@gOI^q1GM=Q<%`sI1X4w zh&mi25MQO4DY5i=#cY$iIf<+%mPbhvvb=|;I6cS@j_nTlKkFvl-Xm_}vPxXE_&p@}FpbdzI1RNsNd(p+FV*ulZejb3ycv$; zR)SXV_n~LQMFv8Q@ito8O_3Ug4;!?SeU?dHD^@e>!7EpLoZj^j%H zb7RG#h4JJCJ>R*=M`9zP3C474n>PNB;VK~DHAw(UvwKfO?`K)59|14@BDO4nm}T@WD|j&hxUdY%LFai-$CvM zQV6}%rP5i7gz~f^gh)|(S-+?KcJdV%S*VK;YYhQzs(K|Soz^9&svvU^Q8Nk3#m!#g(jq) z?7IcTs~yE@UN8fo1YhieqqSMt{)H1xXxZrewxo1dYtm?Kw~L|G*(I3!m}PRrBVBlo zay7-8?oSAkZ7(7#``a4VB}#bk~4+f%Wx6YQR9I9Fcv$vjxHTLJ!{SoBd-aqcpV&m%1oh=L2mtu9%#6%M9+U%hE`oG9t z0+-0z&jme@;1ac7g&?dfr9ztoMDql9GhuBvj^yO`(m$C{xQn)ky}nndbCuIg*@YQ7 zEh?RpvnB0Bq&o*=;FQ06{Jdq@$>h4fiya@F#N9dhe^QhD}TWdQFqX@-HyclD<)&> zi7&jNDZYyr!-PwZA`&^87?5^5)LwtsYi%^Xz^U&FfkN^-xWQs1F*_?xZ8(3Plld;=v;CX&;pKrt1mlW(4zjRqTmheZVx}e7{z-QMyKHjL?I|RB*#NS7>Lm% z_%gw4Q!tjdk+t0cYDP|VyvhrA^+AZhwa1)4Kw7%NlPFl$NZ=23bddr#dG&iTVU|3X zr4Iqqa>rzE*1pI2i!i;X4{)56SJtNiZ$BQKU(T1p_#k>nJfPVt;Aovd$r~VLt_7fh z^nwUsd(HG~#Pi_g{F*heR4%~QMF{ejg-{@R0eJn^dUwM4u=NNO08IWoc!S1}m7XEd zJa{^|W=*sulnXFPz-niJAZ9*B>wYu+jZi+Uu|mjFXMiv!5oD}`Hl`#1vI1QFf0W38 zXj@@|n1&eE0Bkvcv4Iv4E(JiK2#X2;Um*bu26}-2x_|@e`?=2omO3Rv1u=<&&^iB4 zm^w-I%82WK5rrVLS4LF+qt^^t>O>0qFQ{P)y)hu>86-R)R5j8W$PtkGr7#*`&lbS) zmq8eS{XhXQZvge0kV62B;u(nQAr2rNkYJra$Ub39o$~;;VJN^>8v!7ICwKNr=r6!p z3s9A-5;P!HzkC2}|Lra4*Z&l`QLz95F#&Y9OZ@*!z??PFAOLBV4T$oW2RMNHxv>6U zN`j33cN)lK0Z@kcfV5_Z07^jW`d>ByB}f4MUm>09fy-QxVgD1p3|JB@0OYv_ zpx5?4y(oYhT>V$cQ1}1kVtSAauwO&~-CwAx|2X=&J)r+b24?bqkf3$}KuM^A0i@(^ zgI0Q+f`H1!;se%B0O=NGge!9$_>T?D0HCcM5c|G~<$tFQS+?IwZy5k*guVP9+tD5^ zUZbx!_w$j&C~wK4xYTmPpYAS9v%a3=P_{)^lNxEu2SDhR;L{a?BN zD`n^ZEB8To;2mfu5Kqd+&qC+hwe-)1zoj1De}XamV!jQkqjzh|e)6iLZ#4pb>goNw zJ`n)4+CRbQ_g~uAea-Zey*ilww;R_#NE`MVl!RQu(?Yn*or)cw3gT~5Z~mPhFBX>| zyzL1Qc?S4T!L2{s{et%9VIxQqmw6EHkG?&Th?#kPLQsjs-!Iew+Lri}^%Lf8XH8ae zbItPaue#fc%b;=yLc(~*4|7FSeINgdnh_jLwKXl^>c2LzhFOUHet$krEPwODC4UHH zIO@nVDz;wt#XmAk?tswMnrYz@Y;EfWcku*wb#gK5^FjDOiu@d9m0Wj z>yK}G=J;NJ=CpVp>%$1t`}CgGUDZT1e)uu0Fi3@D6cx|{`~72%Idt-2-x)r%23H{~ zLJiqocNZ?(zC`oK76Y!3-w91TmtOrHE;$H3Z-1+^0Nlo&SOhcQ`^u}6p;6;OabTFv zLOl z-MlPe2mu4?A`0xMSG6T$XKhlMRlV9JpjG>PrBB=wk~;c{vObr7Qgzzl@NffFn z*MkydC89xML;8gT90B$Lt&GWx1pGvR904W@N(6)~bS)`3Okcd3y1I)X3hs-rykW-r zdg{0hRO-(n_Tw)*Nkw%D=2b76@xe9aMSH)<i(CVR8_0|u zpVpIEV<-4_3NMX;j7;nVXq7x*&dqJrwM|<%$n!O=t{(sO)s)wOC2C3@QnKsM@*R&m zIFTY?Z5r?c@nLYO|CP0#*H5QKCjgN&eNzcs%Ge3Dfb}UwmJ`OJ*!cWQ5@L!ZYiz71 zNo99UCf84|E3b;}6j6%eMY;jJr|c7nkL@qpiwphvwB@OT3%~HYBa_3~={a0;AGLap zPHikvUMipGVSr>+sFG(|TaTTS^p-K1Fx~>%%e6wR!71+_=HXoNq(H7rTJmFZ<3 z%@Vj~JRVL2GFr&wMaQPqNuNi%0P?`%Wx@WwT!KDJ;Gw&=xq`GS$N(X%xY5aIdM z%xwj+jdRrFrD$e%Ss9xX{k43dz5a(6uNHo8s^P(CfMk}WUWJ%hTPMgKEb>!MkhdLs zT66pxhdT%fsc)uQ_cmelepaRU2emrEvp)sM=xcuLnTw*wTBXJx=EQ)sQ2>MyE-iA$ zM^loOgU6X4+JKALixrtkGRJT+253pz`@jp6^mqN(Y^wA zc9VQeLTKZl3HG=pDda;V9CM@V(&^v76oYRdvSf(%L5l;s=&X2YxnPw)pkd55mSYdQ zAl-f8E@&5aUhg7`WGM0moq?@Wv?tA09Eluz&ds$Ibc?D~Iq3UMH{qFI#C1>}_Rxe1 zs=X_9rzLCo_f{{4s-Z?E_R z|13@na7-Gip|WjxhsdmYcXm|uzwT|diEP1ujP}`!6ARvE^3U`B5SXB2#~2B`(|&Bb z^f!LlHJ9@Yy$AC&4Yf2g^8^P2XZ0lG5?dA>RtjB9r}hlx6g?Jwr|#%mEA7zbftZlp ziC|N)I%Vimh9eh4e*vSSX$q`aMh=l+|L}q9R^?Lsz$oHmzo(kFI+CPzza7_9H;+qy zLf(i=Zfig;4h4Q8JBF>n>;418dg&~bd92Pf&C)T|Nr#$PJ(DizdMz@eJ-6kjW!Zz^ zqf;?4N6?IGYzvZY;{!g0>)gn$YgsZw<%m>nPx5I#JF@HN&};YWkf+};`t81_1fMcV zata953LTqftK}ydv+#F|%paCU#gVLlB3Q0+4}M_BBDDmCPh{R?Wx777n^<~`oe@^a zl#5eklv+Ni=X^J$u@lZ28-XCg#vF-#hd_|yVF#+~ekw!3?$C4p{e=E3TF+*5?xfKb z{T;GI1ua7y))Bv?IAc>pWUon6HMsrSoNsfM$JMwVMmVxvh*5?H|BXhGlk~@}TkW@| zuwDOx&|S?DYrpp_o$nt0rEQm}3Bu=$peLfCpn}YECs6TV)n|rk{4Xim_GZ`Ks1LnP zhNcPIeHM}UdEcyx(6&v_8s?3zFr}XCv%@yF*L9f~aDd)EvkHhN753drXI)t0kR(IAZ-VTAWIvs=j>LHVYQ};C z$k&4K&ixC}9U+p|;#IU6(ODiz@9Sq5bs{LFQ-K4d#*+R6~+h?f)C$L28AY9p3kckU%zi%xB0pxu{Tn{ zTUNfd_|0A9;avtqbcqoS4rVL2Utw4g3YbzdE|LrXX;}}O*$!92b-_x7#5%^KB_li* z^&Z_966w4V7;F@oTgTF;(%G|#<>Hi>)VE~i=pY}r`z=SBZGL(B&52Je-5RFbiFZT1 zBM0Y%o|(MMApB;GnI&PKv1+9~trM}E)8|pwgOG8nP7t!zH@uf<|7=C<4VF8)3%TMS zdHte38JN=w{TR99e;cA=55uj6fbWE-kIL9__!dmScp**P!wxVq6R#wkXL^MJi%>&K z<3hc74{DNYA@q||@?n2{zCRl}HGpXQGHmNBJh`iNPmLuS%8o@qOq&+(jVk+WVinjw zwirc@8#zefcg&K;EVnY}uZVw6RG0Hz^mg))JlnHDf<2}pB#1EyIna|x!#{$c8soA# z3g$->4s5PZ^DJLF3sq z?=OENJ#(J!em3O0J*tn* z#Y82IOXg+dU=T5aX1rCxRYpFyl75@#oShmg$m3G8dJmRT564Mqt>rx2Nm$`|3RoU9PEJGsM2~jT*G7lP z+s*tiPq<6ZI9H*-k<89CeCfWN}ncQF` z@J)&L5`oQwl1TY#`f+r~1{HQFUo}DILa5r}T{D#~O`|HG?B@1ZcRv@p$+S5c%X@U) z-%YqhgN@=g=E`vkxZNyQf*ktn$Be&BMX;h@G5_wZf+EIWc@`g=4Om)#9HTc0u9Btb zfH^=q1~0pj7{nOJ!)2lPGJ4V5K~t z2U)F*Avr71VA!y8XMu6uWrX$l1(g!mm&@V%7ZJe;J6Ol878cra1(peB6{ku?DI-3s zTFc##MtfGYr9VPjg{>ue3ru?`JW$Vl4vKQto{uS?tzm}bdR1NH#$c|FWOXygsu!swwQ6Yf30@ulA?0dcJ5@9%n#HI%rvDM)9>1vP9ju z@> zxqR>ITEM&W$_fmOaVEs!m<-Gx?e2el2OsmaQA=V}cM__*-$}fCASR9;Z!QzcZ9Al$ z@MB4*V(P)Yj(da&sVHY%$7JD8jk>T?S!eBuoI}S0QVPe4V!^V~)^_WlnWJ^8^3!q; z2izYvK&^~Cuv32Okio75>-dtDip-^1uiSk;jagARZ>`>md-cb#w6Jpt;Iy@u)fwF~ETMVfX#IY~1tb_3fbt3-URb%(Dr^mcecZ0y_DD z@3`#qc>B@*{)cOjABI9mD z8yWvi0Qr<)(@8&E?8|by{pB{%kHZA)(_(Q?9q#K~Z`I&3{%4F4U7r^7=Th?LHHtKm zdsP~kE`>2=>A_q>Jr*hra%VO7wEy>u{U0Szs0ryZN?kKy4aL4yVHDFBQ!Kp^DO}t_ zn00bB4$Emcg~0yK602YnW31caW;ZiX)CyxI^t}g%0BUm}D4r zx(~3PwCo&y&2g_mc36L2yo!Cben479jzT?a{Y1{fGNWxtSi60;EUJ6}?pZAd~Yv>dX>Uh&-CpR?J8|4e0u z-6AP@?HNSZ{xHRV({Bqjerd#$K}f$%bldhlN~LE+w)?P%1-Q}({|SF*rc1>6y2A9| z>zo@oL?L+c9<9U6QkoW8ZA}T(E6}v4;AB$eup5X$Z7H#~7$?_rATu_u^Tc zSn8}f69~l3Djwx?{b~vMhwFfZIQmU{WdeAc-F7YC7B~vKyW`@@7kRgt9Jj}F95tVS zo|77j=6s{dpUJi3vBT}+lv(@wYEWbq!e^=h!~tuXEO2t9g&L=R$RraZBoXmoVEAGE z4DffDm^y#6l;4w?UKSG`m0onc+iy$w;%7oBK~cx4EwT#w)dY{@us!4Zzd^d5V41G> zwg}T8KKX_XjMh&Jyn+$KCRqzWA(>Ftek$W z9ws=5H%CrUTnqE3ZdUISIi)|yHAyYaB|bz*{p;YLc0C_`$6yhV{t+)6#z^U1fn>0O z=F8V*SR}Fb0ti{sWeXG!Df(B_zwwnNqXw?my_00s)QjXq3&Wic|H$wWAdT~M^Uepf zqZ?1)>+%wLN@F~W5O7tjBMdsm1O;6rCs#U4BYTT|In?u~+Sx~Sy+`J{JTs&k>_$?+ z)$Nvc=O#Zifh~FwUpVe5S=u2^oj60RF^reX@hjJSvw@dq!&AK z33#2f4rs1vAHGoKRq3wLw6*9F2rR&Y3Coj4vu%;SWpmjyLPHihq~@OGs4s9j|7D8$TV; zsRR^&{v-_fO(_j5M)ebRYr<&~1tSxI&BSC$3l@#-1;quHv3Y?N*;8mFMD#CQQB7RAsB@?vnGU=McvWI-V;pRH zONj!JPGQw?cr0xPv97_%b-A~=B@&Kg679rdT-|$EB0S#4+Dy6rff>jMV%j1pt&Tx2 z&~$*O$-AA2|L^_2EP4%3gt9}%tASLfgQMep(2xeGlSz&<*`@j~)Z{#{(Y*FyaZP$d z{Sd_%sBzk&b3f6)uOsD-%6c?gmYqv*QkKNBq2m*(i}S_?Dduo%xB`!tv?#bCKj|7%6Z-}<gfeWuuqr)>Id4P97e1*g486+nuiDH%ZTN6RjS^~9l}-e~Sabg2Ag z7^{o)S)u87B$ghsQCP!s?q11xVzW(s;2$1o*~4iF`mMTOAQOi8;H8!Wz8VthRXR+} z0_7Gh%XgmAoP#KiW$*fZ+OYeNLk+i&m1vih=ypAYm*mvcT-s~K3?%$L#pGP*in}z! zGBT9$U7#W{akq>*kCQKV7XwJ(v}$8;JAY1nCGTF%KR_#}36kRUeq!r8k2jZ8BqYW% zyW`5XaB6};t2A^t-R7QiMuC{~Q+vd0Va&Pu4+K%i9cUi2FAzmV*JXjAnyT^rM5}4d z`T&;neO?K~wTrM-jP)d2j&R{#8`tIBu_?1YDd8T@j<@igym56JaqPSnbvNrrah)n# zo&!C#^-Tz)uH@(=@wjUVYk1}ygJmIK!Y$MZHRc@p+=9%Ugj*iOsv!k}Xm+c423du( zPLi0~9eR=m%5iqgsV6wBhEmxjoUZ5_@xsCH5Xvs>1` zZqBYQ!)=g)))R=SSnXI4X3B*yFO;rKuW`na^6!`Y3jX|vwWv^OV9d1p%th3@sOB?8 z4`J~Nug`q>&YNMh4Pf?F-A?JMt*3?`w`v)1P?6{eJ4YN`?RFs7;Yo4*Fjp@`A><@Y z#>kKQe9fUX|UI%-`4M~h3-PqWZ!w4A$ z5??rq!rF-ityqtmb3Mff&d|cBVA_Dt|-&?_iO)9wdG+erBj(J zs^LRLre{_E=ETduR9-(HDM2N;+#BL}vNTSPTqubtU#X!H4ZiM| zENG~K*KTq~`wdbv4|E0d0dEH)QuY?}VPG7A1T;e!2IF{2<)#4ONK%sGLJ(Lbfu+13 zE?_Ezj*W4MCHPI(0?AqDWut5~j}ne5Gd3MJe}8}F`}4J}+4!GI6$?ppwpvY798kf> zFjDHusp)Ak5E2CRp=jAVp-h}=Ep|`FEpA{|jyP_O0FltM!$z%A|1}XcRni4;6(T2| z(L1cN9`1$5_8yaI@qf7;Xhs=3g_YNBQ)Ww_L+lAGyq1_Q)k!Vf4 zQQi0J27&=d*kP5OTNWp%#%)=c*Pj$zm@#j-C=k$=?(3X*m{SokL#RuH&mc0z#P(sSQ!KAf=J zK~glk5tfv|$rur@K|($}leQXebZ5UNJsH>en`CtAgSxpC`mrqF6hXHYC1}KEVxak_ zGDZhQ1$S!mhwtr&ZVIWA@MFdXKn#9-_-FdmUK17yxr{g3?yJT9K2d37=z{W-E&jgC z;cca}#Hp4?(#}rG&D&JRP|G%vm|qUg8A9%9R><|yW4D>YvMl(-=8?A*Am9o`P^UVz zf($WqD3C!LGO4$0mzX0z-eHt^jlyUNaL?-*7S(_r|EaMyqnk+y;N#;XX7cNomF z1_+lFtIg(33W0?bY~LWmGx9gNb1E)pv*s7fp|cGgHX!o@(S=xU?Sl!ekB@+WK9TG& z+nT~hXf#4X!)D736VBzQ$WRz!bL(F1od9IBkr8E%@j}lZwnP%@>&}nafrxY<5JGvW7>yAa7wFL+ZI?Ig%MS3rZITxz^9%3dgwPuuL`h& zw~Ijdqo?>(Q`cH8%=?opdXZCasCuNEoy?q?Z0t2e6_NGKt*3*s)xYG;pfkKOYIDLm zx6YMK&HR+ng>XOy>SE<@BxBp>yT=1VwIa^uTB`-&8AZ27gLC!N=g})aK%)CVVYQD;0BNFCLHW1whFGA~Uk#~{FuXKxZpu6=vP-X{$@cBR z=*2cZqV5ft;v>d2j0NXyN@K<2Yo+n=^NO)xVGS2UkyPH}0z(@p0^biypBN^Jm{Nxf z=RaX&5=n&kUD_j2_BEbOxrov$gGrA&gVa;vs5Tpgjy=Q0JB!#iz8P%muo-%Q@5i@v zW=A#oN0U?e>a*&jxh-AFOg)smP!Yyxt9t)_l%Zbi9v-GUFQ4&?62D`XN^9`q_D{I} z5tWV3W?ey`NbZ42Kt)$1p2+GbjirRfU!PqK{v9lZa*{k6PJRi_TJ^inJZN5ISPWad zy|AOEVC%O8(P3(_W>R$aC^k@Ct2X#O!~}K!uK^f`tT_QKMx?*|&wk7|F@2V9XYv~t zlev6ZNEfh-b%MyQ1|I`b`QpDQ7^)C&z<2`M!LhvYL<%T?0#K(}U#$NXvpj9bqmgXu zMNlg65ynU}_QAiVq+s~i#d>?c7e#sBRM;^!2TqrU&Qr99nOUX#hl@t6hfeZFWGfc=Y_lmUt~j>FOlIZ){*9saUp)%`b!9Q47hC1 zr(jR#1=V*Ll(Y`Vg(R8|u`ddz6+=uHOKjgnG<|}EAPZbATaX;GDQ`<_h>Fa^>roB9 z`Il3M70;4nnr;<61BoYpeOH(lJYMK*5VA#-j$z>g6Q-f8+^G89kSEm_V@ zDNx)K)Xppu$*($T4s?ec8kA@)Z)q2-)oC<4WbZcn_@Fyb9Hkp|GweRj4`|oK!qhhm z-dX@^LS2!neD0Ck1Ssoi5w*UxmD#)wf}2U?3e&wAF8FD|Sb39rQF zs&f9iii%Dwbd=ot5JdhS9w)4aIDlJH2fnzgLD8LUfrZ-exYxf#Te*cF**H8&Z$VHe zTl~j1=HSpj+fKSRWg+flcbR4@H-7tyJgzq$nf;)z$u(H7RJu6K)6p6_PO1`Oc_v^r zc;8Ui39RAG8)_2jBI&)0TZ2F^Q7^M}`u^tMNbNq(?*&aM7ZZ`9EfO^%_Mhw+D;2nI zJoKQ|IPZ*<-8i6p%s|9~QK_rhlsNYO5}YfFytbQ8NgYzP$(V?_V}aXnUa}b3{7^5pmt^RP>htC8pG_f&?GjL7SnaJrAQXEo{SZ?l<*&gY5Xs}M;n3aaOuGhs-y!n##1Wqpbq0J|x z23|CeyP}>IR{r3wKb+^^=;`I5$yc<(TLmEv(Ent{?5+31&v#}!%f6};q!M;nX>S*o zm<-b?W*>)w^LOOdXzLgFBQM#ySI9;^p)oO~*8S5qYUtZl~%(oN)4N#iyOCw|wADu74%`H2qufa(x@> z{WWe0#pC^jT(odiQcO0$19yG-c4b_75VK~4{`KOsBCwrE&A(d{5fN-{yG5f`b*Y7l zDQBVz_pSNirY4@|yG;wC1z^lKgiMLa+TX+G&{8pAtS0YU^^Z(?1a1G`q%A}MWKNnl zGj8%jl$c$Fe0Ba~n2z~K31VsBuPzN$yQz*n027m(UDRpq2Cm^a0fgxPhLeb*2bl^K z;PB~`xo(v1>^x?dY^2;QrW`aQ!Seq1BL!QGb%nI&O-3AuEW?S0o6C|jl1d;b4S0}s z$c2Gg!rrM+{cJ4GHKKvh9v+*xa-*J@iGkTolTuhD$I8(aY2u0;1Bg{A2OJYy|KV z{B`^~W?5QW>xyo>&J+enlT=c7NeY4#`hqwi@=>n9=<2G?`O zWl2v@X6HOMq;sJ`oJm_-ZH&mKYKLyqTA%YXtIZIzg1gYxQv?0Y#YDo(W9(i&*nbW& z*T|h?3Y7_#rlRjJr1Uy{Jy9!GNQ>PtK>8RbEeqHcznh&HI`gjK3xjf+lOIrHKK>@y zaSiM*l0&GHjO|`B8a9TN23_*<{!X%z9;=%?=?o(cp;hKDSo3BnK6FGg|T!Ib_o5?+Ni>3N$=knwg#d;oFAe-ZYaSmtplhN5XnT0PBa1&YX z+mOmPr=#v2htGGw)Kcp!_c|Du+GassL}{gPWjM@bL;9naT~t~t#hJDPr1*=|D*y8u z1_57yqTd?vZyHG@=i%nDCU~;eNazPI^C6ny0R!5;?A_hQ{r$ko>#nVZ#YL%8Ez!d) z9@4&4NHZ$-h42LLVxCfC#}IUli&-}#C>UpUJL=#^_Osw$Cg2$rtfF{}NWmRu(TqwdXbbUAy~3EbXsluC79>Lpc4S zxDK3GgNb}JcSfhk8VVt&34U1|d}xoEhSVC?XmgiwJTSjw&lY57mhdJk^y>&*#In7E; zPDHe4A~}W4>UcV!+ZCN~MjdTboT@t9oq7ffi#S!H!Z?DJf(K5drhF#WQarXyTU+&q zzOkxIe|T4opJmL{@4!M`;KWycTaTezgMSIL+ThF|?#*Bef&ZF~3d7Kz+}RrutgL8` z^Q>b^O3qD=DtyRE%lT>Gq>y?eEy%s~30-1|(F;$C*NDk{lvYkRlZUU?g069yi-IN zp8xs4mE+cYV*YgFNa9^Ejt?!#QRZbxpEV6cx51eiW2>-Kn8ZAVgwoCW@s zmm8|1q_*Y_oK(8C5eNePn92JbHThHN`FKn>{p(hPLx{nD#LRC$U_=q{@&!AoHMmiZ zkKHIFqzAu|BPY{e^1KDe?}T&TFSZ{@o64pUsQl7nS5g{WpmY^Yq5h3w9OsD=ZjDvq zCB#A`>Wv8mJn?nRZ)kv0m!s8lwBx22!ZUqIOn&kR*^PY5@Fe-1g8AW7=Y8R?o<67z zry?uh2AUi-G&-K`AINAG6%}iYp5)6uE%2Vs+H3mE<2{ecLz=w0{&g|!RPztWtYDiZ z^LE(%*}I6h=ssi*dgJm@Vb~zy(26!V7%XF46rDjggkMT^OnETo>&+@;QgDr%6iI)% zf-+xJH&-@}yGgheVS5@Z;iNej6Jvm<9YxM08@*e}U8BuaXMoiWbL{lJyc(cBvB1Hk z%XU(80db5`>&|!V!~C&&&kmY;4^*g5BvH0DlW85^xBcNXkd&&{1Hd z_fDnn^!o!mFQ=eYS4+?yX_jxYwA0RH@nT24#0&%T&bqRy z)7bp+D&gno{rrhdvX(>-$e}YPNt)BK{}Z~jnQg1Ac%|4h7`d-ny22UK5y4D%MeBCj zL6Dr9>yFSf6qxoBhh=StgC7y3<=@)nCfIuLY~<|rw+%+cEO1J4IbPGNSYYwE>lHHH zQan=ECN*Hc83p&EW$;$xYXX;o18VgwcCcM#-ExG7=<8J>7WNsQnR(-xZg%Wpk7HzF zx}KS3TuMr`l5+DXB=20ax1#`wpQzh)BZazL?gfZAbgKAmrxf;5@89+>3DpmWPHC-3 z3Qq!o=uEsSjBb#UzzpCINxbI5w+j8cfA;si#~vq?8W{Uo#c#Hu{vRJ7Q5ZxSj9Kw) z0t0{9BlY8WiDO}ZNBxRdWBy_$NbK3nev*=Kvx^TP6Os7BbiZLE-L9e|1Z7B65Q zMk}3(+|7_1cK#&`I3h8XR!?`3iW@+HU`7?ux!by&23x2jR z2xB8`GyX%Y;Zk7>*H@5azF<`E>Fg^Gc)97*Q-dLkiGHz#n$f~1d;Uy8JYI@VRqo~O z%X6<@5zE8%hwd^#@=$2KG)b&`$0i^*Eu|id3Ya4#B1wurqUDM+^!w4GsS|C@&S1;FAyq^y}pkH9KGf zG=O6sy4-sf(GdB3?~ni${WWmzzk>@@dHGZKWv+M2HI7r%4;$@$Q$I06}z`M3wa$NKxN5n1K8*8gt&~rzyks|zj?JhZP`9fft7!usz;`{b{1#lrx z4#vGoBr=>_9H!%6J-Hhai!$a=ME+^Ob0HFswTGWXqgwB1FIFTzcAu+v#IV93HGx%sGd)(s@@oe_?nGY7n^Yoew*S9b-EomgElbs2J*3D|&L;08 z5>HGH3b%q{pYre2Olp6QJzkzVI^qja`*Jh`tCe?bW#g;zmJUhV;j~9os?51n8X+=Q zK5fHdbyRnDyJX2==1?qulOoOkA-5Ce^iyR z;QEAH>~Tl~Xl7=dmd$mW!yU(drBmpI|G~So#M4?C!pbx?s+4!GBfPPkPgRX(iEtAQ z`BtEyOaLi+Xw zTZ1%`G^8Md;3Nq>MMG1I`*NHBWe+t5O?^=eO5sh!D-^#K8P_Tn$j5POY0Jy)c?hm+ z@)N!lqaU@%zZ67_I*5Yg5xe4c#i*4Sd2_v}C#{zrqGt z1FJYI#Cdzk;xu{QSroe%YMbW1yAfiMoy2&k`VZn!is)L45}D4M-@O~uaXk^uZBR9; zJvx9g43_0NY}UK9*FNH>-}YGK7uK5Izs6Iku|Gk$xauX1To{V7S{bnMZ?@hdn~o=o9IdC`dzI^sW-mT z_`>eOa&7;rKTi&?esYeXL1jp5O73=FS-ZA3xvaBsq}(XySl8R1AROCPQ=5OZS2HI&Pb9YU|J~AnVJ#z+hiO6c5Fv zR$AU+;WJANuAJX(u>EwMJ5KMaarVJX+>uZW;dKH!Zc_LRSsOs=xZ7M*@o->pA?fL6 zxoYpp%%QRB6|}jv_RkG9+!==cDKNoagh2j(l);n(&|tU)Efcqhumnu`7sg7GuL2n! z^*{AQOV{&YqTd$3t_HuZ7S5*vKi!{C$+9fp!*zogepYI%83$~*F+|0DL^X4Ro#G)Al+r7O1#b+Qux^NG0!Q|IvD*dYoR*y zLcne0m}*aL26tR^YesPCrB!JuAIVcy6Qs;e{M$xQg8({tuC-1Iw^OLqPoRfVFAT)% zSa}jmx~UU_Q}}HL4`JIzUoMTIXHe zE!P*#!c)*WX%kQ1zk0gGCa%kLq(~OAhjgp>BE9w3{r&=*+B&RDUKMNgl1dS?8fX)l zzu#3M58*VhMt!x5nI^W!omdijY|?Dic7=6$0^F@I$tVeYo_!R)ox+b5bc^jA-RQi^ zjWSE_8bM4Z5lKqlUH3pw=n?NG9KpLW=SCFH@Wp)u_Q z=(!zXXc!6TP16)dMm?5uGz8{tdsY#I7ExS+K6s8CcZ^Q9g|*xRk4oon4CUtY)(FKu zszsZ)#{Ej`*fGmy=7g=~MEs9NYqj>x#C{|A5WW zkEf0n^K&p9QZJGbI8~AY*HLC9EJ0!=BsaZ1s> z5t$9PvcR`5(^wno+E{52b8eGHs)QNm6(>GWuyqiE*to&rG)}UW$CUnysLDG2J;l$t zdc#7mu1^7RgRM=B4(_%WFeI;dOaPrGr>)hM5i=JdM7M3q;~e_E$}HsA{c&_qas%T0 z6K}?kV6fi;ju-Aej$|lcia!QbBu|4BirB6!VQ3FCC(J65Z#b{b9pWopI)y-{y~%kZ zEU>q4_kw8DUUo$%Oxm?$@X&3%vFsNgH>3KG|2ya;vYsF`8A{7h!zTE&)NS3XOiQe1E(NkNGt)V}) z;#4wS&?4>ZFuI5{a>okgHT}ZQ6khqDUqxyNMFj*Kos7oM3bSQ z+tXsg_S4-O%-i%t@m!Ohg3-l%2EN>IyOwXLfX&v5rNqu3oE_tyIL=Z|%%V&MYmJCY zauESWh&7q*=~`oXX7cm3kLw1RS!_sYB`$UCzE+QBc^-D1l2Ngt8RYna!GH2*CVQE# zXv|jF%4?~;^t-A8-r7!#f%cJ-APUR2%9HjFcf=&r7$u3oCyI&Ut=8*55FnV&PM+*_ zRw^m3@=%Um{`EG{Z5b*%{`f%~)Gt@2BK}dkXq>@8ZRXG2m{Vzf1{jjl(P()v^kxz7 zZbmo1a2dYep+Fpr_pT=M--48zYj)bIOvfQJ^rYM!4=*dXHDuci3JbyN&bZLd{S0a- z$rVyV@a3o_gegpo3yW?zS-l!YdH>Yk=9ZHVnTC@pm*5K+aexqAb1G&h>@Qt49CnG8 zX?_l11NHpt8nf^v>7$}EgXO6*%a9M*Zt$(G*>t#yiuFxf@a%%KP0Fd5&C{N)=~Xl* z34?wsVt2^5x#^>29FCyL$_3JqX1*&(uNrL`P^uNHmTvsQ%u8NH46kDugkxbT?24u8 z&ODaLE-59e9k3)k2aOYBJe>)ycMFKpLz@=shHyKwhNK*^W_oA$)g$IF9>XiHqVaiX z(%Sao&D)E|J3OgQf(a>t+pA3zK7DhGX+gt|EO=o;r)W)-!YxMD;7N`9E3|MNtFImA zlNZ*JcsXJw}U}fiP6((ONbRoE7zF6cPtW{H|1!Q3uKVKKs=SEW@megyLx&f z_CkKmEVs)2NHiZ3)hD`@0E5K8j?rF7K4KI5!v+6RovW6Qa4K4)#>}Xh?%@wd0h6TxKg{2j4kb8 z1gIBuqbhqBdxrVQX#MT>yx~!aIr9Fg*r%(nPY4>5a5=a^&q|O%Nu`YYuskJuzYhAIT?*gg9*k?ZS$k|n5}OlbVA&p+@#0GZJ;*x zaoXqA^d#t%F&@aXV@EO)j;Jvm97naz`a4(Kw%Uw~eF9`U){`|FX>N#IYb5%Q2G_aH z`d9lyw~N??CyH?(#K8UtPG0V15)=D9RMhvcBP0-~$G;hf)mTA;UlQCNYU1KH8j8tK zKyV?(YN`YZ;n3ha9qCQhoZ@`z_Foxi*)|b}IJnz&(VGDf(0_S!xi(Dwt28tP^}-Z8 zS@u|IX&*<$(jy4Fs<}EcSG9skJlb!2l;XB7{8Bk=pxNH%-t2N8IT!*3qOS_`pGuSj z8e~>%yMA2cTujVUaS*Dc2rz-TT0y^cENM4g2k7xg$-`p!ldPpJ#$~J+pTM*^P z2RDvYy&mUMD$0zR2xj*_KChYL88?ACV01>!$BYSJ#^1qIIU;H?cud!$;S>a?5f1!@ zUt2kP^d!!X8CgA7vrsn)947Aui(HW?a}B^JRS3=QNllWmMm5?3 zd!eBB0s_+I%pY?nIbneB=i7GoIAT~cq`VtTCnW~Ll6n}O=1vwih9C4-l*1e>5QKAba&T}9dUP;otXghk zuxSBly@b+Kfousb&P$O#bV7Id$MzT?y>byE$H({rpCLx=4DuwG$JK5Pz z64ZwatN6FumwFs%;OH(}d=n@`K0~GT z0r^p0I_N?6+`RuZNUuO6RYT5VV)=gg{DgR=%)Rb7^Ia-{q?hgb>@>oEdX2oJ{>JqE z@XFPLTm_!~A-SGD$aDV)@ylV(=z|TYvoSHYG+Q{(2EraGDFz<1){Rekhn*JUV8 zM5tE#`Y~dBW+IuMp?FzYJ1R={*uy4-KrirZ9?;$P3QvlRJgKlEjx1cb_+y~S+Ai_! z^{}pu@|cXqgThJ*8-2bj+L)gEQ>2V_JTMG3s{E?z< z6wD@WC>Ada9QpR*%$R`8bH8Fu>&#Jqcj8^SQtU2E8fM2>$Nz$%Rw^O+X(ct6K{*;W z;*HN>86TX+8hNg)?<%qX)8=LJn5*9)62$=vo~M~cpKkcO^p9ucU?L|24^&+KPh@H@W&Z$A z=v<#@{%vOt_zb$aPFsn51JgCZVKlxRR{fjLzpGn7iRf@-T3_c*rML0Yole>MMQi+D zZxKs*Z4(9e-cGn(rpkuF)Jo4i0}ie~J9oI-u&(es&{%fg7tK$IX}Pj^sw>s6}|?0H!p@8<$AWULtl zr`e`mdNsNjayTw=3;JvycZ1*+`4dV?h->W10(3!4b*Rj#1S(wAK0L&)`Elw;Nho*- zI<&oxct4_N$vjSsvo&HEeExbf8p^G--bc*Dy)%VqcF;fCjPehR*EF`Vs0HQwBuJ)+C+>g41!XY!Rm1JesRKMJdFPSORn9$y@?&>th`i7(R&CjlyEiX_xg>xTw2PA8v}<#9bA6O&#LOyq zkuXQ=Cxq_HRodu78V9IAsennJi23B`v@Dz`$ofNh zOgkU3Z0R0SWGFl(MT(70zx8BwVI?k?ul5T+pqeMbbNt0= zVfjRb9;viBh=|N*@y}+sqU2z*SM#6`xmk;q>HILE#Xfu~m*vhgm zX3RZK380Js*f<>fK!JjQA$zq+>i%Q%)ktX>hU?|VW^s&~dU?=Ts-6|6?pi42Emphy zV5CH;t;%}DVkg?dUd_{`abLW02(k{>_WGf57w?jHLF$9!*E=z?v?bU4^|-tbDH5}X z{GHbq*$(x3vRR5K7JZX5=LCNe>Z@^+fTm8qV7&50$FHQR+`60l@6~VIiX4KyF~B5`xqXi3fpXj`cib2i&jp34b- zO9x8U=e#_zDN{V9UwmihD|hky+qfR|-lZ)f`nOd2cRqP(UH8U-EY5H94yV$tJE5vW!2?oLxXWwlaj)Pg zO?z&H3Y<}U8kl8(@?4nt$m($W@Sp+OrKaA_s~Mf~PJe~x{ET9ESm(OK&0P-t97m0z%1&k0 zAO?tehNZ4^$Sy^eQZsb10T?A8J*jZ&%|6?nSYOglFZinVX+@-zAFam=VFWd7g6Y$U zMazkSRsE;Msox%c89W;^H+L8Ek4cdx*wGnyp2;i_?OU2jbxpPdYf=qUg312=ZsCbc z6wmO#HN3Asf>*tfVL18CwL39+KdGmiiEchk<+V=}1|>IaBP~o!zwcvAU||O5GgQb~ zqu5fs)w(GciIn)XDQFn0b2rEHPS)G}O5?&KnJwp&SGdsB<-!%ea=Ln~KH0Lqwtw^3 zO)U{sdbvF6WEvBgLnOH$oHifYmB`2Lh76XJNZBlM8Hp0{6-2=VC&3S9=4ijfb)QLI zSJHhsN8n#S@+By=|LFXy-~a3i%TQT%+Nsy3qEbXFVY6_uFO^@EJrnsv-SO|<&YwM! z5>3jH0avZjNnZLo^*fxJf_R=lk5#N*U*}tWG=7N?S+T%V9}%SrxyFpCou>|cOTo>Y zh7=twq8kF=p|)-Y%X*Zl;A`i0a!SHFjuGS)TX4(ZYO=OcDX+HFbpEtE-;WqI<_fxT zC=V}kC;lTA=Tvn!1$kCs7!t2~Ra4FZFRm;Z3rCQ*akzuDeHLOO%gvs%$$c=yf=6nr8x>9~VMWyEWi*5~F z^?td5+fwhl%A|luYG6P1to?iS^kE@`)@$1P{dp?<`Ke;7e?I;$g??LnH*=W&JiO?G zpP_Dg)Q+EBWA67hlkdPGwzL%+CkKOAk2=>r$C!P^aBxA#R>vEQ@kpu%-4IDL-9v}- zO#Q^sLN3}i?P<;?=SOcJd7F-bqJ8M#iNuN#in?o`F20bbmfrL$K8-pD*<^T3=jPlw}043P}NqyVqglr1ung16*pQ9PqRq-+6?>TWw1SgD2-0!P7}M;Gj>`RO2*+Y?#T0=9Rdf= z`z%(bE}BhyoYH{1s2Zn5^`e;=>SDEzBE+p=bZ-=WQdP5Jht&|-vx8KcT`jU)(2Ao~`4VJFc zY<0L=O$MVICF*Tfx7u1g@aSKIMb;tg&!w;aobax7%L%IX0-(Cg$MlFjUCq)zI%99s zpY&^L4ay^E#1H4{FhY$<{mWx4ib;FeZ-h5tN3G)jz7`AnFS9Qo(tU)tiLG?0yI-R@ z;xfC6DC^nVMl2#^9F11qxkAD=*RMY{2DgQr_i-fn$~KCmWG`2FbM0h|ZEeaX_kE=^ zj{gkZL^vqJ%dumL`Ks(<@GCz&f6fvWX>y4xt=`njqqiM!`mDKmY*khhD&3Fv&xqR} z!-rLV8KGoKK{Ri<ap^k7M0cdHh`jKMwq&k{6r4C}fp{lJ;;-wf=#wr~hsHgVTyZMeMkvb@|d7m@^sF9_KhdKQa z9!}=bbM00oxkW-yr&d>q2HWb@SAvj+zcH@fW(MiyMbcn;yQsMaZk974DMyNLHrlx6 zc)c~Zo^4xuR)4jAkWtNBl53f~X~0C4bI&9;u|j_3R92y;UI%ydXFYk4kMCwlZ2vZQ z=PagM9&4__jputxN;O;z9<%wI!-Jl8Y9Be}Df)GhsQu>8XeNEh!2CkK951rceh7>* zKHEyL+S)Bag(qqBGuI(yFhB3#<+9&tOQCl*>(}mV+>MAQ9_Q(}A(l_pl(H7J{r9hB z1UC>B^gY!LB*+s625X}ob&c>^sCIJVhAkfcW_j+zO3*+}d7nYaiG1hIi6Ur}5# zWU*`6zGpI$Bk+3B=$dw|-nuSipAfsL_)SCW(f;|}?E=04tbCG8mLdaz#uN7N&zooa z>+(3<#T^>89IGPGO%p+9crb1lK;`J2mjgv3v}yT8;+K z2lZ$l-7s92!qX-0vl|#15A@rMY^NYwl@XU3|kM zq|@^X3Vf56-B%vNo@++))ioRFdRS#$Vd8ir9-#AFhl;!d;BytRXh@SXQVya=|maMYSDJkslBPX8*w ze=&}NAB&15-mZ=-nB9zII%;1e*NuJ8l@=>D7NP9oJdO1>mk};W>LF<>hE*;eei$D#F-ia0Dlo0iZ9Y?MAOu9+1XuGuiN}77<0fIOe%fTeOT@nEjY#A; zxF2g8rr}eI`1b?e;h^V4arFgAl??fL+N5JN&Vp?Ujoag9J;A#MLcrh7>Ww45p!^fk z$enc=v^AS9Y;XvBa*kEtg}1Po6=UXHY~&aUc1rvHxgx7l3F=PA-&Kq6tF)C-TK5x_ zXdSQbv%_{VsWFOKmmZex@>94m?Z9F4JeDSANqH-ITBNwk@D7;>9kazm-)Om8 zla}6BH+g)0*p%Q$K6|ymeE5T2)T@wlm9AoML-w!W>nGHLw=V+OFgbNwli<9IztOBK zzBO4DS@*Rko3)1N;8D(~F8==gJM=*!OZ+G3nW2Ig?)i!OII5-lGwONqgkzuoY;rgo zF_#xDjNEoK$8;vTC!CjPzrBtI}0bS@&Y(8o+U^6h|IXp#ly(Bl#}E2s4KgOrfjO=4|{gwmdBp+ZkU73MYDeics1vJN=)?v?w@## zfMO{YLAGmZd#BMg%+`Ks^-l*NoQ!JwYKMHvvWvoymYzpM2?NU~_6eAp zW1Q+cQ5N$;?O?~^Use!^45kP0?z!6Z+BB_M+pS8oe8~~L3zf&4Xixf`4Fa0+^@}bm zuPJ(PhO^Q01lFi7RKwZ21m3Qpe8PAiuOlJHIkwRyG`QJOQ1)J(&KqUF`sqB5V#MH9 zgmnU%TQarnqHgVezGn*74#cPrdk>H?Hi!Q`r@Mx*pd8(#OiGJ-JnMlx6IX90?p%Ko zx+G*Q%;~jnVH4Afe&9$j#HMq(V;HZe>-Hr>3v zUL?R#Z=5zp!*A!jXL3$udu(MJpu$Ri7a`*2S1u{rsJ4sjh_l^%+>rsfcB}m7l{Yf8 zOysl7p5&fn&+FjSIXGO=^TA>@{tGL

7srz6`E8O620-c;uT%iBRm`&LfU(zDiPI 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�Ip8m8NmFTkL;$jYQSz%Up_s%?ww$ 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%0D;0h(zAC&hK^dpm~3>%m0KXq@TRRe$S^9 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%0AwO>EMMj(9N{qR6nZ2@lbdJw)fL_@(o^vc@4}Na2 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

KbNmrD~ra$tZ_p^ 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�TECDN4!8e|VK2o5Rbu)K!>Pbfg+%VC$zi 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�;p|D2;$p?^@}x8VkK{?!S{j1w<%FBA4?%36 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ð~G4JibA_@^Wqc>4zj-oCq6 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 -export * from "./models"; -export { CreatorClient } from "./creatorClient"; -export { CreatorClientContext } from "./creatorClientContext"; -export * from "./operationsInterfaces"; diff --git a/sdk/maps/maps-creator/src/lro/azureAsyncPolling.ts b/sdk/maps/maps-creator/src/lro/azureAsyncPolling.ts deleted file mode 100644 index 0d63c54f6026..000000000000 --- a/sdk/maps/maps-creator/src/lro/azureAsyncPolling.ts +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { FullOperationResponse } from "@azure/core-client"; -import { FinalStateVia, LROResult } from "./models"; -import { failureStates, LROState, successStates } from "./stateMachine"; - -function getResponseStatus(rawResponse: FullOperationResponse): string { - const { status } = - rawResponse.parsedBody ?? - (rawResponse.bodyAsText ? JSON.parse(rawResponse.bodyAsText) : {}); - return status?.toLowerCase() ?? "succeeded"; -} - -function isAzureAsyncPollingDone(rawResponse: FullOperationResponse) { - const state = getResponseStatus(rawResponse); - if (failureStates.includes(state)) { - throw new Error(`Operation status: ${state}`); - } - return successStates.includes(state); -} - -export function processAzureAsyncOperationResult( - restrieveResource: (path?: string) => Promise>, - resourceLocation?: string, - finalStateVia?: FinalStateVia -): ( - rawResponse: FullOperationResponse, - flatResponse: TResult -) => LROState { - return ( - rawResponse: FullOperationResponse, - flatResponse: TResult - ): LROState => { - if (isAzureAsyncPollingDone(rawResponse)) { - if (resourceLocation === undefined) { - return { rawResponse, flatResponse, done: true }; - } else { - return { - rawResponse, - flatResponse, - done: false, - next: async () => { - async function sendFinalRequest(): Promise< - LROResult | undefined - > { - switch (finalStateVia) { - case "original-uri": - return restrieveResource(); - case "azure-async-operation": - return Promise.resolve(undefined); - case "location": - default: - return restrieveResource(resourceLocation); - } - } - const finalResponse = await sendFinalRequest(); - return { - ...(finalResponse ?? { - rawResponse, - flatResponse - }), - done: true - }; - } - }; - } - } - return { - rawResponse, - flatResponse, - done: false - }; - }; -} diff --git a/sdk/maps/maps-creator/src/lro/bodyPolling.ts b/sdk/maps/maps-creator/src/lro/bodyPolling.ts deleted file mode 100644 index 269d8e6799a1..000000000000 --- a/sdk/maps/maps-creator/src/lro/bodyPolling.ts +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { FullOperationResponse } from "@azure/core-client"; -import { failureStates, LROState, successStates } from "./stateMachine"; - -function getProvisioningState(rawResponse: FullOperationResponse): string { - const { properties, provisioningState } = - rawResponse.parsedBody ?? - (rawResponse.bodyAsText ? JSON.parse(rawResponse.bodyAsText) : {}); - const state: string | undefined = - properties?.provisioningState ?? provisioningState; - return state?.toLowerCase() ?? "succeeded"; -} - -export function isBodyPollingDone(rawResponse: FullOperationResponse) { - const state = getProvisioningState(rawResponse); - if (failureStates.includes(state)) { - throw new Error(`Provisioning state: ${state}`); - } - return successStates.includes(state); -} - -/** - * Creates a polling strategy based on BodyPolling which uses the provisioning state - * from the result to determine the current operation state - */ -export function processBodyPollingOperationResult( - rawResponse: FullOperationResponse, - flatResponse: TResult -): LROState { - return { - rawResponse, - flatResponse, - done: isBodyPollingDone(rawResponse) - }; -} diff --git a/sdk/maps/maps-creator/src/lro/index.ts b/sdk/maps/maps-creator/src/lro/index.ts deleted file mode 100644 index 85c2187669e7..000000000000 --- a/sdk/maps/maps-creator/src/lro/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export { shouldDeserializeLRO } from "./requestUtils"; -export { LROPoller } from "./lroPoller"; diff --git a/sdk/maps/maps-creator/src/lro/locationPolling.ts b/sdk/maps/maps-creator/src/lro/locationPolling.ts deleted file mode 100644 index 6fef61938419..000000000000 --- a/sdk/maps/maps-creator/src/lro/locationPolling.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { FullOperationResponse } from "@azure/core-client"; -import { LROState } from "./stateMachine"; - -function isLocationPollingDone(rawResponse: FullOperationResponse) { - const code = rawResponse.status; - if (![202, 200].includes(code)) { - throw new Error(`Operation failed`); - } - return code !== 202; -} - -export function processLocationPollingOperationResult( - rawResponse: FullOperationResponse, - flatResponse: TResult -): LROState { - return { - rawResponse, - flatResponse, - done: isLocationPollingDone(rawResponse) - }; -} diff --git a/sdk/maps/maps-creator/src/lro/lroPoller.ts b/sdk/maps/maps-creator/src/lro/lroPoller.ts deleted file mode 100644 index cd1cd64fe813..000000000000 --- a/sdk/maps/maps-creator/src/lro/lroPoller.ts +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { Poller, PollOperationState } from "@azure/core-lro"; -import { OperationArguments, OperationSpec } from "@azure/core-client"; -import { FinalStateVia, SendOperationFn } from "./models"; -import { GenericPollOperation } from "./operation"; - -export interface LROPollerOptions { - /** - * Defines how much time the poller is going to wait before making a new request to the service. - */ - intervalInMs?: number; - /** - * A serialized poller which can be used to resume an existing paused Long-Running-Operation. - */ - resumeFrom?: string; -} - -export class LROPoller extends Poller< - PollOperationState, - TResult -> { - private intervalInMs: number; - - constructor( - { intervalInMs = 2000, resumeFrom }: LROPollerOptions, - initialOperationArguments: OperationArguments, - initialOperationSpec: OperationSpec, - sendOperation: SendOperationFn, - finalStateVia?: FinalStateVia - ) { - const state: PollOperationState = resumeFrom - ? JSON.parse(resumeFrom).state - : {}; - - const operation = new GenericPollOperation( - state, - initialOperationArguments, - initialOperationSpec, - sendOperation, - finalStateVia - ); - super(operation); - - this.intervalInMs = intervalInMs; - operation.setPollerConfig(this as any); - } - - /** - * The method used by the poller to wait before attempting to update its operation. - */ - delay(): Promise { - return new Promise((resolve) => - setTimeout(() => resolve(), this.intervalInMs) - ); - } -} diff --git a/sdk/maps/maps-creator/src/lro/models.ts b/sdk/maps/maps-creator/src/lro/models.ts deleted file mode 100644 index a4a5a5abd6c2..000000000000 --- a/sdk/maps/maps-creator/src/lro/models.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { - FullOperationResponse, - OperationArguments, - OperationSpec -} from "@azure/core-client"; -import { PollOperationState } from "@azure/core-lro"; - -export type FinalStateVia = - | "azure-async-operation" - | "location" - | "original-uri"; - -export interface LROResult { - flatResponse: T; - rawResponse: FullOperationResponse; -} - -export type LROMode = "AzureAsync" | "Location" | "Body"; - -export interface LROConfig { - mode?: LROMode; - resourceLocation?: string; -} - -export type SendOperationFn = ( - args: OperationArguments, - spec: OperationSpec -) => Promise>; - -/** - * Type of a polling operation state that can actually be resumed. - */ -export type ResumablePollOperationState = PollOperationState & { - initialRawResponse?: FullOperationResponse; - config?: LROConfig; - pollingURL?: string; -}; - -export interface PollerConfig { - intervalInMs: number; -} diff --git a/sdk/maps/maps-creator/src/lro/operation.ts b/sdk/maps/maps-creator/src/lro/operation.ts deleted file mode 100644 index 801d03e7203a..000000000000 --- a/sdk/maps/maps-creator/src/lro/operation.ts +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { AbortSignalLike } from "@azure/abort-controller"; -import { OperationArguments, OperationSpec } from "@azure/core-client"; -import { PollOperation, PollOperationState } from "@azure/core-lro"; -import { - FinalStateVia, - PollerConfig, - ResumablePollOperationState, - SendOperationFn -} from "./models"; -import { getPollingURL } from "./requestUtils"; -import { createGetLROState, initializeState, LROState } from "./stateMachine"; - -export class GenericPollOperation - implements PollOperation, TResult> { - private getLROState?: ( - pollingURL: string, - pollerConfig: PollerConfig - ) => Promise>; - private pollerConfig?: PollerConfig; - constructor( - public state: PollOperationState, - private initialOperationArguments: OperationArguments, - private initialOperationSpec: OperationSpec, - private sendOperation: SendOperationFn, - private finalStateVia?: FinalStateVia - ) {} - - public setPollerConfig(pollerConfig: PollerConfig) { - this.pollerConfig = pollerConfig; - } - - /** - * General update function for LROPoller, the general process is as follows - * 1. Check initial operation result to determine the strategy to use - * - Strategies: Location, Azure-AsyncOperation, Original Uri - * 2. Check if the operation result has a terminal state - * - Terminal state will be determined by each strategy - * 2.1 If it is terminal state Check if a final GET request is required, if so - * send final GET request and return result from operation. If no final GET - * is required, just return the result from operation. - * - Determining what to call for final request is responsibility of each strategy - * 2.2 If it is not terminal state, call the polling operation and go to step 1 - * - Determining what to call for polling is responsibility of each strategy - * - Strategies will always use the latest URI for polling if provided otherwise - * the last known one - */ - async update(options?: { - abortSignal?: AbortSignalLike | undefined; - fireProgress?: ((state: PollOperationState) => void) | undefined; - }): Promise, TResult>> { - const state = this.state as ResumablePollOperationState; - const { onResponse, ...restOptions } = - this.initialOperationArguments.options || {}; - if (!state.isStarted) { - await this.sendOperation( - { - ...this.initialOperationArguments, - options: { - ...restOptions, - onResponse: initializeState( - state, - this.initialOperationSpec, - onResponse - ) - } - }, - this.initialOperationSpec - ); - } - - if (!state.isCompleted) { - if (this.getLROState === undefined) { - if (state.config === undefined) { - throw new Error("Bad state: LRO mode is undefined"); - } - this.getLROState = createGetLROState( - this.sendOperation, - this.initialOperationArguments, - this.initialOperationSpec, - state.config, - this.finalStateVia - ); - } - if (state.pollingURL === undefined) { - throw new Error("Bad state: polling URL is undefined"); - } - const currentState = await this.getLROState( - state.pollingURL, - this.pollerConfig! - ); - if (currentState.done) { - state.result = currentState.flatResponse; - state.isCompleted = true; - } else { - this.getLROState = currentState.next ?? this.getLROState; - state.pollingURL = getPollingURL( - currentState.rawResponse, - state.pollingURL - ); - } - } - if (options?.fireProgress !== undefined) { - options.fireProgress(state); - } - return this; - } - - async cancel(): Promise, TResult>> { - this.state.isCancelled = true; - return this; - } - - /** - * Serializes the Poller operation. - */ - public toString(): string { - return JSON.stringify({ - state: this.state - }); - } -} diff --git a/sdk/maps/maps-creator/src/lro/passthrough.ts b/sdk/maps/maps-creator/src/lro/passthrough.ts deleted file mode 100644 index 64c10380c1b2..000000000000 --- a/sdk/maps/maps-creator/src/lro/passthrough.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { FullOperationResponse } from "@azure/core-client"; -import { LROState } from "./stateMachine"; - -export function processPassthroughOperationResult( - rawResponse: FullOperationResponse, - flatResponse: TResult -): LROState { - return { - rawResponse, - flatResponse, - done: true - }; -} diff --git a/sdk/maps/maps-creator/src/lro/pollingMethod.ts b/sdk/maps/maps-creator/src/lro/pollingMethod.ts deleted file mode 100644 index cb6482bbdea9..000000000000 --- a/sdk/maps/maps-creator/src/lro/pollingMethod.ts +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { - OperationArguments, - OperationSpec, - OperationResponseMap -} from "@azure/core-client"; -import { LROMode, LROResult, SendOperationFn } from "./models"; - -export function createPollingMethod( - sendOperationFn: SendOperationFn, - args: OperationArguments, - spec: OperationSpec, - mode?: LROMode -): (path?: string) => Promise> { - /** - * Polling calls will always return a status object i.e. {"status": "success"} - * these intermediate responses are not described in the swagger so we need to - * pass custom mappers at runtime. - * This function replaces all the existing mappers to be able to deserialize a status object - * @param responses Original set of responses defined in the operation - */ - function getCompositeMappers(responses: { - [responseCode: string]: OperationResponseMap; - }): { - [responseCode: string]: OperationResponseMap; - } { - return Object.keys(responses).reduce((acc, statusCode) => { - return { - ...acc, - [statusCode]: { - ...responses[statusCode], - bodyMapper: { - type: { - name: "Composite", - modelProperties: { - status: { - serializedName: "status", - type: { - name: "String" - } - } - } - } - } - } - }; - }, {} as { [responseCode: string]: OperationResponseMap }); - } - // Make sure we don't send any body to the get request - const { requestBody, responses, ...restSpec } = spec; - if (mode === "AzureAsync") { - return async (path?: string) => { - return sendOperationFn(args, { - ...restSpec, - responses: getCompositeMappers(responses), - httpMethod: "GET", - ...(path && { path }) - }); - }; - } - return async (path?: string) => { - return sendOperationFn(args, { - ...restSpec, - responses: responses, - httpMethod: "GET", - ...(path && { path }) - }); - }; -} - -export function createRetrieveAzureAsyncResource( - sendOperationFn: SendOperationFn, - args: OperationArguments, - spec: OperationSpec -): (path?: string) => Promise> { - const updatedArgs = { ...args }; - if (updatedArgs.options) { - (updatedArgs.options as any).shouldDeserialize = true; - } - return createPollingMethod(sendOperationFn, updatedArgs, spec); -} diff --git a/sdk/maps/maps-creator/src/lro/requestUtils.ts b/sdk/maps/maps-creator/src/lro/requestUtils.ts deleted file mode 100644 index 9162f6633905..000000000000 --- a/sdk/maps/maps-creator/src/lro/requestUtils.ts +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { FullOperationResponse, OperationSpec } from "@azure/core-client"; -import { LROConfig } from "./models"; -import { terminalStates } from "./stateMachine"; - -/** - * We need to selectively deserialize our responses, only deserializing if we - * are in a final LRO response, not deserializing any polling non-terminal responses - */ -export function shouldDeserializeLRO(finalStateVia?: string) { - let initialOperationInfo: LROResponseInfo | undefined; - let isInitialRequest = true; - - return (response: FullOperationResponse) => { - if (response.status < 200 || response.status >= 300) { - return true; - } - - if (!initialOperationInfo) { - initialOperationInfo = getLROData(response); - } else { - isInitialRequest = false; - } - - if ( - initialOperationInfo.azureAsyncOperation || - initialOperationInfo.operationLocation - ) { - return ( - !isInitialRequest && - isAsyncOperationFinalResponse( - response, - initialOperationInfo, - finalStateVia - ) - ); - } - - if (initialOperationInfo.location) { - return isLocationFinalResponse(response); - } - - if (initialOperationInfo.requestMethod === "PUT") { - return isBodyPollingFinalResponse(response); - } - - return true; - }; -} - -function isAsyncOperationFinalResponse( - response: FullOperationResponse, - initialOperationInfo: LROResponseInfo, - finalStateVia?: string -): boolean { - const status: string = response.parsedBody?.status || "Succeeded"; - if (!terminalStates.includes(status.toLowerCase())) { - return false; - } - - if (initialOperationInfo.requestMethod === "DELETE") { - return true; - } - - if ( - initialOperationInfo.requestMethod === "PUT" && - finalStateVia && - finalStateVia.toLowerCase() === "azure-asyncoperation" - ) { - return true; - } - - if ( - initialOperationInfo.requestMethod !== "PUT" && - !initialOperationInfo.location - ) { - return true; - } - - return false; -} - -function isLocationFinalResponse(response: FullOperationResponse): boolean { - return response.status !== 202; -} - -function isBodyPollingFinalResponse(response: FullOperationResponse): boolean { - const provisioningState: string = - response.parsedBody?.properties?.provisioningState || "Succeeded"; - - if (terminalStates.includes(provisioningState.toLowerCase())) { - return true; - } - - return false; -} - -interface LROResponseInfo { - requestMethod: string; - azureAsyncOperation?: string; - operationLocation?: string; - location?: string; -} - -function getLROData(result: FullOperationResponse): LROResponseInfo { - return { - azureAsyncOperation: result.headers.get("azure-asyncoperation"), - operationLocation: result.headers.get("operation-location"), - location: result.headers.get("location"), - requestMethod: result.request.method - }; -} - -/** - * Detects where the continuation token is and returns it. Notice that azure-asyncoperation - * must be checked first before the other location headers because there are scenarios - * where both azure-asyncoperation and location could be present in the same response but - * azure-asyncoperation should be the one to use for polling. - */ -export function getPollingURL( - rawResponse: FullOperationResponse, - defaultPath: string -): string { - return ( - getAzureAsyncoperation(rawResponse) ?? - getLocation(rawResponse) ?? - getOperationLocation(rawResponse) ?? - defaultPath - ); -} - -function getLocation(rawResponse: FullOperationResponse): string | undefined { - return rawResponse.headers?.get("location"); -} - -function getOperationLocation( - rawResponse: FullOperationResponse -): string | undefined { - return rawResponse.headers?.get("operation-location"); -} - -function getAzureAsyncoperation( - rawResponse: FullOperationResponse -): string | undefined { - return rawResponse.headers?.get("azure-asyncoperation"); -} - -export function inferLROMode( - spec: OperationSpec, - rawResponse: FullOperationResponse -): LROConfig { - const requestMethod = spec.httpMethod; - if (getAzureAsyncoperation(rawResponse) !== undefined) { - return { - mode: "AzureAsync", - resourceLocation: - requestMethod === "PUT" - ? spec.path - : requestMethod === "POST" - ? getLocation(rawResponse) - : undefined - }; - } else if ( - getLocation(rawResponse) !== undefined || - getOperationLocation(rawResponse) !== undefined - ) { - return { - mode: "Location" - }; - } else if (["PUT", "PATCH"].includes(requestMethod)) { - return { - mode: "Body" - }; - } - return {}; -} - -export function getSpecPath(spec: OperationSpec): string { - if (spec.path) { - return spec.path; - } else { - throw Error("Bad spec: request path is not found!"); - } -} diff --git a/sdk/maps/maps-creator/src/lro/stateMachine.ts b/sdk/maps/maps-creator/src/lro/stateMachine.ts deleted file mode 100644 index b2a69b554601..000000000000 --- a/sdk/maps/maps-creator/src/lro/stateMachine.ts +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { - FullOperationResponse, - OperationArguments, - OperationSpec, - RawResponseCallback -} from "@azure/core-client"; -import { processAzureAsyncOperationResult } from "./azureAsyncPolling"; -import { - isBodyPollingDone, - processBodyPollingOperationResult -} from "./bodyPolling"; -import { processLocationPollingOperationResult } from "./locationPolling"; -import { - FinalStateVia, - LROConfig, - LROResult, - PollerConfig, - ResumablePollOperationState, - SendOperationFn -} from "./models"; -import { processPassthroughOperationResult } from "./passthrough"; -import { - createPollingMethod, - createRetrieveAzureAsyncResource -} from "./pollingMethod"; -import { getPollingURL, getSpecPath, inferLROMode } from "./requestUtils"; - -export const successStates = ["succeeded"]; -export const failureStates = ["failed", "canceled", "cancelled"]; -export const terminalStates = successStates.concat(failureStates); - -/** - * The type of a terminal state of an LRO. - */ -interface LROTerminalState extends LROResult { - /** - * Whether the operation has finished. - */ - done: true; -} - -/** - * The type of an in-progress state of an LRO. - */ -interface LROInProgressState extends LROResult { - /** - * Whether the operation has finished. - */ - done: false; - /** - * The request to be sent next if it is different from the standard polling one. - * Notice that it will disregard any polling URLs provided to it. - */ - next?: () => Promise>; -} - -/** - * The type of an LRO state which is a tagged union of terminal and in-progress states. - */ -export type LROState = LROTerminalState | LROInProgressState; - -/** - * creates a stepping function that maps an LRO state to another. - */ -function createTransition( - sendOperationFn: SendOperationFn, - args: OperationArguments, - spec: OperationSpec, - config: LROConfig, - finalStateVia?: FinalStateVia -): ( - rawResponse: FullOperationResponse, - flatResponse: TResult -) => LROState { - switch (config.mode) { - case "AzureAsync": { - return processAzureAsyncOperationResult( - createRetrieveAzureAsyncResource(sendOperationFn, args, spec), - config.resourceLocation, - finalStateVia - ); - } - case "Location": { - return processLocationPollingOperationResult; - } - case "Body": { - return processBodyPollingOperationResult; - } - default: { - return processPassthroughOperationResult; - } - } -} - -/** - * Creates a polling operation that returns a LRO state. - */ -export function createGetLROState( - sendOperationFn: SendOperationFn, - args: OperationArguments, - spec: OperationSpec, - config: LROConfig, - finalStateVia?: FinalStateVia -): ( - pollingURL: string, - pollerConfig: PollerConfig -) => Promise> { - const step = createTransition( - sendOperationFn, - args, - spec, - config, - finalStateVia - ); - const customerCallback = args?.options?.onResponse; - let response: LROState | undefined = undefined; - let retryAfter: string | undefined = undefined; - const poll = createPollingMethod( - sendOperationFn, - { - ...args, - options: { - ...args.options, - onResponse: ( - rawResponse: FullOperationResponse, - flatResponse: unknown - ): void => { - response = step(rawResponse, flatResponse as TResult); - retryAfter = rawResponse.headers.get("Retry-After"); - if (response.done) { - customerCallback?.(rawResponse, flatResponse); - } - } - } - }, - spec, - config.mode - ); - return async ( - path: string, - pollerConfig: PollerConfig - ): Promise> => { - await poll(path); - if (retryAfter !== undefined) { - const retryAfterInMs = parseInt(retryAfter); - pollerConfig.intervalInMs = isNaN(retryAfterInMs) - ? calculatePollingIntervalFromDate( - new Date(retryAfter), - pollerConfig.intervalInMs - ) - : retryAfterInMs; - } - return response!; - }; -} - -function calculatePollingIntervalFromDate( - retryAfterDate: Date, - defaultIntervalInMs: number -): number { - const timeNow = Math.floor(new Date().getTime()); - const retryAfterTime = retryAfterDate.getTime(); - if (timeNow < retryAfterTime) { - return retryAfterTime - timeNow; - } - return defaultIntervalInMs; -} - -/** - * Creates a callback to be used to initialize the polling operation state. - * @param state of the polling operation - * @param operationSpec of the LRO - * @param callback callback to be called when the operation is done - * @returns callback that initializes the state of the polling operation - */ -export function initializeState( - state: ResumablePollOperationState, - operationSpec: OperationSpec, - callback?: RawResponseCallback -): (rawResponse: FullOperationResponse, flatResponse: unknown) => void { - return (rawResponse: FullOperationResponse, flatResponse: unknown) => { - state.initialRawResponse = rawResponse; - state.isStarted = true; - state.pollingURL = getPollingURL( - state.initialRawResponse, - getSpecPath(operationSpec) - ); - state.config = inferLROMode(operationSpec, state.initialRawResponse); - /** short circuit polling if body polling is done in the initial request */ - if ( - state.config.mode === undefined || - (state.config.mode === "Body" && - isBodyPollingDone(state.initialRawResponse)) - ) { - state.result = flatResponse as TResult; - state.isCompleted = true; - /** - * We need to check if the LRO operation is finished inside the - * call back so that we can call the customer-provided callback - * on that result. - */ - callback?.(rawResponse, flatResponse); - } - }; -} diff --git a/sdk/maps/maps-creator/src/models/index.ts b/sdk/maps/maps-creator/src/models/index.ts deleted file mode 100644 index f6cc2baded75..000000000000 --- a/sdk/maps/maps-creator/src/models/index.ts +++ /dev/null @@ -1,1742 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; - -export type StyleObjectUnion = - | StyleObject - | BooleanTypeStyleRule - | NumberTypeStyleRule - | StringTypeStyleRule; -export type GeoJsonObjectUnion = - | GeoJsonObject - | GeoJsonGeometryUnion - | GeoJsonFeature - | GeoJsonFeatureCollectionUnion; -export type GeoJsonGeometryUnion = - | GeoJsonGeometry - | GeoJsonPoint - | GeoJsonMultiPoint - | GeoJsonLineString - | GeoJsonMultiLineString - | GeoJsonPolygon - | GeoJsonMultiPolygon - | GeoJsonGeometryCollection; -export type GeoJsonFeatureCollectionUnion = - | GeoJsonFeatureCollection - | ExtendedGeoJsonFeatureCollection; - -/** The response model for the Alias Create API for the case when the alias was successfully created. */ -export interface AliasesCreateResponse { - /** - * The created timestamp for the alias. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly createdTimestamp?: string; - /** - * The id for the alias. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly aliasId?: string; - /** - * The id for the creator data item that this alias references (could be null if the alias has not been assigned). - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly creatorDataItemId?: string; - /** - * The timestamp of the last time the alias was assigned. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly lastUpdatedTimestamp?: string; -} - -/** Common error response for all Azure Resource Manager APIs to return error details for failed operations. (This also follows the OData error response format.). */ -export interface ErrorResponse { - /** The error object. */ - error?: ErrorDetail; -} - -/** The error detail. */ -export interface ErrorDetail { - /** - * The error code. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly code?: string; - /** - * The error message. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly message?: string; - /** - * The error target. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly target?: string; - /** - * The error details. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly details?: ErrorDetail[]; - /** - * The error additional info. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly additionalInfo?: ErrorAdditionalInfo[]; -} - -/** The resource management error additional info. */ -export interface ErrorAdditionalInfo { - /** - * The additional info type. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly type?: string; - /** - * The additional info. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly info?: Record; -} - -/** The response model for the List API. Returns a list of all the previously created aliases. */ -export interface AliasListResponse { - /** - * A list of all the previously created aliases. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly aliases?: AliasListItem[]; - /** - * If present, the location of the next page of data. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly nextLink?: string; -} - -/** Detailed information for the alias. */ -export interface AliasListItem { - /** - * The created timestamp for the alias. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly createdTimestamp?: string; - /** - * The id for the alias. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly aliasId?: string; - /** - * The id for the creator data item that this alias references (could be null if the alias has not been assigned). - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly creatorDataItemId?: string | null; - /** - * The timestamp of the last time the alias was assigned. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly lastUpdatedTimestamp?: string; -} - -/** The response model for a Long-Running Operations API. */ -export interface LongRunningOperationResult { - /** The Id for this long-running operation. */ - operationId?: string; - /** - * The status state of the request. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly status?: LroStatus; - /** - * The created timestamp. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly created?: string; - /** The error detail. */ - error?: ErrorDetail; - /** The error detail. */ - warning?: ErrorDetail; -} - -/** The response model for the Data List API. Returns a list of all the previously uploaded data. */ -export interface MapDataListResponse { - /** - * A list of all the previously uploaded data. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly mapDataList?: MapDataDetailInfo[]; -} - -/** Detail information for the data. */ -export interface MapDataDetailInfo { - /** - * The unique data id for the data. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly udid?: string; - /** - * The location of the data. Execute a HTTP `GET` on this location to download the data. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly location?: string; - /** - * The size of the content in bytes. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly sizeInBytes?: number; - /** - * The current upload status of the content. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly uploadStatus?: string; - /** - * The current data format. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly dataFormat?: string; - /** - * The current description. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly description?: string; -} - -/** The response model for the Dataset List API. The response body will contain a list of all the previously created datasets. */ -export interface DatasetListResponse { - /** - * A list of all the previously created datasets. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly datasets?: DatasetDetailInfo[]; - /** - * If present, the location of the next page of data. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly nextLink?: string; -} - -/** Detail information for the dataset. */ -export interface DatasetDetailInfo { - /** - * The created timestamp for the dataset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly created?: string; - /** - * The id for the dataset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly datasetId?: string; - /** - * The ontology version of this dataset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly ontology?: string; - /** - * The description for the dataset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly description?: string; - /** Information about the details of the create request for the dataset. */ - datasetSources?: DatasetSources; - /** - * The feature counts for the dataset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly featureCounts?: Record; -} - -/** Information about the details of the create request for the dataset. */ -export interface DatasetSources { - /** - * The list of `conversionId` that were used to create the dataset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly conversionIds?: string[]; - /** - * The dataset that was appended to to create the current dataset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly appendDatasetId?: string; -} - -/** The response model for the Conversion List API. */ -export interface ConversionListResponse { - /** - * A list of all the previously submitted conversion requests. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly conversions?: ConversionListDetailInfo[]; - /** - * If present, the location of the next page of data. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly nextLink?: string; -} - -/** Detail information for the conversion requests. */ -export interface ConversionListDetailInfo { - /** - * A unique id that represents the artifact of a _successfully_ completed conversion process. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly conversionId?: string; - /** - * The ontology version of this dataset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly ontology?: string; - /** - * The unique id of the content provided to create this conversion. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly udid?: string; - /** - * The date and time of this conversion. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly created?: string; - /** - * User provided description of the content being converted. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly description?: string; - /** - * A summary of feature counts in this conversion. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly featureCounts?: Record; -} - -/** The styles model. */ -export interface StylesObject { - /** An array of stateset styles. The style rule could be a numeric or string or a boolean type style rule. Refer to NumberRuleObject, StringRuleObject and BooleanRuleObject definitions [here](https://aka.ms/AzureMapsStatesetStylesObject). */ - styles?: StyleObjectUnion[]; -} - -/** The stateset style model. The style rule could be a numeric type style rule or a boolean type style rule. Refer to NumberRuleObject, StringRuleObject and BooleanRuleObject definitions [here](https://aka.ms/AzureMapsStatesetStylesObject). */ -export interface StyleObject { - /** Polymorphic discriminator, which specifies the different types this object can be */ - type: "boolean" | "number" | "string"; - /** Stateset style key name. Key names are random strings but they should be unique inside style array. */ - keyName: string; -} - -/** The response model for the successful Stateset Create API. */ -export interface StatesetCreatedResponse { - /** - * The ID for the new stateset created. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly statesetId?: string; -} - -/** The response model for the successful Stateset List API. */ -export interface StatesetListResponse { - /** A list of statesets information. */ - statesets?: StatesetInfoObject[]; - /** - * If present, the location of the next page of data. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly nextLink?: string; -} - -/** The stateset information detail. */ -export interface StatesetInfoObject { - /** The stateset ID of this stateset. */ - statesetId?: string; - /** - * Description associated with the stateset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly description?: string; - /** Dataset ID associated with the stateset. */ - datasetIds?: string[]; - /** The styles model. */ - statesetStyle?: StylesObject; -} - -/** The response model for the successful Stateset Get API. */ -export interface StatesetGetResponse { - /** - * Description associated with the stateset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly description?: string; - /** Dataset ID associated with the stateset. */ - datasetIds?: string[]; - /** The styles model. */ - statesetStyle?: StylesObject; -} - -/** The feature states model for a feature. */ -export interface FeatureStatesStructure { - /** The feature states array. */ - states?: FeatureStateObject[]; -} - -/** Single feature state model. */ -export interface FeatureStateObject { - /** Feature state Keyname. Maximum length allowed is 1000. */ - keyName?: string; - /** Value for the feature state. Type should comply with the style definition attached to the featurestate. Maximum length allowed for string type is 1024. */ - value?: string; - /** Valid Timestamp when the feature state was captured. */ - eventTimestamp?: string; -} - -/** This object is returned from a geofence proximity call. */ -export interface GeofenceResponse { - /** - * Lists the fence geometries that contain the coordinate position or overlap the searchBuffer around the position. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly geometries?: GeofenceGeometry[]; - /** - * Lists of the geometry ID of the geofence which is expired relative to the user time in the request. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly expiredGeofenceGeometryId?: string[]; - /** - * Lists of the geometry ID of the geofence which is in invalid period relative to the user time in the request. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly invalidPeriodGeofenceGeometryId?: string[]; - /** - * True if at least one event is published to the Azure Maps event subscriber, false if no event is published to the Azure Maps event subscriber. This will only be presented in response when 'isAsync' query parameter is set to true. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly isEventPublished?: boolean; -} - -/** The geofencing geometry. */ -export interface GeofenceGeometry { - /** - * ID of the device. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly deviceId?: string; - /** - * The unique id returned from [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) after uploading a valid GeoJSON FeatureCollection object. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. All the feature's properties should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly udId?: string; - /** - * The unique id identifies a geometry. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly geometryId?: string; - /** - * Distance from the coordinate to the closest border of the geofence. Positive means the coordinate is outside of the geofence. If the coordinate is outside of the geofence, but more than the value of searchBuffer away from the closest geofence border, then the value is 999. Negative means the coordinate is inside of the geofence. If the coordinate is inside the polygon, but more than the value of searchBuffer away from the closest geofencing border, then the value is -999. A value of 999 means that there is great confidence the coordinate is well outside the geofence. A value of -999 means that there is great confidence the coordinate is well within the geofence. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly distance?: number; - /** - * Latitude of the nearest point of the geometry. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly nearestLat?: number; - /** - * Longitude of the nearest point of the geometry. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly nearestLon?: number; - /** - * Sea level in meter of the nearest point on the 2D extrusion geometry. This will only be presented in response when value is provided for 'zInMeter' in the request. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly nearestZ?: number; -} - -/** An object with a FeatureCollection and a list of distances. All the feature's properties should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. */ -export interface BufferRequestBody { - /** A valid `GeoJSON FeatureCollection` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. */ - geometries?: Record; - /** List of the distances to compute the buffer for, one-to-one per Feature in the collection, or one for all Features in the collection. */ - distances?: number[]; -} - -/** This object is returned from a successful Spatial Buffer call. */ -export interface BufferResponse { - /** - * Summary of the call. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly summary?: BufferResponseSummary; - /** The FeatureCollection of buffers for the input. */ - result?: GeoJsonFeatureCollectionUnion; -} - -/** Summary of the call. */ -export interface BufferResponseSummary { - /** - * The udid for the user data if one exists - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly udid?: string; - /** - * The information about what happened during the call. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly information?: string; -} - -/** A valid `GeoJSON` object. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3) for details. */ -export interface GeoJsonObject { - /** Polymorphic discriminator, which specifies the different types this object can be */ - type: - | "GeoJsonGeometry" - | "Feature" - | "FeatureCollection" - | "FeatureCollection" - | "Point" - | "MultiPoint" - | "LineString" - | "MultiLineString" - | "Polygon" - | "MultiPolygon" - | "GeometryCollection"; -} - -export interface GeoJsonFeatureCollectionData { - /** Contains a list of valid `GeoJSON Feature` objects. */ - features: GeoJsonFeature[]; -} - -export interface GeoJsonFeatureData { - /** A valid `GeoJSON` geometry object. The type must be one of the seven valid GeoJSON geometry types - Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon and GeometryCollection. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1) for details. */ - geometry: GeoJsonGeometryUnion; - /** Properties can contain any additional metadata about the `Feature`. Value can be any JSON object or a JSON null value */ - properties?: Record; - /** Identifier for the feature. */ - id?: string; - /** The type of the feature. The value depends on the data model the current feature is part of. Some data models may have an empty value. */ - featureType?: string; -} - -/** This object is returned from a successful Spatial Closest Point call */ -export interface ClosestPointResponse { - /** - * Closest Point Summary object - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly summary?: ClosestPointSummary; - /** Closest Point Result Array */ - result?: ClosestPointResultEntry[]; -} - -/** Closest Point Summary object */ -export interface ClosestPointSummary { - /** A location represented as a latitude and longitude */ - sourcePoint?: SpatialCoordinate; - /** - * A unique data id (udid) for the uploaded content - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly udid?: string; - /** - * Processing information - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly information?: string; -} - -/** A location represented as a latitude and longitude */ -export interface SpatialCoordinate { - /** - * Latitude property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly lat?: number; - /** - * Longitude property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly lon?: number; -} - -/** Closest Point Result Entry Object */ -export interface ClosestPointResultEntry { - /** - * The distance in meters from the source point to the closest point - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly distanceInMeters?: number; - /** A location represented as a latitude and longitude */ - position?: SpatialCoordinate; - /** - * The unique id identifies a geometry - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly geometryId?: string; -} - -/** Returns true if point is within the polygon, false otherwise */ -export interface PointInPolygonResponse { - /** - * Point In Polygon Summary object - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly summary?: PointInPolygonSummary; - /** Point In Polygon Result Object */ - result?: PointInPolygonResult; -} - -/** Point In Polygon Summary object */ -export interface PointInPolygonSummary { - /** A location represented as a latitude and longitude */ - sourcePoint?: SpatialCoordinate; - /** - * A unique data id (udid) for the uploaded content. Udid is not applicable for POST spatial operations(set to null) - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly udid?: string; - /** - * Processing information - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly information?: string; -} - -/** Point In Polygon Result Object */ -export interface PointInPolygonResult { - /** - * Point In Polygons Property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly pointInPolygons?: boolean; - /** - * Geometries array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly intersectingGeometries?: string[]; -} - -/** This object is returned from a successful Great Circle Distance call */ -export interface GreatCircleDistanceResponse { - /** - * Summary object - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly summary?: GreatCircleDistanceResponseSummary; - /** - * Result Object - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly result?: GreatCircleDistanceResponseResult; -} - -/** Summary object */ -export interface GreatCircleDistanceResponseSummary { - /** A location represented as a latitude and longitude */ - sourcePoint?: SpatialCoordinate; - /** A location represented as a latitude and longitude */ - targetPoint?: SpatialCoordinate; -} - -/** Result Object */ -export interface GreatCircleDistanceResponseResult { - /** - * The great circle distance in meters from the source point to the target point - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly distanceInMeters?: number; -} - -/** The response model for the Tileset List API. Returns a list of all tilesets. */ -export interface TilesetListResponse { - /** - * A list of all tilesets. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly tilesets?: TilesetDetailInfo[]; - /** - * If present, the location of the next page of data. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly nextLink?: string; -} - -/** Detail information for the data. */ -export interface TilesetDetailInfo { - /** - * The unique tileset id for the tileset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly tilesetId?: string; - /** - * The ontology version of this dataset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly ontology?: string; - /** - * The unique dataset Id used to create the tileset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly datasetId?: string; - /** - * The description the caller provided when creating the tileset. Maximum length 1024 characters. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly description?: string; - /** - * The lowest tile zoom level tile generated for the tileset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly minZoom?: number; - /** - * The highest tile zoom level tile generated for the tileset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly maxZoom?: number; - /** - * Bounding box which all features of the tileset lay within. Projection used - EPSG:3857. Format : 'minLon, minLat, maxLon, maxLat'. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly bbox?: number[]; -} - -export interface LandingPageResponse { - /** - * The ontology version of this dataset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly ontology?: string; - /** Links to other WFS endpoints. */ - links: WfsEndpointLink[]; -} - -/** Links to other WFS endpoints */ -export interface WfsEndpointLink { - /** The link target. */ - href: string; - /** The relation type. */ - rel?: string; - /** A hint indicating what the media type of the result of dereferencing the link should be. */ - type?: string; - /** A hint indicating what the language of the result of dereferencing the link should be. */ - hreflang?: string; - /** Used to label the destination of a link such that it can be used as a human-readable identifier (e.g., a menu entry) in the language indicated by the Content-Language header field (if present). */ - title?: string; -} - -export interface ConformanceResponse { - /** List of requirements classes that the server conforms to. */ - conformsTo: string[]; -} - -export interface CollectionsResponse { - /** - * The ontology version of this dataset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly ontology?: string; - /** Links to other WFS endpoints. */ - links: WfsEndpointLink[]; - /** All the collections in a given dataset. */ - collections: CollectionInfo[]; -} - -export interface CollectionInfo { - /** identifier of the collection used, for example, in URIs */ - name: string; - /** human readable title of the collection */ - title?: string; - /** - * The ontology version of this dataset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly ontology?: string; - /** a description of the features in the collection */ - description?: string; - /** Links to other WFS endpoints. */ - links: WfsEndpointLink[]; -} - -/** collection of GeoJSON features */ -export interface CollectionDefinitionResponse { - /** describes the collection */ - description?: string; - /** prefix of the collection used */ - idPrefix: string; - /** identifier of the collection used, for example, in URIs */ - name: string; - /** title of collection */ - title?: string; - /** - * The ontology version of this dataset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly ontology?: string; - /** type of geometry returned */ - geometryType: GeoJsonGeometryType; - /** type of features returned */ - featureTypes: string[]; - /** attributes of the collection used */ - properties?: DefinitionProperties[]; - /** Links to other WFS endpoints. */ - links?: WfsEndpointLink[]; -} - -export interface DefinitionProperties { - /** name of attribute */ - name: string; - /** is attribute required */ - required: boolean; - /** type of attribute */ - type: Record; -} - -export interface ExtendedGeoJsonFeatureCollectionData { - /** - * The ontology version of this dataset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly ontology?: string; - /** Number of returned features. */ - numberReturned?: number; - /** Links to other WFS endpoints. */ - links?: WfsEndpointLink[]; -} - -export interface FeatureResponse { - /** - * The ontology version of this dataset. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly ontology?: string; - /** A valid `GeoJSON Feature` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.2) for details. */ - feature: GeoJsonFeature; - /** Links to other WFS endpoints. */ - links?: WfsEndpointLink[]; -} - -/** The numeric rule. The color is selected from the first range it falls into. */ -export interface NumberRuleObject { - /** The numeric value range for this style rule. If the value is in the range, all the conditions must hold true. */ - range?: RangeObject; - /** The color when value is within the range. Color is a JSON string in a variety of permitted formats, HTML-style hex values, RGB ("#ff0", "#ffff00", "rgb(255, 255, 0)"), RGBA ("rgba(255, 255, 0, 1)"), HSL("hsl(100, 50%, 50%)"), and HSLA("hsla(100, 50%, 50%, 1)"). Predefined HTML colors names, like yellow and blue, are also permitted. */ - color?: string; -} - -/** The numeric value range for this style rule. If the value is in the range, all the conditions must hold true. */ -export interface RangeObject { - /** All the number x that x ≥ minimum. */ - minimum?: number; - /** All the number x that x ≤ maximum. */ - maximum?: number; - /** All the number x that x > exclusiveMinimum. */ - exclusiveMinimum?: number; - /** All the number x that x < exclusiveMaximum. */ - exclusiveMaximum?: number; -} - -/** The boolean rule. The color is selected based on the logic value of the key. */ -export interface BooleanRuleObject { - /** The color when value is true. Color is a JSON string in a variety of permitted formats, HTML-style hex values, RGB ("#ff0", "#ffff00", "rgb(255, 255, 0)"), RGBA ("rgba(255, 255, 0, 1)"), HSL("hsl(100, 50%, 50%)"), and HSLA("hsla(100, 50%, 50%, 1)"). Predefined HTML colors names, like yellow and blue, are also permitted. */ - true?: string; - /** The color when value is false. Color is a JSON string in a variety of permitted formats, HTML-style hex values, RGB ("#ff0", "#ffff00", "rgb(255, 255, 0)"), RGBA ("rgba(255, 255, 0, 1)"), HSL("hsl(100, 50%, 50%)"), and HSLA("hsla(100, 50%, 50%, 1)"). Predefined HTML colors names, like yellow and blue, are also permitted. */ - false?: string; -} - -/** Data contained by a `GeoJson Point`. */ -export interface GeoJsonPointData { - /** A `Position` is an array of numbers with two or more elements. The first two elements are _longitude_ and _latitude_, precisely in that order. _Altitude/Elevation_ is an optional third element. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.1) for details. */ - coordinates: number[]; -} - -/** Data contained by a `GeoJson MultiPoint`. */ -export interface GeoJsonMultiPointData { - /** Coordinates for the `GeoJson MultiPoint` geometry. */ - coordinates: number[][]; -} - -export interface GeoJsonLineStringData { - /** Coordinates for the `GeoJson LineString` geometry. */ - coordinates: number[][]; -} - -export interface GeoJsonMultiLineStringData { - /** Coordinates for the `GeoJson MultiLineString` geometry. */ - coordinates: number[][][]; -} - -export interface GeoJsonPolygonData { - /** Coordinates for the `GeoJson Polygon` geometry type. */ - coordinates: number[][][]; -} - -export interface GeoJsonMultiPolygonData { - /** Contains a list of valid `GeoJSON Polygon` objects. **Note** that coordinates in GeoJSON are in x, y order (longitude, latitude). */ - coordinates: number[][][][]; -} - -export interface GeoJsonGeometryCollectionData { - /** Contains a list of valid `GeoJSON` geometry objects. **Note** that coordinates in GeoJSON are in x, y order (longitude, latitude). */ - geometries: GeoJsonGeometryUnion[]; -} - -/** The boolean type style rule object. */ -export type BooleanTypeStyleRule = StyleObject & { - /** Polymorphic discriminator, which specifies the different types this object can be */ - type: "boolean"; - /** Boolean style rules. */ - rules: BooleanRuleObject[]; -}; - -/** The numeric type style rule object. */ -export type NumberTypeStyleRule = StyleObject & { - /** Polymorphic discriminator, which specifies the different types this object can be */ - type: "number"; - /** Numeric style rules. */ - rules: NumberRuleObject[]; -}; - -/** The string type style rule object. */ -export type StringTypeStyleRule = StyleObject & { - /** Polymorphic discriminator, which specifies the different types this object can be */ - type: "string"; - /** String style rules. */ - rules: { [propertyName: string]: string }[]; -}; - -/** A valid `GeoJSON` geometry object. The type must be one of the seven valid GeoJSON geometry types - Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon and GeometryCollection. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1) for details. */ -export type GeoJsonGeometry = GeoJsonObject & { - /** Polymorphic discriminator, which specifies the different types this object can be */ - type: - | "GeoJsonGeometry" - | "Point" - | "MultiPoint" - | "LineString" - | "MultiLineString" - | "Polygon" - | "MultiPolygon" - | "GeometryCollection"; -}; - -/** A valid `GeoJSON Feature` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.2) for details. */ -export type GeoJsonFeature = GeoJsonObject & - GeoJsonFeatureData & { - /** Polymorphic discriminator, which specifies the different types this object can be */ - type: "Feature"; - }; - -/** A valid `GeoJSON FeatureCollection` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. */ -export type GeoJsonFeatureCollection = GeoJsonObject & - GeoJsonFeatureCollectionData & { - /** Polymorphic discriminator, which specifies the different types this object can be */ - type: "FeatureCollection" | "FeatureCollection"; - }; - -/** A valid `GeoJSON FeatureCollection` object type extended with numberReturned and links array. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. */ -export type ExtendedGeoJsonFeatureCollection = GeoJsonFeatureCollection & - ExtendedGeoJsonFeatureCollectionData & {}; - -/** A valid `GeoJSON Point` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.2) for details. */ -export type GeoJsonPoint = GeoJsonGeometry & GeoJsonPointData & {}; - -/** A valid `GeoJSON MultiPoint` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.3) for details. */ -export type GeoJsonMultiPoint = GeoJsonGeometry & GeoJsonMultiPointData & {}; - -/** A valid `GeoJSON LineString` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.4) for details. */ -export type GeoJsonLineString = GeoJsonGeometry & GeoJsonLineStringData & {}; - -/** A valid `GeoJSON MultiLineString` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.5) for details. */ -export type GeoJsonMultiLineString = GeoJsonGeometry & - GeoJsonMultiLineStringData & {}; - -/** A valid `GeoJSON Polygon` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.6) for details. */ -export type GeoJsonPolygon = GeoJsonGeometry & GeoJsonPolygonData & {}; - -/** A valid `GeoJSON MultiPolygon` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.7) for details. */ -export type GeoJsonMultiPolygon = GeoJsonGeometry & - GeoJsonMultiPolygonData & {}; - -/** A valid `GeoJSON GeometryCollection` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.8) for details. */ -export type GeoJsonGeometryCollection = GeoJsonGeometry & - GeoJsonGeometryCollectionData & {}; - -/** Defines headers for Alias_create operation. */ -export interface AliasCreateHeaders { - /** The list of response headers that can be read by the client. */ - accessControlExposeHeaders?: string; -} - -/** Defines headers for Data_uploadPreview operation. */ -export interface DataUploadPreviewHeaders { - /** If successful, a URI where details on the newly created resource can be found. */ - resourceLocation?: string; -} - -/** Defines headers for Data_updatePreview operation. */ -export interface DataUpdatePreviewHeaders { - /** If successful, a URI where details on the newly created resource can be found. */ - resourceLocation?: string; -} - -/** Defines headers for Data_downloadPreview operation. */ -export interface DataDownloadPreviewHeaders { - /** The content-type for the Download API response. */ - contentType?: string; -} - -/** Defines headers for Data_getOperationPreview operation. */ -export interface DataGetOperationPreviewHeaders { - /** If successful, a URI where details on the newly created resource can be found. */ - resourceLocation?: string; -} - -/** Defines headers for Dataset_create operation. */ -export interface DatasetCreateHeaders { - /** If successful, a URI where details on the newly created resource can be found. */ - resourceLocation?: string; -} - -/** Defines headers for Dataset_getOperation operation. */ -export interface DatasetGetOperationHeaders { - /** If successful, a URI where details on the newly created resource can be found. */ - resourceLocation?: string; -} - -/** Defines headers for Conversion_convert operation. */ -export interface ConversionConvertHeaders { - /** If successful, a URI where details on the newly created resource can be found. */ - resourceLocation?: string; -} - -/** Defines headers for Conversion_getOperation operation. */ -export interface ConversionGetOperationHeaders { - /** If successful, a URI where details on the newly created resource can be found. */ - resourceLocation?: string; -} - -/** Defines headers for Spatial_getGeofence operation. */ -export interface SpatialGetGeofenceHeaders { - /** Value present in an async call's response and the Event Grid event data. It helps correlate the async call’s response with the corresponding Event Grid event. */ - xCorrelationId?: string; -} - -/** Defines headers for Spatial_postGeofence operation. */ -export interface SpatialPostGeofenceHeaders { - /** Value present in an async call's response and the Event Grid event data. It helps correlate the async call’s response with the corresponding Event Grid event. */ - xCorrelationId?: string; -} - -/** Defines headers for Tileset_create operation. */ -export interface TilesetCreateHeaders { - /** If successful, a URI where details on the newly created resource can be found. */ - resourceLocation?: string; -} - -/** Defines headers for Tileset_getOperation operation. */ -export interface TilesetGetOperationHeaders { - /** If successful, a URI where details on the newly created resource can be found. */ - resourceLocation?: string; -} - -/** Known values of {@link Geography} that the service accepts. */ -export const enum KnownGeography { - Us = "us", - Eu = "eu" -} - -/** - * Defines values for Geography. \ - * {@link KnownGeography} can be used interchangeably with Geography, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **us** \ - * **eu** - */ -export type Geography = string; - -/** Known values of {@link UploadDataFormat} that the service accepts. */ -export const enum KnownUploadDataFormat { - /** [GeoJSON](https://tools.ietf.org/html/rfc7946) is a JSON based geospatial data interchange format. */ - Geojson = "geojson", - /** Compressed data format. */ - Zip = "zip", - /** ZIP package containing DWG file. */ - Dwgzippackage = "dwgzippackage" -} - -/** - * Defines values for UploadDataFormat. \ - * {@link KnownUploadDataFormat} can be used interchangeably with UploadDataFormat, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **geojson**: [GeoJSON](https:\/\/tools.ietf.org\/html\/rfc7946) is a JSON based geospatial data interchange format. \ - * **zip**: Compressed data format. \ - * **dwgzippackage**: ZIP package containing DWG file. - */ -export type UploadDataFormat = string; - -/** Known values of {@link LroStatus} that the service accepts. */ -export const enum KnownLroStatus { - /** The request has not started processing yet. */ - NotStarted = "NotStarted", - /** The request has started processing. */ - Running = "Running", - /** The request has one or more failures. */ - Failed = "Failed", - /** The request has successfully completed. */ - Succeeded = "Succeeded" -} - -/** - * Defines values for LroStatus. \ - * {@link KnownLroStatus} can be used interchangeably with LroStatus, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **NotStarted**: The request has not started processing yet. \ - * **Running**: The request has started processing. \ - * **Failed**: The request has one or more failures. \ - * **Succeeded**: The request has successfully completed. - */ -export type LroStatus = string; - -/** Known values of {@link StyleObjectType} that the service accepts. */ -export const enum KnownStyleObjectType { - /** Boolean type of stateset style. */ - BooleanTypeStyleRule = "boolean", - /** Number type of stateset style. */ - NumberTypeStyleRule = "number", - /** String type of stateset style. */ - StringTypeStyleRule = "string" -} - -/** - * Defines values for StyleObjectType. \ - * {@link KnownStyleObjectType} can be used interchangeably with StyleObjectType, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **boolean**: Boolean type of stateset style. \ - * **number**: Number type of stateset style. \ - * **string**: String type of stateset style. - */ -export type StyleObjectType = string; - -/** Known values of {@link ResponseFormat} that the service accepts. */ -export const enum KnownResponseFormat { - /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ - Json = "json" -} - -/** - * Defines values for ResponseFormat. \ - * {@link KnownResponseFormat} can be used interchangeably with ResponseFormat, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) - */ -export type ResponseFormat = string; - -/** Known values of {@link GeofenceMode} that the service accepts. */ -export const enum KnownGeofenceMode { - /** Publish all the query results to Azure Maps account event subscription. */ - All = "All", - /** Only publish result when user location is considered as crossing geofencing boarder. */ - EnterAndExit = "EnterAndExit" -} - -/** - * Defines values for GeofenceMode. \ - * {@link KnownGeofenceMode} can be used interchangeably with GeofenceMode, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **All**: Publish all the query results to Azure Maps account event subscription. \ - * **EnterAndExit**: Only publish result when user location is considered as crossing geofencing boarder. - */ -export type GeofenceMode = string; - -/** Known values of {@link GeoJsonObjectType} that the service accepts. */ -export const enum KnownGeoJsonObjectType { - /** `GeoJSON Point` geometry. */ - GeoJsonPoint = "Point", - /** `GeoJSON MultiPoint` geometry. */ - GeoJsonMultiPoint = "MultiPoint", - /** `GeoJSON LineString` geometry. */ - GeoJsonLineString = "LineString", - /** `GeoJSON MultiLineString` geometry. */ - GeoJsonMultiLineString = "MultiLineString", - /** `GeoJSON Polygon` geometry. */ - GeoJsonPolygon = "Polygon", - /** `GeoJSON MultiPolygon` geometry. */ - GeoJsonMultiPolygon = "MultiPolygon", - /** `GeoJSON GeometryCollection` geometry. */ - GeoJsonGeometryCollection = "GeometryCollection", - /** `GeoJSON Feature` object. */ - GeoJsonFeature = "Feature", - /** `GeoJSON FeatureCollection` object. */ - GeoJsonFeatureCollection = "FeatureCollection" -} - -/** - * Defines values for GeoJsonObjectType. \ - * {@link KnownGeoJsonObjectType} can be used interchangeably with GeoJsonObjectType, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **Point**: `GeoJSON Point` geometry. \ - * **MultiPoint**: `GeoJSON MultiPoint` geometry. \ - * **LineString**: `GeoJSON LineString` geometry. \ - * **MultiLineString**: `GeoJSON MultiLineString` geometry. \ - * **Polygon**: `GeoJSON Polygon` geometry. \ - * **MultiPolygon**: `GeoJSON MultiPolygon` geometry. \ - * **GeometryCollection**: `GeoJSON GeometryCollection` geometry. \ - * **Feature**: `GeoJSON Feature` object. \ - * **FeatureCollection**: `GeoJSON FeatureCollection` object. - */ -export type GeoJsonObjectType = string; - -/** Known values of {@link GeoJsonGeometryType} that the service accepts. */ -export const enum KnownGeoJsonGeometryType { - /** `GeoJSON Point` geometry. */ - GeoJsonPoint = "Point", - /** `GeoJSON MultiPoint` geometry. */ - GeoJsonMultiPoint = "MultiPoint", - /** `GeoJSON LineString` geometry. */ - GeoJsonLineString = "LineString", - /** `GeoJSON MultiLineString` geometry. */ - GeoJsonMultiLineString = "MultiLineString", - /** `GeoJSON Polygon` geometry. */ - GeoJsonPolygon = "Polygon", - /** `GeoJSON MultiPolygon` geometry. */ - GeoJsonMultiPolygon = "MultiPolygon", - /** `GeoJSON GeometryCollection` geometry. */ - GeoJsonGeometryCollection = "GeometryCollection" -} - -/** - * Defines values for GeoJsonGeometryType. \ - * {@link KnownGeoJsonGeometryType} can be used interchangeably with GeoJsonGeometryType, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **Point**: `GeoJSON Point` geometry. \ - * **MultiPoint**: `GeoJSON MultiPoint` geometry. \ - * **LineString**: `GeoJSON LineString` geometry. \ - * **MultiLineString**: `GeoJSON MultiLineString` geometry. \ - * **Polygon**: `GeoJSON Polygon` geometry. \ - * **MultiPolygon**: `GeoJSON MultiPolygon` geometry. \ - * **GeometryCollection**: `GeoJSON GeometryCollection` geometry. - */ -export type GeoJsonGeometryType = string; - -/** Known values of {@link GeographicResourceLocation} that the service accepts. */ -export const enum KnownGeographicResourceLocation { - /** Used to access an Azure Maps Creator resource in the United States */ - Us = "us", - /** Used to access an Azure Maps Creator resource in Europe */ - Eu = "eu" -} - -/** - * Defines values for GeographicResourceLocation. \ - * {@link KnownGeographicResourceLocation} can be used interchangeably with GeographicResourceLocation, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **us**: Used to access an Azure Maps Creator resource in the United States \ - * **eu**: Used to access an Azure Maps Creator resource in Europe - */ -export type GeographicResourceLocation = string; - -/** Optional parameters. */ -export interface AliasCreateOptionalParams extends coreClient.OperationOptions { - /** The unique id that references a creator data item to be aliased. */ - creatorDataItemId?: string; -} - -/** Contains response data for the create operation. */ -export type AliasCreateResponse = AliasCreateHeaders & AliasesCreateResponse; - -/** Optional parameters. */ -export interface AliasListOptionalParams extends coreClient.OperationOptions {} - -/** Contains response data for the list operation. */ -export type AliasListOperationResponse = AliasListResponse; - -/** Optional parameters. */ -export interface AliasAssignOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the assign operation. */ -export type AliasAssignResponse = AliasListItem; - -/** Optional parameters. */ -export interface AliasDeleteOptionalParams - extends coreClient.OperationOptions {} - -/** Optional parameters. */ -export interface AliasGetDetailsOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getDetails operation. */ -export type AliasGetDetailsResponse = AliasListItem; - -/** Optional parameters. */ -export interface AliasListNextOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the listNext operation. */ -export type AliasListNextResponse = AliasListResponse; - -/** Optional parameters. */ -export interface DataUploadPreview$binaryOptionalParams - extends coreClient.OperationOptions { - /** The description to be given to the upload. */ - uploadDataDescription?: string; - /** Delay to wait until next poll, in milliseconds. */ - updateIntervalInMs?: number; - /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ - resumeFrom?: string; -} - -/** Optional parameters. */ -export interface DataUploadPreview$jsonOptionalParams - extends coreClient.OperationOptions { - /** The description to be given to the upload. */ - uploadDataDescription?: string; - /** Delay to wait until next poll, in milliseconds. */ - updateIntervalInMs?: number; - /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ - resumeFrom?: string; -} - -/** Contains response data for the uploadPreview operation. */ -export type DataUploadPreviewResponse = DataUploadPreviewHeaders & - LongRunningOperationResult; - -/** Optional parameters. */ -export interface DataListPreviewOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the listPreview operation. */ -export type DataListPreviewResponse = MapDataListResponse; - -/** Optional parameters. */ -export interface DataUpdatePreviewOptionalParams - extends coreClient.OperationOptions { - /** The description to be given to the upload. */ - uploadDataDescription?: string; - /** Delay to wait until next poll, in milliseconds. */ - updateIntervalInMs?: number; - /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ - resumeFrom?: string; -} - -/** Contains response data for the updatePreview operation. */ -export type DataUpdatePreviewResponse = DataUpdatePreviewHeaders & - LongRunningOperationResult; - -/** Optional parameters. */ -export interface DataDownloadPreviewOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the downloadPreview operation. */ -export type DataDownloadPreviewResponse = DataDownloadPreviewHeaders & { - /** - * BROWSER ONLY - * - * The response body as a browser Blob. - * Always `undefined` in node.js. - */ - blobBody?: Promise; - /** - * NODEJS ONLY - * - * The response body as a node.js Readable stream. - * Always `undefined` in the browser. - */ - readableStreamBody?: NodeJS.ReadableStream; -}; - -/** Optional parameters. */ -export interface DataDeletePreviewOptionalParams - extends coreClient.OperationOptions {} - -/** Optional parameters. */ -export interface DataGetOperationPreviewOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getOperationPreview operation. */ -export type DataGetOperationPreviewResponse = DataGetOperationPreviewHeaders & - LongRunningOperationResult; - -/** Optional parameters. */ -export interface DatasetCreateOptionalParams - extends coreClient.OperationOptions { - /** The ID for the dataset to append with. The dataset must originate from a previous dataset creation call that matches the datasetId */ - datasetId?: string; - /** The description to be given to the dataset. */ - descriptionDataset?: string; - /** Delay to wait until next poll, in milliseconds. */ - updateIntervalInMs?: number; - /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ - resumeFrom?: string; -} - -/** Contains response data for the create operation. */ -export type DatasetCreateResponse = DatasetCreateHeaders & - LongRunningOperationResult; - -/** Optional parameters. */ -export interface DatasetListOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the list operation. */ -export type DatasetListOperationResponse = DatasetListResponse; - -/** Optional parameters. */ -export interface DatasetGetOptionalParams extends coreClient.OperationOptions {} - -/** Contains response data for the get operation. */ -export type DatasetGetResponse = DatasetDetailInfo; - -/** Optional parameters. */ -export interface DatasetDeleteOptionalParams - extends coreClient.OperationOptions {} - -/** Optional parameters. */ -export interface DatasetGetOperationOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getOperation operation. */ -export type DatasetGetOperationResponse = DatasetGetOperationHeaders & - LongRunningOperationResult; - -/** Optional parameters. */ -export interface DatasetListNextOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the listNext operation. */ -export type DatasetListNextResponse = DatasetListResponse; - -/** Optional parameters. */ -export interface ConversionConvertOptionalParams - extends coreClient.OperationOptions { - /** User provided description of the content being converted. */ - description?: string; - /** Delay to wait until next poll, in milliseconds. */ - updateIntervalInMs?: number; - /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ - resumeFrom?: string; -} - -/** Contains response data for the convert operation. */ -export type ConversionConvertResponse = ConversionConvertHeaders & - LongRunningOperationResult; - -/** Optional parameters. */ -export interface ConversionListOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the list operation. */ -export type ConversionListOperationResponse = ConversionListResponse; - -/** Optional parameters. */ -export interface ConversionGetOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the get operation. */ -export type ConversionGetResponse = ConversionListDetailInfo; - -/** Optional parameters. */ -export interface ConversionDeleteOptionalParams - extends coreClient.OperationOptions {} - -/** Optional parameters. */ -export interface ConversionGetOperationOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getOperation operation. */ -export type ConversionGetOperationResponse = ConversionGetOperationHeaders & - LongRunningOperationResult; - -/** Optional parameters. */ -export interface ConversionListNextOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the listNext operation. */ -export type ConversionListNextResponse = ConversionListResponse; - -/** Optional parameters. */ -export interface FeatureStateCreateStatesetOptionalParams - extends coreClient.OperationOptions { - /** Description for the stateset. Max length allowed is 1000. */ - description?: string; -} - -/** Contains response data for the createStateset operation. */ -export type FeatureStateCreateStatesetResponse = StatesetCreatedResponse; - -/** Optional parameters. */ -export interface FeatureStateListStatesetOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the listStateset operation. */ -export type FeatureStateListStatesetResponse = StatesetListResponse; - -/** Optional parameters. */ -export interface FeatureStatePutStatesetOptionalParams - extends coreClient.OperationOptions {} - -/** Optional parameters. */ -export interface FeatureStateDeleteStatesetOptionalParams - extends coreClient.OperationOptions {} - -/** Optional parameters. */ -export interface FeatureStateGetStatesetOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getStateset operation. */ -export type FeatureStateGetStatesetResponse = StatesetGetResponse; - -/** Optional parameters. */ -export interface FeatureStateUpdateStatesOptionalParams - extends coreClient.OperationOptions {} - -/** Optional parameters. */ -export interface FeatureStateDeleteStateOptionalParams - extends coreClient.OperationOptions {} - -/** Optional parameters. */ -export interface FeatureStateGetStatesOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getStates operation. */ -export type FeatureStateGetStatesResponse = FeatureStatesStructure; - -/** Optional parameters. */ -export interface FeatureStateListStatesetNextOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the listStatesetNext operation. */ -export type FeatureStateListStatesetNextResponse = StatesetListResponse; - -/** Optional parameters. */ -export interface SpatialGetGeofenceOptionalParams - extends coreClient.OperationOptions { - /** The sea level in meter of the location being passed. If this parameter is presented, 2D extrusion is used. Example: 200. */ - z?: number; - /** The user request time. If not presented in the request, the default value is DateTime.Now. */ - userTime?: Date; - /** The radius of the buffer around the geofence in meters that defines how far to search inside and outside the border of the fence against the coordinate that was provided when calculating the result. The minimum value is 0, and the maximum is 500. The default value is 50. */ - searchBuffer?: number; - /** If true, the request will use async event mechanism; if false, the request will be synchronized and do not trigger any event. The default value is false. */ - isAsync?: boolean; - /** Mode of the geofencing async event mechanism. */ - mode?: GeofenceMode; -} - -/** Contains response data for the getGeofence operation. */ -export type SpatialGetGeofenceResponse = SpatialGetGeofenceHeaders & - GeofenceResponse; - -/** Optional parameters. */ -export interface SpatialPostGeofenceOptionalParams - extends coreClient.OperationOptions { - /** The sea level in meter of the location being passed. If this parameter is presented, 2D extrusion geofencing is applied. Example: 200. */ - z?: number; - /** The user request time. If not presented in the request, the default value is DateTime.UtcNow. */ - userTime?: Date; - /** The radius of the buffer around the geofence in meters that defines how far to search inside and outside the border of the fence against the coordinate that was provided when calculating the result. The minimum value is 0, and the maximum is 500. The default value is 50. */ - searchBuffer?: number; - /** If true, the request will use async event mechanism; if false, the request will be synchronized and do not trigger any event. The default value is false. */ - isAsync?: boolean; - /** Mode of the geofencing async event mechanism. */ - mode?: GeofenceMode; -} - -/** Contains response data for the postGeofence operation. */ -export type SpatialPostGeofenceResponse = SpatialPostGeofenceHeaders & - GeofenceResponse; - -/** Optional parameters. */ -export interface SpatialPostBufferOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the postBuffer operation. */ -export type SpatialPostBufferResponse = BufferResponse; - -/** Optional parameters. */ -export interface SpatialGetBufferOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getBuffer operation. */ -export type SpatialGetBufferResponse = BufferResponse; - -/** Optional parameters. */ -export interface SpatialPostClosestPointOptionalParams - extends coreClient.OperationOptions { - /** The number of closest points expected from response. Default: 1, minimum: 1 and maximum: 50 */ - numberOfClosestPoints?: number; -} - -/** Contains response data for the postClosestPoint operation. */ -export type SpatialPostClosestPointResponse = ClosestPointResponse; - -/** Optional parameters. */ -export interface SpatialGetClosestPointOptionalParams - extends coreClient.OperationOptions { - /** The number of closest points expected from response. Default: 1, minimum: 1 and maximum: 50 */ - numberOfClosestPoints?: number; -} - -/** Contains response data for the getClosestPoint operation. */ -export type SpatialGetClosestPointResponse = ClosestPointResponse; - -/** Optional parameters. */ -export interface SpatialPostPointInPolygonOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the postPointInPolygon operation. */ -export type SpatialPostPointInPolygonResponse = PointInPolygonResponse; - -/** Optional parameters. */ -export interface SpatialGetPointInPolygonOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getPointInPolygon operation. */ -export type SpatialGetPointInPolygonResponse = PointInPolygonResponse; - -/** Optional parameters. */ -export interface SpatialGetGreatCircleDistanceOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getGreatCircleDistance operation. */ -export type SpatialGetGreatCircleDistanceResponse = GreatCircleDistanceResponse; - -/** Optional parameters. */ -export interface TilesetCreateOptionalParams - extends coreClient.OperationOptions { - /** User provided description of the tileset. */ - description?: string; - /** Delay to wait until next poll, in milliseconds. */ - updateIntervalInMs?: number; - /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ - resumeFrom?: string; -} - -/** Contains response data for the create operation. */ -export type TilesetCreateResponse = TilesetCreateHeaders & - LongRunningOperationResult; - -/** Optional parameters. */ -export interface TilesetListOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the list operation. */ -export type TilesetListOperationResponse = TilesetListResponse; - -/** Optional parameters. */ -export interface TilesetGetOptionalParams extends coreClient.OperationOptions {} - -/** Contains response data for the get operation. */ -export type TilesetGetResponse = TilesetDetailInfo; - -/** Optional parameters. */ -export interface TilesetDeleteOptionalParams - extends coreClient.OperationOptions {} - -/** Optional parameters. */ -export interface TilesetGetOperationOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getOperation operation. */ -export type TilesetGetOperationResponse = TilesetGetOperationHeaders & - LongRunningOperationResult; - -/** Optional parameters. */ -export interface TilesetListNextOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the listNext operation. */ -export type TilesetListNextResponse = TilesetListResponse; - -/** Optional parameters. */ -export interface WfsGetLandingPageOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getLandingPage operation. */ -export type WfsGetLandingPageResponse = LandingPageResponse; - -/** Optional parameters. */ -export interface WfsGetConformanceOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getConformance operation. */ -export type WfsGetConformanceResponse = ConformanceResponse; - -/** Optional parameters. */ -export interface WfsGetCollectionsOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getCollections operation. */ -export type WfsGetCollectionsResponse = CollectionsResponse; - -/** Optional parameters. */ -export interface WfsGetCollectionOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getCollection operation. */ -export type WfsGetCollectionResponse = CollectionInfo; - -/** Optional parameters. */ -export interface WfsGetCollectionDefinitionOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getCollectionDefinition operation. */ -export type WfsGetCollectionDefinitionResponse = CollectionDefinitionResponse; - -/** Optional parameters. */ -export interface WfsGetFeaturesOptionalParams - extends coreClient.OperationOptions { - /** - * The optional limit parameter limits the number of features that are presented in the response document. - * Only features that are on the first level of the collection in the response document are counted. Nested objects contained within the explicitly requested features shall not be counted. - * * Minimum = 1 * Maximum = 50 * Default = 10 - */ - limit?: number; - /** - * Only features that have a geometry that intersects the supplied bounding box are selected. - * * Lower left corner, coordinate axis 1 * Lower left corner, coordinate axis 2 * Upper right corner, coordinate axis 1 * Upper right corner, coordinate axis 2 - * The coordinate reference system of the values is WGS84 longitude/latitude (http://www.opengis.net/def/crs/OGC/1.3/CRS84) unless a different coordinate reference system is specified in the parameter `bbox-crs`. - * For WGS84 longitude/latitude the values are in most cases the sequence of minimum longitude, minimum latitude, maximum longitude and maximum latitude. However, in cases where the box spans the antimeridian the first value (west-most box edge) is larger than the third value (east-most box edge). - */ - bbox?: string; - /** - * Filter expression to search for features with specific property values in a given collection. Only feature properties of scalar type and equals operator are supported. - * This is a special parameter where the parameter name is a case sensitive property name. The scheme for this parameter is {property name}={property value}. Unless "filter" is one of the property names in the collection, "filter" should not be used as a parameter name. To search for features with "name" property value "21N13", use "name=21N13". - * Multiple filters are supported and should be represented as multiple query parameters. E.g., =&= String values are case sensitive. - */ - filter?: string; -} - -/** Contains response data for the getFeatures operation. */ -export type WfsGetFeaturesResponse = ExtendedGeoJsonFeatureCollection; - -/** Optional parameters. */ -export interface WfsGetFeatureOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getFeature operation. */ -export type WfsGetFeatureResponse = FeatureResponse; - -/** Optional parameters. */ -export interface WfsDeleteFeatureOptionalParams - extends coreClient.OperationOptions {} - -/** Optional parameters. */ -export interface CreatorClientOptionalParams - extends coreClient.ServiceClientOptions { - /** This parameter specifies where the Azure Maps Creator resource is located. Valid values are us and eu. */ - geography?: Geography; - /** Specifies which account is intended for usage in conjunction with the Azure AD security model. It represents a unique ID for the Azure Maps account and can be retrieved from the Azure Maps management plane Account API. To use Azure AD security in Azure Maps see the following [articles](https://aka.ms/amauthdetails) for guidance. */ - xMsClientId?: string; - /** Overrides client endpoint. */ - endpoint?: string; -} diff --git a/sdk/maps/maps-creator/src/models/mappers.ts b/sdk/maps/maps-creator/src/models/mappers.ts deleted file mode 100644 index 4bb4e8bbca34..000000000000 --- a/sdk/maps/maps-creator/src/models/mappers.ts +++ /dev/null @@ -1,2429 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; - -export const AliasesCreateResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "AliasesCreateResponse", - modelProperties: { - createdTimestamp: { - serializedName: "createdTimestamp", - readOnly: true, - type: { - name: "String" - } - }, - aliasId: { - serializedName: "aliasId", - readOnly: true, - type: { - name: "String" - } - }, - creatorDataItemId: { - serializedName: "creatorDataItemId", - readOnly: true, - type: { - name: "String" - } - }, - lastUpdatedTimestamp: { - serializedName: "lastUpdatedTimestamp", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const ErrorResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorResponse", - modelProperties: { - error: { - serializedName: "error", - type: { - name: "Composite", - className: "ErrorDetail" - } - } - } - } -}; - -export const ErrorDetail: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorDetail", - modelProperties: { - code: { - serializedName: "code", - readOnly: true, - type: { - name: "String" - } - }, - message: { - serializedName: "message", - readOnly: true, - type: { - name: "String" - } - }, - target: { - serializedName: "target", - readOnly: true, - type: { - name: "String" - } - }, - details: { - serializedName: "details", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ErrorDetail" - } - } - } - }, - additionalInfo: { - serializedName: "additionalInfo", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ErrorAdditionalInfo" - } - } - } - } - } - } -}; - -export const ErrorAdditionalInfo: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorAdditionalInfo", - modelProperties: { - type: { - serializedName: "type", - readOnly: true, - type: { - name: "String" - } - }, - info: { - serializedName: "info", - readOnly: true, - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - } - } - } -}; - -export const AliasListResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "AliasListResponse", - modelProperties: { - aliases: { - serializedName: "aliases", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "AliasListItem" - } - } - } - }, - nextLink: { - serializedName: "nextLink", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const AliasListItem: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "AliasListItem", - modelProperties: { - createdTimestamp: { - serializedName: "createdTimestamp", - readOnly: true, - type: { - name: "String" - } - }, - aliasId: { - serializedName: "aliasId", - readOnly: true, - type: { - name: "String" - } - }, - creatorDataItemId: { - serializedName: "creatorDataItemId", - readOnly: true, - nullable: true, - type: { - name: "String" - } - }, - lastUpdatedTimestamp: { - serializedName: "lastUpdatedTimestamp", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const LongRunningOperationResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "LongRunningOperationResult", - modelProperties: { - operationId: { - serializedName: "operationId", - type: { - name: "String" - } - }, - status: { - serializedName: "status", - readOnly: true, - type: { - name: "String" - } - }, - created: { - serializedName: "created", - readOnly: true, - type: { - name: "String" - } - }, - error: { - serializedName: "error", - type: { - name: "Composite", - className: "ErrorDetail" - } - }, - warning: { - serializedName: "warning", - type: { - name: "Composite", - className: "ErrorDetail" - } - } - } - } -}; - -export const MapDataListResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "MapDataListResponse", - modelProperties: { - mapDataList: { - serializedName: "mapDataList", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "MapDataDetailInfo" - } - } - } - } - } - } -}; - -export const MapDataDetailInfo: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "MapDataDetailInfo", - modelProperties: { - udid: { - serializedName: "udid", - readOnly: true, - type: { - name: "String" - } - }, - location: { - serializedName: "location", - readOnly: true, - type: { - name: "String" - } - }, - sizeInBytes: { - serializedName: "sizeInBytes", - readOnly: true, - type: { - name: "Number" - } - }, - uploadStatus: { - serializedName: "uploadStatus", - readOnly: true, - type: { - name: "String" - } - }, - dataFormat: { - serializedName: "dataFormat", - readOnly: true, - type: { - name: "String" - } - }, - description: { - serializedName: "description", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const DatasetListResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "DatasetListResponse", - modelProperties: { - datasets: { - serializedName: "datasets", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "DatasetDetailInfo" - } - } - } - }, - nextLink: { - serializedName: "nextLink", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const DatasetDetailInfo: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "DatasetDetailInfo", - modelProperties: { - created: { - serializedName: "created", - readOnly: true, - type: { - name: "String" - } - }, - datasetId: { - serializedName: "datasetId", - readOnly: true, - type: { - name: "String" - } - }, - ontology: { - serializedName: "ontology", - readOnly: true, - type: { - name: "String" - } - }, - description: { - serializedName: "description", - readOnly: true, - type: { - name: "String" - } - }, - datasetSources: { - serializedName: "datasetSources", - type: { - name: "Composite", - className: "DatasetSources" - } - }, - featureCounts: { - serializedName: "featureCounts", - readOnly: true, - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - } - } - } -}; - -export const DatasetSources: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "DatasetSources", - modelProperties: { - conversionIds: { - serializedName: "conversionIds", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - appendDatasetId: { - serializedName: "appendDatasetId", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const ConversionListResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ConversionListResponse", - modelProperties: { - conversions: { - serializedName: "conversions", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ConversionListDetailInfo" - } - } - } - }, - nextLink: { - serializedName: "nextLink", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const ConversionListDetailInfo: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ConversionListDetailInfo", - modelProperties: { - conversionId: { - serializedName: "conversionId", - readOnly: true, - type: { - name: "String" - } - }, - ontology: { - serializedName: "ontology", - readOnly: true, - type: { - name: "String" - } - }, - udid: { - serializedName: "udid", - readOnly: true, - type: { - name: "String" - } - }, - created: { - serializedName: "created", - readOnly: true, - type: { - name: "String" - } - }, - description: { - serializedName: "description", - readOnly: true, - type: { - name: "String" - } - }, - featureCounts: { - serializedName: "featureCounts", - readOnly: true, - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - } - } - } -}; - -export const StylesObject: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "StylesObject", - modelProperties: { - styles: { - serializedName: "styles", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "StyleObject" - } - } - } - } - } - } -}; - -export const StyleObject: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "StyleObject", - uberParent: "StyleObject", - polymorphicDiscriminator: { - serializedName: "type", - clientName: "type" - }, - modelProperties: { - keyName: { - serializedName: "keyName", - required: true, - type: { - name: "String" - } - }, - type: { - serializedName: "type", - required: true, - type: { - name: "String" - } - } - } - } -}; - -export const StatesetCreatedResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "StatesetCreatedResponse", - modelProperties: { - statesetId: { - serializedName: "statesetId", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const StatesetListResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "StatesetListResponse", - modelProperties: { - statesets: { - serializedName: "statesets", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "StatesetInfoObject" - } - } - } - }, - nextLink: { - serializedName: "nextLink", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const StatesetInfoObject: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "StatesetInfoObject", - modelProperties: { - statesetId: { - serializedName: "statesetId", - type: { - name: "String" - } - }, - description: { - serializedName: "description", - readOnly: true, - type: { - name: "String" - } - }, - datasetIds: { - serializedName: "datasetIds", - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - statesetStyle: { - serializedName: "statesetStyle", - type: { - name: "Composite", - className: "StylesObject" - } - } - } - } -}; - -export const StatesetGetResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "StatesetGetResponse", - modelProperties: { - description: { - serializedName: "description", - readOnly: true, - type: { - name: "String" - } - }, - datasetIds: { - serializedName: "datasetIds", - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - statesetStyle: { - serializedName: "statesetStyle", - type: { - name: "Composite", - className: "StylesObject" - } - } - } - } -}; - -export const FeatureStatesStructure: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "FeatureStatesStructure", - modelProperties: { - states: { - serializedName: "states", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "FeatureStateObject" - } - } - } - } - } - } -}; - -export const FeatureStateObject: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "FeatureStateObject", - modelProperties: { - keyName: { - serializedName: "keyName", - type: { - name: "String" - } - }, - value: { - serializedName: "value", - type: { - name: "String" - } - }, - eventTimestamp: { - serializedName: "eventTimestamp", - type: { - name: "String" - } - } - } - } -}; - -export const GeofenceResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeofenceResponse", - modelProperties: { - geometries: { - serializedName: "geometries", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "GeofenceGeometry" - } - } - } - }, - expiredGeofenceGeometryId: { - serializedName: "expiredGeofenceGeometryId", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - invalidPeriodGeofenceGeometryId: { - serializedName: "invalidPeriodGeofenceGeometryId", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - isEventPublished: { - serializedName: "isEventPublished", - readOnly: true, - type: { - name: "Boolean" - } - } - } - } -}; - -export const GeofenceGeometry: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeofenceGeometry", - modelProperties: { - deviceId: { - serializedName: "deviceId", - readOnly: true, - type: { - name: "String" - } - }, - udId: { - serializedName: "udId", - readOnly: true, - type: { - name: "String" - } - }, - geometryId: { - serializedName: "geometryId", - readOnly: true, - type: { - name: "String" - } - }, - distance: { - serializedName: "distance", - readOnly: true, - type: { - name: "Number" - } - }, - nearestLat: { - serializedName: "nearestLat", - readOnly: true, - type: { - name: "Number" - } - }, - nearestLon: { - serializedName: "nearestLon", - readOnly: true, - type: { - name: "Number" - } - }, - nearestZ: { - serializedName: "nearestZ", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const BufferRequestBody: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "BufferRequestBody", - modelProperties: { - geometries: { - serializedName: "geometries", - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - }, - distances: { - serializedName: "distances", - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } -}; - -export const BufferResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "BufferResponse", - modelProperties: { - summary: { - serializedName: "summary", - type: { - name: "Composite", - className: "BufferResponseSummary" - } - }, - result: { - serializedName: "result", - type: { - name: "Composite", - className: "GeoJsonFeatureCollection" - } - } - } - } -}; - -export const BufferResponseSummary: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "BufferResponseSummary", - modelProperties: { - udid: { - serializedName: "udid", - readOnly: true, - type: { - name: "String" - } - }, - information: { - serializedName: "information", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const GeoJsonObject: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonObject", - uberParent: "GeoJsonObject", - polymorphicDiscriminator: { - serializedName: "type", - clientName: "type" - }, - modelProperties: { - type: { - serializedName: "type", - required: true, - type: { - name: "String" - } - } - } - } -}; - -export const GeoJsonFeatureCollectionData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonFeatureCollectionData", - modelProperties: { - features: { - serializedName: "features", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "GeoJsonFeature" - } - } - } - } - } - } -}; - -export const GeoJsonFeatureData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonFeatureData", - modelProperties: { - geometry: { - serializedName: "geometry", - type: { - name: "Composite", - className: "GeoJsonGeometry" - } - }, - properties: { - serializedName: "properties", - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - }, - id: { - serializedName: "id", - type: { - name: "String" - } - }, - featureType: { - serializedName: "featureType", - type: { - name: "String" - } - } - } - } -}; - -export const ClosestPointResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ClosestPointResponse", - modelProperties: { - summary: { - serializedName: "summary", - type: { - name: "Composite", - className: "ClosestPointSummary" - } - }, - result: { - serializedName: "result", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ClosestPointResultEntry" - } - } - } - } - } - } -}; - -export const ClosestPointSummary: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ClosestPointSummary", - modelProperties: { - sourcePoint: { - serializedName: "sourcePoint", - type: { - name: "Composite", - className: "SpatialCoordinate" - } - }, - udid: { - serializedName: "udid", - readOnly: true, - type: { - name: "String" - } - }, - information: { - serializedName: "information", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const SpatialCoordinate: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SpatialCoordinate", - modelProperties: { - lat: { - serializedName: "lat", - readOnly: true, - type: { - name: "Number" - } - }, - lon: { - serializedName: "lon", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const ClosestPointResultEntry: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ClosestPointResultEntry", - modelProperties: { - distanceInMeters: { - serializedName: "distanceInMeters", - readOnly: true, - type: { - name: "Number" - } - }, - position: { - serializedName: "position", - type: { - name: "Composite", - className: "SpatialCoordinate" - } - }, - geometryId: { - serializedName: "geometryId", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const PointInPolygonResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "PointInPolygonResponse", - modelProperties: { - summary: { - serializedName: "summary", - type: { - name: "Composite", - className: "PointInPolygonSummary" - } - }, - result: { - serializedName: "result", - type: { - name: "Composite", - className: "PointInPolygonResult" - } - } - } - } -}; - -export const PointInPolygonSummary: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "PointInPolygonSummary", - modelProperties: { - sourcePoint: { - serializedName: "sourcePoint", - type: { - name: "Composite", - className: "SpatialCoordinate" - } - }, - udid: { - serializedName: "udid", - readOnly: true, - type: { - name: "String" - } - }, - information: { - serializedName: "information", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const PointInPolygonResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "PointInPolygonResult", - modelProperties: { - pointInPolygons: { - serializedName: "pointInPolygons", - readOnly: true, - type: { - name: "Boolean" - } - }, - intersectingGeometries: { - serializedName: "intersectingGeometries", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - } - } - } -}; - -export const GreatCircleDistanceResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GreatCircleDistanceResponse", - modelProperties: { - summary: { - serializedName: "summary", - type: { - name: "Composite", - className: "GreatCircleDistanceResponseSummary" - } - }, - result: { - serializedName: "result", - type: { - name: "Composite", - className: "GreatCircleDistanceResponseResult" - } - } - } - } -}; - -export const GreatCircleDistanceResponseSummary: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GreatCircleDistanceResponseSummary", - modelProperties: { - sourcePoint: { - serializedName: "sourcePoint", - type: { - name: "Composite", - className: "SpatialCoordinate" - } - }, - targetPoint: { - serializedName: "targetPoint", - type: { - name: "Composite", - className: "SpatialCoordinate" - } - } - } - } -}; - -export const GreatCircleDistanceResponseResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GreatCircleDistanceResponseResult", - modelProperties: { - distanceInMeters: { - serializedName: "distanceInMeters", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const TilesetListResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TilesetListResponse", - modelProperties: { - tilesets: { - serializedName: "tilesets", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "TilesetDetailInfo" - } - } - } - }, - nextLink: { - serializedName: "nextLink", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const TilesetDetailInfo: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TilesetDetailInfo", - modelProperties: { - tilesetId: { - serializedName: "tilesetId", - readOnly: true, - type: { - name: "String" - } - }, - ontology: { - serializedName: "ontology", - readOnly: true, - type: { - name: "String" - } - }, - datasetId: { - serializedName: "datasetId", - readOnly: true, - type: { - name: "String" - } - }, - description: { - serializedName: "description", - readOnly: true, - type: { - name: "String" - } - }, - minZoom: { - serializedName: "minZoom", - readOnly: true, - type: { - name: "Number" - } - }, - maxZoom: { - serializedName: "maxZoom", - readOnly: true, - type: { - name: "Number" - } - }, - bbox: { - serializedName: "bbox", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } -}; - -export const LandingPageResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "LandingPageResponse", - modelProperties: { - ontology: { - serializedName: "ontology", - readOnly: true, - type: { - name: "String" - } - }, - links: { - serializedName: "links", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "WfsEndpointLink" - } - } - } - } - } - } -}; - -export const WfsEndpointLink: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "WfsEndpointLink", - modelProperties: { - href: { - serializedName: "href", - required: true, - type: { - name: "String" - } - }, - rel: { - serializedName: "rel", - type: { - name: "String" - } - }, - type: { - serializedName: "type", - type: { - name: "String" - } - }, - hreflang: { - serializedName: "hreflang", - type: { - name: "String" - } - }, - title: { - serializedName: "title", - type: { - name: "String" - } - } - } - } -}; - -export const ConformanceResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ConformanceResponse", - modelProperties: { - conformsTo: { - serializedName: "conformsTo", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - } - } - } -}; - -export const CollectionsResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "CollectionsResponse", - modelProperties: { - ontology: { - serializedName: "ontology", - readOnly: true, - type: { - name: "String" - } - }, - links: { - serializedName: "links", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "WfsEndpointLink" - } - } - } - }, - collections: { - serializedName: "collections", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "CollectionInfo" - } - } - } - } - } - } -}; - -export const CollectionInfo: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "CollectionInfo", - modelProperties: { - name: { - serializedName: "name", - required: true, - type: { - name: "String" - } - }, - title: { - serializedName: "title", - type: { - name: "String" - } - }, - ontology: { - serializedName: "ontology", - readOnly: true, - type: { - name: "String" - } - }, - description: { - serializedName: "description", - type: { - name: "String" - } - }, - links: { - serializedName: "links", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "WfsEndpointLink" - } - } - } - } - } - } -}; - -export const CollectionDefinitionResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "CollectionDefinitionResponse", - modelProperties: { - description: { - serializedName: "description", - type: { - name: "String" - } - }, - idPrefix: { - serializedName: "idPrefix", - required: true, - type: { - name: "String" - } - }, - name: { - serializedName: "name", - required: true, - type: { - name: "String" - } - }, - title: { - serializedName: "title", - type: { - name: "String" - } - }, - ontology: { - serializedName: "ontology", - readOnly: true, - type: { - name: "String" - } - }, - geometryType: { - serializedName: "geometryType", - required: true, - type: { - name: "String" - } - }, - featureTypes: { - serializedName: "featureTypes", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - properties: { - serializedName: "properties", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "DefinitionProperties" - } - } - } - }, - links: { - serializedName: "links", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "WfsEndpointLink" - } - } - } - } - } - } -}; - -export const DefinitionProperties: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "DefinitionProperties", - modelProperties: { - name: { - serializedName: "name", - required: true, - type: { - name: "String" - } - }, - required: { - serializedName: "required", - required: true, - type: { - name: "Boolean" - } - }, - type: { - serializedName: "type", - required: true, - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - } - } - } -}; - -export const ExtendedGeoJsonFeatureCollectionData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ExtendedGeoJsonFeatureCollectionData", - modelProperties: { - ontology: { - serializedName: "ontology", - readOnly: true, - type: { - name: "String" - } - }, - numberReturned: { - serializedName: "numberReturned", - type: { - name: "Number" - } - }, - links: { - serializedName: "links", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "WfsEndpointLink" - } - } - } - } - } - } -}; - -export const FeatureResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "FeatureResponse", - modelProperties: { - ontology: { - serializedName: "ontology", - readOnly: true, - type: { - name: "String" - } - }, - feature: { - serializedName: "feature", - type: { - name: "Composite", - className: "GeoJsonFeature" - } - }, - links: { - serializedName: "links", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "WfsEndpointLink" - } - } - } - } - } - } -}; - -export const NumberRuleObject: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "NumberRuleObject", - modelProperties: { - range: { - serializedName: "range", - type: { - name: "Composite", - className: "RangeObject" - } - }, - color: { - serializedName: "color", - type: { - name: "String" - } - } - } - } -}; - -export const RangeObject: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RangeObject", - modelProperties: { - minimum: { - serializedName: "minimum", - type: { - name: "Number" - } - }, - maximum: { - serializedName: "maximum", - type: { - name: "Number" - } - }, - exclusiveMinimum: { - serializedName: "exclusiveMinimum", - type: { - name: "Number" - } - }, - exclusiveMaximum: { - serializedName: "exclusiveMaximum", - type: { - name: "Number" - } - } - } - } -}; - -export const BooleanRuleObject: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "BooleanRuleObject", - modelProperties: { - true: { - serializedName: "true", - type: { - name: "String" - } - }, - false: { - serializedName: "false", - type: { - name: "String" - } - } - } - } -}; - -export const GeoJsonPointData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonPointData", - modelProperties: { - coordinates: { - serializedName: "coordinates", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } -}; - -export const GeoJsonMultiPointData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonMultiPointData", - modelProperties: { - coordinates: { - serializedName: "coordinates", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } - } - } -}; - -export const GeoJsonLineStringData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonLineStringData", - modelProperties: { - coordinates: { - serializedName: "coordinates", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } - } - } -}; - -export const GeoJsonMultiLineStringData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonMultiLineStringData", - modelProperties: { - coordinates: { - serializedName: "coordinates", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } - } - } - } - } -}; - -export const GeoJsonPolygonData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonPolygonData", - modelProperties: { - coordinates: { - serializedName: "coordinates", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } - } - } - } - } -}; - -export const GeoJsonMultiPolygonData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonMultiPolygonData", - modelProperties: { - coordinates: { - serializedName: "coordinates", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } - } - } - } - } - } - } -}; - -export const GeoJsonGeometryCollectionData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonGeometryCollectionData", - modelProperties: { - geometries: { - serializedName: "geometries", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "GeoJsonGeometry" - } - } - } - } - } - } -}; - -export const BooleanTypeStyleRule: coreClient.CompositeMapper = { - serializedName: "boolean", - type: { - name: "Composite", - className: "BooleanTypeStyleRule", - uberParent: "StyleObject", - polymorphicDiscriminator: StyleObject.type.polymorphicDiscriminator, - modelProperties: { - ...StyleObject.type.modelProperties, - rules: { - serializedName: "rules", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "BooleanRuleObject" - } - } - } - } - } - } -}; - -export const NumberTypeStyleRule: coreClient.CompositeMapper = { - serializedName: "number", - type: { - name: "Composite", - className: "NumberTypeStyleRule", - uberParent: "StyleObject", - polymorphicDiscriminator: StyleObject.type.polymorphicDiscriminator, - modelProperties: { - ...StyleObject.type.modelProperties, - rules: { - serializedName: "rules", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "NumberRuleObject" - } - } - } - } - } - } -}; - -export const StringTypeStyleRule: coreClient.CompositeMapper = { - serializedName: "string", - type: { - name: "Composite", - className: "StringTypeStyleRule", - uberParent: "StyleObject", - polymorphicDiscriminator: StyleObject.type.polymorphicDiscriminator, - modelProperties: { - ...StyleObject.type.modelProperties, - rules: { - serializedName: "rules", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Dictionary", - value: { type: { name: "String" } } - } - } - } - } - } - } -}; - -export const GeoJsonGeometry: coreClient.CompositeMapper = { - serializedName: "GeoJsonGeometry", - type: { - name: "Composite", - className: "GeoJsonGeometry", - uberParent: "GeoJsonObject", - polymorphicDiscriminator: { - serializedName: "type", - clientName: "type" - }, - modelProperties: { - ...GeoJsonObject.type.modelProperties - } - } -}; - -export const GeoJsonFeature: coreClient.CompositeMapper = { - serializedName: "Feature", - type: { - name: "Composite", - className: "GeoJsonFeature", - uberParent: "GeoJsonObject", - polymorphicDiscriminator: GeoJsonObject.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonObject.type.modelProperties, - ...GeoJsonFeatureData.type.modelProperties - } - } -}; - -export const GeoJsonFeatureCollection: coreClient.CompositeMapper = { - serializedName: "FeatureCollection", - type: { - name: "Composite", - className: "GeoJsonFeatureCollection", - uberParent: "GeoJsonObject", - polymorphicDiscriminator: { - serializedName: "type", - clientName: "type" - }, - modelProperties: { - ...GeoJsonObject.type.modelProperties, - ...GeoJsonFeatureCollectionData.type.modelProperties - } - } -}; - -export const ExtendedGeoJsonFeatureCollection: coreClient.CompositeMapper = { - serializedName: "FeatureCollection", - type: { - name: "Composite", - className: "ExtendedGeoJsonFeatureCollection", - uberParent: "ExtendedGeoJsonFeatureCollectionData", - polymorphicDiscriminator: - ExtendedGeoJsonFeatureCollectionData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonFeatureCollection.type.modelProperties, - ...ExtendedGeoJsonFeatureCollectionData.type.modelProperties - } - } -}; - -export const GeoJsonPoint: coreClient.CompositeMapper = { - serializedName: "Point", - type: { - name: "Composite", - className: "GeoJsonPoint", - uberParent: "GeoJsonPointData", - polymorphicDiscriminator: GeoJsonPointData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonPointData.type.modelProperties - } - } -}; - -export const GeoJsonMultiPoint: coreClient.CompositeMapper = { - serializedName: "MultiPoint", - type: { - name: "Composite", - className: "GeoJsonMultiPoint", - uberParent: "GeoJsonMultiPointData", - polymorphicDiscriminator: - GeoJsonMultiPointData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonMultiPointData.type.modelProperties - } - } -}; - -export const GeoJsonLineString: coreClient.CompositeMapper = { - serializedName: "LineString", - type: { - name: "Composite", - className: "GeoJsonLineString", - uberParent: "GeoJsonLineStringData", - polymorphicDiscriminator: - GeoJsonLineStringData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonLineStringData.type.modelProperties - } - } -}; - -export const GeoJsonMultiLineString: coreClient.CompositeMapper = { - serializedName: "MultiLineString", - type: { - name: "Composite", - className: "GeoJsonMultiLineString", - uberParent: "GeoJsonMultiLineStringData", - polymorphicDiscriminator: - GeoJsonMultiLineStringData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonMultiLineStringData.type.modelProperties - } - } -}; - -export const GeoJsonPolygon: coreClient.CompositeMapper = { - serializedName: "Polygon", - type: { - name: "Composite", - className: "GeoJsonPolygon", - uberParent: "GeoJsonPolygonData", - polymorphicDiscriminator: GeoJsonPolygonData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonPolygonData.type.modelProperties - } - } -}; - -export const GeoJsonMultiPolygon: coreClient.CompositeMapper = { - serializedName: "MultiPolygon", - type: { - name: "Composite", - className: "GeoJsonMultiPolygon", - uberParent: "GeoJsonMultiPolygonData", - polymorphicDiscriminator: - GeoJsonMultiPolygonData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonMultiPolygonData.type.modelProperties - } - } -}; - -export const GeoJsonGeometryCollection: coreClient.CompositeMapper = { - serializedName: "GeometryCollection", - type: { - name: "Composite", - className: "GeoJsonGeometryCollection", - uberParent: "GeoJsonGeometryCollectionData", - polymorphicDiscriminator: - GeoJsonGeometryCollectionData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonGeometryCollectionData.type.modelProperties - } - } -}; - -export const AliasCreateHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "AliasCreateHeaders", - modelProperties: { - accessControlExposeHeaders: { - serializedName: "access-control-expose-headers", - type: { - name: "String" - } - } - } - } -}; - -export const DataUploadPreviewHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "DataUploadPreviewHeaders", - modelProperties: { - resourceLocation: { - serializedName: "resource-location", - type: { - name: "String" - } - } - } - } -}; - -export const DataUpdatePreviewHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "DataUpdatePreviewHeaders", - modelProperties: { - resourceLocation: { - serializedName: "resource-location", - type: { - name: "String" - } - } - } - } -}; - -export const DataDownloadPreviewHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "DataDownloadPreviewHeaders", - modelProperties: { - contentType: { - serializedName: "content-type", - type: { - name: "String" - } - } - } - } -}; - -export const DataGetOperationPreviewHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "DataGetOperationPreviewHeaders", - modelProperties: { - resourceLocation: { - serializedName: "resource-location", - type: { - name: "String" - } - } - } - } -}; - -export const DatasetCreateHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "DatasetCreateHeaders", - modelProperties: { - resourceLocation: { - serializedName: "resource-location", - type: { - name: "String" - } - } - } - } -}; - -export const DatasetGetOperationHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "DatasetGetOperationHeaders", - modelProperties: { - resourceLocation: { - serializedName: "resource-location", - type: { - name: "String" - } - } - } - } -}; - -export const ConversionConvertHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ConversionConvertHeaders", - modelProperties: { - resourceLocation: { - serializedName: "resource-location", - type: { - name: "String" - } - } - } - } -}; - -export const ConversionGetOperationHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ConversionGetOperationHeaders", - modelProperties: { - resourceLocation: { - serializedName: "resource-location", - type: { - name: "String" - } - } - } - } -}; - -export const SpatialGetGeofenceHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SpatialGetGeofenceHeaders", - modelProperties: { - xCorrelationId: { - serializedName: "x-correlation-id", - type: { - name: "String" - } - } - } - } -}; - -export const SpatialPostGeofenceHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SpatialPostGeofenceHeaders", - modelProperties: { - xCorrelationId: { - serializedName: "x-correlation-id", - type: { - name: "String" - } - } - } - } -}; - -export const TilesetCreateHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TilesetCreateHeaders", - modelProperties: { - resourceLocation: { - serializedName: "resource-location", - type: { - name: "String" - } - } - } - } -}; - -export const TilesetGetOperationHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TilesetGetOperationHeaders", - modelProperties: { - resourceLocation: { - serializedName: "resource-location", - type: { - name: "String" - } - } - } - } -}; - -export let discriminators = { - StyleObject: StyleObject, - GeoJsonObject: GeoJsonObject, - "StyleObject.boolean": BooleanTypeStyleRule, - "StyleObject.number": NumberTypeStyleRule, - "StyleObject.string": StringTypeStyleRule, - "GeoJsonObject.GeoJsonGeometry": GeoJsonGeometry, - "GeoJsonObject.Feature": GeoJsonFeature, - "GeoJsonObject.FeatureCollection": GeoJsonFeatureCollection, - "ExtendedGeoJsonFeatureCollectionData.FeatureCollection": ExtendedGeoJsonFeatureCollection, - "GeoJsonPointData.Point": GeoJsonPoint, - "GeoJsonMultiPointData.MultiPoint": GeoJsonMultiPoint, - "GeoJsonLineStringData.LineString": GeoJsonLineString, - "GeoJsonMultiLineStringData.MultiLineString": GeoJsonMultiLineString, - "GeoJsonPolygonData.Polygon": GeoJsonPolygon, - "GeoJsonMultiPolygonData.MultiPolygon": GeoJsonMultiPolygon, - "GeoJsonGeometryCollectionData.GeometryCollection": GeoJsonGeometryCollection -}; diff --git a/sdk/maps/maps-creator/src/models/parameters.ts b/sdk/maps/maps-creator/src/models/parameters.ts deleted file mode 100644 index e1b3aa342168..000000000000 --- a/sdk/maps/maps-creator/src/models/parameters.ts +++ /dev/null @@ -1,629 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { - OperationParameter, - OperationURLParameter, - OperationQueryParameter -} from "@azure/core-client"; -import { - StylesObject as StylesObjectMapper, - FeatureStatesStructure as FeatureStatesStructureMapper, - BufferRequestBody as BufferRequestBodyMapper -} from "../models/mappers"; - -export const accept: OperationParameter = { - parameterPath: "accept", - mapper: { - defaultValue: "application/json", - isConstant: true, - serializedName: "Accept", - type: { - name: "String" - } - } -}; - -export const geography: OperationURLParameter = { - parameterPath: "geography", - mapper: { - serializedName: "geography", - required: true, - type: { - name: "String" - } - } -}; - -export const apiVersion: OperationQueryParameter = { - parameterPath: "apiVersion", - mapper: { - defaultValue: "2.0", - isConstant: true, - serializedName: "api-version", - type: { - name: "String" - } - } -}; - -export const creatorDataItemId: OperationQueryParameter = { - parameterPath: ["options", "creatorDataItemId"], - mapper: { - serializedName: "creatorDataItemId", - type: { - name: "String" - } - } -}; - -export const aliasId: OperationURLParameter = { - parameterPath: "aliasId", - mapper: { - serializedName: "aliasId", - required: true, - type: { - name: "String" - } - } -}; - -export const creatorDataItemId1: OperationQueryParameter = { - parameterPath: "creatorDataItemId", - mapper: { - serializedName: "creatorDataItemId", - required: true, - type: { - name: "String" - } - } -}; - -export const nextLink: OperationURLParameter = { - parameterPath: "nextLink", - mapper: { - serializedName: "nextLink", - required: true, - type: { - name: "String" - } - }, - skipEncoding: true -}; - -export const contentType: OperationParameter = { - parameterPath: "contentType", - mapper: { - defaultValue: "application/octet-stream", - isConstant: true, - serializedName: "Content-Type", - type: { - name: "String" - } - } -}; - -export const uploadContent: OperationParameter = { - parameterPath: "uploadContent", - mapper: { - serializedName: "uploadContent", - required: true, - type: { - name: "Stream" - } - } -}; - -export const accept1: OperationParameter = { - parameterPath: "accept", - mapper: { - defaultValue: "application/json", - isConstant: true, - serializedName: "Accept", - type: { - name: "String" - } - } -}; - -export const contentType1: OperationParameter = { - parameterPath: "contentType", - mapper: { - defaultValue: "application/json", - isConstant: true, - serializedName: "Content-Type", - type: { - name: "String" - } - } -}; - -export const uploadContent1: OperationParameter = { - parameterPath: "uploadContent", - mapper: { - serializedName: "uploadContent", - required: true, - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - } -}; - -export const xMsClientId: OperationParameter = { - parameterPath: "xMsClientId", - mapper: { - serializedName: "x-ms-client-id", - type: { - name: "String" - } - } -}; - -export const uploadDataDescription: OperationQueryParameter = { - parameterPath: ["options", "uploadDataDescription"], - mapper: { - serializedName: "description", - type: { - name: "String" - } - } -}; - -export const uploadDataFormat: OperationQueryParameter = { - parameterPath: "uploadDataFormat", - mapper: { - serializedName: "dataFormat", - required: true, - type: { - name: "String" - } - } -}; - -export const contentType2: OperationParameter = { - parameterPath: ["options", "contentType"], - mapper: { - defaultValue: "application/json", - isConstant: true, - serializedName: "Content-Type", - type: { - name: "String" - } - } -}; - -export const updateContent: OperationParameter = { - parameterPath: "updateContent", - mapper: { - serializedName: "updateContent", - required: true, - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - } -}; - -export const uniqueDataId: OperationURLParameter = { - parameterPath: "uniqueDataId", - mapper: { - serializedName: "udid", - required: true, - type: { - name: "String" - } - } -}; - -export const accept2: OperationParameter = { - parameterPath: "accept", - mapper: { - defaultValue: - "application/json, application/vnd.geo+json, application/octet-stream", - isConstant: true, - serializedName: "Accept", - type: { - name: "String" - } - } -}; - -export const operationId: OperationURLParameter = { - parameterPath: "operationId", - mapper: { - serializedName: "operationId", - required: true, - type: { - name: "String" - } - } -}; - -export const conversionId: OperationQueryParameter = { - parameterPath: "conversionId", - mapper: { - serializedName: "conversionId", - required: true, - type: { - name: "String" - } - } -}; - -export const datasetId: OperationQueryParameter = { - parameterPath: ["options", "datasetId"], - mapper: { - serializedName: "datasetId", - type: { - name: "String" - } - } -}; - -export const descriptionDataset: OperationQueryParameter = { - parameterPath: ["options", "descriptionDataset"], - mapper: { - serializedName: "description", - type: { - name: "String" - } - } -}; - -export const datasetId1: OperationURLParameter = { - parameterPath: "datasetId", - mapper: { - serializedName: "datasetId", - required: true, - type: { - name: "String" - } - } -}; - -export const udid: OperationQueryParameter = { - parameterPath: "udid", - mapper: { - serializedName: "udid", - required: true, - type: { - name: "String" - } - } -}; - -export const outputOntology: OperationQueryParameter = { - parameterPath: "outputOntology", - mapper: { - serializedName: "outputOntology", - required: true, - type: { - name: "String" - } - } -}; - -export const description: OperationQueryParameter = { - parameterPath: ["options", "description"], - mapper: { - serializedName: "description", - type: { - name: "String" - } - } -}; - -export const conversionId1: OperationURLParameter = { - parameterPath: "conversionId", - mapper: { - serializedName: "conversionId", - required: true, - type: { - name: "String" - } - } -}; - -export const statesetCreateRequestBody: OperationParameter = { - parameterPath: "statesetCreateRequestBody", - mapper: StylesObjectMapper -}; - -export const datasetId2: OperationQueryParameter = { - parameterPath: "datasetId", - mapper: { - serializedName: "datasetId", - required: true, - type: { - name: "String" - } - } -}; - -export const statesetStyleUpdateRequestBody: OperationParameter = { - parameterPath: "statesetStyleUpdateRequestBody", - mapper: StylesObjectMapper -}; - -export const statesetId: OperationURLParameter = { - parameterPath: "statesetId", - mapper: { - serializedName: "statesetId", - required: true, - type: { - name: "String" - } - } -}; - -export const featureStateUpdateRequestBody: OperationParameter = { - parameterPath: "featureStateUpdateRequestBody", - mapper: FeatureStatesStructureMapper -}; - -export const featureId: OperationURLParameter = { - parameterPath: "featureId", - mapper: { - serializedName: "featureId", - required: true, - type: { - name: "String" - } - } -}; - -export const stateKeyName: OperationQueryParameter = { - parameterPath: "stateKeyName", - mapper: { - serializedName: "stateKeyName", - required: true, - type: { - name: "String" - } - } -}; - -export const apiVersion1: OperationQueryParameter = { - parameterPath: "apiVersion", - mapper: { - defaultValue: "1.0", - isConstant: true, - serializedName: "api-version", - type: { - name: "String" - } - } -}; - -export const format: OperationURLParameter = { - parameterPath: "format", - mapper: { - serializedName: "format", - required: true, - type: { - name: "String" - } - } -}; - -export const deviceId: OperationQueryParameter = { - parameterPath: "deviceId", - mapper: { - serializedName: "deviceId", - required: true, - type: { - name: "String" - } - } -}; - -export const latitude: OperationQueryParameter = { - parameterPath: "latitude", - mapper: { - serializedName: "lat", - required: true, - type: { - name: "Number" - } - } -}; - -export const longitude: OperationQueryParameter = { - parameterPath: "longitude", - mapper: { - serializedName: "lon", - required: true, - type: { - name: "Number" - } - } -}; - -export const z: OperationQueryParameter = { - parameterPath: ["options", "z"], - mapper: { - serializedName: "z", - type: { - name: "Number" - } - } -}; - -export const userTime: OperationQueryParameter = { - parameterPath: ["options", "userTime"], - mapper: { - serializedName: "userTime", - type: { - name: "DateTime" - } - } -}; - -export const searchBuffer: OperationQueryParameter = { - parameterPath: ["options", "searchBuffer"], - mapper: { - constraints: { - InclusiveMaximum: 500, - InclusiveMinimum: 0 - }, - serializedName: "searchBuffer", - type: { - name: "Number" - } - } -}; - -export const isAsync: OperationQueryParameter = { - parameterPath: ["options", "isAsync"], - mapper: { - serializedName: "isAsync", - type: { - name: "Boolean" - } - } -}; - -export const mode: OperationQueryParameter = { - parameterPath: ["options", "mode"], - mapper: { - serializedName: "mode", - type: { - name: "String" - } - } -}; - -export const searchGeofenceRequestBody: OperationParameter = { - parameterPath: "searchGeofenceRequestBody", - mapper: { - serializedName: "searchGeofenceRequestBody", - required: true, - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - } -}; - -export const bufferRequestBody: OperationParameter = { - parameterPath: "bufferRequestBody", - mapper: BufferRequestBodyMapper -}; - -export const distances: OperationQueryParameter = { - parameterPath: "distances", - mapper: { - serializedName: "distances", - required: true, - type: { - name: "String" - } - } -}; - -export const closestPointRequestBody: OperationParameter = { - parameterPath: "closestPointRequestBody", - mapper: { - serializedName: "closestPointRequestBody", - required: true, - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - } -}; - -export const numberOfClosestPoints: OperationQueryParameter = { - parameterPath: ["options", "numberOfClosestPoints"], - mapper: { - serializedName: "numberOfClosestPoints", - type: { - name: "Number" - } - } -}; - -export const pointInPolygonRequestBody: OperationParameter = { - parameterPath: "pointInPolygonRequestBody", - mapper: { - serializedName: "pointInPolygonRequestBody", - required: true, - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - } -}; - -export const query: OperationQueryParameter = { - parameterPath: "query", - mapper: { - serializedName: "query", - required: true, - type: { - name: "String" - } - } -}; - -export const tilesetId: OperationURLParameter = { - parameterPath: "tilesetId", - mapper: { - serializedName: "tilesetId", - required: true, - type: { - name: "String" - } - } -}; - -export const collectionId: OperationURLParameter = { - parameterPath: "collectionId", - mapper: { - serializedName: "collectionId", - required: true, - type: { - name: "String" - } - } -}; - -export const limit: OperationQueryParameter = { - parameterPath: ["options", "limit"], - mapper: { - constraints: { - InclusiveMaximum: 50, - InclusiveMinimum: 1 - }, - serializedName: "limit", - type: { - name: "Number" - } - } -}; - -export const bbox: OperationQueryParameter = { - parameterPath: ["options", "bbox"], - mapper: { - serializedName: "bbox", - type: { - name: "String" - } - } -}; - -export const filter: OperationQueryParameter = { - parameterPath: ["options", "filter"], - mapper: { - serializedName: "filter", - type: { - name: "String" - } - } -}; diff --git a/sdk/maps/maps-creator/src/operations/alias.ts b/sdk/maps/maps-creator/src/operations/alias.ts deleted file mode 100644 index 5d9606015fc4..000000000000 --- a/sdk/maps/maps-creator/src/operations/alias.ts +++ /dev/null @@ -1,445 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import "@azure/core-paging"; -import { PagedAsyncIterableIterator } from "@azure/core-paging"; -import { Alias } from "../operationsInterfaces"; -import * as coreClient from "@azure/core-client"; -import * as Mappers from "../models/mappers"; -import * as Parameters from "../models/parameters"; -import { CreatorClientContext } from "../creatorClientContext"; -import { - AliasListItem, - AliasListNextOptionalParams, - AliasListOptionalParams, - AliasCreateOptionalParams, - AliasCreateResponse, - AliasListOperationResponse, - AliasAssignOptionalParams, - AliasAssignResponse, - AliasDeleteOptionalParams, - AliasGetDetailsOptionalParams, - AliasGetDetailsResponse, - AliasListNextResponse -} from "../models"; - -/// -/** Class representing a Alias. */ -export class AliasImpl implements Alias { - private readonly client: CreatorClientContext; - - /** - * Initialize a new instance of the class Alias class. - * @param client Reference to the service client - */ - constructor(client: CreatorClientContext) { - this.client = client; - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a list of all previously successfully created aliases. - * - * ### Submit List Request - * - * To list all your aliases, you will issue a `GET` request with no additional parameters. - * - * ### List Data Response - * - * The List API returns the complete list of all aliases in `json` format. The response contains the - * following details for each alias resource: - * > createdTimestamp - The timestamp that the alias was created. Format yyyy-MM-ddTHH:mm:ss.sssZ - * > aliasId - The id for the alias. - * > creatorDataItemId - The id for the creator data item that this alias references (could be null - * if the alias has not been assigned). - * > lastUpdatedTimestamp - The last time the alias was assigned to a resource. Format - * yyyy-MM-ddTHH:mm:ss.sssZ - * - * A sample response returning 2 alias resources: - * - * ```json - * { - * "aliases": [ - * { - * "createdTimestamp": "2020-02-13T21:19:11.123Z", - * "aliasId": "a8a4b8bb-ecf4-fb27-a618-f41721552766", - * "creatorDataItemId": "e89aebb9-70a3-8fe1-32bb-1fbd0c725f14", - * "lastUpdatedTimestamp": "2020-02-13T21:19:22.123Z" - * }, - * { - * "createdTimestamp": "2020-02-18T19:53:33.123Z", - * "aliasId": "1856dbfc-7a66-ee5a-bf8d-51dbfe1906f6", - * "creatorDataItemId": null, - * "lastUpdatedTimestamp": "2020-02-18T19:53:33.123Z" - * } - * ] - * } - * ``` - * @param options The options parameters. - */ - public list( - options?: AliasListOptionalParams - ): PagedAsyncIterableIterator { - const iter = this.listPagingAll(options); - return { - next() { - return iter.next(); - }, - [Symbol.asyncIterator]() { - return this; - }, - byPage: () => { - return this.listPagingPage(options); - } - }; - } - - private async *listPagingPage( - options?: AliasListOptionalParams - ): AsyncIterableIterator { - let result = await this._list(options); - yield result.aliases || []; - let continuationToken = result.nextLink; - while (continuationToken) { - result = await this._listNext(continuationToken, options); - continuationToken = result.nextLink; - yield result.aliases || []; - } - } - - private async *listPagingAll( - options?: AliasListOptionalParams - ): AsyncIterableIterator { - for await (const page of this.listPagingPage(options)) { - yield* page; - } - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to create an alias. You can also assign the alias during the create - * request. An alias can reference an ID generated by a creator service, but cannot reference another - * alias ID. - * - * ### Submit Create Request - * - * To create your alias, you will use a `POST` request. If you would like to assign the alias during - * the creation, you will pass the `resourceId` query parameter. - * - * ### Create Alias Response - * - * The Create API returns a HTTP `201 Created` response with the alias resource in the body. - * - * A sample response from creating an alias: - * - * ```json - * { - * "createdTimestamp": "2020-02-13T21:19:11.123Z", - * "aliasId": "a8a4b8bb-ecf4-fb27-a618-f41721552766", - * "creatorDataItemId": "e89aebb9-70a3-8fe1-32bb-1fbd0c725f14", - * "lastUpdatedTimestamp": "2020-02-13T21:19:22.123Z" - * } - * ``` - * @param options The options parameters. - */ - create(options?: AliasCreateOptionalParams): Promise { - return this.client.sendOperationRequest({ options }, createOperationSpec); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a list of all previously successfully created aliases. - * - * ### Submit List Request - * - * To list all your aliases, you will issue a `GET` request with no additional parameters. - * - * ### List Data Response - * - * The List API returns the complete list of all aliases in `json` format. The response contains the - * following details for each alias resource: - * > createdTimestamp - The timestamp that the alias was created. Format yyyy-MM-ddTHH:mm:ss.sssZ - * > aliasId - The id for the alias. - * > creatorDataItemId - The id for the creator data item that this alias references (could be null - * if the alias has not been assigned). - * > lastUpdatedTimestamp - The last time the alias was assigned to a resource. Format - * yyyy-MM-ddTHH:mm:ss.sssZ - * - * A sample response returning 2 alias resources: - * - * ```json - * { - * "aliases": [ - * { - * "createdTimestamp": "2020-02-13T21:19:11.123Z", - * "aliasId": "a8a4b8bb-ecf4-fb27-a618-f41721552766", - * "creatorDataItemId": "e89aebb9-70a3-8fe1-32bb-1fbd0c725f14", - * "lastUpdatedTimestamp": "2020-02-13T21:19:22.123Z" - * }, - * { - * "createdTimestamp": "2020-02-18T19:53:33.123Z", - * "aliasId": "1856dbfc-7a66-ee5a-bf8d-51dbfe1906f6", - * "creatorDataItemId": null, - * "lastUpdatedTimestamp": "2020-02-18T19:53:33.123Z" - * } - * ] - * } - * ``` - * @param options The options parameters. - */ - private _list( - options?: AliasListOptionalParams - ): Promise { - return this.client.sendOperationRequest({ options }, listOperationSpec); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to assign an alias to reference a resource. - * - * ### Submit Assign Request - * - * To assign your alias to a resource, you will use a `PUT` request with the `aliasId` in the path and - * the `creatorDataItemId` passed as a query parameter. - * - * ### Assign Alias Response - * - * The Assign API returns a HTTP `200 OK` response with the updated alias resource in the body, if the - * alias was assigned successfully. A sample of the assign response is - * - * ```json - * { - * "createdTimestamp": "2020-02-13T21:19:11.123Z", - * "aliasId": "a8a4b8bb-ecf4-fb27-a618-f41721552766", - * "creatorDataItemId": "e89aebb9-70a3-8fe1-32bb-1fbd0c725f14", - * "lastUpdatedTimestamp": "2020-02-13T21:19:22.123Z" - * } - * ``` - * @param aliasId The unique id that references an existing alias. - * @param creatorDataItemId The unique id that references a creator data item to be aliased. - * @param options The options parameters. - */ - assign( - aliasId: string, - creatorDataItemId: string, - options?: AliasAssignOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { aliasId, creatorDataItemId, options }, - assignOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to delete a previously created alias. You can also use this API to delete - * old/unused aliases to create space for new content.This API does not delete the references resource, - * only the alias referencing the resource. - * - * ### Submit Delete Request - * - * To delete your alias you will issue a `DELETE` request where the path will contain the `aliasId` of - * the alias to delete. - * - * ### Delete Alias Response - * - * The Delete API returns a HTTP `204 No Content` response with an empty body, if the alias was deleted - * successfully. - * @param aliasId The unique id that references an existing alias. - * @param options The options parameters. - */ - delete(aliasId: string, options?: AliasDeleteOptionalParams): Promise { - return this.client.sendOperationRequest( - { aliasId, options }, - deleteOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch the details of a previously created alias. - * - * ### Submit Get Details Request - * - * To get the details of your alias, you will issue a `GET` request with the `aliasId` in the path. - * - * ### Get Details Response - * - * The Get Details API returns the previously created alias in `json` format. The response contains the - * following details for the alias resource: - * > createdTimestamp - The timestamp that the alias was created. - * > aliasId - The id for the alias. - * > creatorDataItemId - The id for the creator data item that this alias references (could be null - * if the alias has not been assigned). - * > lastUpdatedTimestamp - The last time the alias was assigned to a resource. - * - * Here's a sample response: - * ```json - * { - * "createdTimestamp": "2020-02-13T21:19:11.123Z", - * "aliasId": "a8a4b8bb-ecf4-fb27-a618-f41721552766", - * "creatorDataItemId": "e89aebb9-70a3-8fe1-32bb-1fbd0c725f14", - * "lastUpdatedTimestamp": "2020-02-13T21:19:22.123Z" - * } - * ``` - * @param aliasId The unique id that references an existing alias. - * @param options The options parameters. - */ - getDetails( - aliasId: string, - options?: AliasGetDetailsOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { aliasId, options }, - getDetailsOperationSpec - ); - } - - /** - * ListNext - * @param nextLink The nextLink from the previous successful call to the List method. - * @param options The options parameters. - */ - private _listNext( - nextLink: string, - options?: AliasListNextOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { nextLink, options }, - listNextOperationSpec - ); - } -} -// Operation Specifications -const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); - -const createOperationSpec: coreClient.OperationSpec = { - path: "/aliases", - httpMethod: "POST", - responses: { - 201: { - bodyMapper: Mappers.AliasesCreateResponse, - headersMapper: Mappers.AliasCreateHeaders - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion, Parameters.creatorDataItemId], - urlParameters: [Parameters.geography], - headerParameters: [Parameters.accept], - serializer -}; -const listOperationSpec: coreClient.OperationSpec = { - path: "/aliases", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.AliasListResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography], - headerParameters: [Parameters.accept], - serializer -}; -const assignOperationSpec: coreClient.OperationSpec = { - path: "/aliases/{aliasId}", - httpMethod: "PUT", - responses: { - 200: { - bodyMapper: Mappers.AliasListItem - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion, Parameters.creatorDataItemId1], - urlParameters: [Parameters.geography, Parameters.aliasId], - headerParameters: [Parameters.accept], - serializer -}; -const deleteOperationSpec: coreClient.OperationSpec = { - path: "/aliases/{aliasId}", - httpMethod: "DELETE", - responses: { - 204: {}, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.aliasId], - headerParameters: [Parameters.accept], - serializer -}; -const getDetailsOperationSpec: coreClient.OperationSpec = { - path: "/aliases/{aliasId}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.AliasListItem - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.aliasId], - headerParameters: [Parameters.accept], - serializer -}; -const listNextOperationSpec: coreClient.OperationSpec = { - path: "{nextLink}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.AliasListResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.nextLink], - headerParameters: [Parameters.accept], - serializer -}; diff --git a/sdk/maps/maps-creator/src/operations/conversion.ts b/sdk/maps/maps-creator/src/operations/conversion.ts deleted file mode 100644 index ea3eb40775eb..000000000000 --- a/sdk/maps/maps-creator/src/operations/conversion.ts +++ /dev/null @@ -1,593 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import "@azure/core-paging"; -import { PagedAsyncIterableIterator } from "@azure/core-paging"; -import { Conversion } from "../operationsInterfaces"; -import * as coreClient from "@azure/core-client"; -import * as Mappers from "../models/mappers"; -import * as Parameters from "../models/parameters"; -import { CreatorClientContext } from "../creatorClientContext"; -import { LROPoller, shouldDeserializeLRO } from "../lro"; -import { PollerLike, PollOperationState } from "@azure/core-lro"; -import { - ConversionListDetailInfo, - ConversionListNextOptionalParams, - ConversionListOptionalParams, - ConversionConvertOptionalParams, - ConversionConvertResponse, - ConversionListOperationResponse, - ConversionGetOptionalParams, - ConversionGetResponse, - ConversionDeleteOptionalParams, - ConversionGetOperationOptionalParams, - ConversionGetOperationResponse, - ConversionListNextResponse -} from "../models"; - -/// -/** Class representing a Conversion. */ -export class ConversionImpl implements Conversion { - private readonly client: CreatorClientContext; - - /** - * Initialize a new instance of the class Conversion class. - * @param client Reference to the service client - */ - constructor(client: CreatorClientContext) { - this.client = client; - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a list of all successful data conversions submitted previously - * using the [Conversion - * API](https://docs.microsoft.com/en-us/rest/api/maps/conversion/convertpreview). - * - * ### Submit List Request - * - * To list all successful conversions you will issue a `GET` request with no additional parameters. - * - * ### List Data Response - * - * The Conversion List API returns the complete list of all conversion details in `json` format.
- * - * Here is a sample response returning the details of two successful conversion requests: - * - *
- * - * ```json - * { - * "conversions": - * [ - * { - * "conversionId": "54398242-ea6c-1f31-4fa6-79b1ae0fc24d", - * "udid": "31838736-8b84-11ea-bc55-0242ac130003", - * "created": "5/19/2020 9:00:00 AM +00:00", - * "description": "User provided description.", - * "featureCounts": { - * "DIR": 1, - * "LVL": 3, - * "FCL": 1, - * "UNIT": 150, - * "CTG": 8, - * "AEL": 0, - * "OPN": 10 - * } - * }, - * { - * "conversionId": "2acf7d32-8b84-11ea-bc55-0242ac130003", - * "udid": "1214bc58-8b84-11ea-bc55-0242ac1300039", - * "created": "5/19/2020 9:00:00 AM +00:00", - * "description": "User provided description.", - * "featureCounts": { - * "DIR": 1, - * "LVL": 3, - * "FCL": 1, - * "UNIT": 150, - * "CTG": 8, - * "AEL": 0, - * "OPN": 10 - * } - * } - * ] - * } - * ``` - * - *
- * @param options The options parameters. - */ - public list( - options?: ConversionListOptionalParams - ): PagedAsyncIterableIterator { - const iter = this.listPagingAll(options); - return { - next() { - return iter.next(); - }, - [Symbol.asyncIterator]() { - return this; - }, - byPage: () => { - return this.listPagingPage(options); - } - }; - } - - private async *listPagingPage( - options?: ConversionListOptionalParams - ): AsyncIterableIterator { - let result = await this._list(options); - yield result.conversions || []; - let continuationToken = result.nextLink; - while (continuationToken) { - result = await this._listNext(continuationToken, options); - continuationToken = result.nextLink; - yield result.conversions || []; - } - } - - private async *listPagingAll( - options?: ConversionListOptionalParams - ): AsyncIterableIterator { - for await (const page of this.listPagingPage(options)) { - yield* page; - } - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * The Conversion API lets the caller import a set of DWG design files as a zipped [Drawing - * Package](https://aka.ms/am-drawing-package) into Azure Maps. The [Drawing - * Package](https://aka.ms/am-drawing-package) should first be uploaded using the [Azure Maps Data - * Service](https://docs.microsoft.com/rest/api/maps/data). Once uploaded, use the `udid` returned by - * the [Data Upload API](https://docs.microsoft.com/rest/api/maps/data/uploadpreview) to call this - * Conversion API. - * - * ## Convert DWG package - * - * The Conversion API performs a [long-running request](https://aka.ms/am-creator-lrt-v2). - * - * ## Debug DWG package issues - * - * - * During the Conversion process, if there are any issues with the DWG package [errors and - * warnings](https://aka.ms/am-conversion-errors) are provided in the response along with a *diagnostic - * package* to visualize and diagnose these issues. In case any issues are encountered with your DWG - * package, the Conversion operation status process as detailed - * [here](https://aka.ms/am-creator-lrt-v2) returns the location of the *diagnostic package* that can - * be downloaded by the caller to help them visualize and diagnose these issues. The *diagnostic - * package* location can be found in the properties section of the conversion operation status response - * and looks like the following: - * - * ```json - * { - * "properties": { - * "diagnosticPackageLocation": - * "https://us.atlas.microsoft.com/mapdata/{DiagnosticPackageId}?api-version=1.0" - * } - * } - * ``` - * - * The *diagnostic package* can be downloaded by executing a `HTTP GET` request on the - * `diagnosticPackageLocation`. - * For more details on how to use the tool to visualize and diagnose all the errors and warnings see - * [Drawing Error Visualizer](https://aka.ms/am-drawing-errors-visualizer).
- * - * A conversion operation will be marked as *success* if there are zero or more warnings but will be - * marked as *failed* if any errors are encountered. - * @param udid The unique data id for the content. The `udid` must have been obtained from a successful - * [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) call. - * @param outputOntology Output ontology version. "facility-2.0" is the only supported value at this - * time. Please refer to this - * [article](https://docs.microsoft.com/en-us/azure/azure-maps/creator-facility-ontology) for more - * information about Azure Maps Creator ontologies. - * @param options The options parameters. - */ - async beginConvert( - udid: string, - outputOntology: string, - options?: ConversionConvertOptionalParams - ): Promise< - PollerLike< - PollOperationState, - ConversionConvertResponse - > - > { - const directSendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ): Promise => { - return this.client.sendOperationRequest(args, spec); - }; - const sendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ) => { - let currentRawResponse: - | coreClient.FullOperationResponse - | undefined = undefined; - const providedCallback = args.options?.onResponse; - const callback: coreClient.RawResponseCallback = ( - rawResponse: coreClient.FullOperationResponse, - flatResponse: unknown - ) => { - currentRawResponse = rawResponse; - providedCallback?.(rawResponse, flatResponse); - }; - const updatedArgs = { - ...args, - options: { - ...args.options, - onResponse: callback - } - }; - const flatResponse = await directSendOperation(updatedArgs, spec); - return { flatResponse, rawResponse: currentRawResponse! }; - }; - - return new LROPoller( - { intervalInMs: options?.updateIntervalInMs }, - { udid, outputOntology, options }, - convertOperationSpec, - sendOperation, - "location" - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * The Conversion API lets the caller import a set of DWG design files as a zipped [Drawing - * Package](https://aka.ms/am-drawing-package) into Azure Maps. The [Drawing - * Package](https://aka.ms/am-drawing-package) should first be uploaded using the [Azure Maps Data - * Service](https://docs.microsoft.com/rest/api/maps/data). Once uploaded, use the `udid` returned by - * the [Data Upload API](https://docs.microsoft.com/rest/api/maps/data/uploadpreview) to call this - * Conversion API. - * - * ## Convert DWG package - * - * The Conversion API performs a [long-running request](https://aka.ms/am-creator-lrt-v2). - * - * ## Debug DWG package issues - * - * - * During the Conversion process, if there are any issues with the DWG package [errors and - * warnings](https://aka.ms/am-conversion-errors) are provided in the response along with a *diagnostic - * package* to visualize and diagnose these issues. In case any issues are encountered with your DWG - * package, the Conversion operation status process as detailed - * [here](https://aka.ms/am-creator-lrt-v2) returns the location of the *diagnostic package* that can - * be downloaded by the caller to help them visualize and diagnose these issues. The *diagnostic - * package* location can be found in the properties section of the conversion operation status response - * and looks like the following: - * - * ```json - * { - * "properties": { - * "diagnosticPackageLocation": - * "https://us.atlas.microsoft.com/mapdata/{DiagnosticPackageId}?api-version=1.0" - * } - * } - * ``` - * - * The *diagnostic package* can be downloaded by executing a `HTTP GET` request on the - * `diagnosticPackageLocation`. - * For more details on how to use the tool to visualize and diagnose all the errors and warnings see - * [Drawing Error Visualizer](https://aka.ms/am-drawing-errors-visualizer).
- * - * A conversion operation will be marked as *success* if there are zero or more warnings but will be - * marked as *failed* if any errors are encountered. - * @param udid The unique data id for the content. The `udid` must have been obtained from a successful - * [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) call. - * @param outputOntology Output ontology version. "facility-2.0" is the only supported value at this - * time. Please refer to this - * [article](https://docs.microsoft.com/en-us/azure/azure-maps/creator-facility-ontology) for more - * information about Azure Maps Creator ontologies. - * @param options The options parameters. - */ - async beginConvertAndWait( - udid: string, - outputOntology: string, - options?: ConversionConvertOptionalParams - ): Promise { - const poller = await this.beginConvert(udid, outputOntology, options); - return poller.pollUntilDone(); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a list of all successful data conversions submitted previously - * using the [Conversion - * API](https://docs.microsoft.com/en-us/rest/api/maps/conversion/convertpreview). - * - * ### Submit List Request - * - * To list all successful conversions you will issue a `GET` request with no additional parameters. - * - * ### List Data Response - * - * The Conversion List API returns the complete list of all conversion details in `json` format.
- * - * Here is a sample response returning the details of two successful conversion requests: - * - *
- * - * ```json - * { - * "conversions": - * [ - * { - * "conversionId": "54398242-ea6c-1f31-4fa6-79b1ae0fc24d", - * "udid": "31838736-8b84-11ea-bc55-0242ac130003", - * "created": "5/19/2020 9:00:00 AM +00:00", - * "description": "User provided description.", - * "featureCounts": { - * "DIR": 1, - * "LVL": 3, - * "FCL": 1, - * "UNIT": 150, - * "CTG": 8, - * "AEL": 0, - * "OPN": 10 - * } - * }, - * { - * "conversionId": "2acf7d32-8b84-11ea-bc55-0242ac130003", - * "udid": "1214bc58-8b84-11ea-bc55-0242ac1300039", - * "created": "5/19/2020 9:00:00 AM +00:00", - * "description": "User provided description.", - * "featureCounts": { - * "DIR": 1, - * "LVL": 3, - * "FCL": 1, - * "UNIT": 150, - * "CTG": 8, - * "AEL": 0, - * "OPN": 10 - * } - * } - * ] - * } - * ``` - * - *
- * @param options The options parameters. - */ - private _list( - options?: ConversionListOptionalParams - ): Promise { - return this.client.sendOperationRequest({ options }, listOperationSpec); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a successful data conversion submitted previously using the - * [Conversion API](https://docs.microsoft.com/en-us/rest/api/maps/conversion/convertpreview). - * @param conversionId The conversion id for the content. The `conversionId` must have been obtained - * from a successful [Conversion - * API](https://docs.microsoft.com/en-us/rest/api/maps/v2/conversion/convert) call. - * @param options The options parameters. - */ - get( - conversionId: string, - options?: ConversionGetOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { conversionId, options }, - getOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to delete any data conversions created previously using the [Conversion - * API](https://docs.microsoft.com/en-us/rest/api/maps/conversion/convertpreview). - * - * ### Submit Delete Request - * - * To delete your conversion data you will issue a `DELETE` request where the path will contain the - * `conversionId` of the data to delete. - * - * ### Conversion Delete Response - * - * The Conversion Delete API returns a HTTP `204 No Content` response with an empty body, if the - * converted data resources were deleted successfully.
- * A HTTP `400 Bad Request` error response will be returned if no resource associated with the - * passed-in `conversionId` is found. - * @param conversionId The conversion id for the content. The `conversionId` must have been obtained - * from a successful [Conversion - * API](https://docs.microsoft.com/en-us/rest/api/maps/v2/conversion/convert) call. - * @param options The options parameters. - */ - delete( - conversionId: string, - options?: ConversionDeleteOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { conversionId, options }, - deleteOperationSpec - ); - } - - /** - * This path will be obtained from a call to POST /conversions. While in progress, an http200 will be - * returned with no extra headers - followed by an http200 with Resource-Location header once - * successfully completed. - * @param operationId The ID to query the status for the dataset create/import request. - * @param options The options parameters. - */ - getOperation( - operationId: string, - options?: ConversionGetOperationOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { operationId, options }, - getOperationOperationSpec - ); - } - - /** - * ListNext - * @param nextLink The nextLink from the previous successful call to the List method. - * @param options The options parameters. - */ - private _listNext( - nextLink: string, - options?: ConversionListNextOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { nextLink, options }, - listNextOperationSpec - ); - } -} -// Operation Specifications -const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); - -const convertOperationSpec: coreClient.OperationSpec = { - path: "/conversions", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.ConversionConvertHeaders - }, - 201: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.ConversionConvertHeaders - }, - 202: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.ConversionConvertHeaders - }, - 204: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.ConversionConvertHeaders - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.udid, - Parameters.outputOntology, - Parameters.description - ], - urlParameters: [Parameters.geography], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const listOperationSpec: coreClient.OperationSpec = { - path: "/conversions", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.ConversionListResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getOperationSpec: coreClient.OperationSpec = { - path: "/conversions/{conversionId}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.ConversionListDetailInfo - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.conversionId1], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const deleteOperationSpec: coreClient.OperationSpec = { - path: "/conversions/{conversionId}", - httpMethod: "DELETE", - responses: { - 204: {}, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.conversionId1], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getOperationOperationSpec: coreClient.OperationSpec = { - path: "/conversions/operations/{operationId}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.ConversionGetOperationHeaders - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.operationId], - headerParameters: [Parameters.accept], - serializer -}; -const listNextOperationSpec: coreClient.OperationSpec = { - path: "{nextLink}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.ConversionListResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.nextLink], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; diff --git a/sdk/maps/maps-creator/src/operations/data.ts b/sdk/maps/maps-creator/src/operations/data.ts deleted file mode 100644 index 33033f61a396..000000000000 --- a/sdk/maps/maps-creator/src/operations/data.ts +++ /dev/null @@ -1,1051 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { Data } from "../operationsInterfaces"; -import * as coreClient from "@azure/core-client"; -import * as coreRestPipeline from "@azure/core-rest-pipeline"; -import * as Mappers from "../models/mappers"; -import * as Parameters from "../models/parameters"; -import { CreatorClientContext } from "../creatorClientContext"; -import { LROPoller, shouldDeserializeLRO } from "../lro"; -import { PollerLike, PollOperationState } from "@azure/core-lro"; -import { - UploadDataFormat, - DataUploadPreview$binaryOptionalParams, - DataUploadPreview$jsonOptionalParams, - DataUploadPreviewResponse, - DataListPreviewOptionalParams, - DataListPreviewResponse, - DataUpdatePreviewOptionalParams, - DataUpdatePreviewResponse, - DataDownloadPreviewOptionalParams, - DataDownloadPreviewResponse, - DataDeletePreviewOptionalParams, - DataGetOperationPreviewOptionalParams, - DataGetOperationPreviewResponse -} from "../models"; - -/** Class representing a Data. */ -export class DataImpl implements Data { - private readonly client: CreatorClientContext; - - /** - * Initialize a new instance of the class Data class. - * @param client Reference to the service client - */ - constructor(client: CreatorClientContext) { - this.client = client; - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * The Data Upload API allows the caller to upload data content to the Azure Maps service. - * You can use this API in a scenario like uploading a collection of Geofences in `GeoJSON` - * format, for use in our [Azure Maps Geofencing - * Service](https://docs.microsoft.com/rest/api/maps/spatial). - * - * ## Submit Upload Request - * - * To upload your content you will use a `POST` request. The request body will contain the data to - * upload. The - * `dataFormat` query parameter will contain the format for the data, the `dataSharingLevel` query - * parameter - * can contain the sharing level for the data. The `Content-Type` header will be set to the content - * type of the - * data. - * - * For example, to upload a collection of geofences in `GeoJSON` format, set the request body to the - * geofence - * content. Set the `dataFormat` query parameter to _geojson_, and set the `Content-Type` header to - * either one - * of the following media types: - * - * - `application/json` - * - `application/vnd.geo+json` - * - `application/octet-stream` - * - * Here's a sample request body for uploading a simple Geofence represented as a circle geometry using - * a center - * point and a radius. The sample below is in `GeoJSON`: - * - * ```json - * { - * "type": "FeatureCollection", - * "features": [{ - * "type": "Feature", - * "geometry": { - * "type": "Point", - * "coordinates": [-122.126986, 47.639754] - * }, - * "properties": { - * "geometryId": "001", - * "radius": 500 - * } - * }] - * } - * ``` - * - * The Data Upload API performs a - * [long-running request](https://aka.ms/am-creator-lrt-v2). - * - * ## Data Upload Limits - * - * Please, be aware that currently every Azure Maps account has a [data storage - * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). - * - * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http - * error response. - * You can always use the [Data Delete - * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to - * delete old/unused content and create space for new uploads. - * @param uploadDataFormat Data format of the content being uploaded. - * @param contentType Upload file type - * @param uploadContent The content to upload. - * @param options The options parameters. - */ - beginUploadPreview( - uploadDataFormat: UploadDataFormat, - contentType: "application/octet-stream", - uploadContent: coreRestPipeline.RequestBodyType, - options?: DataUploadPreview$binaryOptionalParams - ): Promise< - PollerLike< - PollOperationState, - DataUploadPreviewResponse - > - >; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * The Data Upload API allows the caller to upload data content to the Azure Maps service. - * You can use this API in a scenario like uploading a collection of Geofences in `GeoJSON` - * format, for use in our [Azure Maps Geofencing - * Service](https://docs.microsoft.com/rest/api/maps/spatial). - * - * ## Submit Upload Request - * - * To upload your content you will use a `POST` request. The request body will contain the data to - * upload. The - * `dataFormat` query parameter will contain the format for the data, the `dataSharingLevel` query - * parameter - * can contain the sharing level for the data. The `Content-Type` header will be set to the content - * type of the - * data. - * - * For example, to upload a collection of geofences in `GeoJSON` format, set the request body to the - * geofence - * content. Set the `dataFormat` query parameter to _geojson_, and set the `Content-Type` header to - * either one - * of the following media types: - * - * - `application/json` - * - `application/vnd.geo+json` - * - `application/octet-stream` - * - * Here's a sample request body for uploading a simple Geofence represented as a circle geometry using - * a center - * point and a radius. The sample below is in `GeoJSON`: - * - * ```json - * { - * "type": "FeatureCollection", - * "features": [{ - * "type": "Feature", - * "geometry": { - * "type": "Point", - * "coordinates": [-122.126986, 47.639754] - * }, - * "properties": { - * "geometryId": "001", - * "radius": 500 - * } - * }] - * } - * ``` - * - * The Data Upload API performs a - * [long-running request](https://aka.ms/am-creator-lrt-v2). - * - * ## Data Upload Limits - * - * Please, be aware that currently every Azure Maps account has a [data storage - * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). - * - * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http - * error response. - * You can always use the [Data Delete - * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to - * delete old/unused content and create space for new uploads. - * @param uploadDataFormat Data format of the content being uploaded. - * @param contentType Body Parameter content-type - * @param uploadContent The content to upload. - * @param options The options parameters. - */ - beginUploadPreview( - uploadDataFormat: UploadDataFormat, - contentType: "application/json", - uploadContent: Record, - options?: DataUploadPreview$jsonOptionalParams - ): Promise< - PollerLike< - PollOperationState, - DataUploadPreviewResponse - > - >; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * The Data Upload API allows the caller to upload data content to the Azure Maps service. - * You can use this API in a scenario like uploading a collection of Geofences in `GeoJSON` - * format, for use in our [Azure Maps Geofencing - * Service](https://docs.microsoft.com/rest/api/maps/spatial). - * - * ## Submit Upload Request - * - * To upload your content you will use a `POST` request. The request body will contain the data to - * upload. The - * `dataFormat` query parameter will contain the format for the data, the `dataSharingLevel` query - * parameter - * can contain the sharing level for the data. The `Content-Type` header will be set to the content - * type of the - * data. - * - * For example, to upload a collection of geofences in `GeoJSON` format, set the request body to the - * geofence - * content. Set the `dataFormat` query parameter to _geojson_, and set the `Content-Type` header to - * either one - * of the following media types: - * - * - `application/json` - * - `application/vnd.geo+json` - * - `application/octet-stream` - * - * Here's a sample request body for uploading a simple Geofence represented as a circle geometry using - * a center - * point and a radius. The sample below is in `GeoJSON`: - * - * ```json - * { - * "type": "FeatureCollection", - * "features": [{ - * "type": "Feature", - * "geometry": { - * "type": "Point", - * "coordinates": [-122.126986, 47.639754] - * }, - * "properties": { - * "geometryId": "001", - * "radius": 500 - * } - * }] - * } - * ``` - * - * The Data Upload API performs a - * [long-running request](https://aka.ms/am-creator-lrt-v2). - * - * ## Data Upload Limits - * - * Please, be aware that currently every Azure Maps account has a [data storage - * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). - * - * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http - * error response. - * You can always use the [Data Delete - * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to - * delete old/unused content and create space for new uploads. - * @param args Includes all the parameters for this operation. - */ - async beginUploadPreview( - ...args: - | [ - UploadDataFormat, - "application/octet-stream", - coreRestPipeline.RequestBodyType, - DataUploadPreview$binaryOptionalParams? - ] - | [ - UploadDataFormat, - "application/json", - Record, - DataUploadPreview$jsonOptionalParams? - ] - ): Promise< - PollerLike< - PollOperationState, - DataUploadPreviewResponse - > - > { - let operationSpec: coreClient.OperationSpec; - let operationArguments: coreClient.OperationArguments; - let options; - if (args[1] === "application/octet-stream") { - operationSpec = uploadPreview$binaryOperationSpec; - operationArguments = { - uploadDataFormat: args[0], - contentType: args[1], - uploadContent: args[2], - options: args[3] - }; - options = args[3]; - } else if (args[1] === "application/json") { - operationSpec = uploadPreview$jsonOperationSpec; - operationArguments = { - uploadDataFormat: args[0], - contentType: args[1], - uploadContent: args[2], - options: args[3] - }; - options = args[3]; - } else { - throw new TypeError( - `"contentType" must be a valid value but instead was "${args[1]}".` - ); - } - operationArguments.options = this.getOperationOptions(options, "location"); - const directSendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ): Promise => { - return this.client.sendOperationRequest(args, spec); - }; - const sendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ) => { - let currentRawResponse: - | coreClient.FullOperationResponse - | undefined = undefined; - const providedCallback = args.options?.onResponse; - const callback: coreClient.RawResponseCallback = ( - rawResponse: coreClient.FullOperationResponse, - flatResponse: unknown - ) => { - currentRawResponse = rawResponse; - providedCallback?.(rawResponse, flatResponse); - }; - const updatedArgs = { - ...args, - options: { - ...args.options, - onResponse: callback - } - }; - const flatResponse = await directSendOperation(updatedArgs, spec); - return { flatResponse, rawResponse: currentRawResponse! }; - }; - - return new LROPoller( - { intervalInMs: options?.updateIntervalInMs }, - operationArguments, - operationSpec, - sendOperation, - "location" - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * The Data Upload API allows the caller to upload data content to the Azure Maps service. - * You can use this API in a scenario like uploading a collection of Geofences in `GeoJSON` - * format, for use in our [Azure Maps Geofencing - * Service](https://docs.microsoft.com/rest/api/maps/spatial). - * - * ## Submit Upload Request - * - * To upload your content you will use a `POST` request. The request body will contain the data to - * upload. The - * `dataFormat` query parameter will contain the format for the data, the `dataSharingLevel` query - * parameter - * can contain the sharing level for the data. The `Content-Type` header will be set to the content - * type of the - * data. - * - * For example, to upload a collection of geofences in `GeoJSON` format, set the request body to the - * geofence - * content. Set the `dataFormat` query parameter to _geojson_, and set the `Content-Type` header to - * either one - * of the following media types: - * - * - `application/json` - * - `application/vnd.geo+json` - * - `application/octet-stream` - * - * Here's a sample request body for uploading a simple Geofence represented as a circle geometry using - * a center - * point and a radius. The sample below is in `GeoJSON`: - * - * ```json - * { - * "type": "FeatureCollection", - * "features": [{ - * "type": "Feature", - * "geometry": { - * "type": "Point", - * "coordinates": [-122.126986, 47.639754] - * }, - * "properties": { - * "geometryId": "001", - * "radius": 500 - * } - * }] - * } - * ``` - * - * The Data Upload API performs a - * [long-running request](https://aka.ms/am-creator-lrt-v2). - * - * ## Data Upload Limits - * - * Please, be aware that currently every Azure Maps account has a [data storage - * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). - * - * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http - * error response. - * You can always use the [Data Delete - * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to - * delete old/unused content and create space for new uploads. - * @param args Includes all the parameters for this operation. - */ - async beginUploadPreviewAndWait( - ...args: - | [ - UploadDataFormat, - "application/octet-stream", - coreRestPipeline.RequestBodyType, - DataUploadPreview$binaryOptionalParams? - ] - | [ - UploadDataFormat, - "application/json", - Record, - DataUploadPreview$jsonOptionalParams? - ] - ): Promise { - if (args[1] === "application/octet-stream") { - const poller = await this.beginUploadPreview(...args); - return poller.pollUntilDone(); - } else if (args[1] === "application/json") { - const poller = await this.beginUploadPreview(...args); - return poller.pollUntilDone(); - } - throw new Error("Impossible case"); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * This API allows the caller to fetch a list of all content uploaded previously using the [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview). - * - * - * ### Submit List Request - * - * To list all your map data content you will issue a `GET` request with no additional parameters. - * - * - * ### List Data Response - * - * The Data List API returns the complete list of all data in `json` format. The response contains the - * following details for each data resource: - * - * > udid - The unique data id for the data resource. - * - * > location - The location of the data resource. Execute a HTTP `GET` on this location to download - * the data. - * - * - * Here's a sample response returning the `udid` and `location` of 3 data resources: - * - *
- * - * ```json - * { - * "mapDataList": - * [ - * { - * "udid": "9a1288fa-1858-4a3b-b68d-13a8j5af7d7c", - * "location": - * "https://us.atlas.microsoft.com/mapData/9a1288fa-1858-4a3b-b68d-13a8j5af7d7c?api-version=1.0", - * "sizeInBytes": 29920, - * "uploadStatus": "Completed" - * }, - * { - * "udid": "8b1288fa-1958-4a2b-b68e-13a7i5af7d7c", - * "location": - * "https://us.atlas.microsoft.com/mapData/8b1288fa-1958-4a2b-b68e-13a7i5af7d7c?api-version=1.0", - * "sizeInBytes": 1339, - * "uploadStatus": "Completed" - * }, - * { - * "udid": "7c1288fa-2058-4a1b-b68f-13a6h5af7d7c", - * "location": - * "https://us.atlas.microsoft.com/mapData/7c1288fa-2058-4a1b-b68f-13a6h5af7d7c?api-version=1.0", - * "sizeInBytes": 1650, - * "uploadStatus": "Pending" - * }] - * } - * ``` - * - *
- * @param options The options parameters. - */ - listPreview( - options?: DataListPreviewOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { options }, - listPreviewOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * The Data Update API allows the caller to update a previously uploaded data content. - * - * You can use this API in a scenario like adding or removing geofences to or from an existing - * collection of geofences. - * Geofences are uploaded using the [Data Upload - * API](https://docs.microsoft.com/rest/api/maps/data%20v2/uploadpreview), for - * use in the [Azure Maps Geofencing Service](https://docs.microsoft.com/rest/api/maps/spatial). - * - * Please note that the Update API will *replace* and *override* the existing data content. - * - * ## Submit Update Request - * - * To update your content you will use a `PUT` request. The request body will contain the new data that - * will replace - * the existing data. The `Content-Type` header will be set to the content type of the data, and the - * path will contain - * the `udid` of the data to be update. - * - * For example, to update a collection of geofences that were previously uploaded using the Upload API, - * place the new - * geofence content in the request body. Set the `udid` parameter in the path to the `udid` of the data - * received - * previously in the upload API response. And set the `Content-Type` header to one of the following - * media types: - * - * - `application/json` - * - `application/vnd.geo+json` - * - `application/octet-stream` - * - * Here's a sample request body for updating a simple Geofence. It's represented as a circle geometry - * using a center - * point and a radius. The sample below is in `GeoJSON`: - * - * ```json - * { - * "type": "FeatureCollection", - * "features": [{ - * "type": "Feature", - * "geometry": { - * "type": "Point", - * "coordinates": [-122.126986, 47.639754] - * }, - * "properties": { - * "geometryId": "001", - * "radius": 500 - * } - * }] - * } - * ``` - * - * The previously uploaded geofence had a radius of 100m. The above request will update it to 500m. - * - * The Data Update API performs a - * [long-running request](https://aka.ms/am-creator-lrt-v2). - * - * ## Data Update Limits - * - * Please, be aware that currently every Azure Maps account has a [data storage - * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). - * - * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http - * error response. - * You can always use the [Data Delete - * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to - * delete old/unused content and create space for new uploads. - * @param uniqueDataId The unique data id for the content. The `udid` must have been obtained from a - * successful [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) - * call. - * @param updateContent The new content that will update/replace the previously uploaded content. - * @param options The options parameters. - */ - async beginUpdatePreview( - uniqueDataId: string, - updateContent: Record, - options?: DataUpdatePreviewOptionalParams - ): Promise< - PollerLike< - PollOperationState, - DataUpdatePreviewResponse - > - > { - const directSendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ): Promise => { - return this.client.sendOperationRequest(args, spec); - }; - const sendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ) => { - let currentRawResponse: - | coreClient.FullOperationResponse - | undefined = undefined; - const providedCallback = args.options?.onResponse; - const callback: coreClient.RawResponseCallback = ( - rawResponse: coreClient.FullOperationResponse, - flatResponse: unknown - ) => { - currentRawResponse = rawResponse; - providedCallback?.(rawResponse, flatResponse); - }; - const updatedArgs = { - ...args, - options: { - ...args.options, - onResponse: callback - } - }; - const flatResponse = await directSendOperation(updatedArgs, spec); - return { flatResponse, rawResponse: currentRawResponse! }; - }; - - return new LROPoller( - { intervalInMs: options?.updateIntervalInMs }, - { uniqueDataId, updateContent, options }, - updatePreviewOperationSpec, - sendOperation, - "location" - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * The Data Update API allows the caller to update a previously uploaded data content. - * - * You can use this API in a scenario like adding or removing geofences to or from an existing - * collection of geofences. - * Geofences are uploaded using the [Data Upload - * API](https://docs.microsoft.com/rest/api/maps/data%20v2/uploadpreview), for - * use in the [Azure Maps Geofencing Service](https://docs.microsoft.com/rest/api/maps/spatial). - * - * Please note that the Update API will *replace* and *override* the existing data content. - * - * ## Submit Update Request - * - * To update your content you will use a `PUT` request. The request body will contain the new data that - * will replace - * the existing data. The `Content-Type` header will be set to the content type of the data, and the - * path will contain - * the `udid` of the data to be update. - * - * For example, to update a collection of geofences that were previously uploaded using the Upload API, - * place the new - * geofence content in the request body. Set the `udid` parameter in the path to the `udid` of the data - * received - * previously in the upload API response. And set the `Content-Type` header to one of the following - * media types: - * - * - `application/json` - * - `application/vnd.geo+json` - * - `application/octet-stream` - * - * Here's a sample request body for updating a simple Geofence. It's represented as a circle geometry - * using a center - * point and a radius. The sample below is in `GeoJSON`: - * - * ```json - * { - * "type": "FeatureCollection", - * "features": [{ - * "type": "Feature", - * "geometry": { - * "type": "Point", - * "coordinates": [-122.126986, 47.639754] - * }, - * "properties": { - * "geometryId": "001", - * "radius": 500 - * } - * }] - * } - * ``` - * - * The previously uploaded geofence had a radius of 100m. The above request will update it to 500m. - * - * The Data Update API performs a - * [long-running request](https://aka.ms/am-creator-lrt-v2). - * - * ## Data Update Limits - * - * Please, be aware that currently every Azure Maps account has a [data storage - * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). - * - * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http - * error response. - * You can always use the [Data Delete - * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to - * delete old/unused content and create space for new uploads. - * @param uniqueDataId The unique data id for the content. The `udid` must have been obtained from a - * successful [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) - * call. - * @param updateContent The new content that will update/replace the previously uploaded content. - * @param options The options parameters. - */ - async beginUpdatePreviewAndWait( - uniqueDataId: string, - updateContent: Record, - options?: DataUpdatePreviewOptionalParams - ): Promise { - const poller = await this.beginUpdatePreview( - uniqueDataId, - updateContent, - options - ); - return poller.pollUntilDone(); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * This API allows the caller to download a previously uploaded data content.
- * You can use this API in a scenario like downloading an existing collection of geofences uploaded - * previously using the [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) for use in our [Azure - * Maps Geofencing Service](https://docs.microsoft.com/en-us/rest/api/maps/spatial). - * - * - * ### Submit Download Request - * - * To download your content you will use a `GET` request where the path will contain the `udid` of the - * data to download. Optionally, you can also pass in an `Accept` header to specify a preference for - * the `Content-Type` of the data response.
- * For example, to download a collection of geofences previously uploaded using the Upload API, set the - * `udid` parameter in the path to the `udid` of the data received previously in the upload API - * response and set the `Accept` header to either one of the following media types: - * - * - `application/json` - * - `application/vnd.geo+json` - * - `application/octet-stream` - * - * - * ### Download Data Response - * - * The Download API will return a HTTP `200 OK` response if the data resource with the passed-in `udid` - * is found, where the response body will contain the content of the data resource.
- * A HTTP `400 Bad Request` error response will be returned if the data resource with the passed-in - * `udid` is not found.
- * - * Here's a sample response body for a simple geofence represented in `GeoJSON` uploaded previously - * using the Upload API: - *
- * - * ```json - * { - * "type": "FeatureCollection", - * "features": [{ - * "type": "Feature", - * "geometry": { - * "type": "Point", - * "coordinates": [-122.126986, 47.639754] - * }, - * "properties": { - * "geometryId": "001", - * "radius": 500 - * } - * }] - * } - * ``` - * @param uniqueDataId The unique data id for the content. The `udid` must have been obtained from a - * successful [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) - * call. - * @param options The options parameters. - */ - downloadPreview( - uniqueDataId: string, - options?: DataDownloadPreviewOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { uniqueDataId, options }, - downloadPreviewOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * This API allows the caller to delete a previously uploaded data content.
- * You can use this API in a scenario like removing geofences previously uploaded using the [Data - * Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) for use in our - * [Azure Maps Geofencing Service](https://docs.microsoft.com/en-us/rest/api/maps/spatial). You can - * also use this API to delete old/unused uploaded content and create space for new content. - * - * - * ### Submit Delete Request - * - * To delete your content you will issue a `DELETE` request where the path will contain the `udid` of - * the data to delete.
- * For example, to delete a collection of geofences previously uploaded using the Upload API, set the - * `udid` parameter in the path to the `udid` of the data received previously in the upload API - * response. - * - * - * ### Delete Data Response - * - * The Data Delete API returns a HTTP `204 No Content` response with an empty body, if the data - * resource was deleted successfully.
- * A HTTP `400 Bad Request` error response will be returned if the data resource with the passed-in - * `udid` is not found. - * @param uniqueDataId The unique data id for the content. The `udid` must have been obtained from a - * successful [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) - * call. - * @param options The options parameters. - */ - deletePreview( - uniqueDataId: string, - options?: DataDeletePreviewOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { uniqueDataId, options }, - deletePreviewOperationSpec - ); - } - - /** - * This path will be obtained from a call to POST /mapData. While in progress, an http200 will be - * returned with no extra headers - followed by an http200 with Resource-Location header once - * completed. - * @param operationId The ID to query the status for the data upload request. - * @param options The options parameters. - */ - getOperationPreview( - operationId: string, - options?: DataGetOperationPreviewOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { operationId, options }, - getOperationPreviewOperationSpec - ); - } - - private getOperationOptions( - options: TOptions | undefined, - finalStateVia?: string - ): coreClient.OperationOptions { - const operationOptions: coreClient.OperationOptions = options || {}; - operationOptions.requestOptions = { - ...operationOptions.requestOptions, - shouldDeserialize: shouldDeserializeLRO(finalStateVia) - }; - return operationOptions; - } -} -// Operation Specifications -const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); - -const uploadPreview$binaryOperationSpec: coreClient.OperationSpec = { - path: "/mapData", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.DataUploadPreviewHeaders - }, - 201: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.DataUploadPreviewHeaders - }, - 202: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.DataUploadPreviewHeaders - }, - 204: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.DataUploadPreviewHeaders - }, - 409: { - bodyMapper: Mappers.ErrorResponse, - isError: true - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.uploadContent, - queryParameters: [ - Parameters.apiVersion, - Parameters.uploadDataDescription, - Parameters.uploadDataFormat - ], - urlParameters: [Parameters.geography], - headerParameters: [ - Parameters.accept, - Parameters.contentType, - Parameters.accept1, - Parameters.xMsClientId - ], - mediaType: "binary", - serializer -}; -const uploadPreview$jsonOperationSpec: coreClient.OperationSpec = { - path: "/mapData", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.DataUploadPreviewHeaders - }, - 201: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.DataUploadPreviewHeaders - }, - 202: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.DataUploadPreviewHeaders - }, - 204: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.DataUploadPreviewHeaders - }, - 409: { - bodyMapper: Mappers.ErrorResponse, - isError: true - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.uploadContent1, - queryParameters: [ - Parameters.apiVersion, - Parameters.uploadDataDescription, - Parameters.uploadDataFormat - ], - urlParameters: [Parameters.geography], - headerParameters: [ - Parameters.accept, - Parameters.contentType1, - Parameters.xMsClientId - ], - mediaType: "json", - serializer -}; -const listPreviewOperationSpec: coreClient.OperationSpec = { - path: "/mapData", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.MapDataListResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const updatePreviewOperationSpec: coreClient.OperationSpec = { - path: "/mapData/{udid}", - httpMethod: "PUT", - responses: { - 200: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.DataUpdatePreviewHeaders - }, - 201: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.DataUpdatePreviewHeaders - }, - 202: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.DataUpdatePreviewHeaders - }, - 204: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.DataUpdatePreviewHeaders - }, - 409: { - bodyMapper: Mappers.ErrorResponse, - isError: true - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.updateContent, - queryParameters: [Parameters.apiVersion, Parameters.uploadDataDescription], - urlParameters: [Parameters.geography, Parameters.uniqueDataId], - headerParameters: [ - Parameters.accept, - Parameters.xMsClientId, - Parameters.contentType2 - ], - mediaType: "json", - serializer -}; -const downloadPreviewOperationSpec: coreClient.OperationSpec = { - path: "/mapData/{udid}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: { - type: { name: "Stream" }, - serializedName: "parsedResponse" - }, - headersMapper: Mappers.DataDownloadPreviewHeaders - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.uniqueDataId], - headerParameters: [Parameters.xMsClientId, Parameters.accept2], - serializer -}; -const deletePreviewOperationSpec: coreClient.OperationSpec = { - path: "/mapData/{udid}", - httpMethod: "DELETE", - responses: { - 204: {}, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.uniqueDataId], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getOperationPreviewOperationSpec: coreClient.OperationSpec = { - path: "/mapData/operations/{operationId}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.DataGetOperationPreviewHeaders - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.operationId], - headerParameters: [Parameters.accept], - serializer -}; diff --git a/sdk/maps/maps-creator/src/operations/dataset.ts b/sdk/maps/maps-creator/src/operations/dataset.ts deleted file mode 100644 index acd9b8307ed2..000000000000 --- a/sdk/maps/maps-creator/src/operations/dataset.ts +++ /dev/null @@ -1,635 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import "@azure/core-paging"; -import { PagedAsyncIterableIterator } from "@azure/core-paging"; -import { Dataset } from "../operationsInterfaces"; -import * as coreClient from "@azure/core-client"; -import * as Mappers from "../models/mappers"; -import * as Parameters from "../models/parameters"; -import { CreatorClientContext } from "../creatorClientContext"; -import { LROPoller, shouldDeserializeLRO } from "../lro"; -import { PollerLike, PollOperationState } from "@azure/core-lro"; -import { - DatasetDetailInfo, - DatasetListNextOptionalParams, - DatasetListOptionalParams, - DatasetCreateOptionalParams, - DatasetCreateResponse, - DatasetListOperationResponse, - DatasetGetOptionalParams, - DatasetGetResponse, - DatasetDeleteOptionalParams, - DatasetGetOperationOptionalParams, - DatasetGetOperationResponse, - DatasetListNextResponse -} from "../models"; - -/// -/** Class representing a Dataset. */ -export class DatasetImpl implements Dataset { - private readonly client: CreatorClientContext; - - /** - * Initialize a new instance of the class Dataset class. - * @param client Reference to the service client - */ - constructor(client: CreatorClientContext) { - this.client = client; - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a list of all previously successfully created datasets. - * - * ### Submit List Request - * - * To list all your datasets, you will issue a `GET` request with no additional parameters. - * - * - * ### List Data Response - * - * The List API returns the complete list of all datasets in `json` format. The response contains the - * following fields (if they are not null or empty): - * > created - The timestamp the dataset was created. - * > datasetId - The id for the dataset. - * > description - The description for the dataset. - * > datasetSources - The source data that was used when the create request was issued. - * > ontology - The source - * [ontology](https://docs.microsoft.com/en-us/azure/azure-maps/creator-facility-ontology) that was - * used in the conversion service for the input data.
- * - * The `datasetSources` describes the source data that was used when the create request was issued and - * contains the following elements (if they are not null or empty): - * - * > conversionIds - The list of `conversionId` (null if none were provided). - * > appendDatasetId - The `datasetId` that was used for an append operation (null if none was used). - * >featureCounts - The counts for each feature type in the dataset.
- * - * Here's a sample response returning the `timestamp`, `datasetId`, `description`, `datasetSources`, - * and `ontology` of 3 dataset resources: - * - * - * ```json - * { - * "datasets": [ - * { - * "timestamp": "2020-01-01T22:50:48.123Z", - * "datasetId": "f6495f62-94f8-0ec2-c252-45626f82fcb2", - * "description": "Some description or comment for the dataset.", - * "datasetSources": { - * "conversionIds": [ - * "15d21452-c9bb-27b6-5e79-743ca5c3205d" - * ], }, - * "ontology": "facility-2.0", - * "featureCounts": { - * "directoryInfo": 2, - * "category": 10, - * "facility": 1, - * "level": 3, - * "unit": 183, - * "zone": 3, - * "verticalPenetration": 6, - * "opening": 48, - * "areaElement": 108 - * } - * }, - * { - * "timestamp": "2020-01-01T22:57:53.123Z", - * "datasetId": "8b1288fa-1958-4a2b-b68e-13a7i5af7d7c", - * "description": "Create from upload '0c1288fa-2058-4a1b-b68d-13a5f5af7d7c'.", - * "datasetSources": { - * "conversionIds": [ - * "0c1288fa-2058-4a1b-b68d-13a5f5af7d7c" - * ], - * "appendDatasetId": "46d1edb6-d29e-4786-9589-dbd4efd7a977" - * }, - * "ontology": "facility-2.0", - * "featureCounts": { - * "directoryInfo": 2, - * "category": 10, - * "facility": 1, - * "level": 3, - * "unit": 183, - * "zone": 3, - * "verticalPenetration": 6, - * "opening": 48, - * "areaElement": 108 - * } - * } - * ] - * } - * ``` - * @param options The options parameters. - */ - public list( - options?: DatasetListOptionalParams - ): PagedAsyncIterableIterator { - const iter = this.listPagingAll(options); - return { - next() { - return iter.next(); - }, - [Symbol.asyncIterator]() { - return this; - }, - byPage: () => { - return this.listPagingPage(options); - } - }; - } - - private async *listPagingPage( - options?: DatasetListOptionalParams - ): AsyncIterableIterator { - let result = await this._list(options); - yield result.datasets || []; - let continuationToken = result.nextLink; - while (continuationToken) { - result = await this._listNext(continuationToken, options); - continuationToken = result.nextLink; - yield result.datasets || []; - } - } - - private async *listPagingAll( - options?: DatasetListOptionalParams - ): AsyncIterableIterator { - for await (const page of this.listPagingPage(options)) { - yield* page; - } - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to create a dataset from data that was uploaded to the Azure Maps Data - * Service and converted using the Azure Maps Conversion Service. - * - * You can use this API in a scenario like uploading a DWG zip package for a building, converting the - * zip package using the Azure Maps Conversion Service, and creating a dataset from the converted zip - * package. The created dataset can be used to create tilesets using the Azure Maps Tileset Service and - * can be queried via the Azure Maps WFS Service. - * - * ### Submit Create Request - * - * To create your dataset, you will use a `POST` request where the `conversionId` query parameter is an - * ID that represents the converted DWG zip package, the `datasetId` parameter will be the ID of a - * previously created dataset to append with the current dataset and, optionally, the `description` - * query parameter will contain a description (if description is not provided a default description - * will be given). - * - * The Create API is a [long-running request](https://aka.ms/am-creator-lrt-v2). - * @param conversionId The unique ID used to create the dataset. The `conversionId` must have been - * obtained from a successful call to the Conversion Service Convert API and may be provided with - * multiple query parameters with same name (if more than one is provided). - * @param options The options parameters. - */ - async beginCreate( - conversionId: string, - options?: DatasetCreateOptionalParams - ): Promise< - PollerLike, DatasetCreateResponse> - > { - const directSendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ): Promise => { - return this.client.sendOperationRequest(args, spec); - }; - const sendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ) => { - let currentRawResponse: - | coreClient.FullOperationResponse - | undefined = undefined; - const providedCallback = args.options?.onResponse; - const callback: coreClient.RawResponseCallback = ( - rawResponse: coreClient.FullOperationResponse, - flatResponse: unknown - ) => { - currentRawResponse = rawResponse; - providedCallback?.(rawResponse, flatResponse); - }; - const updatedArgs = { - ...args, - options: { - ...args.options, - onResponse: callback - } - }; - const flatResponse = await directSendOperation(updatedArgs, spec); - return { flatResponse, rawResponse: currentRawResponse! }; - }; - - return new LROPoller( - { intervalInMs: options?.updateIntervalInMs }, - { conversionId, options }, - createOperationSpec, - sendOperation, - "location" - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to create a dataset from data that was uploaded to the Azure Maps Data - * Service and converted using the Azure Maps Conversion Service. - * - * You can use this API in a scenario like uploading a DWG zip package for a building, converting the - * zip package using the Azure Maps Conversion Service, and creating a dataset from the converted zip - * package. The created dataset can be used to create tilesets using the Azure Maps Tileset Service and - * can be queried via the Azure Maps WFS Service. - * - * ### Submit Create Request - * - * To create your dataset, you will use a `POST` request where the `conversionId` query parameter is an - * ID that represents the converted DWG zip package, the `datasetId` parameter will be the ID of a - * previously created dataset to append with the current dataset and, optionally, the `description` - * query parameter will contain a description (if description is not provided a default description - * will be given). - * - * The Create API is a [long-running request](https://aka.ms/am-creator-lrt-v2). - * @param conversionId The unique ID used to create the dataset. The `conversionId` must have been - * obtained from a successful call to the Conversion Service Convert API and may be provided with - * multiple query parameters with same name (if more than one is provided). - * @param options The options parameters. - */ - async beginCreateAndWait( - conversionId: string, - options?: DatasetCreateOptionalParams - ): Promise { - const poller = await this.beginCreate(conversionId, options); - return poller.pollUntilDone(); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a list of all previously successfully created datasets. - * - * ### Submit List Request - * - * To list all your datasets, you will issue a `GET` request with no additional parameters. - * - * - * ### List Data Response - * - * The List API returns the complete list of all datasets in `json` format. The response contains the - * following fields (if they are not null or empty): - * > created - The timestamp the dataset was created. - * > datasetId - The id for the dataset. - * > description - The description for the dataset. - * > datasetSources - The source data that was used when the create request was issued. - * > ontology - The source - * [ontology](https://docs.microsoft.com/en-us/azure/azure-maps/creator-facility-ontology) that was - * used in the conversion service for the input data.
- * - * The `datasetSources` describes the source data that was used when the create request was issued and - * contains the following elements (if they are not null or empty): - * - * > conversionIds - The list of `conversionId` (null if none were provided). - * > appendDatasetId - The `datasetId` that was used for an append operation (null if none was used). - * >featureCounts - The counts for each feature type in the dataset.
- * - * Here's a sample response returning the `timestamp`, `datasetId`, `description`, `datasetSources`, - * and `ontology` of 3 dataset resources: - * - * - * ```json - * { - * "datasets": [ - * { - * "timestamp": "2020-01-01T22:50:48.123Z", - * "datasetId": "f6495f62-94f8-0ec2-c252-45626f82fcb2", - * "description": "Some description or comment for the dataset.", - * "datasetSources": { - * "conversionIds": [ - * "15d21452-c9bb-27b6-5e79-743ca5c3205d" - * ], }, - * "ontology": "facility-2.0", - * "featureCounts": { - * "directoryInfo": 2, - * "category": 10, - * "facility": 1, - * "level": 3, - * "unit": 183, - * "zone": 3, - * "verticalPenetration": 6, - * "opening": 48, - * "areaElement": 108 - * } - * }, - * { - * "timestamp": "2020-01-01T22:57:53.123Z", - * "datasetId": "8b1288fa-1958-4a2b-b68e-13a7i5af7d7c", - * "description": "Create from upload '0c1288fa-2058-4a1b-b68d-13a5f5af7d7c'.", - * "datasetSources": { - * "conversionIds": [ - * "0c1288fa-2058-4a1b-b68d-13a5f5af7d7c" - * ], - * "appendDatasetId": "46d1edb6-d29e-4786-9589-dbd4efd7a977" - * }, - * "ontology": "facility-2.0", - * "featureCounts": { - * "directoryInfo": 2, - * "category": 10, - * "facility": 1, - * "level": 3, - * "unit": 183, - * "zone": 3, - * "verticalPenetration": 6, - * "opening": 48, - * "areaElement": 108 - * } - * } - * ] - * } - * ``` - * @param options The options parameters. - */ - private _list( - options?: DatasetListOptionalParams - ): Promise { - return this.client.sendOperationRequest({ options }, listOperationSpec); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a previously successfully created dataset. - * - * ### Submit Get Details Request - * - * To get the details for a previously created dataset, you will issue a `GET` request with the - * `datasetId` in the path. - * - * ### Get Details Response - * - * The Get Details API returns the details for a dataset in `json` format. The response contains the - * following fields (if they are not null or empty): - * > created - The timestamp the dataset was created. - * > datasetId - The id for the dataset. - * > description - The description for the dataset. - * > datasetSources - The source data that was used when the create request was issued. - * > ontology - The source - * [ontology](https://docs.microsoft.com/en-us/azure/azure-maps/creator-facility-ontology) that was - * used in the conversion service for the input data.
- * - * The `datasetSources` describes the source data that was used when the create request was issued and - * contains the following elements (if they are not null or empty): - * > conversionIds - The list of `conversionId` (null if none were provided). - * > appendDatasetId - The `datasetId` that was used for an append operation (null if none was used). - * >featureCounts - The counts for each feature type in the dataset.
- * - * Here's a sample response returning the `timestamp`, `datasetId`, `description`, `datasetSources`, - * and `ontology` of a dataset resource: - * - * ```json - * { - * "timestamp": "2020-01-01T22:50:48.123Z", - * "datasetId": "f6495f62-94f8-0ec2-c252-45626f82fcb2", - * "description": "Some description or comment for the dataset.", - * "datasetSources": { - * "conversionIds": [ - * "15d21452-c9bb-27b6-5e79-743ca5c3205d" - * ], - * }, - * "ontology": "facility-2.0", - * "featureCounts": { - * "directoryInfo": 2, - * "category": 10, - * "facility": 1, - * "level": 3, - * "unit": 183, - * "zone": 3, - * "verticalPenetration": 6, - * "opening": 48, - * "areaElement": 108 - * } - * } - * ``` - * @param datasetId The identifier for the dataset to query from. - * @param options The options parameters. - */ - get( - datasetId: string, - options?: DatasetGetOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { datasetId, options }, - getOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * You can also use this API to delete old/unused datasets to create space for new Creator content. - * - * ### Submit Delete Request - * - * To delete your content you will issue a `DELETE` request where the path will contain the `datasetId` - * of the dataset to delete. - * @param datasetId The identifier for the dataset to query from. - * @param options The options parameters. - */ - delete( - datasetId: string, - options?: DatasetDeleteOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { datasetId, options }, - deleteOperationSpec - ); - } - - /** - * This API allows the caller to view the current progress of a dataset operation and the path is - * obtained from a call to the Create API. - * - * ### Submit Operations Request - * - * To view the current progress of a dataset operation, you will use a `GET` request where the - * `operationId` given the path is the ID that represents the operation. - * - * ### Operation Response - * - * While in progress, a `200-OK` http status code will be returned with no extra headers. If the - * operation succeeds, a `200-OK` http status code with Resource-Location header will be returned. - * @param operationId The ID to query the status for the dataset create/import request. - * @param options The options parameters. - */ - getOperation( - operationId: string, - options?: DatasetGetOperationOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { operationId, options }, - getOperationOperationSpec - ); - } - - /** - * ListNext - * @param nextLink The nextLink from the previous successful call to the List method. - * @param options The options parameters. - */ - private _listNext( - nextLink: string, - options?: DatasetListNextOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { nextLink, options }, - listNextOperationSpec - ); - } -} -// Operation Specifications -const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); - -const createOperationSpec: coreClient.OperationSpec = { - path: "/datasets", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.DatasetCreateHeaders - }, - 201: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.DatasetCreateHeaders - }, - 202: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.DatasetCreateHeaders - }, - 204: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.DatasetCreateHeaders - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.conversionId, - Parameters.datasetId, - Parameters.descriptionDataset - ], - urlParameters: [Parameters.geography], - headerParameters: [Parameters.accept], - serializer -}; -const listOperationSpec: coreClient.OperationSpec = { - path: "/datasets", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.DatasetListResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography], - headerParameters: [Parameters.accept], - serializer -}; -const getOperationSpec: coreClient.OperationSpec = { - path: "/datasets/{datasetId}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.DatasetDetailInfo - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.datasetId1], - headerParameters: [Parameters.accept], - serializer -}; -const deleteOperationSpec: coreClient.OperationSpec = { - path: "/datasets/{datasetId}", - httpMethod: "DELETE", - responses: { - 204: {}, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.datasetId1], - headerParameters: [Parameters.accept], - serializer -}; -const getOperationOperationSpec: coreClient.OperationSpec = { - path: "/datasets/operations/{operationId}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.DatasetGetOperationHeaders - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.operationId], - headerParameters: [Parameters.accept], - serializer -}; -const listNextOperationSpec: coreClient.OperationSpec = { - path: "{nextLink}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.DatasetListResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.nextLink], - headerParameters: [Parameters.accept], - serializer -}; diff --git a/sdk/maps/maps-creator/src/operations/featureState.ts b/sdk/maps/maps-creator/src/operations/featureState.ts deleted file mode 100644 index 28c406988606..000000000000 --- a/sdk/maps/maps-creator/src/operations/featureState.ts +++ /dev/null @@ -1,484 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import "@azure/core-paging"; -import { PagedAsyncIterableIterator } from "@azure/core-paging"; -import { FeatureState } from "../operationsInterfaces"; -import * as coreClient from "@azure/core-client"; -import * as Mappers from "../models/mappers"; -import * as Parameters from "../models/parameters"; -import { CreatorClientContext } from "../creatorClientContext"; -import { - StatesetInfoObject, - FeatureStateListStatesetNextOptionalParams, - FeatureStateListStatesetOptionalParams, - StylesObject, - FeatureStateCreateStatesetOptionalParams, - FeatureStateCreateStatesetResponse, - FeatureStateListStatesetResponse, - FeatureStatePutStatesetOptionalParams, - FeatureStateDeleteStatesetOptionalParams, - FeatureStateGetStatesetOptionalParams, - FeatureStateGetStatesetResponse, - FeatureStatesStructure, - FeatureStateUpdateStatesOptionalParams, - FeatureStateDeleteStateOptionalParams, - FeatureStateGetStatesOptionalParams, - FeatureStateGetStatesResponse, - FeatureStateListStatesetNextResponse -} from "../models"; - -/// -/** Class representing a FeatureState. */ -export class FeatureStateImpl implements FeatureState { - private readonly client: CreatorClientContext; - - /** - * Initialize a new instance of the class FeatureState class. - * @param client Reference to the service client - */ - constructor(client: CreatorClientContext) { - this.client = client; - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a list of all previously successfully created statesets. - * @param options The options parameters. - */ - public listStateset( - options?: FeatureStateListStatesetOptionalParams - ): PagedAsyncIterableIterator { - const iter = this.listStatesetPagingAll(options); - return { - next() { - return iter.next(); - }, - [Symbol.asyncIterator]() { - return this; - }, - byPage: () => { - return this.listStatesetPagingPage(options); - } - }; - } - - private async *listStatesetPagingPage( - options?: FeatureStateListStatesetOptionalParams - ): AsyncIterableIterator { - let result = await this._listStateset(options); - yield result.statesets || []; - let continuationToken = result.nextLink; - while (continuationToken) { - result = await this._listStatesetNext(continuationToken, options); - continuationToken = result.nextLink; - yield result.statesets || []; - } - } - - private async *listStatesetPagingAll( - options?: FeatureStateListStatesetOptionalParams - ): AsyncIterableIterator { - for await (const page of this.listStatesetPagingPage(options)) { - yield* page; - } - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This POST API allows the user to create a new Stateset and define stateset style using request body. - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. The Feature State API is part of Creator. - * - * The Feature State service allows the user to update the states of a feature and query them to be - * used in other services. The dynamic properties of a feature that don't belong to the dataset are - * referred to as *states* here. - * - * This Feature State service pivot on the Stateset. Like Tileset, Stateset encapsulates the storage - * mechanism for feature states for a dataset. - * - * Once the stateset is created, users can use that statesetId to post feature state updates and - * retrieve the current feature states. A feature can have only one state at a given point in time. - * - * Feature state is defined by the key name, value and the timestamp. When a feature state update is - * posted to Azure Maps, the state value gets updated only if the provided state’s timestamp is later - * than the stored timestamp. - * - * Azure Maps MapControl provides a way to use these feature states to style the features. Please refer - * to the State Tile documentation for more information. - * @param datasetId The datasetId must have been obtained from a successful [Dataset Create - * API](https://docs.microsoft.com/en-us/rest/api/maps/v2/dataset/create) call. - * @param statesetCreateRequestBody The stateset style JSON data. - * @param options The options parameters. - */ - createStateset( - datasetId: string, - statesetCreateRequestBody: StylesObject, - options?: FeatureStateCreateStatesetOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { datasetId, statesetCreateRequestBody, options }, - createStatesetOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a list of all previously successfully created statesets. - * @param options The options parameters. - */ - private _listStateset( - options?: FeatureStateListStatesetOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { options }, - listStatesetOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This PUT API allows the user to update the stateset style rules. - * @param statesetId The stateset id that was created. - * @param statesetStyleUpdateRequestBody The stateset style JSON data. Only style rules are allowed to - * be updated, update on keyname and type is not allowed. - * @param options The options parameters. - */ - putStateset( - statesetId: string, - statesetStyleUpdateRequestBody: StylesObject, - options?: FeatureStatePutStatesetOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { statesetId, statesetStyleUpdateRequestBody, options }, - putStatesetOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This DELETE API allows the user to delete the stateset and the associated data. - * @param statesetId The stateset id that was created. - * @param options The options parameters. - */ - deleteStateset( - statesetId: string, - options?: FeatureStateDeleteStatesetOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { statesetId, options }, - deleteStatesetOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This GET API allows the user to get the stateset Information. - * - * The stateset Information includes the datasetId associated to the stateset, and the styles of that - * stateset. - * @param statesetId The stateset id that was created. - * @param options The options parameters. - */ - getStateset( - statesetId: string, - options?: FeatureStateGetStatesetOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { statesetId, options }, - getStatesetOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This PUT API allows the user to update the state of the given feature in the given stateset. - * @param statesetId The stateset id that was created. - * @param featureId The id of a feature in the given dataset. If the featureId is not present in the - * dataset, Bad Request response will be returned. - * @param featureStateUpdateRequestBody The feature state JSON data. A feature can have only one state - * at a given point in time. The specified state keyname must have been defined during the stateset - * creation. - * @param options The options parameters. - */ - updateStates( - statesetId: string, - featureId: string, - featureStateUpdateRequestBody: FeatureStatesStructure, - options?: FeatureStateUpdateStatesOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { statesetId, featureId, featureStateUpdateRequestBody, options }, - updateStatesOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API deletes the state information identified by the StateKeyName parameter for the feature - * identified by the FeatureId parameter in the the stateset. - * @param statesetId The stateset id that was created. - * @param featureId The id of a feature in the given stateset. If no state was set for the featureId in - * the stateset earlier, Bad Request response will be returned. - * @param stateKeyName The Name of the state to be deleted. - * @param options The options parameters. - */ - deleteState( - statesetId: string, - featureId: string, - stateKeyName: string, - options?: FeatureStateDeleteStateOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { statesetId, featureId, stateKeyName, options }, - deleteStateOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API returns the current state information associated with the given feature in the given - * stateset. - * @param statesetId The stateset id that was created. - * @param featureId The id of a feature in the given stateset. If no state was set for the featureId in - * the stateset earlier, Bad Request response will be returned. - * @param options The options parameters. - */ - getStates( - statesetId: string, - featureId: string, - options?: FeatureStateGetStatesOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { statesetId, featureId, options }, - getStatesOperationSpec - ); - } - - /** - * ListStatesetNext - * @param nextLink The nextLink from the previous successful call to the ListStateset method. - * @param options The options parameters. - */ - private _listStatesetNext( - nextLink: string, - options?: FeatureStateListStatesetNextOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { nextLink, options }, - listStatesetNextOperationSpec - ); - } -} -// Operation Specifications -const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); - -const createStatesetOperationSpec: coreClient.OperationSpec = { - path: "/featureStateSets", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.StatesetCreatedResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.statesetCreateRequestBody, - queryParameters: [ - Parameters.apiVersion, - Parameters.description, - Parameters.datasetId2 - ], - urlParameters: [Parameters.geography], - headerParameters: [Parameters.accept, Parameters.contentType2], - mediaType: "json", - serializer -}; -const listStatesetOperationSpec: coreClient.OperationSpec = { - path: "/featureStateSets", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.StatesetListResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography], - headerParameters: [Parameters.accept], - serializer -}; -const putStatesetOperationSpec: coreClient.OperationSpec = { - path: "/featureStateSets/{statesetId}", - httpMethod: "PUT", - responses: { - 200: {}, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.statesetStyleUpdateRequestBody, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.statesetId], - headerParameters: [Parameters.accept, Parameters.contentType2], - mediaType: "json", - serializer -}; -const deleteStatesetOperationSpec: coreClient.OperationSpec = { - path: "/featureStateSets/{statesetId}", - httpMethod: "DELETE", - responses: { - 204: {}, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.statesetId], - headerParameters: [Parameters.accept], - serializer -}; -const getStatesetOperationSpec: coreClient.OperationSpec = { - path: "/featureStateSets/{statesetId}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.StatesetGetResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.statesetId], - headerParameters: [Parameters.accept], - serializer -}; -const updateStatesOperationSpec: coreClient.OperationSpec = { - path: "/featureStateSets/{statesetId}/featureStates/{featureId}", - httpMethod: "PUT", - responses: { - 200: {}, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.featureStateUpdateRequestBody, - queryParameters: [Parameters.apiVersion], - urlParameters: [ - Parameters.geography, - Parameters.statesetId, - Parameters.featureId - ], - headerParameters: [Parameters.accept, Parameters.contentType2], - mediaType: "json", - serializer -}; -const deleteStateOperationSpec: coreClient.OperationSpec = { - path: "/featureStateSets/{statesetId}/featureStates/{featureId}", - httpMethod: "DELETE", - responses: { - 204: {}, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion, Parameters.stateKeyName], - urlParameters: [ - Parameters.geography, - Parameters.statesetId, - Parameters.featureId - ], - headerParameters: [Parameters.accept], - serializer -}; -const getStatesOperationSpec: coreClient.OperationSpec = { - path: "/featureStateSets/{statesetId}/featureStates/{featureId}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.FeatureStatesStructure - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [ - Parameters.geography, - Parameters.statesetId, - Parameters.featureId - ], - headerParameters: [Parameters.accept], - serializer -}; -const listStatesetNextOperationSpec: coreClient.OperationSpec = { - path: "{nextLink}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.StatesetListResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.nextLink], - headerParameters: [Parameters.accept], - serializer -}; diff --git a/sdk/maps/maps-creator/src/operations/index.ts b/sdk/maps/maps-creator/src/operations/index.ts deleted file mode 100644 index 7fe2a1f1d8c6..000000000000 --- a/sdk/maps/maps-creator/src/operations/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./alias"; -export * from "./data"; -export * from "./dataset"; -export * from "./conversion"; -export * from "./featureState"; -export * from "./spatial"; -export * from "./tileset"; -export * from "./wfs"; diff --git a/sdk/maps/maps-creator/src/operations/spatial.ts b/sdk/maps/maps-creator/src/operations/spatial.ts deleted file mode 100644 index b5ca4ec871ba..000000000000 --- a/sdk/maps/maps-creator/src/operations/spatial.ts +++ /dev/null @@ -1,631 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { Spatial } from "../operationsInterfaces"; -import * as coreClient from "@azure/core-client"; -import * as Mappers from "../models/mappers"; -import * as Parameters from "../models/parameters"; -import { CreatorClientContext } from "../creatorClientContext"; -import { - ResponseFormat, - SpatialGetGeofenceOptionalParams, - SpatialGetGeofenceResponse, - SpatialPostGeofenceOptionalParams, - SpatialPostGeofenceResponse, - BufferRequestBody, - SpatialPostBufferOptionalParams, - SpatialPostBufferResponse, - SpatialGetBufferOptionalParams, - SpatialGetBufferResponse, - SpatialPostClosestPointOptionalParams, - SpatialPostClosestPointResponse, - SpatialGetClosestPointOptionalParams, - SpatialGetClosestPointResponse, - SpatialPostPointInPolygonOptionalParams, - SpatialPostPointInPolygonResponse, - SpatialGetPointInPolygonOptionalParams, - SpatialGetPointInPolygonResponse, - SpatialGetGreatCircleDistanceOptionalParams, - SpatialGetGreatCircleDistanceResponse -} from "../models"; - -/** Class representing a Spatial. */ -export class SpatialImpl implements Spatial { - private readonly client: CreatorClientContext; - - /** - * Initialize a new instance of the class Spatial class. - * @param client Reference to the service client - */ - constructor(client: CreatorClientContext) { - this.client = client; - } - - /** - * **Search Geofence Get API** - * - * **Applies to:** S1 Pricing tier. - * - * The Geofence Get API allows you to retrieve the proximity of a coordinate to a - * geofence that has been uploaded to the Data service. You can use the - * [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) to upload - * a geofence or set of fences. See [Geofencing GeoJSON - * data](https://docs.microsoft.com/en-us/azure/azure-maps/geofence-geojson) - * for more details on the geofence data format. To query the proximity of a coordinate, you supply the - * location of the object you are tracking as well - * as the ID for the fence or set of fences, and the response will contain information about - * the distance from the outer edge of the geofence. A negative value signifies that the - * coordinate is inside of the fence while a positive value means that it is outside of the - * fence.

This API can be used for a variety of scenarios that include things like asset - * tracking, fleet management, or setting up alerts for moving objects. - * - * The API supports [integration with Event - * Grid](https://docs.microsoft.com/azure/azure-maps/azure-maps-event-grid-integration). The isAsync - * parameter is used to enable integration with Event Grid (disabled by default). - * To test this API, you can upload the sample data from Post Geofence API examples(Request Body) via - * Data Upload API and replace the [udid] from the sample request below with the udid returned by Data - * Upload API. - * - * - * ### Geofencing InnerError code - * - * In geofencing response error contract, `innererror` is an object containing service specific - * information about the error. `code` is a property in `innererror` which can map to a specific - * geofencing error type. The table belows shows the code mapping between all the known client error - * type to the corresponding geofencing error `message`. - * - * innererror.code | error.message - * ---------------------------- | -------------------------------------- - * NullDeviceId | Device Id should not be null. - * NullUdid | Udid should not be null. - * UdidWrongFormat| Udid should be acquired from user data ingestion API. - * InvalidUserTime| Usertime is invalid. - * InvalidSearchBuffer| Searchbuffer is invalid. - * InvalidSearchRange| The value range of searchbuffer should be from 0 to 500 meters. - * InvalidLatLon| Lat and/or lon parameters are invalid. - * InvalidIsAsyncValue| The IsAsync parameter is invalid. - * InvalidModeValue| The mode parameter invalid. - * InvalidJson| Geofencing data is not a valid json file. - * NotSupportedGeoJson| Geofencing data can't be read as a Feature or FeatureCollections. - * InvalidGeoJson| Geofencing data is invalid. - * NoUserDataWithAccountOrSubscription| Can't find user geofencing data with provided account-id and/or - * subscription-id. - * NoUserDataWithUdid| Can't find user geofencing data with provided udid. - * @param format Desired format of the response. Only `json` format is supported. - * @param deviceId ID of the device - * @param udid The unique id returned from [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) after uploading a valid - * GeoJSON FeatureCollection object. Please refer to [RFC - * 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. All the feature's properties - * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. - * @param latitude The latitude of the location being passed. Example: 48.36. - * @param longitude The longitude of the location being passed. Example: -124.63. - * @param options The options parameters. - */ - getGeofence( - format: ResponseFormat, - deviceId: string, - udid: string, - latitude: number, - longitude: number, - options?: SpatialGetGeofenceOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, deviceId, udid, latitude, longitude, options }, - getGeofenceOperationSpec - ); - } - - /** - * **Search Geofence Post API** - * **Applies to:** S1 Pricing tier. - * The Geofence Post API allows you to retrieve the proximity of a coordinate to a provided geofence - * or set of fences. With POST call, you do not have to upload the fence data in advance, instead you - * supply the location of the object you are tracking in query parameters as well as the fence or set - * of fences data in post request body. See [Geofencing GeoJSON - * data](https://docs.microsoft.com/en-us/azure/azure-maps/geofence-geojson) for more details on the - * geofence data format. The response will contain information about the distance from the outer edge - * of the geofence. A negative value signifies that the coordinate is inside of the fence while a - * positive value means that it is outside of the fence.

This API can be used for a variety of - * scenarios that include things like asset tracking, fleet management, or setting up alerts for - * moving objects. - * - * The API supports [integration with Event - * Grid](https://docs.microsoft.com/azure/azure-maps/azure-maps-event-grid-integration). The isAsync - * parameter is used to enable integration with Event Grid (disabled by default). - * @param format Desired format of the response. Only `json` format is supported. - * @param deviceId ID of the device - * @param latitude The latitude of the location being passed. Example: 48.36. - * @param longitude The longitude of the location being passed. Example: -124.63. - * @param searchGeofenceRequestBody The geofencing GeoJSON data. - * @param options The options parameters. - */ - postGeofence( - format: ResponseFormat, - deviceId: string, - latitude: number, - longitude: number, - searchGeofenceRequestBody: Record, - options?: SpatialPostGeofenceOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { - format, - deviceId, - latitude, - longitude, - searchGeofenceRequestBody, - options - }, - postGeofenceOperationSpec - ); - } - - /** - * **Applies to**: S1 pricing tier. - * - * This API returns a FeatureCollection where each Feature is a buffer around the corresponding indexed - * Feature of the input. The buffer could be either on the outside or the inside of the provided - * Feature, depending on the distance provided in the input. There must be either one distance provided - * per Feature in the FeatureCollection input, or if only one distance is provided, then that distance - * is applied to every Feature in the collection. The positive (or negative) buffer of a geometry is - * defined as the Minkowski sum (or difference) of the geometry with a circle of radius equal to the - * absolute value of the buffer distance. The buffer API always returns a polygonal result. The - * negative or zero-distance buffer of lines and points is always an empty polygon. The input may - * contain a collection of Point, MultiPoint, Polygon, MultiPolygon, LineString and MultiLineString. - * GeometryCollection will be ignored if provided. - * @param format Desired format of the response. Only `json` format is supported. - * @param bufferRequestBody The FeatureCollection and the list of distances (one per feature or one for - * all features). - * @param options The options parameters. - */ - postBuffer( - format: ResponseFormat, - bufferRequestBody: BufferRequestBody, - options?: SpatialPostBufferOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, bufferRequestBody, options }, - postBufferOperationSpec - ); - } - - /** - * **Applies to**: S1 pricing tier. - * - * This API returns a FeatureCollection where each Feature is a buffer around the corresponding indexed - * Feature of the input. The buffer could be either on the outside or the inside of the provided - * Feature, depending on the distance provided in the input. There must be either one distance provided - * per Feature in the FeatureCollection input, or if only one distance is provided, then that distance - * is applied to every Feature in the collection. The positive (or negative) buffer of a geometry is - * defined as the Minkowski sum (or difference) of the geometry with a circle of radius equal to the - * absolute value of the buffer distance. The buffer API always returns a polygonal result. The - * negative or zero-distance buffer of lines and points is always an empty polygon. The input features - * are provided by a GeoJSON file which is uploaded via [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and referenced by a unique - * udid. The GeoJSON file may contain a collection of Point, MultiPoint, Polygon, MultiPolygon, - * LineString and MultiLineString. GeometryCollection will be ignored if provided. - * - * To test this API, you can upload the sample data from [Post Buffer - * API](https://docs.microsoft.com/en-us/rest/api/maps/spatial/postbuffer#examples) examples(Request - * Body without distances array) via [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and replace the [udid] from - * the [sample request - * below](https://docs.microsoft.com/en-us/rest/api/maps/spatial/getbuffer#examples) with the udid - * returned by Data Upload API. - * @param format Desired format of the response. Only `json` format is supported. - * @param udid The unique id returned from [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) after uploading a valid - * GeoJSON FeatureCollection object. Please refer to [RFC - * 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. All the feature's properties - * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. - * @param distances The list of distances (one per feature or one for all features), delimited by - * semicolons. For example, 12.34;-56.78. Positive distance will generate a buffer outside of the - * feature, whereas negative distance will generate a buffer inside of the feature. If the negative - * distance larger than the geometry itself, an empty polygon will be returned. - * @param options The options parameters. - */ - getBuffer( - format: ResponseFormat, - udid: string, - distances: string, - options?: SpatialGetBufferOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, udid, distances, options }, - getBufferOperationSpec - ); - } - - /** - * **Applies to**: S1 pricing tier. - * - * This API returns the closest point between a base point and a given set of target points. The set of - * target points is provided by user data in post request body. The user data may only contain a - * collection of Point geometry. MultiPoint or other geometries will be ignored if provided. The - * algorithm does not take into account routing or traffic. The maximum number of points accepted is - * 100,000. Information returned includes closest point latitude, longitude, and distance in meters - * from the closest point. - * @param format Desired format of the response. Only `json` format is supported. - * @param latitude The latitude of the location being passed. Example: 48.36. - * @param longitude The longitude of the location being passed. Example: -124.63. - * @param closestPointRequestBody The FeatureCollection of Point geometries from which closest point to - * source point should be determined. All the feature's properties should contain `geometryId`, which - * is used for identifying the geometry and is case-sensitive. - * @param options The options parameters. - */ - postClosestPoint( - format: ResponseFormat, - latitude: number, - longitude: number, - closestPointRequestBody: Record, - options?: SpatialPostClosestPointOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, latitude, longitude, closestPointRequestBody, options }, - postClosestPointOperationSpec - ); - } - - /** - * **Applies to**: S1 pricing tier. - * - * This API returns the closest point between a base point and a given set of points in the user - * uploaded data set identified by udid. The set of target points is provided by a GeoJSON file which - * is uploaded via [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) - * and referenced by a unique udid. The GeoJSON file may only contain a collection of Point geometry. - * MultiPoint or other geometries will be ignored if provided. The maximum number of points accepted is - * 100,000. The algorithm does not take into account routing or traffic. Information returned includes - * closest point latitude, longitude, and distance in meters from the closest point. - * - * To test this API, you can upload the sample data from [Post Closest Point - * API](https://docs.microsoft.com/en-us/rest/api/maps/spatial/postclosestpoint#examples) - * examples(Request Body) via [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and replace the [udid] from - * the [sample request - * below](https://docs.microsoft.com/en-us/rest/api/maps/spatial/getclosestpoint#examples) with the - * udid returned by Data Upload API. - * @param format Desired format of the response. Only `json` format is supported. - * @param udid The unique id returned from [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) after uploading a valid - * GeoJSON FeatureCollection object. Please refer to [RFC - * 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. All the feature's properties - * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. - * @param latitude The latitude of the location being passed. Example: 48.36. - * @param longitude The longitude of the location being passed. Example: -124.63. - * @param options The options parameters. - */ - getClosestPoint( - format: ResponseFormat, - udid: string, - latitude: number, - longitude: number, - options?: SpatialGetClosestPointOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, udid, latitude, longitude, options }, - getClosestPointOperationSpec - ); - } - - /** - * **Applies to**: S1 pricing tier. - * - * This API returns a boolean value indicating whether a point is inside a set of polygons. The user - * data may contain Polygon and MultiPolygon geometries, other geometries will be ignored if provided. - * If the point is inside or on the boundary of one of these polygons, the value returned is true. In - * all other cases, the value returned is false. When the point is inside multiple polygons, the result - * will give intersecting geometries section to show all valid geometries (referenced by geometryId) in - * user data. The maximum number of vertices accepted to form a Polygon is 10,000. - * @param format Desired format of the response. Only `json` format is supported. - * @param latitude The latitude of the location being passed. Example: 48.36. - * @param longitude The longitude of the location being passed. Example: -124.63. - * @param pointInPolygonRequestBody A FeatureCollection with a set of Polygon/MultiPolygon geometries. - * The maximum number of vertices accepted to form a Polygon is 10,000. All the feature's properties - * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. - * @param options The options parameters. - */ - postPointInPolygon( - format: ResponseFormat, - latitude: number, - longitude: number, - pointInPolygonRequestBody: Record, - options?: SpatialPostPointInPolygonOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, latitude, longitude, pointInPolygonRequestBody, options }, - postPointInPolygonOperationSpec - ); - } - - /** - * **Applies to**: S1 pricing tier. - * - * This API returns a boolean value indicating whether a point is inside a set of polygons. The set of - * polygons is provided by a GeoJSON file which is uploaded via [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and referenced by a unique - * udid. The GeoJSON file may contain Polygon and MultiPolygon geometries, other geometries will be - * ignored if provided. If the point is inside or on the boundary of one of these polygons, the value - * returned is true. In all other cases, the value returned is false. When the point is inside multiple - * polygons, the result will give intersecting geometries section to show all valid - * geometries(referenced by geometryId) in user data. The maximum number of vertices accepted to form a - * Polygon is 10,000. - * - * - * To test this API, you can upload the sample data from [Post Point In Polygon - * API](https://docs.microsoft.com/en-us/rest/api/maps/spatial/postpointinpolygon#examples) - * examples(Request Body) via [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and replace the [udid] from - * the [sample request - * below](https://docs.microsoft.com/en-us/rest/api/maps/spatial/getpointinpolygon#examples) with the - * udid returned by Data Upload API. - * @param format Desired format of the response. Only `json` format is supported. - * @param udid The unique id returned from [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) after uploading a valid - * GeoJSON FeatureCollection object. Please refer to [RFC - * 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. All the feature's properties - * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. - * @param latitude The latitude of the location being passed. Example: 48.36. - * @param longitude The longitude of the location being passed. Example: -124.63. - * @param options The options parameters. - */ - getPointInPolygon( - format: ResponseFormat, - udid: string, - latitude: number, - longitude: number, - options?: SpatialGetPointInPolygonOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, udid, latitude, longitude, options }, - getPointInPolygonOperationSpec - ); - } - - /** - * **Applies to**: S1 pricing tier. - * - * This API will return the great-circle or shortest distance between two points on the surface of a - * sphere, measured along the surface of the sphere. This differs from calculating a straight line - * through the sphere's interior. This method is helpful for estimating travel distances for airplanes - * by calculating the shortest distance between airports. - * @param format Desired format of the response. Only `json` format is supported. - * @param query The Coordinates through which the distance is calculated, delimited by a colon. Two - * coordinates are required. The first one is the source point coordinate and the last is the target - * point coordinate. For example, 47.622942,122.316456:57.673988,127.121513 - * @param options The options parameters. - */ - getGreatCircleDistance( - format: ResponseFormat, - query: string, - options?: SpatialGetGreatCircleDistanceOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getGreatCircleDistanceOperationSpec - ); - } -} -// Operation Specifications -const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); - -const getGeofenceOperationSpec: coreClient.OperationSpec = { - path: "/spatial/geofence/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.GeofenceResponse, - headersMapper: Mappers.SpatialGetGeofenceHeaders - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.udid, - Parameters.apiVersion1, - Parameters.deviceId, - Parameters.latitude, - Parameters.longitude, - Parameters.z, - Parameters.userTime, - Parameters.searchBuffer, - Parameters.isAsync, - Parameters.mode - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const postGeofenceOperationSpec: coreClient.OperationSpec = { - path: "/spatial/geofence/{format}", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.GeofenceResponse, - headersMapper: Mappers.SpatialPostGeofenceHeaders - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.searchGeofenceRequestBody, - queryParameters: [ - Parameters.apiVersion1, - Parameters.deviceId, - Parameters.latitude, - Parameters.longitude, - Parameters.z, - Parameters.userTime, - Parameters.searchBuffer, - Parameters.isAsync, - Parameters.mode - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [ - Parameters.accept, - Parameters.xMsClientId, - Parameters.contentType2 - ], - mediaType: "json", - serializer -}; -const postBufferOperationSpec: coreClient.OperationSpec = { - path: "/spatial/buffer/{format}", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.BufferResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.bufferRequestBody, - queryParameters: [Parameters.apiVersion1], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [ - Parameters.accept, - Parameters.xMsClientId, - Parameters.contentType2 - ], - mediaType: "json", - serializer -}; -const getBufferOperationSpec: coreClient.OperationSpec = { - path: "/spatial/buffer/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.BufferResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.udid, - Parameters.apiVersion1, - Parameters.distances - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const postClosestPointOperationSpec: coreClient.OperationSpec = { - path: "/spatial/closestPoint/{format}", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.ClosestPointResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.closestPointRequestBody, - queryParameters: [ - Parameters.apiVersion1, - Parameters.latitude, - Parameters.longitude, - Parameters.numberOfClosestPoints - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [ - Parameters.accept, - Parameters.xMsClientId, - Parameters.contentType2 - ], - mediaType: "json", - serializer -}; -const getClosestPointOperationSpec: coreClient.OperationSpec = { - path: "/spatial/closestPoint/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.ClosestPointResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.udid, - Parameters.apiVersion1, - Parameters.latitude, - Parameters.longitude, - Parameters.numberOfClosestPoints - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const postPointInPolygonOperationSpec: coreClient.OperationSpec = { - path: "/spatial/pointInPolygon/{format}", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.PointInPolygonResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.pointInPolygonRequestBody, - queryParameters: [ - Parameters.apiVersion1, - Parameters.latitude, - Parameters.longitude - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [ - Parameters.accept, - Parameters.xMsClientId, - Parameters.contentType2 - ], - mediaType: "json", - serializer -}; -const getPointInPolygonOperationSpec: coreClient.OperationSpec = { - path: "/spatial/pointInPolygon/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.PointInPolygonResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.udid, - Parameters.apiVersion1, - Parameters.latitude, - Parameters.longitude - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getGreatCircleDistanceOperationSpec: coreClient.OperationSpec = { - path: "/spatial/greatCircleDistance/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.GreatCircleDistanceResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion1, Parameters.query], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; diff --git a/sdk/maps/maps-creator/src/operations/tileset.ts b/sdk/maps/maps-creator/src/operations/tileset.ts deleted file mode 100644 index 79d99c31c082..000000000000 --- a/sdk/maps/maps-creator/src/operations/tileset.ts +++ /dev/null @@ -1,442 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import "@azure/core-paging"; -import { PagedAsyncIterableIterator } from "@azure/core-paging"; -import { Tileset } from "../operationsInterfaces"; -import * as coreClient from "@azure/core-client"; -import * as Mappers from "../models/mappers"; -import * as Parameters from "../models/parameters"; -import { CreatorClientContext } from "../creatorClientContext"; -import { LROPoller, shouldDeserializeLRO } from "../lro"; -import { PollerLike, PollOperationState } from "@azure/core-lro"; -import { - TilesetDetailInfo, - TilesetListNextOptionalParams, - TilesetListOptionalParams, - TilesetCreateOptionalParams, - TilesetCreateResponse, - TilesetListOperationResponse, - TilesetGetOptionalParams, - TilesetGetResponse, - TilesetDeleteOptionalParams, - TilesetGetOperationOptionalParams, - TilesetGetOperationResponse, - TilesetListNextResponse -} from "../models"; - -/// -/** Class representing a Tileset. */ -export class TilesetImpl implements Tileset { - private readonly client: CreatorClientContext; - - /** - * Initialize a new instance of the class Tileset class. - * @param client Reference to the service client - */ - constructor(client: CreatorClientContext) { - this.client = client; - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a list of all tilesets created. - *
- * @param options The options parameters. - */ - public list( - options?: TilesetListOptionalParams - ): PagedAsyncIterableIterator { - const iter = this.listPagingAll(options); - return { - next() { - return iter.next(); - }, - [Symbol.asyncIterator]() { - return this; - }, - byPage: () => { - return this.listPagingPage(options); - } - }; - } - - private async *listPagingPage( - options?: TilesetListOptionalParams - ): AsyncIterableIterator { - let result = await this._list(options); - yield result.tilesets || []; - let continuationToken = result.nextLink; - while (continuationToken) { - result = await this._listNext(continuationToken, options); - continuationToken = result.nextLink; - yield result.tilesets || []; - } - } - - private async *listPagingAll( - options?: TilesetListOptionalParams - ): AsyncIterableIterator { - for await (const page of this.listPagingPage(options)) { - yield* page; - } - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * [This](https://docs.microsoft.com/en-us/azure/azure-maps/creator-indoor-maps) article introduces - * concepts and tools that apply to Azure Maps Creator. - * - * The Tileset Create API allows the caller to create a tileset from a dataset. A tileset contains a - * set of tiles that can be consumed - * from the [Get Map Tile](/rest/api/maps/render/getmaptile) to retrieve custom tiles. To make a - * dataset, use the - * [DataSet Create API](/rest/api/maps/dataset/createpreview). - * - * ## Submit Create Request - * - * To create your tileset you will make a `POST` request with an empty body. The `datasetId` query - * parameter will be - * used as the source of the tileset data. - * - * The Create Tileset API is a - * [long-running request](https://aka.ms/am-creator-lrt-v2). - * @param datasetId The unique `datasetId` that the tileset create API uses to retrieve features to - * generate tiles. The `datasetId` must have been obtained from a successful [Dataset Create - * API](/en-us/rest/api/maps/dataset/createpreview) call. - * @param options The options parameters. - */ - async beginCreate( - datasetId: string, - options?: TilesetCreateOptionalParams - ): Promise< - PollerLike, TilesetCreateResponse> - > { - const directSendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ): Promise => { - return this.client.sendOperationRequest(args, spec); - }; - const sendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ) => { - let currentRawResponse: - | coreClient.FullOperationResponse - | undefined = undefined; - const providedCallback = args.options?.onResponse; - const callback: coreClient.RawResponseCallback = ( - rawResponse: coreClient.FullOperationResponse, - flatResponse: unknown - ) => { - currentRawResponse = rawResponse; - providedCallback?.(rawResponse, flatResponse); - }; - const updatedArgs = { - ...args, - options: { - ...args.options, - onResponse: callback - } - }; - const flatResponse = await directSendOperation(updatedArgs, spec); - return { flatResponse, rawResponse: currentRawResponse! }; - }; - - return new LROPoller( - { intervalInMs: options?.updateIntervalInMs }, - { datasetId, options }, - createOperationSpec, - sendOperation, - "location" - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * [This](https://docs.microsoft.com/en-us/azure/azure-maps/creator-indoor-maps) article introduces - * concepts and tools that apply to Azure Maps Creator. - * - * The Tileset Create API allows the caller to create a tileset from a dataset. A tileset contains a - * set of tiles that can be consumed - * from the [Get Map Tile](/rest/api/maps/render/getmaptile) to retrieve custom tiles. To make a - * dataset, use the - * [DataSet Create API](/rest/api/maps/dataset/createpreview). - * - * ## Submit Create Request - * - * To create your tileset you will make a `POST` request with an empty body. The `datasetId` query - * parameter will be - * used as the source of the tileset data. - * - * The Create Tileset API is a - * [long-running request](https://aka.ms/am-creator-lrt-v2). - * @param datasetId The unique `datasetId` that the tileset create API uses to retrieve features to - * generate tiles. The `datasetId` must have been obtained from a successful [Dataset Create - * API](/en-us/rest/api/maps/dataset/createpreview) call. - * @param options The options parameters. - */ - async beginCreateAndWait( - datasetId: string, - options?: TilesetCreateOptionalParams - ): Promise { - const poller = await this.beginCreate(datasetId, options); - return poller.pollUntilDone(); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a list of all tilesets created. - *
- * @param options The options parameters. - */ - private _list( - options?: TilesetListOptionalParams - ): Promise { - return this.client.sendOperationRequest({ options }, listOperationSpec); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a tileset. - * @param tilesetId The Tileset Id - * @param options The options parameters. - */ - get( - tilesetId: string, - options?: TilesetGetOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { tilesetId, options }, - getOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to delete a created tileset.
- * You can use this API if a tileset is no longer needed. - * - * ### Submit Delete Request - * - * To delete your content you will issue a `DELETE` request where the path will contain the `tilesetId` - * of the tileset to delete.
- * - * #### Delete request "Successful" - * - * The Tileset Delete API returns a HTTP `204 No Content` response with an empty body, if the tileset - * was deleted successfully.
- * - * #### Delete request "Failed" - * - * A HTTP `400 Bad Request` error response will be returned if the tileset with the passed-in - * `tilesetId` is not found. - * - * Here is a sample error response: - * - *
- * - * ```json - * { - * "error": { - * "code": "400 BadRequest", - * "message": "Bad request - Tileset Id: d85b5b27-5fc4-4599-8b50-47160e90f8ce does not exist." - * } - * } - * ``` - * @param tilesetId The Tileset Id - * @param options The options parameters. - */ - delete( - tilesetId: string, - options?: TilesetDeleteOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { tilesetId, options }, - deleteOperationSpec - ); - } - - /** - * This path will be obtained from a call to /tilesets/create. While in progress, an http200 will be - * returned with no extra headers - followed by an http200 with Resource-Location header once - * successfully completed. - * @param operationId The ID to query the status for the dataset create/import request. - * @param options The options parameters. - */ - getOperation( - operationId: string, - options?: TilesetGetOperationOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { operationId, options }, - getOperationOperationSpec - ); - } - - /** - * ListNext - * @param nextLink The nextLink from the previous successful call to the List method. - * @param options The options parameters. - */ - private _listNext( - nextLink: string, - options?: TilesetListNextOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { nextLink, options }, - listNextOperationSpec - ); - } -} -// Operation Specifications -const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); - -const createOperationSpec: coreClient.OperationSpec = { - path: "/tilesets", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.TilesetCreateHeaders - }, - 201: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.TilesetCreateHeaders - }, - 202: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.TilesetCreateHeaders - }, - 204: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.TilesetCreateHeaders - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.description, - Parameters.datasetId2 - ], - urlParameters: [Parameters.geography], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const listOperationSpec: coreClient.OperationSpec = { - path: "/tilesets", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.TilesetListResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getOperationSpec: coreClient.OperationSpec = { - path: "/tilesets/{tilesetId}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.TilesetDetailInfo - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.tilesetId], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const deleteOperationSpec: coreClient.OperationSpec = { - path: "/tilesets/{tilesetId}", - httpMethod: "DELETE", - responses: { - 204: {}, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.tilesetId], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getOperationOperationSpec: coreClient.OperationSpec = { - path: "/tilesets/operations/{operationId}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.LongRunningOperationResult, - headersMapper: Mappers.TilesetGetOperationHeaders - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.operationId], - headerParameters: [Parameters.accept], - serializer -}; -const listNextOperationSpec: coreClient.OperationSpec = { - path: "{nextLink}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.TilesetListResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.nextLink], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; diff --git a/sdk/maps/maps-creator/src/operations/wfs.ts b/sdk/maps/maps-creator/src/operations/wfs.ts deleted file mode 100644 index 0840d999bc6d..000000000000 --- a/sdk/maps/maps-creator/src/operations/wfs.ts +++ /dev/null @@ -1,431 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { Wfs } from "../operationsInterfaces"; -import * as coreClient from "@azure/core-client"; -import * as Mappers from "../models/mappers"; -import * as Parameters from "../models/parameters"; -import { CreatorClientContext } from "../creatorClientContext"; -import { - WfsGetLandingPageOptionalParams, - WfsGetLandingPageResponse, - WfsGetConformanceOptionalParams, - WfsGetConformanceResponse, - WfsGetCollectionsOptionalParams, - WfsGetCollectionsResponse, - WfsGetCollectionOptionalParams, - WfsGetCollectionResponse, - WfsGetCollectionDefinitionOptionalParams, - WfsGetCollectionDefinitionResponse, - WfsGetFeaturesOptionalParams, - WfsGetFeaturesResponse, - WfsGetFeatureOptionalParams, - WfsGetFeatureResponse, - WfsDeleteFeatureOptionalParams -} from "../models"; - -/** Class representing a Wfs. */ -export class WfsImpl implements Wfs { - private readonly client: CreatorClientContext; - - /** - * Initialize a new instance of the class Wfs class. - * @param client Reference to the service client - */ - constructor(client: CreatorClientContext) { - this.client = client; - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial - * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to - * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). - * A dataset consists of multiple feature collections. A feature collection is a collection of features - * of a similar type, based on a common schema. - * The Get Landing Page API provides links to the API definition, the Conformance statements and the - * metadata about the feature data in this dataset. - * @param datasetId The identifier for the dataset to query from. - * @param options The options parameters. - */ - getLandingPage( - datasetId: string, - options?: WfsGetLandingPageOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { datasetId, options }, - getLandingPageOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial - * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to - * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). - * A dataset consists of multiple feature collections. A feature collection is a collection of features - * of a similar type, based on a common schema. - * The Get Requirements Classes lists all requirements classes specified in the standard that the - * server conforms to. - * @param datasetId The identifier for the dataset to query from. - * @param options The options parameters. - */ - getConformance( - datasetId: string, - options?: WfsGetConformanceOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { datasetId, options }, - getConformanceOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial - * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to - * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). - * A dataset consists of multiple feature collections. A feature collection is a collection of features - * of a similar type, based on a common schema. - * The Collections Description API provides descriptions of all the collections in a given dataset. - * @param datasetId The identifier for the dataset to query from. - * @param options The options parameters. - */ - getCollections( - datasetId: string, - options?: WfsGetCollectionsOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { datasetId, options }, - getCollectionsOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial - * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to - * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). - * A dataset consists of multiple feature collections. A feature collection is a collection of features - * of a similar type, based on a common schema. - * - * The Collection Description API provides the description of a given collection. It includes the links - * to the operations that can be performed on the collection. - * @param datasetId The identifier for the dataset to query from. - * @param collectionId Identifier (name) of a specific collection - * @param options The options parameters. - */ - getCollection( - datasetId: string, - collectionId: string, - options?: WfsGetCollectionOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { datasetId, collectionId, options }, - getCollectionOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * [This](https://docs.microsoft.com/en-us/azure/azure-maps/creator-indoor-maps) article introduces - * concepts and tools that apply to Azure Maps Creator. WFS API follows the [Open Geospatial Consortium - * API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to query - * [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). - * A dataset consists of multiple feature collections. A feature collection is a collection of features - * of a similar type, based on a common schema. - * - * The Collection Definition API provides the detailed data model of a given collection. - * @param datasetId The identifier for the dataset to query from. - * @param collectionId Identifier (name) of a specific collection - * @param options The options parameters. - */ - getCollectionDefinition( - datasetId: string, - collectionId: string, - options?: WfsGetCollectionDefinitionOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { datasetId, collectionId, options }, - getCollectionDefinitionOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial - * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to - * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). - * A dataset consists of multiple feature collections. A feature collection is a collection of features - * of a similar type, based on a common schema. - * The Get Features API returns the list of features in the given collection. - * @param datasetId The identifier for the dataset to query from. - * @param collectionId Identifier (name) of a specific collection - * @param options The options parameters. - */ - getFeatures( - datasetId: string, - collectionId: string, - options?: WfsGetFeaturesOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { datasetId, collectionId, options }, - getFeaturesOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial - * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to - * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). - * A dataset consists of multiple feature collections. A feature collection is a collection of features - * of a similar type, based on a common schema. - * The Get Feature API returns the feature identified by the provided id in the given collection. - * @param datasetId The identifier for the dataset to query from. - * @param collectionId Identifier (name) of a specific collection - * @param featureId Local identifier of a specific feature - * @param options The options parameters. - */ - getFeature( - datasetId: string, - collectionId: string, - featureId: string, - options?: WfsGetFeatureOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { datasetId, collectionId, featureId, options }, - getFeatureOperationSpec - ); - } - - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial - * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to - * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). - * A dataset consists of multiple feature collections. A feature collection is a collection of features - * of a similar type, based on a common schema. - * The Delete Feature API deletes the feature identified by the provided id in the given collection. At - * this point this API supports only facility features. Deleting a facility feature deletes all the - * child features of that facility recursively. - * @param datasetId The identifier for the dataset to query from. - * @param collectionId Identifier (name) of a specific collection - * @param featureId Local identifier of a specific feature - * @param options The options parameters. - */ - deleteFeature( - datasetId: string, - collectionId: string, - featureId: string, - options?: WfsDeleteFeatureOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { datasetId, collectionId, featureId, options }, - deleteFeatureOperationSpec - ); - } -} -// Operation Specifications -const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); - -const getLandingPageOperationSpec: coreClient.OperationSpec = { - path: "/wfs/datasets/{datasetId}/", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.LandingPageResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.datasetId1], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getConformanceOperationSpec: coreClient.OperationSpec = { - path: "/wfs/datasets/{datasetId}/conformance", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.ConformanceResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.datasetId1], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getCollectionsOperationSpec: coreClient.OperationSpec = { - path: "/wfs/datasets/{datasetId}/collections", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.CollectionsResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.datasetId1], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getCollectionOperationSpec: coreClient.OperationSpec = { - path: "/wfs/datasets/{datasetId}/collections/{collectionId}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.CollectionInfo - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [ - Parameters.geography, - Parameters.datasetId1, - Parameters.collectionId - ], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getCollectionDefinitionOperationSpec: coreClient.OperationSpec = { - path: "/wfs/datasets/{datasetId}/collections/{collectionId}/definition", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.CollectionDefinitionResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [ - Parameters.geography, - Parameters.datasetId1, - Parameters.collectionId - ], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getFeaturesOperationSpec: coreClient.OperationSpec = { - path: "/wfs/datasets/{datasetId}/collections/{collectionId}/items", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.ExtendedGeoJsonFeatureCollection - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.limit, - Parameters.bbox, - Parameters.filter - ], - urlParameters: [ - Parameters.geography, - Parameters.datasetId1, - Parameters.collectionId - ], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getFeatureOperationSpec: coreClient.OperationSpec = { - path: - "/wfs/datasets/{datasetId}/collections/{collectionId}/items/{featureId}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.FeatureResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [ - Parameters.geography, - Parameters.datasetId1, - Parameters.featureId, - Parameters.collectionId - ], - headerParameters: [Parameters.accept], - serializer -}; -const deleteFeatureOperationSpec: coreClient.OperationSpec = { - path: - "/wfs/datasets/{datasetId}/collections/{collectionId}/items/{featureId}", - httpMethod: "DELETE", - responses: { - 204: {}, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [ - Parameters.geography, - Parameters.datasetId1, - Parameters.featureId, - Parameters.collectionId - ], - headerParameters: [Parameters.accept], - serializer -}; diff --git a/sdk/maps/maps-creator/src/operationsInterfaces/alias.ts b/sdk/maps/maps-creator/src/operationsInterfaces/alias.ts deleted file mode 100644 index 469956ab0d8b..000000000000 --- a/sdk/maps/maps-creator/src/operationsInterfaces/alias.ts +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import "@azure/core-paging"; -import { PagedAsyncIterableIterator } from "@azure/core-paging"; -import { - AliasListItem, - AliasListOptionalParams, - AliasCreateOptionalParams, - AliasCreateResponse, - AliasAssignOptionalParams, - AliasAssignResponse, - AliasDeleteOptionalParams, - AliasGetDetailsOptionalParams, - AliasGetDetailsResponse -} from "../models"; - -/// -/** Interface representing a Alias. */ -export interface Alias { - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a list of all previously successfully created aliases. - * - * ### Submit List Request - * - * To list all your aliases, you will issue a `GET` request with no additional parameters. - * - * ### List Data Response - * - * The List API returns the complete list of all aliases in `json` format. The response contains the - * following details for each alias resource: - * > createdTimestamp - The timestamp that the alias was created. Format yyyy-MM-ddTHH:mm:ss.sssZ - * > aliasId - The id for the alias. - * > creatorDataItemId - The id for the creator data item that this alias references (could be null - * if the alias has not been assigned). - * > lastUpdatedTimestamp - The last time the alias was assigned to a resource. Format - * yyyy-MM-ddTHH:mm:ss.sssZ - * - * A sample response returning 2 alias resources: - * - * ```json - * { - * "aliases": [ - * { - * "createdTimestamp": "2020-02-13T21:19:11.123Z", - * "aliasId": "a8a4b8bb-ecf4-fb27-a618-f41721552766", - * "creatorDataItemId": "e89aebb9-70a3-8fe1-32bb-1fbd0c725f14", - * "lastUpdatedTimestamp": "2020-02-13T21:19:22.123Z" - * }, - * { - * "createdTimestamp": "2020-02-18T19:53:33.123Z", - * "aliasId": "1856dbfc-7a66-ee5a-bf8d-51dbfe1906f6", - * "creatorDataItemId": null, - * "lastUpdatedTimestamp": "2020-02-18T19:53:33.123Z" - * } - * ] - * } - * ``` - * @param options The options parameters. - */ - list( - options?: AliasListOptionalParams - ): PagedAsyncIterableIterator; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to create an alias. You can also assign the alias during the create - * request. An alias can reference an ID generated by a creator service, but cannot reference another - * alias ID. - * - * ### Submit Create Request - * - * To create your alias, you will use a `POST` request. If you would like to assign the alias during - * the creation, you will pass the `resourceId` query parameter. - * - * ### Create Alias Response - * - * The Create API returns a HTTP `201 Created` response with the alias resource in the body. - * - * A sample response from creating an alias: - * - * ```json - * { - * "createdTimestamp": "2020-02-13T21:19:11.123Z", - * "aliasId": "a8a4b8bb-ecf4-fb27-a618-f41721552766", - * "creatorDataItemId": "e89aebb9-70a3-8fe1-32bb-1fbd0c725f14", - * "lastUpdatedTimestamp": "2020-02-13T21:19:22.123Z" - * } - * ``` - * @param options The options parameters. - */ - create(options?: AliasCreateOptionalParams): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to assign an alias to reference a resource. - * - * ### Submit Assign Request - * - * To assign your alias to a resource, you will use a `PUT` request with the `aliasId` in the path and - * the `creatorDataItemId` passed as a query parameter. - * - * ### Assign Alias Response - * - * The Assign API returns a HTTP `200 OK` response with the updated alias resource in the body, if the - * alias was assigned successfully. A sample of the assign response is - * - * ```json - * { - * "createdTimestamp": "2020-02-13T21:19:11.123Z", - * "aliasId": "a8a4b8bb-ecf4-fb27-a618-f41721552766", - * "creatorDataItemId": "e89aebb9-70a3-8fe1-32bb-1fbd0c725f14", - * "lastUpdatedTimestamp": "2020-02-13T21:19:22.123Z" - * } - * ``` - * @param aliasId The unique id that references an existing alias. - * @param creatorDataItemId The unique id that references a creator data item to be aliased. - * @param options The options parameters. - */ - assign( - aliasId: string, - creatorDataItemId: string, - options?: AliasAssignOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to delete a previously created alias. You can also use this API to delete - * old/unused aliases to create space for new content.This API does not delete the references resource, - * only the alias referencing the resource. - * - * ### Submit Delete Request - * - * To delete your alias you will issue a `DELETE` request where the path will contain the `aliasId` of - * the alias to delete. - * - * ### Delete Alias Response - * - * The Delete API returns a HTTP `204 No Content` response with an empty body, if the alias was deleted - * successfully. - * @param aliasId The unique id that references an existing alias. - * @param options The options parameters. - */ - delete(aliasId: string, options?: AliasDeleteOptionalParams): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch the details of a previously created alias. - * - * ### Submit Get Details Request - * - * To get the details of your alias, you will issue a `GET` request with the `aliasId` in the path. - * - * ### Get Details Response - * - * The Get Details API returns the previously created alias in `json` format. The response contains the - * following details for the alias resource: - * > createdTimestamp - The timestamp that the alias was created. - * > aliasId - The id for the alias. - * > creatorDataItemId - The id for the creator data item that this alias references (could be null - * if the alias has not been assigned). - * > lastUpdatedTimestamp - The last time the alias was assigned to a resource. - * - * Here's a sample response: - * ```json - * { - * "createdTimestamp": "2020-02-13T21:19:11.123Z", - * "aliasId": "a8a4b8bb-ecf4-fb27-a618-f41721552766", - * "creatorDataItemId": "e89aebb9-70a3-8fe1-32bb-1fbd0c725f14", - * "lastUpdatedTimestamp": "2020-02-13T21:19:22.123Z" - * } - * ``` - * @param aliasId The unique id that references an existing alias. - * @param options The options parameters. - */ - getDetails( - aliasId: string, - options?: AliasGetDetailsOptionalParams - ): Promise; -} diff --git a/sdk/maps/maps-creator/src/operationsInterfaces/conversion.ts b/sdk/maps/maps-creator/src/operationsInterfaces/conversion.ts deleted file mode 100644 index 938dad939d14..000000000000 --- a/sdk/maps/maps-creator/src/operationsInterfaces/conversion.ts +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import "@azure/core-paging"; -import { PagedAsyncIterableIterator } from "@azure/core-paging"; -import { PollerLike, PollOperationState } from "@azure/core-lro"; -import { - ConversionListDetailInfo, - ConversionListOptionalParams, - ConversionConvertOptionalParams, - ConversionConvertResponse, - ConversionGetOptionalParams, - ConversionGetResponse, - ConversionDeleteOptionalParams, - ConversionGetOperationOptionalParams, - ConversionGetOperationResponse -} from "../models"; - -/// -/** Interface representing a Conversion. */ -export interface Conversion { - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a list of all successful data conversions submitted previously - * using the [Conversion - * API](https://docs.microsoft.com/en-us/rest/api/maps/conversion/convertpreview). - * - * ### Submit List Request - * - * To list all successful conversions you will issue a `GET` request with no additional parameters. - * - * ### List Data Response - * - * The Conversion List API returns the complete list of all conversion details in `json` format.
- * - * Here is a sample response returning the details of two successful conversion requests: - * - *
- * - * ```json - * { - * "conversions": - * [ - * { - * "conversionId": "54398242-ea6c-1f31-4fa6-79b1ae0fc24d", - * "udid": "31838736-8b84-11ea-bc55-0242ac130003", - * "created": "5/19/2020 9:00:00 AM +00:00", - * "description": "User provided description.", - * "featureCounts": { - * "DIR": 1, - * "LVL": 3, - * "FCL": 1, - * "UNIT": 150, - * "CTG": 8, - * "AEL": 0, - * "OPN": 10 - * } - * }, - * { - * "conversionId": "2acf7d32-8b84-11ea-bc55-0242ac130003", - * "udid": "1214bc58-8b84-11ea-bc55-0242ac1300039", - * "created": "5/19/2020 9:00:00 AM +00:00", - * "description": "User provided description.", - * "featureCounts": { - * "DIR": 1, - * "LVL": 3, - * "FCL": 1, - * "UNIT": 150, - * "CTG": 8, - * "AEL": 0, - * "OPN": 10 - * } - * } - * ] - * } - * ``` - * - *
- * @param options The options parameters. - */ - list( - options?: ConversionListOptionalParams - ): PagedAsyncIterableIterator; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * The Conversion API lets the caller import a set of DWG design files as a zipped [Drawing - * Package](https://aka.ms/am-drawing-package) into Azure Maps. The [Drawing - * Package](https://aka.ms/am-drawing-package) should first be uploaded using the [Azure Maps Data - * Service](https://docs.microsoft.com/rest/api/maps/data). Once uploaded, use the `udid` returned by - * the [Data Upload API](https://docs.microsoft.com/rest/api/maps/data/uploadpreview) to call this - * Conversion API. - * - * ## Convert DWG package - * - * The Conversion API performs a [long-running request](https://aka.ms/am-creator-lrt-v2). - * - * ## Debug DWG package issues - * - * - * During the Conversion process, if there are any issues with the DWG package [errors and - * warnings](https://aka.ms/am-conversion-errors) are provided in the response along with a *diagnostic - * package* to visualize and diagnose these issues. In case any issues are encountered with your DWG - * package, the Conversion operation status process as detailed - * [here](https://aka.ms/am-creator-lrt-v2) returns the location of the *diagnostic package* that can - * be downloaded by the caller to help them visualize and diagnose these issues. The *diagnostic - * package* location can be found in the properties section of the conversion operation status response - * and looks like the following: - * - * ```json - * { - * "properties": { - * "diagnosticPackageLocation": - * "https://us.atlas.microsoft.com/mapdata/{DiagnosticPackageId}?api-version=1.0" - * } - * } - * ``` - * - * The *diagnostic package* can be downloaded by executing a `HTTP GET` request on the - * `diagnosticPackageLocation`. - * For more details on how to use the tool to visualize and diagnose all the errors and warnings see - * [Drawing Error Visualizer](https://aka.ms/am-drawing-errors-visualizer).
- * - * A conversion operation will be marked as *success* if there are zero or more warnings but will be - * marked as *failed* if any errors are encountered. - * @param udid The unique data id for the content. The `udid` must have been obtained from a successful - * [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) call. - * @param outputOntology Output ontology version. "facility-2.0" is the only supported value at this - * time. Please refer to this - * [article](https://docs.microsoft.com/en-us/azure/azure-maps/creator-facility-ontology) for more - * information about Azure Maps Creator ontologies. - * @param options The options parameters. - */ - beginConvert( - udid: string, - outputOntology: string, - options?: ConversionConvertOptionalParams - ): Promise< - PollerLike< - PollOperationState, - ConversionConvertResponse - > - >; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * The Conversion API lets the caller import a set of DWG design files as a zipped [Drawing - * Package](https://aka.ms/am-drawing-package) into Azure Maps. The [Drawing - * Package](https://aka.ms/am-drawing-package) should first be uploaded using the [Azure Maps Data - * Service](https://docs.microsoft.com/rest/api/maps/data). Once uploaded, use the `udid` returned by - * the [Data Upload API](https://docs.microsoft.com/rest/api/maps/data/uploadpreview) to call this - * Conversion API. - * - * ## Convert DWG package - * - * The Conversion API performs a [long-running request](https://aka.ms/am-creator-lrt-v2). - * - * ## Debug DWG package issues - * - * - * During the Conversion process, if there are any issues with the DWG package [errors and - * warnings](https://aka.ms/am-conversion-errors) are provided in the response along with a *diagnostic - * package* to visualize and diagnose these issues. In case any issues are encountered with your DWG - * package, the Conversion operation status process as detailed - * [here](https://aka.ms/am-creator-lrt-v2) returns the location of the *diagnostic package* that can - * be downloaded by the caller to help them visualize and diagnose these issues. The *diagnostic - * package* location can be found in the properties section of the conversion operation status response - * and looks like the following: - * - * ```json - * { - * "properties": { - * "diagnosticPackageLocation": - * "https://us.atlas.microsoft.com/mapdata/{DiagnosticPackageId}?api-version=1.0" - * } - * } - * ``` - * - * The *diagnostic package* can be downloaded by executing a `HTTP GET` request on the - * `diagnosticPackageLocation`. - * For more details on how to use the tool to visualize and diagnose all the errors and warnings see - * [Drawing Error Visualizer](https://aka.ms/am-drawing-errors-visualizer).
- * - * A conversion operation will be marked as *success* if there are zero or more warnings but will be - * marked as *failed* if any errors are encountered. - * @param udid The unique data id for the content. The `udid` must have been obtained from a successful - * [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) call. - * @param outputOntology Output ontology version. "facility-2.0" is the only supported value at this - * time. Please refer to this - * [article](https://docs.microsoft.com/en-us/azure/azure-maps/creator-facility-ontology) for more - * information about Azure Maps Creator ontologies. - * @param options The options parameters. - */ - beginConvertAndWait( - udid: string, - outputOntology: string, - options?: ConversionConvertOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a successful data conversion submitted previously using the - * [Conversion API](https://docs.microsoft.com/en-us/rest/api/maps/conversion/convertpreview). - * @param conversionId The conversion id for the content. The `conversionId` must have been obtained - * from a successful [Conversion - * API](https://docs.microsoft.com/en-us/rest/api/maps/v2/conversion/convert) call. - * @param options The options parameters. - */ - get( - conversionId: string, - options?: ConversionGetOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to delete any data conversions created previously using the [Conversion - * API](https://docs.microsoft.com/en-us/rest/api/maps/conversion/convertpreview). - * - * ### Submit Delete Request - * - * To delete your conversion data you will issue a `DELETE` request where the path will contain the - * `conversionId` of the data to delete. - * - * ### Conversion Delete Response - * - * The Conversion Delete API returns a HTTP `204 No Content` response with an empty body, if the - * converted data resources were deleted successfully.
- * A HTTP `400 Bad Request` error response will be returned if no resource associated with the - * passed-in `conversionId` is found. - * @param conversionId The conversion id for the content. The `conversionId` must have been obtained - * from a successful [Conversion - * API](https://docs.microsoft.com/en-us/rest/api/maps/v2/conversion/convert) call. - * @param options The options parameters. - */ - delete( - conversionId: string, - options?: ConversionDeleteOptionalParams - ): Promise; - /** - * This path will be obtained from a call to POST /conversions. While in progress, an http200 will be - * returned with no extra headers - followed by an http200 with Resource-Location header once - * successfully completed. - * @param operationId The ID to query the status for the dataset create/import request. - * @param options The options parameters. - */ - getOperation( - operationId: string, - options?: ConversionGetOperationOptionalParams - ): Promise; -} diff --git a/sdk/maps/maps-creator/src/operationsInterfaces/data.ts b/sdk/maps/maps-creator/src/operationsInterfaces/data.ts deleted file mode 100644 index 8f51c0f0fa5a..000000000000 --- a/sdk/maps/maps-creator/src/operationsInterfaces/data.ts +++ /dev/null @@ -1,521 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreRestPipeline from "@azure/core-rest-pipeline"; -import { PollerLike, PollOperationState } from "@azure/core-lro"; -import { - UploadDataFormat, - DataUploadPreview$binaryOptionalParams, - DataUploadPreview$jsonOptionalParams, - DataUploadPreviewResponse, - DataListPreviewOptionalParams, - DataListPreviewResponse, - DataUpdatePreviewOptionalParams, - DataUpdatePreviewResponse, - DataDownloadPreviewOptionalParams, - DataDownloadPreviewResponse, - DataDeletePreviewOptionalParams, - DataGetOperationPreviewOptionalParams, - DataGetOperationPreviewResponse -} from "../models"; - -/** Interface representing a Data. */ -export interface Data { - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * The Data Upload API allows the caller to upload data content to the Azure Maps service. - * You can use this API in a scenario like uploading a collection of Geofences in `GeoJSON` - * format, for use in our [Azure Maps Geofencing - * Service](https://docs.microsoft.com/rest/api/maps/spatial). - * - * ## Submit Upload Request - * - * To upload your content you will use a `POST` request. The request body will contain the data to - * upload. The - * `dataFormat` query parameter will contain the format for the data, the `dataSharingLevel` query - * parameter - * can contain the sharing level for the data. The `Content-Type` header will be set to the content - * type of the - * data. - * - * For example, to upload a collection of geofences in `GeoJSON` format, set the request body to the - * geofence - * content. Set the `dataFormat` query parameter to _geojson_, and set the `Content-Type` header to - * either one - * of the following media types: - * - * - `application/json` - * - `application/vnd.geo+json` - * - `application/octet-stream` - * - * Here's a sample request body for uploading a simple Geofence represented as a circle geometry using - * a center - * point and a radius. The sample below is in `GeoJSON`: - * - * ```json - * { - * "type": "FeatureCollection", - * "features": [{ - * "type": "Feature", - * "geometry": { - * "type": "Point", - * "coordinates": [-122.126986, 47.639754] - * }, - * "properties": { - * "geometryId": "001", - * "radius": 500 - * } - * }] - * } - * ``` - * - * The Data Upload API performs a - * [long-running request](https://aka.ms/am-creator-lrt-v2). - * - * ## Data Upload Limits - * - * Please, be aware that currently every Azure Maps account has a [data storage - * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). - * - * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http - * error response. - * You can always use the [Data Delete - * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to - * delete old/unused content and create space for new uploads. - * @param args Includes all the parameters for this operation. - */ - beginUploadPreview( - ...args: - | [ - UploadDataFormat, - "application/octet-stream", - coreRestPipeline.RequestBodyType, - DataUploadPreview$binaryOptionalParams? - ] - | [ - UploadDataFormat, - "application/json", - Record, - DataUploadPreview$jsonOptionalParams? - ] - ): Promise< - PollerLike< - PollOperationState, - DataUploadPreviewResponse - > - >; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * The Data Upload API allows the caller to upload data content to the Azure Maps service. - * You can use this API in a scenario like uploading a collection of Geofences in `GeoJSON` - * format, for use in our [Azure Maps Geofencing - * Service](https://docs.microsoft.com/rest/api/maps/spatial). - * - * ## Submit Upload Request - * - * To upload your content you will use a `POST` request. The request body will contain the data to - * upload. The - * `dataFormat` query parameter will contain the format for the data, the `dataSharingLevel` query - * parameter - * can contain the sharing level for the data. The `Content-Type` header will be set to the content - * type of the - * data. - * - * For example, to upload a collection of geofences in `GeoJSON` format, set the request body to the - * geofence - * content. Set the `dataFormat` query parameter to _geojson_, and set the `Content-Type` header to - * either one - * of the following media types: - * - * - `application/json` - * - `application/vnd.geo+json` - * - `application/octet-stream` - * - * Here's a sample request body for uploading a simple Geofence represented as a circle geometry using - * a center - * point and a radius. The sample below is in `GeoJSON`: - * - * ```json - * { - * "type": "FeatureCollection", - * "features": [{ - * "type": "Feature", - * "geometry": { - * "type": "Point", - * "coordinates": [-122.126986, 47.639754] - * }, - * "properties": { - * "geometryId": "001", - * "radius": 500 - * } - * }] - * } - * ``` - * - * The Data Upload API performs a - * [long-running request](https://aka.ms/am-creator-lrt-v2). - * - * ## Data Upload Limits - * - * Please, be aware that currently every Azure Maps account has a [data storage - * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). - * - * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http - * error response. - * You can always use the [Data Delete - * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to - * delete old/unused content and create space for new uploads. - * @param args Includes all the parameters for this operation. - */ - beginUploadPreviewAndWait( - ...args: - | [ - UploadDataFormat, - "application/octet-stream", - coreRestPipeline.RequestBodyType, - DataUploadPreview$binaryOptionalParams? - ] - | [ - UploadDataFormat, - "application/json", - Record, - DataUploadPreview$jsonOptionalParams? - ] - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * This API allows the caller to fetch a list of all content uploaded previously using the [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview). - * - * - * ### Submit List Request - * - * To list all your map data content you will issue a `GET` request with no additional parameters. - * - * - * ### List Data Response - * - * The Data List API returns the complete list of all data in `json` format. The response contains the - * following details for each data resource: - * - * > udid - The unique data id for the data resource. - * - * > location - The location of the data resource. Execute a HTTP `GET` on this location to download - * the data. - * - * - * Here's a sample response returning the `udid` and `location` of 3 data resources: - * - *
- * - * ```json - * { - * "mapDataList": - * [ - * { - * "udid": "9a1288fa-1858-4a3b-b68d-13a8j5af7d7c", - * "location": - * "https://us.atlas.microsoft.com/mapData/9a1288fa-1858-4a3b-b68d-13a8j5af7d7c?api-version=1.0", - * "sizeInBytes": 29920, - * "uploadStatus": "Completed" - * }, - * { - * "udid": "8b1288fa-1958-4a2b-b68e-13a7i5af7d7c", - * "location": - * "https://us.atlas.microsoft.com/mapData/8b1288fa-1958-4a2b-b68e-13a7i5af7d7c?api-version=1.0", - * "sizeInBytes": 1339, - * "uploadStatus": "Completed" - * }, - * { - * "udid": "7c1288fa-2058-4a1b-b68f-13a6h5af7d7c", - * "location": - * "https://us.atlas.microsoft.com/mapData/7c1288fa-2058-4a1b-b68f-13a6h5af7d7c?api-version=1.0", - * "sizeInBytes": 1650, - * "uploadStatus": "Pending" - * }] - * } - * ``` - * - *
- * @param options The options parameters. - */ - listPreview( - options?: DataListPreviewOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * The Data Update API allows the caller to update a previously uploaded data content. - * - * You can use this API in a scenario like adding or removing geofences to or from an existing - * collection of geofences. - * Geofences are uploaded using the [Data Upload - * API](https://docs.microsoft.com/rest/api/maps/data%20v2/uploadpreview), for - * use in the [Azure Maps Geofencing Service](https://docs.microsoft.com/rest/api/maps/spatial). - * - * Please note that the Update API will *replace* and *override* the existing data content. - * - * ## Submit Update Request - * - * To update your content you will use a `PUT` request. The request body will contain the new data that - * will replace - * the existing data. The `Content-Type` header will be set to the content type of the data, and the - * path will contain - * the `udid` of the data to be update. - * - * For example, to update a collection of geofences that were previously uploaded using the Upload API, - * place the new - * geofence content in the request body. Set the `udid` parameter in the path to the `udid` of the data - * received - * previously in the upload API response. And set the `Content-Type` header to one of the following - * media types: - * - * - `application/json` - * - `application/vnd.geo+json` - * - `application/octet-stream` - * - * Here's a sample request body for updating a simple Geofence. It's represented as a circle geometry - * using a center - * point and a radius. The sample below is in `GeoJSON`: - * - * ```json - * { - * "type": "FeatureCollection", - * "features": [{ - * "type": "Feature", - * "geometry": { - * "type": "Point", - * "coordinates": [-122.126986, 47.639754] - * }, - * "properties": { - * "geometryId": "001", - * "radius": 500 - * } - * }] - * } - * ``` - * - * The previously uploaded geofence had a radius of 100m. The above request will update it to 500m. - * - * The Data Update API performs a - * [long-running request](https://aka.ms/am-creator-lrt-v2). - * - * ## Data Update Limits - * - * Please, be aware that currently every Azure Maps account has a [data storage - * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). - * - * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http - * error response. - * You can always use the [Data Delete - * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to - * delete old/unused content and create space for new uploads. - * @param uniqueDataId The unique data id for the content. The `udid` must have been obtained from a - * successful [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) - * call. - * @param updateContent The new content that will update/replace the previously uploaded content. - * @param options The options parameters. - */ - beginUpdatePreview( - uniqueDataId: string, - updateContent: Record, - options?: DataUpdatePreviewOptionalParams - ): Promise< - PollerLike< - PollOperationState, - DataUpdatePreviewResponse - > - >; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * The Data Update API allows the caller to update a previously uploaded data content. - * - * You can use this API in a scenario like adding or removing geofences to or from an existing - * collection of geofences. - * Geofences are uploaded using the [Data Upload - * API](https://docs.microsoft.com/rest/api/maps/data%20v2/uploadpreview), for - * use in the [Azure Maps Geofencing Service](https://docs.microsoft.com/rest/api/maps/spatial). - * - * Please note that the Update API will *replace* and *override* the existing data content. - * - * ## Submit Update Request - * - * To update your content you will use a `PUT` request. The request body will contain the new data that - * will replace - * the existing data. The `Content-Type` header will be set to the content type of the data, and the - * path will contain - * the `udid` of the data to be update. - * - * For example, to update a collection of geofences that were previously uploaded using the Upload API, - * place the new - * geofence content in the request body. Set the `udid` parameter in the path to the `udid` of the data - * received - * previously in the upload API response. And set the `Content-Type` header to one of the following - * media types: - * - * - `application/json` - * - `application/vnd.geo+json` - * - `application/octet-stream` - * - * Here's a sample request body for updating a simple Geofence. It's represented as a circle geometry - * using a center - * point and a radius. The sample below is in `GeoJSON`: - * - * ```json - * { - * "type": "FeatureCollection", - * "features": [{ - * "type": "Feature", - * "geometry": { - * "type": "Point", - * "coordinates": [-122.126986, 47.639754] - * }, - * "properties": { - * "geometryId": "001", - * "radius": 500 - * } - * }] - * } - * ``` - * - * The previously uploaded geofence had a radius of 100m. The above request will update it to 500m. - * - * The Data Update API performs a - * [long-running request](https://aka.ms/am-creator-lrt-v2). - * - * ## Data Update Limits - * - * Please, be aware that currently every Azure Maps account has a [data storage - * limit](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-maps-limits). - * - * Once the storage limit is reached, all the new upload API calls will return a `409 Conflict` http - * error response. - * You can always use the [Data Delete - * API](https://docs.microsoft.com/rest/api/maps/data%20v2/deletepreview) to - * delete old/unused content and create space for new uploads. - * @param uniqueDataId The unique data id for the content. The `udid` must have been obtained from a - * successful [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) - * call. - * @param updateContent The new content that will update/replace the previously uploaded content. - * @param options The options parameters. - */ - beginUpdatePreviewAndWait( - uniqueDataId: string, - updateContent: Record, - options?: DataUpdatePreviewOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * This API allows the caller to download a previously uploaded data content.
- * You can use this API in a scenario like downloading an existing collection of geofences uploaded - * previously using the [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) for use in our [Azure - * Maps Geofencing Service](https://docs.microsoft.com/en-us/rest/api/maps/spatial). - * - * - * ### Submit Download Request - * - * To download your content you will use a `GET` request where the path will contain the `udid` of the - * data to download. Optionally, you can also pass in an `Accept` header to specify a preference for - * the `Content-Type` of the data response.
- * For example, to download a collection of geofences previously uploaded using the Upload API, set the - * `udid` parameter in the path to the `udid` of the data received previously in the upload API - * response and set the `Accept` header to either one of the following media types: - * - * - `application/json` - * - `application/vnd.geo+json` - * - `application/octet-stream` - * - * - * ### Download Data Response - * - * The Download API will return a HTTP `200 OK` response if the data resource with the passed-in `udid` - * is found, where the response body will contain the content of the data resource.
- * A HTTP `400 Bad Request` error response will be returned if the data resource with the passed-in - * `udid` is not found.
- * - * Here's a sample response body for a simple geofence represented in `GeoJSON` uploaded previously - * using the Upload API: - *
- * - * ```json - * { - * "type": "FeatureCollection", - * "features": [{ - * "type": "Feature", - * "geometry": { - * "type": "Point", - * "coordinates": [-122.126986, 47.639754] - * }, - * "properties": { - * "geometryId": "001", - * "radius": 500 - * } - * }] - * } - * ``` - * @param uniqueDataId The unique data id for the content. The `udid` must have been obtained from a - * successful [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) - * call. - * @param options The options parameters. - */ - downloadPreview( - uniqueDataId: string, - options?: DataDownloadPreviewOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * This API allows the caller to delete a previously uploaded data content.
- * You can use this API in a scenario like removing geofences previously uploaded using the [Data - * Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) for use in our - * [Azure Maps Geofencing Service](https://docs.microsoft.com/en-us/rest/api/maps/spatial). You can - * also use this API to delete old/unused uploaded content and create space for new content. - * - * - * ### Submit Delete Request - * - * To delete your content you will issue a `DELETE` request where the path will contain the `udid` of - * the data to delete.
- * For example, to delete a collection of geofences previously uploaded using the Upload API, set the - * `udid` parameter in the path to the `udid` of the data received previously in the upload API - * response. - * - * - * ### Delete Data Response - * - * The Data Delete API returns a HTTP `204 No Content` response with an empty body, if the data - * resource was deleted successfully.
- * A HTTP `400 Bad Request` error response will be returned if the data resource with the passed-in - * `udid` is not found. - * @param uniqueDataId The unique data id for the content. The `udid` must have been obtained from a - * successful [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data%20v2/uploadpreview) - * call. - * @param options The options parameters. - */ - deletePreview( - uniqueDataId: string, - options?: DataDeletePreviewOptionalParams - ): Promise; - /** - * This path will be obtained from a call to POST /mapData. While in progress, an http200 will be - * returned with no extra headers - followed by an http200 with Resource-Location header once - * completed. - * @param operationId The ID to query the status for the data upload request. - * @param options The options parameters. - */ - getOperationPreview( - operationId: string, - options?: DataGetOperationPreviewOptionalParams - ): Promise; -} diff --git a/sdk/maps/maps-creator/src/operationsInterfaces/dataset.ts b/sdk/maps/maps-creator/src/operationsInterfaces/dataset.ts deleted file mode 100644 index b957064d764b..000000000000 --- a/sdk/maps/maps-creator/src/operationsInterfaces/dataset.ts +++ /dev/null @@ -1,293 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import "@azure/core-paging"; -import { PagedAsyncIterableIterator } from "@azure/core-paging"; -import { PollerLike, PollOperationState } from "@azure/core-lro"; -import { - DatasetDetailInfo, - DatasetListOptionalParams, - DatasetCreateOptionalParams, - DatasetCreateResponse, - DatasetGetOptionalParams, - DatasetGetResponse, - DatasetDeleteOptionalParams, - DatasetGetOperationOptionalParams, - DatasetGetOperationResponse -} from "../models"; - -/// -/** Interface representing a Dataset. */ -export interface Dataset { - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a list of all previously successfully created datasets. - * - * ### Submit List Request - * - * To list all your datasets, you will issue a `GET` request with no additional parameters. - * - * - * ### List Data Response - * - * The List API returns the complete list of all datasets in `json` format. The response contains the - * following fields (if they are not null or empty): - * > created - The timestamp the dataset was created. - * > datasetId - The id for the dataset. - * > description - The description for the dataset. - * > datasetSources - The source data that was used when the create request was issued. - * > ontology - The source - * [ontology](https://docs.microsoft.com/en-us/azure/azure-maps/creator-facility-ontology) that was - * used in the conversion service for the input data.
- * - * The `datasetSources` describes the source data that was used when the create request was issued and - * contains the following elements (if they are not null or empty): - * - * > conversionIds - The list of `conversionId` (null if none were provided). - * > appendDatasetId - The `datasetId` that was used for an append operation (null if none was used). - * >featureCounts - The counts for each feature type in the dataset.
- * - * Here's a sample response returning the `timestamp`, `datasetId`, `description`, `datasetSources`, - * and `ontology` of 3 dataset resources: - * - * - * ```json - * { - * "datasets": [ - * { - * "timestamp": "2020-01-01T22:50:48.123Z", - * "datasetId": "f6495f62-94f8-0ec2-c252-45626f82fcb2", - * "description": "Some description or comment for the dataset.", - * "datasetSources": { - * "conversionIds": [ - * "15d21452-c9bb-27b6-5e79-743ca5c3205d" - * ], }, - * "ontology": "facility-2.0", - * "featureCounts": { - * "directoryInfo": 2, - * "category": 10, - * "facility": 1, - * "level": 3, - * "unit": 183, - * "zone": 3, - * "verticalPenetration": 6, - * "opening": 48, - * "areaElement": 108 - * } - * }, - * { - * "timestamp": "2020-01-01T22:57:53.123Z", - * "datasetId": "8b1288fa-1958-4a2b-b68e-13a7i5af7d7c", - * "description": "Create from upload '0c1288fa-2058-4a1b-b68d-13a5f5af7d7c'.", - * "datasetSources": { - * "conversionIds": [ - * "0c1288fa-2058-4a1b-b68d-13a5f5af7d7c" - * ], - * "appendDatasetId": "46d1edb6-d29e-4786-9589-dbd4efd7a977" - * }, - * "ontology": "facility-2.0", - * "featureCounts": { - * "directoryInfo": 2, - * "category": 10, - * "facility": 1, - * "level": 3, - * "unit": 183, - * "zone": 3, - * "verticalPenetration": 6, - * "opening": 48, - * "areaElement": 108 - * } - * } - * ] - * } - * ``` - * @param options The options parameters. - */ - list( - options?: DatasetListOptionalParams - ): PagedAsyncIterableIterator; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to create a dataset from data that was uploaded to the Azure Maps Data - * Service and converted using the Azure Maps Conversion Service. - * - * You can use this API in a scenario like uploading a DWG zip package for a building, converting the - * zip package using the Azure Maps Conversion Service, and creating a dataset from the converted zip - * package. The created dataset can be used to create tilesets using the Azure Maps Tileset Service and - * can be queried via the Azure Maps WFS Service. - * - * ### Submit Create Request - * - * To create your dataset, you will use a `POST` request where the `conversionId` query parameter is an - * ID that represents the converted DWG zip package, the `datasetId` parameter will be the ID of a - * previously created dataset to append with the current dataset and, optionally, the `description` - * query parameter will contain a description (if description is not provided a default description - * will be given). - * - * The Create API is a [long-running request](https://aka.ms/am-creator-lrt-v2). - * @param conversionId The unique ID used to create the dataset. The `conversionId` must have been - * obtained from a successful call to the Conversion Service Convert API and may be provided with - * multiple query parameters with same name (if more than one is provided). - * @param options The options parameters. - */ - beginCreate( - conversionId: string, - options?: DatasetCreateOptionalParams - ): Promise< - PollerLike, DatasetCreateResponse> - >; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to create a dataset from data that was uploaded to the Azure Maps Data - * Service and converted using the Azure Maps Conversion Service. - * - * You can use this API in a scenario like uploading a DWG zip package for a building, converting the - * zip package using the Azure Maps Conversion Service, and creating a dataset from the converted zip - * package. The created dataset can be used to create tilesets using the Azure Maps Tileset Service and - * can be queried via the Azure Maps WFS Service. - * - * ### Submit Create Request - * - * To create your dataset, you will use a `POST` request where the `conversionId` query parameter is an - * ID that represents the converted DWG zip package, the `datasetId` parameter will be the ID of a - * previously created dataset to append with the current dataset and, optionally, the `description` - * query parameter will contain a description (if description is not provided a default description - * will be given). - * - * The Create API is a [long-running request](https://aka.ms/am-creator-lrt-v2). - * @param conversionId The unique ID used to create the dataset. The `conversionId` must have been - * obtained from a successful call to the Conversion Service Convert API and may be provided with - * multiple query parameters with same name (if more than one is provided). - * @param options The options parameters. - */ - beginCreateAndWait( - conversionId: string, - options?: DatasetCreateOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a previously successfully created dataset. - * - * ### Submit Get Details Request - * - * To get the details for a previously created dataset, you will issue a `GET` request with the - * `datasetId` in the path. - * - * ### Get Details Response - * - * The Get Details API returns the details for a dataset in `json` format. The response contains the - * following fields (if they are not null or empty): - * > created - The timestamp the dataset was created. - * > datasetId - The id for the dataset. - * > description - The description for the dataset. - * > datasetSources - The source data that was used when the create request was issued. - * > ontology - The source - * [ontology](https://docs.microsoft.com/en-us/azure/azure-maps/creator-facility-ontology) that was - * used in the conversion service for the input data.
- * - * The `datasetSources` describes the source data that was used when the create request was issued and - * contains the following elements (if they are not null or empty): - * > conversionIds - The list of `conversionId` (null if none were provided). - * > appendDatasetId - The `datasetId` that was used for an append operation (null if none was used). - * >featureCounts - The counts for each feature type in the dataset.
- * - * Here's a sample response returning the `timestamp`, `datasetId`, `description`, `datasetSources`, - * and `ontology` of a dataset resource: - * - * ```json - * { - * "timestamp": "2020-01-01T22:50:48.123Z", - * "datasetId": "f6495f62-94f8-0ec2-c252-45626f82fcb2", - * "description": "Some description or comment for the dataset.", - * "datasetSources": { - * "conversionIds": [ - * "15d21452-c9bb-27b6-5e79-743ca5c3205d" - * ], - * }, - * "ontology": "facility-2.0", - * "featureCounts": { - * "directoryInfo": 2, - * "category": 10, - * "facility": 1, - * "level": 3, - * "unit": 183, - * "zone": 3, - * "verticalPenetration": 6, - * "opening": 48, - * "areaElement": 108 - * } - * } - * ``` - * @param datasetId The identifier for the dataset to query from. - * @param options The options parameters. - */ - get( - datasetId: string, - options?: DatasetGetOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * You can also use this API to delete old/unused datasets to create space for new Creator content. - * - * ### Submit Delete Request - * - * To delete your content you will issue a `DELETE` request where the path will contain the `datasetId` - * of the dataset to delete. - * @param datasetId The identifier for the dataset to query from. - * @param options The options parameters. - */ - delete( - datasetId: string, - options?: DatasetDeleteOptionalParams - ): Promise; - /** - * This API allows the caller to view the current progress of a dataset operation and the path is - * obtained from a call to the Create API. - * - * ### Submit Operations Request - * - * To view the current progress of a dataset operation, you will use a `GET` request where the - * `operationId` given the path is the ID that represents the operation. - * - * ### Operation Response - * - * While in progress, a `200-OK` http status code will be returned with no extra headers. If the - * operation succeeds, a `200-OK` http status code with Resource-Location header will be returned. - * @param operationId The ID to query the status for the dataset create/import request. - * @param options The options parameters. - */ - getOperation( - operationId: string, - options?: DatasetGetOperationOptionalParams - ): Promise; -} diff --git a/sdk/maps/maps-creator/src/operationsInterfaces/featureState.ts b/sdk/maps/maps-creator/src/operationsInterfaces/featureState.ts deleted file mode 100644 index 3369ef6123e4..000000000000 --- a/sdk/maps/maps-creator/src/operationsInterfaces/featureState.ts +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import "@azure/core-paging"; -import { PagedAsyncIterableIterator } from "@azure/core-paging"; -import { - StatesetInfoObject, - FeatureStateListStatesetOptionalParams, - StylesObject, - FeatureStateCreateStatesetOptionalParams, - FeatureStateCreateStatesetResponse, - FeatureStatePutStatesetOptionalParams, - FeatureStateDeleteStatesetOptionalParams, - FeatureStateGetStatesetOptionalParams, - FeatureStateGetStatesetResponse, - FeatureStatesStructure, - FeatureStateUpdateStatesOptionalParams, - FeatureStateDeleteStateOptionalParams, - FeatureStateGetStatesOptionalParams, - FeatureStateGetStatesResponse -} from "../models"; - -/// -/** Interface representing a FeatureState. */ -export interface FeatureState { - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a list of all previously successfully created statesets. - * @param options The options parameters. - */ - listStateset( - options?: FeatureStateListStatesetOptionalParams - ): PagedAsyncIterableIterator; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This POST API allows the user to create a new Stateset and define stateset style using request body. - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. The Feature State API is part of Creator. - * - * The Feature State service allows the user to update the states of a feature and query them to be - * used in other services. The dynamic properties of a feature that don't belong to the dataset are - * referred to as *states* here. - * - * This Feature State service pivot on the Stateset. Like Tileset, Stateset encapsulates the storage - * mechanism for feature states for a dataset. - * - * Once the stateset is created, users can use that statesetId to post feature state updates and - * retrieve the current feature states. A feature can have only one state at a given point in time. - * - * Feature state is defined by the key name, value and the timestamp. When a feature state update is - * posted to Azure Maps, the state value gets updated only if the provided state’s timestamp is later - * than the stored timestamp. - * - * Azure Maps MapControl provides a way to use these feature states to style the features. Please refer - * to the State Tile documentation for more information. - * @param datasetId The datasetId must have been obtained from a successful [Dataset Create - * API](https://docs.microsoft.com/en-us/rest/api/maps/v2/dataset/create) call. - * @param statesetCreateRequestBody The stateset style JSON data. - * @param options The options parameters. - */ - createStateset( - datasetId: string, - statesetCreateRequestBody: StylesObject, - options?: FeatureStateCreateStatesetOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This PUT API allows the user to update the stateset style rules. - * @param statesetId The stateset id that was created. - * @param statesetStyleUpdateRequestBody The stateset style JSON data. Only style rules are allowed to - * be updated, update on keyname and type is not allowed. - * @param options The options parameters. - */ - putStateset( - statesetId: string, - statesetStyleUpdateRequestBody: StylesObject, - options?: FeatureStatePutStatesetOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This DELETE API allows the user to delete the stateset and the associated data. - * @param statesetId The stateset id that was created. - * @param options The options parameters. - */ - deleteStateset( - statesetId: string, - options?: FeatureStateDeleteStatesetOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This GET API allows the user to get the stateset Information. - * - * The stateset Information includes the datasetId associated to the stateset, and the styles of that - * stateset. - * @param statesetId The stateset id that was created. - * @param options The options parameters. - */ - getStateset( - statesetId: string, - options?: FeatureStateGetStatesetOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This PUT API allows the user to update the state of the given feature in the given stateset. - * @param statesetId The stateset id that was created. - * @param featureId The id of a feature in the given dataset. If the featureId is not present in the - * dataset, Bad Request response will be returned. - * @param featureStateUpdateRequestBody The feature state JSON data. A feature can have only one state - * at a given point in time. The specified state keyname must have been defined during the stateset - * creation. - * @param options The options parameters. - */ - updateStates( - statesetId: string, - featureId: string, - featureStateUpdateRequestBody: FeatureStatesStructure, - options?: FeatureStateUpdateStatesOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API deletes the state information identified by the StateKeyName parameter for the feature - * identified by the FeatureId parameter in the the stateset. - * @param statesetId The stateset id that was created. - * @param featureId The id of a feature in the given stateset. If no state was set for the featureId in - * the stateset earlier, Bad Request response will be returned. - * @param stateKeyName The Name of the state to be deleted. - * @param options The options parameters. - */ - deleteState( - statesetId: string, - featureId: string, - stateKeyName: string, - options?: FeatureStateDeleteStateOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API returns the current state information associated with the given feature in the given - * stateset. - * @param statesetId The stateset id that was created. - * @param featureId The id of a feature in the given stateset. If no state was set for the featureId in - * the stateset earlier, Bad Request response will be returned. - * @param options The options parameters. - */ - getStates( - statesetId: string, - featureId: string, - options?: FeatureStateGetStatesOptionalParams - ): Promise; -} diff --git a/sdk/maps/maps-creator/src/operationsInterfaces/index.ts b/sdk/maps/maps-creator/src/operationsInterfaces/index.ts deleted file mode 100644 index 7fe2a1f1d8c6..000000000000 --- a/sdk/maps/maps-creator/src/operationsInterfaces/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./alias"; -export * from "./data"; -export * from "./dataset"; -export * from "./conversion"; -export * from "./featureState"; -export * from "./spatial"; -export * from "./tileset"; -export * from "./wfs"; diff --git a/sdk/maps/maps-creator/src/operationsInterfaces/spatial.ts b/sdk/maps/maps-creator/src/operationsInterfaces/spatial.ts deleted file mode 100644 index f8b9ea8d2108..000000000000 --- a/sdk/maps/maps-creator/src/operationsInterfaces/spatial.ts +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { - ResponseFormat, - SpatialGetGeofenceOptionalParams, - SpatialGetGeofenceResponse, - SpatialPostGeofenceOptionalParams, - SpatialPostGeofenceResponse, - BufferRequestBody, - SpatialPostBufferOptionalParams, - SpatialPostBufferResponse, - SpatialGetBufferOptionalParams, - SpatialGetBufferResponse, - SpatialPostClosestPointOptionalParams, - SpatialPostClosestPointResponse, - SpatialGetClosestPointOptionalParams, - SpatialGetClosestPointResponse, - SpatialPostPointInPolygonOptionalParams, - SpatialPostPointInPolygonResponse, - SpatialGetPointInPolygonOptionalParams, - SpatialGetPointInPolygonResponse, - SpatialGetGreatCircleDistanceOptionalParams, - SpatialGetGreatCircleDistanceResponse -} from "../models"; - -/** Interface representing a Spatial. */ -export interface Spatial { - /** - * **Search Geofence Get API** - * - * **Applies to:** S1 Pricing tier. - * - * The Geofence Get API allows you to retrieve the proximity of a coordinate to a - * geofence that has been uploaded to the Data service. You can use the - * [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) to upload - * a geofence or set of fences. See [Geofencing GeoJSON - * data](https://docs.microsoft.com/en-us/azure/azure-maps/geofence-geojson) - * for more details on the geofence data format. To query the proximity of a coordinate, you supply the - * location of the object you are tracking as well - * as the ID for the fence or set of fences, and the response will contain information about - * the distance from the outer edge of the geofence. A negative value signifies that the - * coordinate is inside of the fence while a positive value means that it is outside of the - * fence.

This API can be used for a variety of scenarios that include things like asset - * tracking, fleet management, or setting up alerts for moving objects. - * - * The API supports [integration with Event - * Grid](https://docs.microsoft.com/azure/azure-maps/azure-maps-event-grid-integration). The isAsync - * parameter is used to enable integration with Event Grid (disabled by default). - * To test this API, you can upload the sample data from Post Geofence API examples(Request Body) via - * Data Upload API and replace the [udid] from the sample request below with the udid returned by Data - * Upload API. - * - * - * ### Geofencing InnerError code - * - * In geofencing response error contract, `innererror` is an object containing service specific - * information about the error. `code` is a property in `innererror` which can map to a specific - * geofencing error type. The table belows shows the code mapping between all the known client error - * type to the corresponding geofencing error `message`. - * - * innererror.code | error.message - * ---------------------------- | -------------------------------------- - * NullDeviceId | Device Id should not be null. - * NullUdid | Udid should not be null. - * UdidWrongFormat| Udid should be acquired from user data ingestion API. - * InvalidUserTime| Usertime is invalid. - * InvalidSearchBuffer| Searchbuffer is invalid. - * InvalidSearchRange| The value range of searchbuffer should be from 0 to 500 meters. - * InvalidLatLon| Lat and/or lon parameters are invalid. - * InvalidIsAsyncValue| The IsAsync parameter is invalid. - * InvalidModeValue| The mode parameter invalid. - * InvalidJson| Geofencing data is not a valid json file. - * NotSupportedGeoJson| Geofencing data can't be read as a Feature or FeatureCollections. - * InvalidGeoJson| Geofencing data is invalid. - * NoUserDataWithAccountOrSubscription| Can't find user geofencing data with provided account-id and/or - * subscription-id. - * NoUserDataWithUdid| Can't find user geofencing data with provided udid. - * @param format Desired format of the response. Only `json` format is supported. - * @param deviceId ID of the device - * @param udid The unique id returned from [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) after uploading a valid - * GeoJSON FeatureCollection object. Please refer to [RFC - * 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. All the feature's properties - * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. - * @param latitude The latitude of the location being passed. Example: 48.36. - * @param longitude The longitude of the location being passed. Example: -124.63. - * @param options The options parameters. - */ - getGeofence( - format: ResponseFormat, - deviceId: string, - udid: string, - latitude: number, - longitude: number, - options?: SpatialGetGeofenceOptionalParams - ): Promise; - /** - * **Search Geofence Post API** - * **Applies to:** S1 Pricing tier. - * The Geofence Post API allows you to retrieve the proximity of a coordinate to a provided geofence - * or set of fences. With POST call, you do not have to upload the fence data in advance, instead you - * supply the location of the object you are tracking in query parameters as well as the fence or set - * of fences data in post request body. See [Geofencing GeoJSON - * data](https://docs.microsoft.com/en-us/azure/azure-maps/geofence-geojson) for more details on the - * geofence data format. The response will contain information about the distance from the outer edge - * of the geofence. A negative value signifies that the coordinate is inside of the fence while a - * positive value means that it is outside of the fence.

This API can be used for a variety of - * scenarios that include things like asset tracking, fleet management, or setting up alerts for - * moving objects. - * - * The API supports [integration with Event - * Grid](https://docs.microsoft.com/azure/azure-maps/azure-maps-event-grid-integration). The isAsync - * parameter is used to enable integration with Event Grid (disabled by default). - * @param format Desired format of the response. Only `json` format is supported. - * @param deviceId ID of the device - * @param latitude The latitude of the location being passed. Example: 48.36. - * @param longitude The longitude of the location being passed. Example: -124.63. - * @param searchGeofenceRequestBody The geofencing GeoJSON data. - * @param options The options parameters. - */ - postGeofence( - format: ResponseFormat, - deviceId: string, - latitude: number, - longitude: number, - searchGeofenceRequestBody: Record, - options?: SpatialPostGeofenceOptionalParams - ): Promise; - /** - * **Applies to**: S1 pricing tier. - * - * This API returns a FeatureCollection where each Feature is a buffer around the corresponding indexed - * Feature of the input. The buffer could be either on the outside or the inside of the provided - * Feature, depending on the distance provided in the input. There must be either one distance provided - * per Feature in the FeatureCollection input, or if only one distance is provided, then that distance - * is applied to every Feature in the collection. The positive (or negative) buffer of a geometry is - * defined as the Minkowski sum (or difference) of the geometry with a circle of radius equal to the - * absolute value of the buffer distance. The buffer API always returns a polygonal result. The - * negative or zero-distance buffer of lines and points is always an empty polygon. The input may - * contain a collection of Point, MultiPoint, Polygon, MultiPolygon, LineString and MultiLineString. - * GeometryCollection will be ignored if provided. - * @param format Desired format of the response. Only `json` format is supported. - * @param bufferRequestBody The FeatureCollection and the list of distances (one per feature or one for - * all features). - * @param options The options parameters. - */ - postBuffer( - format: ResponseFormat, - bufferRequestBody: BufferRequestBody, - options?: SpatialPostBufferOptionalParams - ): Promise; - /** - * **Applies to**: S1 pricing tier. - * - * This API returns a FeatureCollection where each Feature is a buffer around the corresponding indexed - * Feature of the input. The buffer could be either on the outside or the inside of the provided - * Feature, depending on the distance provided in the input. There must be either one distance provided - * per Feature in the FeatureCollection input, or if only one distance is provided, then that distance - * is applied to every Feature in the collection. The positive (or negative) buffer of a geometry is - * defined as the Minkowski sum (or difference) of the geometry with a circle of radius equal to the - * absolute value of the buffer distance. The buffer API always returns a polygonal result. The - * negative or zero-distance buffer of lines and points is always an empty polygon. The input features - * are provided by a GeoJSON file which is uploaded via [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and referenced by a unique - * udid. The GeoJSON file may contain a collection of Point, MultiPoint, Polygon, MultiPolygon, - * LineString and MultiLineString. GeometryCollection will be ignored if provided. - * - * To test this API, you can upload the sample data from [Post Buffer - * API](https://docs.microsoft.com/en-us/rest/api/maps/spatial/postbuffer#examples) examples(Request - * Body without distances array) via [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and replace the [udid] from - * the [sample request - * below](https://docs.microsoft.com/en-us/rest/api/maps/spatial/getbuffer#examples) with the udid - * returned by Data Upload API. - * @param format Desired format of the response. Only `json` format is supported. - * @param udid The unique id returned from [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) after uploading a valid - * GeoJSON FeatureCollection object. Please refer to [RFC - * 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. All the feature's properties - * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. - * @param distances The list of distances (one per feature or one for all features), delimited by - * semicolons. For example, 12.34;-56.78. Positive distance will generate a buffer outside of the - * feature, whereas negative distance will generate a buffer inside of the feature. If the negative - * distance larger than the geometry itself, an empty polygon will be returned. - * @param options The options parameters. - */ - getBuffer( - format: ResponseFormat, - udid: string, - distances: string, - options?: SpatialGetBufferOptionalParams - ): Promise; - /** - * **Applies to**: S1 pricing tier. - * - * This API returns the closest point between a base point and a given set of target points. The set of - * target points is provided by user data in post request body. The user data may only contain a - * collection of Point geometry. MultiPoint or other geometries will be ignored if provided. The - * algorithm does not take into account routing or traffic. The maximum number of points accepted is - * 100,000. Information returned includes closest point latitude, longitude, and distance in meters - * from the closest point. - * @param format Desired format of the response. Only `json` format is supported. - * @param latitude The latitude of the location being passed. Example: 48.36. - * @param longitude The longitude of the location being passed. Example: -124.63. - * @param closestPointRequestBody The FeatureCollection of Point geometries from which closest point to - * source point should be determined. All the feature's properties should contain `geometryId`, which - * is used for identifying the geometry and is case-sensitive. - * @param options The options parameters. - */ - postClosestPoint( - format: ResponseFormat, - latitude: number, - longitude: number, - closestPointRequestBody: Record, - options?: SpatialPostClosestPointOptionalParams - ): Promise; - /** - * **Applies to**: S1 pricing tier. - * - * This API returns the closest point between a base point and a given set of points in the user - * uploaded data set identified by udid. The set of target points is provided by a GeoJSON file which - * is uploaded via [Data Upload API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) - * and referenced by a unique udid. The GeoJSON file may only contain a collection of Point geometry. - * MultiPoint or other geometries will be ignored if provided. The maximum number of points accepted is - * 100,000. The algorithm does not take into account routing or traffic. Information returned includes - * closest point latitude, longitude, and distance in meters from the closest point. - * - * To test this API, you can upload the sample data from [Post Closest Point - * API](https://docs.microsoft.com/en-us/rest/api/maps/spatial/postclosestpoint#examples) - * examples(Request Body) via [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and replace the [udid] from - * the [sample request - * below](https://docs.microsoft.com/en-us/rest/api/maps/spatial/getclosestpoint#examples) with the - * udid returned by Data Upload API. - * @param format Desired format of the response. Only `json` format is supported. - * @param udid The unique id returned from [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) after uploading a valid - * GeoJSON FeatureCollection object. Please refer to [RFC - * 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. All the feature's properties - * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. - * @param latitude The latitude of the location being passed. Example: 48.36. - * @param longitude The longitude of the location being passed. Example: -124.63. - * @param options The options parameters. - */ - getClosestPoint( - format: ResponseFormat, - udid: string, - latitude: number, - longitude: number, - options?: SpatialGetClosestPointOptionalParams - ): Promise; - /** - * **Applies to**: S1 pricing tier. - * - * This API returns a boolean value indicating whether a point is inside a set of polygons. The user - * data may contain Polygon and MultiPolygon geometries, other geometries will be ignored if provided. - * If the point is inside or on the boundary of one of these polygons, the value returned is true. In - * all other cases, the value returned is false. When the point is inside multiple polygons, the result - * will give intersecting geometries section to show all valid geometries (referenced by geometryId) in - * user data. The maximum number of vertices accepted to form a Polygon is 10,000. - * @param format Desired format of the response. Only `json` format is supported. - * @param latitude The latitude of the location being passed. Example: 48.36. - * @param longitude The longitude of the location being passed. Example: -124.63. - * @param pointInPolygonRequestBody A FeatureCollection with a set of Polygon/MultiPolygon geometries. - * The maximum number of vertices accepted to form a Polygon is 10,000. All the feature's properties - * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. - * @param options The options parameters. - */ - postPointInPolygon( - format: ResponseFormat, - latitude: number, - longitude: number, - pointInPolygonRequestBody: Record, - options?: SpatialPostPointInPolygonOptionalParams - ): Promise; - /** - * **Applies to**: S1 pricing tier. - * - * This API returns a boolean value indicating whether a point is inside a set of polygons. The set of - * polygons is provided by a GeoJSON file which is uploaded via [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and referenced by a unique - * udid. The GeoJSON file may contain Polygon and MultiPolygon geometries, other geometries will be - * ignored if provided. If the point is inside or on the boundary of one of these polygons, the value - * returned is true. In all other cases, the value returned is false. When the point is inside multiple - * polygons, the result will give intersecting geometries section to show all valid - * geometries(referenced by geometryId) in user data. The maximum number of vertices accepted to form a - * Polygon is 10,000. - * - * - * To test this API, you can upload the sample data from [Post Point In Polygon - * API](https://docs.microsoft.com/en-us/rest/api/maps/spatial/postpointinpolygon#examples) - * examples(Request Body) via [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) and replace the [udid] from - * the [sample request - * below](https://docs.microsoft.com/en-us/rest/api/maps/spatial/getpointinpolygon#examples) with the - * udid returned by Data Upload API. - * @param format Desired format of the response. Only `json` format is supported. - * @param udid The unique id returned from [Data Upload - * API](https://docs.microsoft.com/en-us/rest/api/maps/data/uploadPreview) after uploading a valid - * GeoJSON FeatureCollection object. Please refer to [RFC - * 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. All the feature's properties - * should contain `geometryId`, which is used for identifying the geometry and is case-sensitive. - * @param latitude The latitude of the location being passed. Example: 48.36. - * @param longitude The longitude of the location being passed. Example: -124.63. - * @param options The options parameters. - */ - getPointInPolygon( - format: ResponseFormat, - udid: string, - latitude: number, - longitude: number, - options?: SpatialGetPointInPolygonOptionalParams - ): Promise; - /** - * **Applies to**: S1 pricing tier. - * - * This API will return the great-circle or shortest distance between two points on the surface of a - * sphere, measured along the surface of the sphere. This differs from calculating a straight line - * through the sphere's interior. This method is helpful for estimating travel distances for airplanes - * by calculating the shortest distance between airports. - * @param format Desired format of the response. Only `json` format is supported. - * @param query The Coordinates through which the distance is calculated, delimited by a colon. Two - * coordinates are required. The first one is the source point coordinate and the last is the target - * point coordinate. For example, 47.622942,122.316456:57.673988,127.121513 - * @param options The options parameters. - */ - getGreatCircleDistance( - format: ResponseFormat, - query: string, - options?: SpatialGetGreatCircleDistanceOptionalParams - ): Promise; -} diff --git a/sdk/maps/maps-creator/src/operationsInterfaces/tileset.ts b/sdk/maps/maps-creator/src/operationsInterfaces/tileset.ts deleted file mode 100644 index 4cd641b7226b..000000000000 --- a/sdk/maps/maps-creator/src/operationsInterfaces/tileset.ts +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import "@azure/core-paging"; -import { PagedAsyncIterableIterator } from "@azure/core-paging"; -import { PollerLike, PollOperationState } from "@azure/core-lro"; -import { - TilesetDetailInfo, - TilesetListOptionalParams, - TilesetCreateOptionalParams, - TilesetCreateResponse, - TilesetGetOptionalParams, - TilesetGetResponse, - TilesetDeleteOptionalParams, - TilesetGetOperationOptionalParams, - TilesetGetOperationResponse -} from "../models"; - -/// -/** Interface representing a Tileset. */ -export interface Tileset { - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a list of all tilesets created. - *
- * @param options The options parameters. - */ - list( - options?: TilesetListOptionalParams - ): PagedAsyncIterableIterator; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * [This](https://docs.microsoft.com/en-us/azure/azure-maps/creator-indoor-maps) article introduces - * concepts and tools that apply to Azure Maps Creator. - * - * The Tileset Create API allows the caller to create a tileset from a dataset. A tileset contains a - * set of tiles that can be consumed - * from the [Get Map Tile](/rest/api/maps/render/getmaptile) to retrieve custom tiles. To make a - * dataset, use the - * [DataSet Create API](/rest/api/maps/dataset/createpreview). - * - * ## Submit Create Request - * - * To create your tileset you will make a `POST` request with an empty body. The `datasetId` query - * parameter will be - * used as the source of the tileset data. - * - * The Create Tileset API is a - * [long-running request](https://aka.ms/am-creator-lrt-v2). - * @param datasetId The unique `datasetId` that the tileset create API uses to retrieve features to - * generate tiles. The `datasetId` must have been obtained from a successful [Dataset Create - * API](/en-us/rest/api/maps/dataset/createpreview) call. - * @param options The options parameters. - */ - beginCreate( - datasetId: string, - options?: TilesetCreateOptionalParams - ): Promise< - PollerLike, TilesetCreateResponse> - >; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * [This](https://docs.microsoft.com/en-us/azure/azure-maps/creator-indoor-maps) article introduces - * concepts and tools that apply to Azure Maps Creator. - * - * The Tileset Create API allows the caller to create a tileset from a dataset. A tileset contains a - * set of tiles that can be consumed - * from the [Get Map Tile](/rest/api/maps/render/getmaptile) to retrieve custom tiles. To make a - * dataset, use the - * [DataSet Create API](/rest/api/maps/dataset/createpreview). - * - * ## Submit Create Request - * - * To create your tileset you will make a `POST` request with an empty body. The `datasetId` query - * parameter will be - * used as the source of the tileset data. - * - * The Create Tileset API is a - * [long-running request](https://aka.ms/am-creator-lrt-v2). - * @param datasetId The unique `datasetId` that the tileset create API uses to retrieve features to - * generate tiles. The `datasetId` must have been obtained from a successful [Dataset Create - * API](/en-us/rest/api/maps/dataset/createpreview) call. - * @param options The options parameters. - */ - beginCreateAndWait( - datasetId: string, - options?: TilesetCreateOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to fetch a tileset. - * @param tilesetId The Tileset Id - * @param options The options parameters. - */ - get( - tilesetId: string, - options?: TilesetGetOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * This API allows the caller to delete a created tileset.
- * You can use this API if a tileset is no longer needed. - * - * ### Submit Delete Request - * - * To delete your content you will issue a `DELETE` request where the path will contain the `tilesetId` - * of the tileset to delete.
- * - * #### Delete request "Successful" - * - * The Tileset Delete API returns a HTTP `204 No Content` response with an empty body, if the tileset - * was deleted successfully.
- * - * #### Delete request "Failed" - * - * A HTTP `400 Bad Request` error response will be returned if the tileset with the passed-in - * `tilesetId` is not found. - * - * Here is a sample error response: - * - *
- * - * ```json - * { - * "error": { - * "code": "400 BadRequest", - * "message": "Bad request - Tileset Id: d85b5b27-5fc4-4599-8b50-47160e90f8ce does not exist." - * } - * } - * ``` - * @param tilesetId The Tileset Id - * @param options The options parameters. - */ - delete( - tilesetId: string, - options?: TilesetDeleteOptionalParams - ): Promise; - /** - * This path will be obtained from a call to /tilesets/create. While in progress, an http200 will be - * returned with no extra headers - followed by an http200 with Resource-Location header once - * successfully completed. - * @param operationId The ID to query the status for the dataset create/import request. - * @param options The options parameters. - */ - getOperation( - operationId: string, - options?: TilesetGetOperationOptionalParams - ): Promise; -} diff --git a/sdk/maps/maps-creator/src/operationsInterfaces/wfs.ts b/sdk/maps/maps-creator/src/operationsInterfaces/wfs.ts deleted file mode 100644 index 2b75fedfc1d2..000000000000 --- a/sdk/maps/maps-creator/src/operationsInterfaces/wfs.ts +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { - WfsGetLandingPageOptionalParams, - WfsGetLandingPageResponse, - WfsGetConformanceOptionalParams, - WfsGetConformanceResponse, - WfsGetCollectionsOptionalParams, - WfsGetCollectionsResponse, - WfsGetCollectionOptionalParams, - WfsGetCollectionResponse, - WfsGetCollectionDefinitionOptionalParams, - WfsGetCollectionDefinitionResponse, - WfsGetFeaturesOptionalParams, - WfsGetFeaturesResponse, - WfsGetFeatureOptionalParams, - WfsGetFeatureResponse, - WfsDeleteFeatureOptionalParams -} from "../models"; - -/** Interface representing a Wfs. */ -export interface Wfs { - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial - * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to - * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). - * A dataset consists of multiple feature collections. A feature collection is a collection of features - * of a similar type, based on a common schema. - * The Get Landing Page API provides links to the API definition, the Conformance statements and the - * metadata about the feature data in this dataset. - * @param datasetId The identifier for the dataset to query from. - * @param options The options parameters. - */ - getLandingPage( - datasetId: string, - options?: WfsGetLandingPageOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial - * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to - * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). - * A dataset consists of multiple feature collections. A feature collection is a collection of features - * of a similar type, based on a common schema. - * The Get Requirements Classes lists all requirements classes specified in the standard that the - * server conforms to. - * @param datasetId The identifier for the dataset to query from. - * @param options The options parameters. - */ - getConformance( - datasetId: string, - options?: WfsGetConformanceOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial - * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to - * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). - * A dataset consists of multiple feature collections. A feature collection is a collection of features - * of a similar type, based on a common schema. - * The Collections Description API provides descriptions of all the collections in a given dataset. - * @param datasetId The identifier for the dataset to query from. - * @param options The options parameters. - */ - getCollections( - datasetId: string, - options?: WfsGetCollectionsOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial - * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to - * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). - * A dataset consists of multiple feature collections. A feature collection is a collection of features - * of a similar type, based on a common schema. - * - * The Collection Description API provides the description of a given collection. It includes the links - * to the operations that can be performed on the collection. - * @param datasetId The identifier for the dataset to query from. - * @param collectionId Identifier (name) of a specific collection - * @param options The options parameters. - */ - getCollection( - datasetId: string, - collectionId: string, - options?: WfsGetCollectionOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * [This](https://docs.microsoft.com/en-us/azure/azure-maps/creator-indoor-maps) article introduces - * concepts and tools that apply to Azure Maps Creator. WFS API follows the [Open Geospatial Consortium - * API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to query - * [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). - * A dataset consists of multiple feature collections. A feature collection is a collection of features - * of a similar type, based on a common schema. - * - * The Collection Definition API provides the detailed data model of a given collection. - * @param datasetId The identifier for the dataset to query from. - * @param collectionId Identifier (name) of a specific collection - * @param options The options parameters. - */ - getCollectionDefinition( - datasetId: string, - collectionId: string, - options?: WfsGetCollectionDefinitionOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial - * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to - * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). - * A dataset consists of multiple feature collections. A feature collection is a collection of features - * of a similar type, based on a common schema. - * The Get Features API returns the list of features in the given collection. - * @param datasetId The identifier for the dataset to query from. - * @param collectionId Identifier (name) of a specific collection - * @param options The options parameters. - */ - getFeatures( - datasetId: string, - collectionId: string, - options?: WfsGetFeaturesOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial - * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to - * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). - * A dataset consists of multiple feature collections. A feature collection is a collection of features - * of a similar type, based on a common schema. - * The Get Feature API returns the feature identified by the provided id in the given collection. - * @param datasetId The identifier for the dataset to query from. - * @param collectionId Identifier (name) of a specific collection - * @param featureId Local identifier of a specific feature - * @param options The options parameters. - */ - getFeature( - datasetId: string, - collectionId: string, - featureId: string, - options?: WfsGetFeatureOptionalParams - ): Promise; - /** - * **Applies to:** see pricing [tiers](https://aka.ms/AzureMapsPricingTier). - * - * Creator makes it possible to develop applications based on your private indoor map data using Azure - * Maps API and SDK. [This](https://docs.microsoft.com/azure/azure-maps/creator-indoor-maps) article - * introduces concepts and tools that apply to Azure Maps Creator. - * - * The Web Feature Service (WFS) API is part of Creator. WFS API follows the [Open Geospatial - * Consortium API standard for Features](http://docs.opengeospatial.org/is/17-069r3/17-069r3.html) to - * query [Datasets](https://docs.microsoft.com/en-us/rest/api/maps/dataset/createpreview). - * A dataset consists of multiple feature collections. A feature collection is a collection of features - * of a similar type, based on a common schema. - * The Delete Feature API deletes the feature identified by the provided id in the given collection. At - * this point this API supports only facility features. Deleting a facility feature deletes all the - * child features of that facility recursively. - * @param datasetId The identifier for the dataset to query from. - * @param collectionId Identifier (name) of a specific collection - * @param featureId Local identifier of a specific feature - * @param options The options parameters. - */ - deleteFeature( - datasetId: string, - collectionId: string, - featureId: string, - options?: WfsDeleteFeatureOptionalParams - ): Promise; -} diff --git a/sdk/maps/maps-creator/tsconfig.json b/sdk/maps/maps-creator/tsconfig.json deleted file mode 100644 index 0ec8659c8e83..000000000000 --- a/sdk/maps/maps-creator/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "module": "es6", - "moduleResolution": "node", - "strict": true, - "target": "es6", - "sourceMap": true, - "declarationMap": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "preserveConstEnums": true, - "lib": ["es6", "dom"], - "declaration": true, - "outDir": "./esm", - "importHelpers": true - }, - "include": ["./src/**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/sdk/maps/maps-elevation/LICENSE.txt b/sdk/maps/maps-elevation/LICENSE.txt deleted file mode 100644 index ccb63b166732..000000000000 --- a/sdk/maps/maps-elevation/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2021 Microsoft - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/sdk/maps/maps-elevation/README.md b/sdk/maps/maps-elevation/README.md deleted file mode 100644 index 52be0e8213ea..000000000000 --- a/sdk/maps/maps-elevation/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# Azure Elevation client library for JavaScript - -This package contains an isomorphic SDK (runs both in Node.js and in browsers) for Azure Elevation client. - -The Azure Maps Elevation API provides an HTTP interface to query elevation data on the surface of the Earth. Elevation data can be retrieved at specific locations by sending lat/lon coordinates, by defining an ordered set of vertices that form a Polyline and a number of sample points along the length of a Polyline, or by defining a bounding box that consists of equally spaced vertices as rows and columns. The vertical datum is EPSG:3855. This datum uses the EGM2008 geoid model applied to the WGS84 ellipsoid as its zero height reference surface. The vertical unit is measured in meters, the spatial resolution of the elevation data is 0.8 arc-second for global coverage (~24 meters). - -[Source code](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-elevation) | -[Package (NPM)](https://www.npmjs.com/package/@azure/maps-elevation) | -[API reference documentation](https://docs.microsoft.com/javascript/api/@azure/maps-elevation) | -[Samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-elevation/samples) - -## Getting started - -### Currently supported environments - -- [LTS versions of Node.js](https://nodejs.org/about/releases/) -- Latest versions of Safari, Chrome, Edge and Firefox. - -### Prerequisites - -- An [Azure subscription][azure_sub]. - -### Install the `@azure/maps-elevation` package - -Install the Azure Elevation client library for JavaScript with `npm`: - -```bash -npm install @azure/maps-elevation -``` - -### Create and authenticate a `ElevationClient` - -To create a client object to access the Azure Elevation API, you will need the `endpoint` of your Azure Elevation resource and a `credential`. The Azure Elevation client can use Azure Active Directory credentials to authenticate. -You can find the endpoint for your Azure Elevation resource in the [Azure Portal][azure_portal]. - -#### Using an Azure Active Directory Credential - -You can authenticate with Azure Active Directory using the [Azure Identity library][azure_identity]. To use the [DefaultAzureCredential][defaultazurecredential] provider shown below, or other credential providers provided with the Azure SDK, please install the `@azure/identity` package: - -```bash -npm install @azure/identity -``` - -You will also need to register a new AAD application and grant access to Azure Elevation by assigning the suitable role to your service principal (note: roles such as `"Owner"` will not grant the necessary permissions). -Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`. - -```javascript -const { ElevationClient } = require("@azure/maps-elevation"); -const { DefaultAzureCredential } = require("@azure/identity"); -const client = new ElevationClient("", new DefaultAzureCredential()); -``` - -## Key concepts - -### ElevationClient - -`ElevationClient` is the primary interface for developers using the Azure Elevation client library. Explore the methods on this client object to understand the different features of the Azure Elevation service that you can access. - -## Troubleshooting - -### Logging - -Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: - -```javascript -import { setLogLevel } from "@azure/logger"; -setLogLevel("info"); -``` - -For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger). - -## Next steps - -Please take a look at the [samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-elevation/samples) directory for detailed examples on how to use this library. - -## Contributing - -If you'd like to contribute to this library, please read the [contributing guide](https://github.com/Azure/azure-sdk-for-js/blob/master/CONTRIBUTING.md) to learn more about how to build and test the code. - -## Related projects - -- [Microsoft Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) - -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fmaps%2Fmaps-elevation%2FREADME.png) - -[azure_cli]: https://docs.microsoft.com/cli/azure -[azure_sub]: https://azure.microsoft.com/free/ -[azure_sub]: https://azure.microsoft.com/free/ -[azure_portal]: https://portal.azure.com -[azure_identity]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity -[defaultazurecredential]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity#defaultazurecredential diff --git a/sdk/maps/maps-elevation/api-extractor.json b/sdk/maps/maps-elevation/api-extractor.json deleted file mode 100644 index 5fb5b21b56f2..000000000000 --- a/sdk/maps/maps-elevation/api-extractor.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", - "mainEntryPointFilePath": "./esm/index.d.ts", - "docModel": { "enabled": true }, - "apiReport": { "enabled": true, "reportFolder": "./review" }, - "dtsRollup": { - "enabled": true, - "untrimmedFilePath": "", - "publicTrimmedFilePath": "./esm/index.d.ts" - }, - "messages": { - "tsdocMessageReporting": { "default": { "logLevel": "none" } }, - "extractorMessageReporting": { - "ae-missing-release-tag": { "logLevel": "none" }, - "ae-unresolved-link": { "logLevel": "none" } - } - } -} diff --git a/sdk/maps/maps-elevation/package.json b/sdk/maps/maps-elevation/package.json deleted file mode 100644 index 2b5766cc1927..000000000000 --- a/sdk/maps/maps-elevation/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "@azure/maps-elevation", - "sdk-type": "client", - "author": "Microsoft Corporation", - "description": "A generated SDK for ElevationClient.", - "version": "1.0.0-beta.1", - "engines": { "node": ">=12.0.0" }, - "dependencies": { - "@azure/core-client": "^1.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-rest-pipeline": "^1.1.0", - "tslib": "^2.2.0" - }, - "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], - "license": "MIT", - "main": "./dist/index.js", - "module": "./esm/index.js", - "types": "./esm/index.d.ts", - "devDependencies": { - "@microsoft/api-extractor": "7.7.11", - "@rollup/plugin-commonjs": "11.0.2", - "@rollup/plugin-json": "^4.0.0", - "@rollup/plugin-multi-entry": "^3.0.0", - "@rollup/plugin-node-resolve": "^8.0.0", - "mkdirp": "^1.0.4", - "rollup": "^1.16.3", - "rollup-plugin-sourcemaps": "^0.4.2", - "rollup-plugin-node-resolve": "^3.4.0", - "typescript": "~4.2.0", - "uglify-js": "^3.4.9" - }, - "homepage": "https://github.com/Azure/azure-sdk-for-js", - "repository": { - "type": "git", - "url": "https://github.com/Azure/azure-sdk-for-js.git" - }, - "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, - "files": [ - "dist/**/*.js", - "dist/**/*.js.map", - "dist/**/*.d.ts", - "dist/**/*.d.ts.map", - "esm/**/*.js", - "esm/**/*.js.map", - "esm/**/*.d.ts", - "esm/**/*.d.ts.map", - "src/**/*.ts", - "README.md", - "rollup.config.js", - "tsconfig.json", - "review/*", - "CHANGELOG.md" - ], - "scripts": { - "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", - "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js", - "prepack": "npm install && npm run build", - "pack": "npm pack 2>&1", - "extract-api": "mkdirp ./review && api-extractor run --local", - "lint": "echo skipped", - "audit": "echo skipped", - "clean": "echo skipped", - "build:node": "echo skipped", - "build:browser": "echo skipped", - "build:test": "echo skipped", - "build:samples": "echo skipped.", - "check-format": "echo skipped", - "execute:samples": "echo skipped", - "format": "echo skipped", - "test": "echo skipped", - "prebuild": "echo skipped", - "test:node": "echo skipped", - "test:browser": "echo skipped", - "unit-test": "echo skipped", - "unit-test:node": "echo skipped", - "unit-test:browser": "echo skipped", - "integration-test:browser": "echo skipped", - "integration-test:node": "echo skipped", - "integration-test": "echo skipped", - "docs": "echo skipped" - }, - "sideEffects": false, - "autoPublish": true -} diff --git a/sdk/maps/maps-elevation/review/maps-elevation.api.md b/sdk/maps/maps-elevation/review/maps-elevation.api.md deleted file mode 100644 index 72dc22e54101..000000000000 --- a/sdk/maps/maps-elevation/review/maps-elevation.api.md +++ /dev/null @@ -1,166 +0,0 @@ -## API Report File for "@azure/maps-elevation" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -import * as coreAuth from '@azure/core-auth'; -import * as coreClient from '@azure/core-client'; - -// @public -export interface BoundingBoxResult { - readonly data?: PointElevationResult[]; -} - -// @public -export interface CoordinatesPair { - latitude?: number; - longitude?: number; -} - -// @public -export interface CoordinatesPairAbbreviated { - lat?: number; - lon?: number; -} - -// @public -export interface Elevation { - getDataForBoundingBox(format: ResponseFormat, bounds: string[], rows: number, columns: number, options?: ElevationGetDataForBoundingBoxOptionalParams): Promise; - getDataForPoints(format: ResponseFormat, points: string[], options?: ElevationGetDataForPointsOptionalParams): Promise; - getDataForPolyline(format: ResponseFormat, lines: string[], options?: ElevationGetDataForPolylineOptionalParams): Promise; - postDataForPoints(format: ResponseFormat, pointsRequestBody: CoordinatesPairAbbreviated[], options?: ElevationPostDataForPointsOptionalParams): Promise; - postDataForPolyline(format: ResponseFormat, linesRequestBody: CoordinatesPairAbbreviated[], options?: ElevationPostDataForPolylineOptionalParams): Promise; -} - -// @public (undocumented) -export class ElevationClient extends ElevationClientContext { - constructor(credentials: coreAuth.TokenCredential, options?: ElevationClientOptionalParams); - // (undocumented) - elevation: Elevation; -} - -// @public (undocumented) -export class ElevationClientContext extends coreClient.ServiceClient { - constructor(credentials: coreAuth.TokenCredential, options?: ElevationClientOptionalParams); - // (undocumented) - apiVersion: string; - // (undocumented) - geography: Geography; - // (undocumented) - xMsClientId?: string; -} - -// @public -export interface ElevationClientOptionalParams extends coreClient.ServiceClientOptions { - apiVersion?: string; - endpoint?: string; - geography?: Geography; - xMsClientId?: string; -} - -// @public -export interface ElevationGetDataForBoundingBoxOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type ElevationGetDataForBoundingBoxResponse = BoundingBoxResult; - -// @public -export interface ElevationGetDataForPointsOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type ElevationGetDataForPointsResponse = PointsResult; - -// @public -export interface ElevationGetDataForPolylineOptionalParams extends coreClient.OperationOptions { - samples?: number; -} - -// @public -export type ElevationGetDataForPolylineResponse = LinesResult; - -// @public -export interface ElevationPostDataForPointsOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type ElevationPostDataForPointsResponse = PointsResult; - -// @public -export interface ElevationPostDataForPolylineOptionalParams extends coreClient.OperationOptions { - samples?: number; -} - -// @public -export type ElevationPostDataForPolylineResponse = LinesResult; - -// @public -export interface ErrorAdditionalInfo { - readonly info?: Record; - readonly type?: string; -} - -// @public -export interface ErrorDetail { - readonly additionalInfo?: ErrorAdditionalInfo[]; - readonly code?: string; - readonly details?: ErrorDetail[]; - readonly message?: string; - readonly target?: string; -} - -// @public -export interface ErrorResponse { - error?: ErrorDetail; -} - -// @public -export type GeographicResourceLocation = string; - -// @public -export type Geography = string; - -// @public -export const enum KnownGeographicResourceLocation { - Eu = "eu", - Us = "us" -} - -// @public -export const enum KnownGeography { - // (undocumented) - Eu = "eu", - // (undocumented) - Us = "us" -} - -// @public -export const enum KnownResponseFormat { - Json = "json" -} - -// @public -export interface LinesResult { - readonly data?: PointElevationResult[]; -} - -// @public -export interface PointElevationResult { - coordinate?: CoordinatesPair; - readonly elevationInMeter?: number; -} - -// @public -export interface PointsResult { - readonly data?: PointElevationResult[]; -} - -// @public -export type ResponseFormat = string; - - -// (No @packageDocumentation comment for this package) - -``` diff --git a/sdk/maps/maps-elevation/rollup.config.js b/sdk/maps/maps-elevation/rollup.config.js deleted file mode 100644 index 9be1955eb7f1..000000000000 --- a/sdk/maps/maps-elevation/rollup.config.js +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import nodeResolve from "@rollup/plugin-node-resolve"; -import cjs from "@rollup/plugin-commonjs"; -import sourcemaps from "rollup-plugin-sourcemaps"; -import multiEntry from "@rollup/plugin-multi-entry"; -import json from "@rollup/plugin-json"; - -import nodeBuiltins from "builtin-modules"; - -/** - * Gets the proper configuration needed for rollup's commonJS plugin for @opentelemetry/api. - * - * NOTE: this manual configuration is only needed because OpenTelemetry uses an - * __exportStar downleveled helper function to declare its exports which confuses - * rollup's automatic discovery mechanism. - * - * @returns an object reference that can be `...`'d into your cjs() configuration. - */ -export function openTelemetryCommonJs() { - const namedExports = {}; - - for (const key of [ - "@opentelemetry/api", - "@azure/core-tracing/node_modules/@opentelemetry/api" - ]) { - namedExports[key] = [ - "SpanKind", - "TraceFlags", - "getSpan", - "setSpan", - "SpanStatusCode", - "getSpanContext", - "setSpanContext" - ]; - } - - const releasedOpenTelemetryVersions = ["0.10.2", "1.0.0-rc.0"]; - - for (const version of releasedOpenTelemetryVersions) { - namedExports[ - // working around a limitation in the rollup common.js plugin - it's not able to resolve these modules so the named exports listed above will not get applied. We have to drill down to the actual path. - `../../../common/temp/node_modules/.pnpm/@opentelemetry/api@${version}/node_modules/@opentelemetry/api/build/src/index.js` - ] = [ - "SpanKind", - "TraceFlags", - "getSpan", - "setSpan", - "StatusCode", - "CanonicalCode", - "getSpanContext", - "setSpanContext" - ]; - } - - return namedExports; -} - -// #region Warning Handler - -/** - * A function that can determine whether a rollupwarning should be ignored. If - * the function returns `true`, then the warning will not be displayed. - */ - -function ignoreNiseSinonEvalWarnings(warning) { - return ( - warning.code === "EVAL" && - warning.id && - (warning.id.includes("node_modules/nise") || - warning.id.includes("node_modules/sinon")) === true - ); -} - -function ignoreChaiCircularDependencyWarnings(warning) { - return ( - warning.code === "CIRCULAR_DEPENDENCY" && - warning.importer && warning.importer.includes("node_modules/chai") === true - ); -} - -const warningInhibitors = [ - ignoreChaiCircularDependencyWarnings, - ignoreNiseSinonEvalWarnings -]; - -/** - * Construct a warning handler for the shared rollup configuration - * that ignores certain warnings that are not relevant to testing. - */ -function makeOnWarnForTesting() { - return (warning, warn) => { - // If every inhibitor returns false (i.e. no inhibitors), then show the warning - if (warningInhibitors.every((inhib) => !inhib(warning))) { - warn(warning); - } - }; -} - -// #endregion - -function makeBrowserTestConfig() { - const config = { - input: { - include: ["dist-esm/test/**/*.spec.js"], - exclude: ["dist-esm/test/**/node/**"] - }, - output: { - file: `dist-test/index.browser.js`, - format: "umd", - sourcemap: true - }, - preserveSymlinks: false, - plugins: [ - multiEntry({ exports: false }), - nodeResolve({ - mainFields: ["module", "browser"] - }), - cjs({ - namedExports: { - // Chai's strange internal architecture makes it impossible to statically - // analyze its exports. - chai: [ - "version", - "use", - "util", - "config", - "expect", - "should", - "assert" - ], - ...openTelemetryCommonJs() - } - }), - json(), - sourcemaps() - //viz({ filename: "dist-test/browser-stats.html", sourcemap: true }) - ], - onwarn: makeOnWarnForTesting(), - // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, - // rollup started respecting the "sideEffects" field in package.json. Since - // our package.json sets "sideEffects=false", this also applies to test - // code, which causes all tests to be removed by tree-shaking. - treeshake: false - }; - - return config; -} - -const defaultConfigurationOptions = { - disableBrowserBundle: false -}; - -export function makeConfig(pkg, options) { - options = { - ...defaultConfigurationOptions, - ...(options || {}) - }; - - const baseConfig = { - // Use the package's module field if it has one - input: pkg["module"] || "dist-esm/src/index.js", - external: [ - ...nodeBuiltins, - ...Object.keys(pkg.dependencies), - ...Object.keys(pkg.devDependencies) - ], - output: { file: "dist/index.js", format: "cjs", sourcemap: true }, - preserveSymlinks: false, - plugins: [sourcemaps(), nodeResolve(), cjs()] - }; - - const config = [baseConfig]; - - if (!options.disableBrowserBundle) { - config.push(makeBrowserTestConfig()); - } - - return config; -} - -export default makeConfig(require("./package.json")); diff --git a/sdk/maps/maps-elevation/src/elevationClient.ts b/sdk/maps/maps-elevation/src/elevationClient.ts deleted file mode 100644 index 87d71d19ea42..000000000000 --- a/sdk/maps/maps-elevation/src/elevationClient.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreAuth from "@azure/core-auth"; -import { ElevationImpl } from "./operations"; -import { Elevation } from "./operationsInterfaces"; -import { ElevationClientContext } from "./elevationClientContext"; -import { ElevationClientOptionalParams } from "./models"; - -export class ElevationClient extends ElevationClientContext { - /** - * Initializes a new instance of the ElevationClient class. - * @param credentials Subscription credentials which uniquely identify client subscription. - * @param options The parameter options - */ - constructor( - credentials: coreAuth.TokenCredential, - options?: ElevationClientOptionalParams - ) { - super(credentials, options); - this.elevation = new ElevationImpl(this); - } - - elevation: Elevation; -} diff --git a/sdk/maps/maps-elevation/src/elevationClientContext.ts b/sdk/maps/maps-elevation/src/elevationClientContext.ts deleted file mode 100644 index ec7e6ee7cd6e..000000000000 --- a/sdk/maps/maps-elevation/src/elevationClientContext.ts +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; -import * as coreAuth from "@azure/core-auth"; -import { Geography, ElevationClientOptionalParams } from "./models"; - -export class ElevationClientContext extends coreClient.ServiceClient { - geography: Geography; - xMsClientId?: string; - apiVersion: string; - - /** - * Initializes a new instance of the ElevationClientContext class. - * @param credentials Subscription credentials which uniquely identify client subscription. - * @param options The parameter options - */ - constructor( - credentials: coreAuth.TokenCredential, - options?: ElevationClientOptionalParams - ) { - if (credentials === undefined) { - throw new Error("'credentials' cannot be null"); - } - - // Initializing default values for options - if (!options) { - options = {}; - } - const defaults: ElevationClientOptionalParams = { - requestContentType: "application/json; charset=utf-8", - credential: credentials - }; - - const packageDetails = `azsdk-js-maps-elevation/1.0.0-beta.1`; - const userAgentPrefix = - options.userAgentOptions && options.userAgentOptions.userAgentPrefix - ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` - : `${packageDetails}`; - - if (!options.credentialScopes) { - options.credentialScopes = ["https://atlas.microsoft.com/.default"]; - } - const optionsWithDefaults = { - ...defaults, - ...options, - userAgentOptions: { - userAgentPrefix - }, - baseUri: options.endpoint || "https://{geography}.atlas.microsoft.com" - }; - super(optionsWithDefaults); - - // Assigning values to Constant parameters - this.geography = options.geography || "us"; - this.apiVersion = options.apiVersion || "1.0"; - } -} diff --git a/sdk/maps/maps-elevation/src/index.ts b/sdk/maps/maps-elevation/src/index.ts deleted file mode 100644 index 6a7bef3d2488..000000000000 --- a/sdk/maps/maps-elevation/src/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./models"; -export { ElevationClient } from "./elevationClient"; -export { ElevationClientContext } from "./elevationClientContext"; -export * from "./operationsInterfaces"; diff --git a/sdk/maps/maps-elevation/src/models/index.ts b/sdk/maps/maps-elevation/src/models/index.ts deleted file mode 100644 index 53c9bd79d050..000000000000 --- a/sdk/maps/maps-elevation/src/models/index.ts +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; - -/** The response from a successful Elevation Points request. */ -export interface PointsResult { - /** - * The response for point/points elevation API. The result will be in same sequence of points listed in request. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly data?: PointElevationResult[]; -} - -/** The elevation data. */ -export interface PointElevationResult { - /** A location represented as a latitude and longitude. */ - coordinate?: CoordinatesPair; - /** - * The elevation value in meters. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly elevationInMeter?: number; -} - -/** A location represented as a latitude and longitude. */ -export interface CoordinatesPair { - /** Latitude property */ - latitude?: number; - /** Longitude property */ - longitude?: number; -} - -/** Common error response for all Azure Resource Manager APIs to return error details for failed operations. (This also follows the OData error response format.). */ -export interface ErrorResponse { - /** The error object. */ - error?: ErrorDetail; -} - -/** The error detail. */ -export interface ErrorDetail { - /** - * The error code. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly code?: string; - /** - * The error message. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly message?: string; - /** - * The error target. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly target?: string; - /** - * The error details. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly details?: ErrorDetail[]; - /** - * The error additional info. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly additionalInfo?: ErrorAdditionalInfo[]; -} - -/** The resource management error additional info. */ -export interface ErrorAdditionalInfo { - /** - * The additional info type. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly type?: string; - /** - * The additional info. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly info?: Record; -} - -/** A location represented as a latitude and longitude using short names 'lat' & 'lon'. */ -export interface CoordinatesPairAbbreviated { - /** Latitude property */ - lat?: number; - /** Longitude property */ - lon?: number; -} - -/** The response from a successful Elevation Polyline request. */ -export interface LinesResult { - /** - * The response from the Get Data for Polyline API. The results will be listed in the direction from the first endpoint towards the last endpoint. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly data?: PointElevationResult[]; -} - -/** The response from a successful Get Data for Bounding Box API. */ -export interface BoundingBoxResult { - /** - * The response from the Get Data for Bounding Box API. The results are ordered starting with the southwest corner, and then proceed west to east and south to north. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly data?: PointElevationResult[]; -} - -/** Known values of {@link Geography} that the service accepts. */ -export const enum KnownGeography { - Us = "us", - Eu = "eu" -} - -/** - * Defines values for Geography. \ - * {@link KnownGeography} can be used interchangeably with Geography, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **us** \ - * **eu** - */ -export type Geography = string; - -/** Known values of {@link ResponseFormat} that the service accepts. */ -export const enum KnownResponseFormat { - /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ - Json = "json" -} - -/** - * Defines values for ResponseFormat. \ - * {@link KnownResponseFormat} can be used interchangeably with ResponseFormat, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) - */ -export type ResponseFormat = string; - -/** Known values of {@link GeographicResourceLocation} that the service accepts. */ -export const enum KnownGeographicResourceLocation { - /** Used to access an Azure Maps Creator resource in the United States */ - Us = "us", - /** Used to access an Azure Maps Creator resource in Europe */ - Eu = "eu" -} - -/** - * Defines values for GeographicResourceLocation. \ - * {@link KnownGeographicResourceLocation} can be used interchangeably with GeographicResourceLocation, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **us**: Used to access an Azure Maps Creator resource in the United States \ - * **eu**: Used to access an Azure Maps Creator resource in Europe - */ -export type GeographicResourceLocation = string; - -/** Optional parameters. */ -export interface ElevationGetDataForPointsOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getDataForPoints operation. */ -export type ElevationGetDataForPointsResponse = PointsResult; - -/** Optional parameters. */ -export interface ElevationPostDataForPointsOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the postDataForPoints operation. */ -export type ElevationPostDataForPointsResponse = PointsResult; - -/** Optional parameters. */ -export interface ElevationGetDataForPolylineOptionalParams - extends coreClient.OperationOptions { - /** The samples parameter specifies the number of equally spaced points at which elevation values should be provided along a polyline path. The number of samples should range from 2 to 2,000. Default value is 10. */ - samples?: number; -} - -/** Contains response data for the getDataForPolyline operation. */ -export type ElevationGetDataForPolylineResponse = LinesResult; - -/** Optional parameters. */ -export interface ElevationPostDataForPolylineOptionalParams - extends coreClient.OperationOptions { - /** The samples parameter specifies the number of equally spaced points at which elevation values should be provided along a polyline path. The number of samples should range from 2 to 2,000. Default value is 10. */ - samples?: number; -} - -/** Contains response data for the postDataForPolyline operation. */ -export type ElevationPostDataForPolylineResponse = LinesResult; - -/** Optional parameters. */ -export interface ElevationGetDataForBoundingBoxOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getDataForBoundingBox operation. */ -export type ElevationGetDataForBoundingBoxResponse = BoundingBoxResult; - -/** Optional parameters. */ -export interface ElevationClientOptionalParams - extends coreClient.ServiceClientOptions { - /** This parameter specifies where the Azure Maps Creator resource is located. Valid values are us and eu. */ - geography?: Geography; - /** Specifies which account is intended for usage in conjunction with the Azure AD security model. It represents a unique ID for the Azure Maps account and can be retrieved from the Azure Maps management plane Account API. To use Azure AD security in Azure Maps see the following [articles](https://aka.ms/amauthdetails) for guidance. */ - xMsClientId?: string; - /** Api Version */ - apiVersion?: string; - /** Overrides client endpoint. */ - endpoint?: string; -} diff --git a/sdk/maps/maps-elevation/src/models/mappers.ts b/sdk/maps/maps-elevation/src/models/mappers.ts deleted file mode 100644 index d0bae3a08ab8..000000000000 --- a/sdk/maps/maps-elevation/src/models/mappers.ts +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; - -export const PointsResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "PointsResult", - modelProperties: { - data: { - serializedName: "data", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "PointElevationResult" - } - } - } - } - } - } -}; - -export const PointElevationResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "PointElevationResult", - modelProperties: { - coordinate: { - serializedName: "coordinate", - type: { - name: "Composite", - className: "CoordinatesPair" - } - }, - elevationInMeter: { - serializedName: "elevationInMeter", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const CoordinatesPair: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "CoordinatesPair", - modelProperties: { - latitude: { - serializedName: "latitude", - type: { - name: "Number" - } - }, - longitude: { - serializedName: "longitude", - type: { - name: "Number" - } - } - } - } -}; - -export const ErrorResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorResponse", - modelProperties: { - error: { - serializedName: "error", - type: { - name: "Composite", - className: "ErrorDetail" - } - } - } - } -}; - -export const ErrorDetail: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorDetail", - modelProperties: { - code: { - serializedName: "code", - readOnly: true, - type: { - name: "String" - } - }, - message: { - serializedName: "message", - readOnly: true, - type: { - name: "String" - } - }, - target: { - serializedName: "target", - readOnly: true, - type: { - name: "String" - } - }, - details: { - serializedName: "details", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ErrorDetail" - } - } - } - }, - additionalInfo: { - serializedName: "additionalInfo", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ErrorAdditionalInfo" - } - } - } - } - } - } -}; - -export const ErrorAdditionalInfo: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorAdditionalInfo", - modelProperties: { - type: { - serializedName: "type", - readOnly: true, - type: { - name: "String" - } - }, - info: { - serializedName: "info", - readOnly: true, - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - } - } - } -}; - -export const CoordinatesPairAbbreviated: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "CoordinatesPairAbbreviated", - modelProperties: { - lat: { - serializedName: "lat", - type: { - name: "Number" - } - }, - lon: { - serializedName: "lon", - type: { - name: "Number" - } - } - } - } -}; - -export const LinesResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "LinesResult", - modelProperties: { - data: { - serializedName: "data", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "PointElevationResult" - } - } - } - } - } - } -}; - -export const BoundingBoxResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "BoundingBoxResult", - modelProperties: { - data: { - serializedName: "data", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "PointElevationResult" - } - } - } - } - } - } -}; diff --git a/sdk/maps/maps-elevation/src/models/parameters.ts b/sdk/maps/maps-elevation/src/models/parameters.ts deleted file mode 100644 index d3d43b3c899a..000000000000 --- a/sdk/maps/maps-elevation/src/models/parameters.ts +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { - OperationParameter, - OperationURLParameter, - OperationQueryParameter -} from "@azure/core-client"; - -export const accept: OperationParameter = { - parameterPath: "accept", - mapper: { - defaultValue: "application/json", - isConstant: true, - serializedName: "Accept", - type: { - name: "String" - } - } -}; - -export const geography: OperationURLParameter = { - parameterPath: "geography", - mapper: { - serializedName: "geography", - required: true, - type: { - name: "String" - } - } -}; - -export const xMsClientId: OperationParameter = { - parameterPath: "xMsClientId", - mapper: { - serializedName: "x-ms-client-id", - type: { - name: "String" - } - } -}; - -export const apiVersion: OperationQueryParameter = { - parameterPath: "apiVersion", - mapper: { - defaultValue: "1.0", - isConstant: true, - serializedName: "api-version", - type: { - name: "String" - } - } -}; - -export const format: OperationURLParameter = { - parameterPath: "format", - mapper: { - serializedName: "format", - required: true, - type: { - name: "String" - } - } -}; - -export const points: OperationQueryParameter = { - parameterPath: "points", - mapper: { - serializedName: "points", - required: true, - type: { - name: "Sequence", - element: { - constraints: { - Pattern: new RegExp( - "\\s*[-]?\\d+[.]\\d+\\s*[,]\\s*[-]?\\d+[.]\\d+\\s*" - ) - }, - type: { - name: "String" - } - } - } - }, - collectionFormat: "Pipes", - skipEncoding: true -}; - -export const contentType: OperationParameter = { - parameterPath: ["options", "contentType"], - mapper: { - defaultValue: "application/json", - isConstant: true, - serializedName: "Content-Type", - type: { - name: "String" - } - } -}; - -export const pointsRequestBody: OperationParameter = { - parameterPath: "pointsRequestBody", - mapper: { - serializedName: "pointsRequestBody", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "CoordinatesPairAbbreviated" - } - } - } - } -}; - -export const lines: OperationQueryParameter = { - parameterPath: "lines", - mapper: { - serializedName: "lines", - required: true, - type: { - name: "Sequence", - element: { - constraints: { - Pattern: new RegExp( - "\\s*[-]?\\d+[.]\\d+\\s*[,]\\s*[-]?\\d+[.]\\d+\\s*" - ) - }, - type: { - name: "String" - } - } - } - }, - collectionFormat: "Pipes", - skipEncoding: true -}; - -export const samples: OperationQueryParameter = { - parameterPath: ["options", "samples"], - mapper: { - constraints: { - InclusiveMaximum: 2000, - InclusiveMinimum: 2 - }, - serializedName: "samples", - type: { - name: "Number" - } - } -}; - -export const linesRequestBody: OperationParameter = { - parameterPath: "linesRequestBody", - mapper: { - serializedName: "linesRequestBody", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "CoordinatesPairAbbreviated" - } - } - } - } -}; - -export const bounds: OperationQueryParameter = { - parameterPath: "bounds", - mapper: { - serializedName: "bounds", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - collectionFormat: "CSV" -}; - -export const rows: OperationQueryParameter = { - parameterPath: "rows", - mapper: { - constraints: { - InclusiveMaximum: 1000, - InclusiveMinimum: 2 - }, - serializedName: "rows", - required: true, - type: { - name: "Number" - } - } -}; - -export const columns: OperationQueryParameter = { - parameterPath: "columns", - mapper: { - constraints: { - InclusiveMaximum: 1000, - InclusiveMinimum: 2 - }, - serializedName: "columns", - required: true, - type: { - name: "Number" - } - } -}; diff --git a/sdk/maps/maps-elevation/src/operations/elevation.ts b/sdk/maps/maps-elevation/src/operations/elevation.ts deleted file mode 100644 index 9d20f94c2928..000000000000 --- a/sdk/maps/maps-elevation/src/operations/elevation.ts +++ /dev/null @@ -1,304 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { Elevation } from "../operationsInterfaces"; -import * as coreClient from "@azure/core-client"; -import * as Mappers from "../models/mappers"; -import * as Parameters from "../models/parameters"; -import { ElevationClientContext } from "../elevationClientContext"; -import { - ResponseFormat, - ElevationGetDataForPointsOptionalParams, - ElevationGetDataForPointsResponse, - CoordinatesPairAbbreviated, - ElevationPostDataForPointsOptionalParams, - ElevationPostDataForPointsResponse, - ElevationGetDataForPolylineOptionalParams, - ElevationGetDataForPolylineResponse, - ElevationPostDataForPolylineOptionalParams, - ElevationPostDataForPolylineResponse, - ElevationGetDataForBoundingBoxOptionalParams, - ElevationGetDataForBoundingBoxResponse -} from "../models"; - -/** Class representing a Elevation. */ -export class ElevationImpl implements Elevation { - private readonly client: ElevationClientContext; - - /** - * Initialize a new instance of the class Elevation class. - * @param client Reference to the service client - */ - constructor(client: ElevationClientContext) { - this.client = client; - } - - /** - * **Applies to**: S1 pricing tier. - * - * The Get Data for Points API provides elevation data for one or more points. A point is defined in - * lat,long coordinate format. - * - * Due to the URL character length limit of 2048, it's not possible to pass more than 100 coordinates - * as a pipeline delimited string in a URL GET request. If you intend to pass more than 100 - * coordinates as a pipeline delimited string, use the [POST Data - * For Points](https://docs.microsoft.com/en-us/rest/api/maps/elevation/postdataforpoints). - * @param format Desired format of the response. Only `json` format is supported. - * @param points The string representation of a list of points. A point is defined in lon/lat WGS84 - * coordinate reference system format. If multiple points are requested, each of the points in a list - * should be separated by the pipe ('|') character. The maximum number of points that can be requested - * in a single request is 2,000. The resolution of the elevation data will be the highest for a single - * point and will decrease if multiple points are spread further apart. - * @param options The options parameters. - */ - getDataForPoints( - format: ResponseFormat, - points: string[], - options?: ElevationGetDataForPointsOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, points, options }, - getDataForPointsOperationSpec - ); - } - - /** - * **Applies to**: S1 pricing tier. - * - * The Post Data for Points API provides elevation data for multiple points. A point is defined - * lon/lat coordinate format. Use the POST endpoint only if you intend to pass multiple points in the - * request. If you intend to pass a single coordinate into the API, use the [GET Data For Points - * API](https://docs.microsoft.com/en-us/rest/api/maps/elevation/getdataforpoints). - * @param format Desired format of the response. Only `json` format is supported. - * @param pointsRequestBody The string representation of a list of points. A point is defined in - * lon/lat WGS84 coordinate reference system format. Each points in a list should be separated by the - * pipe ('|') character. The number of points that can be requested in a POST request ranges from 2 to - * 2,000. The resolution of the elevation data will be the highest for a single point and will - * decrease if multiple points are spread further apart. - * @param options The options parameters. - */ - postDataForPoints( - format: ResponseFormat, - pointsRequestBody: CoordinatesPairAbbreviated[], - options?: ElevationPostDataForPointsOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, pointsRequestBody, options }, - postDataForPointsOperationSpec - ); - } - - /** - * **Applies to**: S1 pricing tier. - * - * The Get Data for Polyline API provides elevation data along a polyline. - * - * A polyline is defined by passing in between 2 and N endpoint coordinates separated by a pipe ('|') - * character. In addition to passing in endpoints, customers can specify the number of sample points - * that will be used to divide polyline into equally spaced segments. Elevation data at both start and - * endpoints and equally spaced points along the polyline will be returned. - * - * A line between two endpoints is a straight Cartesian line, the shortest line between those two - * points in the coordinate reference system. Note that the point is chosen based on Euclidean - * distance and may markedly differ from the geodesic path along the curved surface of the reference - * ellipsoid. - * @param format Desired format of the response. Only `json` format is supported. - * @param lines The string representation of a polyline path. A polyline is defined by endpoint - * coordinates, with each endpoint separated by a pipe ('|') character. The polyline should be defined - * in the following format: `[longitude_point1, latitude_point1 | longitude_point2, latitude_point2, - * ..., longitude_pointN, latitude_pointN]`. - * - * The longitude and latitude values refer to the World Geodetic System (WGS84) coordinate reference - * system. The resolution of the data used to compute the elevation depends on the distance between - * the endpoints. - * @param options The options parameters. - */ - getDataForPolyline( - format: ResponseFormat, - lines: string[], - options?: ElevationGetDataForPolylineOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, lines, options }, - getDataForPolylineOperationSpec - ); - } - - /** - * **Applies to**: S1 pricing tier. - * - * The Post Data for Polyline API provides elevation data along a polyline. A polyline is defined by - * passing in between 2 and N endpoint coordinates separated by a pipe ('|') character. In addition to - * passing in endpoints, customers can specify the number of sample points that will be used to divide - * polyline into equally spaced segments. - * - * Elevation data at both start and end points and equally spaced points along the polyline will be - * returned. A line between two endpoints is a straight Cartesian line, the shortest line between - * those two points in the coordinate reference system. Note that the point is chosen based on - * Euclidean distance and may markedly differ from the geodesic path along the curved surface of the - * reference ellipsoid. - * @param format Desired format of the response. Only `json` format is supported. - * @param linesRequestBody The string representation of a polyline path. A polyline is defined by - * endpoint coordinates, with each endpoint separated by a pipe ('|') character. The polyline should - * be defined in the following format: `[longitude_point1, latitude_point1 | longitude_point2, - * latitude_point2, ..., longitude_pointN, latitude_pointN]`. The longitude and latitude values refer - * to the World Geodetic System (WGS84) coordinate reference system. The resolution of the data used - * to compute the elevation will depend on the distance between the endpoints. - * @param options The options parameters. - */ - postDataForPolyline( - format: ResponseFormat, - linesRequestBody: CoordinatesPairAbbreviated[], - options?: ElevationPostDataForPolylineOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, linesRequestBody, options }, - postDataForPolylineOperationSpec - ); - } - - /** - * **Applies to**: S1 pricing tier. - * - * The Get Data for Bounding Box API provides elevation data at equally spaced locations within a - * bounding box. A bounding box is defined by the coordinates for two corners (southwest, northeast) - * and then subsequently divided into rows and columns. - * - * Elevations are returned for the vertices of the grid created by the rows and columns. Up to 2,000 - * elevations can be returned in a single request. The returned elevation values are ordered, starting - * at the southwest corner, and then proceeding west to east along the row. At the end of the row, it - * moves north to the next row, and repeats the process until it reaches the far northeast corner. - * @param format Desired format of the response. Only `json` format is supported. - * @param bounds The string that represents the rectangular area of a bounding box. The bounds - * parameter is defined by the 4 bounding box coordinates, with WGS84 longitude and latitude of the - * southwest corner followed by WGS84 longitude and latitude of the northeast corner. The string is - * presented in the following format: `[SouthwestCorner_Longitude, SouthwestCorner_Latitude, - * NortheastCorner_Longitude, NortheastCorner_Latitude]`. - * @param rows Specifies the number of rows to use to divide the bounding box area into a grid. The - * number of vertices in the grid should be less than 2,000. - * @param columns Specifies the number of columns to use to divide the bounding box area into a grid. - * The number of vertices in the grid should be less than 2,000. - * @param options The options parameters. - */ - getDataForBoundingBox( - format: ResponseFormat, - bounds: string[], - rows: number, - columns: number, - options?: ElevationGetDataForBoundingBoxOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, bounds, rows, columns, options }, - getDataForBoundingBoxOperationSpec - ); - } -} -// Operation Specifications -const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); - -const getDataForPointsOperationSpec: coreClient.OperationSpec = { - path: "/elevation/point/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.PointsResult - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion, Parameters.points], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const postDataForPointsOperationSpec: coreClient.OperationSpec = { - path: "/elevation/point/{format}", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.PointsResult - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.pointsRequestBody, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [ - Parameters.accept, - Parameters.xMsClientId, - Parameters.contentType - ], - mediaType: "json", - serializer -}; -const getDataForPolylineOperationSpec: coreClient.OperationSpec = { - path: "/elevation/line/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.LinesResult - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.lines, - Parameters.samples - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const postDataForPolylineOperationSpec: coreClient.OperationSpec = { - path: "/elevation/line/{format}", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.LinesResult - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.linesRequestBody, - queryParameters: [Parameters.apiVersion, Parameters.samples], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [ - Parameters.accept, - Parameters.xMsClientId, - Parameters.contentType - ], - mediaType: "json", - serializer -}; -const getDataForBoundingBoxOperationSpec: coreClient.OperationSpec = { - path: "/elevation/lattice/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.BoundingBoxResult - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.bounds, - Parameters.rows, - Parameters.columns - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; diff --git a/sdk/maps/maps-elevation/src/operations/index.ts b/sdk/maps/maps-elevation/src/operations/index.ts deleted file mode 100644 index 8b7f3e6f4fd4..000000000000 --- a/sdk/maps/maps-elevation/src/operations/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./elevation"; diff --git a/sdk/maps/maps-elevation/src/operationsInterfaces/elevation.ts b/sdk/maps/maps-elevation/src/operationsInterfaces/elevation.ts deleted file mode 100644 index 288101794a30..000000000000 --- a/sdk/maps/maps-elevation/src/operationsInterfaces/elevation.ts +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { - ResponseFormat, - ElevationGetDataForPointsOptionalParams, - ElevationGetDataForPointsResponse, - CoordinatesPairAbbreviated, - ElevationPostDataForPointsOptionalParams, - ElevationPostDataForPointsResponse, - ElevationGetDataForPolylineOptionalParams, - ElevationGetDataForPolylineResponse, - ElevationPostDataForPolylineOptionalParams, - ElevationPostDataForPolylineResponse, - ElevationGetDataForBoundingBoxOptionalParams, - ElevationGetDataForBoundingBoxResponse -} from "../models"; - -/** Interface representing a Elevation. */ -export interface Elevation { - /** - * **Applies to**: S1 pricing tier. - * - * The Get Data for Points API provides elevation data for one or more points. A point is defined in - * lat,long coordinate format. - * - * Due to the URL character length limit of 2048, it's not possible to pass more than 100 coordinates - * as a pipeline delimited string in a URL GET request. If you intend to pass more than 100 - * coordinates as a pipeline delimited string, use the [POST Data - * For Points](https://docs.microsoft.com/en-us/rest/api/maps/elevation/postdataforpoints). - * @param format Desired format of the response. Only `json` format is supported. - * @param points The string representation of a list of points. A point is defined in lon/lat WGS84 - * coordinate reference system format. If multiple points are requested, each of the points in a list - * should be separated by the pipe ('|') character. The maximum number of points that can be requested - * in a single request is 2,000. The resolution of the elevation data will be the highest for a single - * point and will decrease if multiple points are spread further apart. - * @param options The options parameters. - */ - getDataForPoints( - format: ResponseFormat, - points: string[], - options?: ElevationGetDataForPointsOptionalParams - ): Promise; - /** - * **Applies to**: S1 pricing tier. - * - * The Post Data for Points API provides elevation data for multiple points. A point is defined - * lon/lat coordinate format. Use the POST endpoint only if you intend to pass multiple points in the - * request. If you intend to pass a single coordinate into the API, use the [GET Data For Points - * API](https://docs.microsoft.com/en-us/rest/api/maps/elevation/getdataforpoints). - * @param format Desired format of the response. Only `json` format is supported. - * @param pointsRequestBody The string representation of a list of points. A point is defined in - * lon/lat WGS84 coordinate reference system format. Each points in a list should be separated by the - * pipe ('|') character. The number of points that can be requested in a POST request ranges from 2 to - * 2,000. The resolution of the elevation data will be the highest for a single point and will - * decrease if multiple points are spread further apart. - * @param options The options parameters. - */ - postDataForPoints( - format: ResponseFormat, - pointsRequestBody: CoordinatesPairAbbreviated[], - options?: ElevationPostDataForPointsOptionalParams - ): Promise; - /** - * **Applies to**: S1 pricing tier. - * - * The Get Data for Polyline API provides elevation data along a polyline. - * - * A polyline is defined by passing in between 2 and N endpoint coordinates separated by a pipe ('|') - * character. In addition to passing in endpoints, customers can specify the number of sample points - * that will be used to divide polyline into equally spaced segments. Elevation data at both start and - * endpoints and equally spaced points along the polyline will be returned. - * - * A line between two endpoints is a straight Cartesian line, the shortest line between those two - * points in the coordinate reference system. Note that the point is chosen based on Euclidean - * distance and may markedly differ from the geodesic path along the curved surface of the reference - * ellipsoid. - * @param format Desired format of the response. Only `json` format is supported. - * @param lines The string representation of a polyline path. A polyline is defined by endpoint - * coordinates, with each endpoint separated by a pipe ('|') character. The polyline should be defined - * in the following format: `[longitude_point1, latitude_point1 | longitude_point2, latitude_point2, - * ..., longitude_pointN, latitude_pointN]`. - * - * The longitude and latitude values refer to the World Geodetic System (WGS84) coordinate reference - * system. The resolution of the data used to compute the elevation depends on the distance between - * the endpoints. - * @param options The options parameters. - */ - getDataForPolyline( - format: ResponseFormat, - lines: string[], - options?: ElevationGetDataForPolylineOptionalParams - ): Promise; - /** - * **Applies to**: S1 pricing tier. - * - * The Post Data for Polyline API provides elevation data along a polyline. A polyline is defined by - * passing in between 2 and N endpoint coordinates separated by a pipe ('|') character. In addition to - * passing in endpoints, customers can specify the number of sample points that will be used to divide - * polyline into equally spaced segments. - * - * Elevation data at both start and end points and equally spaced points along the polyline will be - * returned. A line between two endpoints is a straight Cartesian line, the shortest line between - * those two points in the coordinate reference system. Note that the point is chosen based on - * Euclidean distance and may markedly differ from the geodesic path along the curved surface of the - * reference ellipsoid. - * @param format Desired format of the response. Only `json` format is supported. - * @param linesRequestBody The string representation of a polyline path. A polyline is defined by - * endpoint coordinates, with each endpoint separated by a pipe ('|') character. The polyline should - * be defined in the following format: `[longitude_point1, latitude_point1 | longitude_point2, - * latitude_point2, ..., longitude_pointN, latitude_pointN]`. The longitude and latitude values refer - * to the World Geodetic System (WGS84) coordinate reference system. The resolution of the data used - * to compute the elevation will depend on the distance between the endpoints. - * @param options The options parameters. - */ - postDataForPolyline( - format: ResponseFormat, - linesRequestBody: CoordinatesPairAbbreviated[], - options?: ElevationPostDataForPolylineOptionalParams - ): Promise; - /** - * **Applies to**: S1 pricing tier. - * - * The Get Data for Bounding Box API provides elevation data at equally spaced locations within a - * bounding box. A bounding box is defined by the coordinates for two corners (southwest, northeast) - * and then subsequently divided into rows and columns. - * - * Elevations are returned for the vertices of the grid created by the rows and columns. Up to 2,000 - * elevations can be returned in a single request. The returned elevation values are ordered, starting - * at the southwest corner, and then proceeding west to east along the row. At the end of the row, it - * moves north to the next row, and repeats the process until it reaches the far northeast corner. - * @param format Desired format of the response. Only `json` format is supported. - * @param bounds The string that represents the rectangular area of a bounding box. The bounds - * parameter is defined by the 4 bounding box coordinates, with WGS84 longitude and latitude of the - * southwest corner followed by WGS84 longitude and latitude of the northeast corner. The string is - * presented in the following format: `[SouthwestCorner_Longitude, SouthwestCorner_Latitude, - * NortheastCorner_Longitude, NortheastCorner_Latitude]`. - * @param rows Specifies the number of rows to use to divide the bounding box area into a grid. The - * number of vertices in the grid should be less than 2,000. - * @param columns Specifies the number of columns to use to divide the bounding box area into a grid. - * The number of vertices in the grid should be less than 2,000. - * @param options The options parameters. - */ - getDataForBoundingBox( - format: ResponseFormat, - bounds: string[], - rows: number, - columns: number, - options?: ElevationGetDataForBoundingBoxOptionalParams - ): Promise; -} diff --git a/sdk/maps/maps-elevation/src/operationsInterfaces/index.ts b/sdk/maps/maps-elevation/src/operationsInterfaces/index.ts deleted file mode 100644 index 8b7f3e6f4fd4..000000000000 --- a/sdk/maps/maps-elevation/src/operationsInterfaces/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./elevation"; diff --git a/sdk/maps/maps-elevation/tsconfig.json b/sdk/maps/maps-elevation/tsconfig.json deleted file mode 100644 index 0ec8659c8e83..000000000000 --- a/sdk/maps/maps-elevation/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "module": "es6", - "moduleResolution": "node", - "strict": true, - "target": "es6", - "sourceMap": true, - "declarationMap": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "preserveConstEnums": true, - "lib": ["es6", "dom"], - "declaration": true, - "outDir": "./esm", - "importHelpers": true - }, - "include": ["./src/**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/sdk/maps/maps-geolocation/LICENSE.txt b/sdk/maps/maps-geolocation/LICENSE.txt deleted file mode 100644 index ccb63b166732..000000000000 --- a/sdk/maps/maps-geolocation/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2021 Microsoft - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/sdk/maps/maps-geolocation/README.md b/sdk/maps/maps-geolocation/README.md deleted file mode 100644 index df73fd4901e2..000000000000 --- a/sdk/maps/maps-geolocation/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# Azure Geolocation client library for JavaScript - -This package contains an isomorphic SDK (runs both in Node.js and in browsers) for Azure Geolocation client. - -Azure Maps Geolocation REST APIs - -[Source code](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-geolocation) | -[Package (NPM)](https://www.npmjs.com/package/@azure/maps-geolocation) | -[API reference documentation](https://docs.microsoft.com/javascript/api/@azure/maps-geolocation) | -[Samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-geolocation/samples) - -## Getting started - -### Currently supported environments - -- [LTS versions of Node.js](https://nodejs.org/about/releases/) -- Latest versions of Safari, Chrome, Edge and Firefox. - -### Prerequisites - -- An [Azure subscription][azure_sub]. - -### Install the `@azure/maps-geolocation` package - -Install the Azure Geolocation client library for JavaScript with `npm`: - -```bash -npm install @azure/maps-geolocation -``` - -### Create and authenticate a `GeolocationClient` - -To create a client object to access the Azure Geolocation API, you will need the `endpoint` of your Azure Geolocation resource and a `credential`. The Azure Geolocation client can use Azure Active Directory credentials to authenticate. -You can find the endpoint for your Azure Geolocation resource in the [Azure Portal][azure_portal]. - -#### Using an Azure Active Directory Credential - -You can authenticate with Azure Active Directory using the [Azure Identity library][azure_identity]. To use the [DefaultAzureCredential][defaultazurecredential] provider shown below, or other credential providers provided with the Azure SDK, please install the `@azure/identity` package: - -```bash -npm install @azure/identity -``` - -You will also need to register a new AAD application and grant access to Azure Geolocation by assigning the suitable role to your service principal (note: roles such as `"Owner"` will not grant the necessary permissions). -Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`. - -```javascript -const { GeolocationClient } = require("@azure/maps-geolocation"); -const { DefaultAzureCredential } = require("@azure/identity"); -const client = new GeolocationClient("", new DefaultAzureCredential()); -``` - -## Key concepts - -### GeolocationClient - -`GeolocationClient` is the primary interface for developers using the Azure Geolocation client library. Explore the methods on this client object to understand the different features of the Azure Geolocation service that you can access. - -## Troubleshooting - -### Logging - -Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: - -```javascript -import { setLogLevel } from "@azure/logger"; -setLogLevel("info"); -``` - -For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger). - -## Next steps - -Please take a look at the [samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-geolocation/samples) directory for detailed examples on how to use this library. - -## Contributing - -If you'd like to contribute to this library, please read the [contributing guide](https://github.com/Azure/azure-sdk-for-js/blob/master/CONTRIBUTING.md) to learn more about how to build and test the code. - -## Related projects - -- [Microsoft Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) - -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fmaps%2Fmaps-geolocation%2FREADME.png) - -[azure_cli]: https://docs.microsoft.com/cli/azure -[azure_sub]: https://azure.microsoft.com/free/ -[azure_sub]: https://azure.microsoft.com/free/ -[azure_portal]: https://portal.azure.com -[azure_identity]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity -[defaultazurecredential]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity#defaultazurecredential diff --git a/sdk/maps/maps-geolocation/api-extractor.json b/sdk/maps/maps-geolocation/api-extractor.json deleted file mode 100644 index 5fb5b21b56f2..000000000000 --- a/sdk/maps/maps-geolocation/api-extractor.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", - "mainEntryPointFilePath": "./esm/index.d.ts", - "docModel": { "enabled": true }, - "apiReport": { "enabled": true, "reportFolder": "./review" }, - "dtsRollup": { - "enabled": true, - "untrimmedFilePath": "", - "publicTrimmedFilePath": "./esm/index.d.ts" - }, - "messages": { - "tsdocMessageReporting": { "default": { "logLevel": "none" } }, - "extractorMessageReporting": { - "ae-missing-release-tag": { "logLevel": "none" }, - "ae-unresolved-link": { "logLevel": "none" } - } - } -} diff --git a/sdk/maps/maps-geolocation/package.json b/sdk/maps/maps-geolocation/package.json deleted file mode 100644 index 08f3fe4b7134..000000000000 --- a/sdk/maps/maps-geolocation/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "@azure/maps-geolocation", - "sdk-type": "client", - "author": "Microsoft Corporation", - "description": "A generated SDK for GeolocationClient.", - "version": "1.0.0-beta.1", - "engines": { "node": ">=12.0.0" }, - "dependencies": { - "@azure/core-client": "^1.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-rest-pipeline": "^1.1.0", - "tslib": "^2.2.0" - }, - "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], - "license": "MIT", - "main": "./dist/index.js", - "module": "./esm/index.js", - "types": "./esm/index.d.ts", - "devDependencies": { - "@microsoft/api-extractor": "7.7.11", - "@rollup/plugin-commonjs": "11.0.2", - "@rollup/plugin-json": "^4.0.0", - "@rollup/plugin-multi-entry": "^3.0.0", - "@rollup/plugin-node-resolve": "^8.0.0", - "mkdirp": "^1.0.4", - "rollup": "^1.16.3", - "rollup-plugin-sourcemaps": "^0.4.2", - "rollup-plugin-node-resolve": "^3.4.0", - "typescript": "~4.2.0", - "uglify-js": "^3.4.9" - }, - "homepage": "https://github.com/Azure/azure-sdk-for-js", - "repository": { - "type": "git", - "url": "https://github.com/Azure/azure-sdk-for-js.git" - }, - "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, - "files": [ - "dist/**/*.js", - "dist/**/*.js.map", - "dist/**/*.d.ts", - "dist/**/*.d.ts.map", - "esm/**/*.js", - "esm/**/*.js.map", - "esm/**/*.d.ts", - "esm/**/*.d.ts.map", - "src/**/*.ts", - "README.md", - "rollup.config.js", - "tsconfig.json", - "review/*", - "CHANGELOG.md" - ], - "scripts": { - "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", - "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js", - "prepack": "npm install && npm run build", - "pack": "npm pack 2>&1", - "extract-api": "mkdirp ./review && api-extractor run --local", - "lint": "echo skipped", - "audit": "echo skipped", - "clean": "echo skipped", - "build:node": "echo skipped", - "build:browser": "echo skipped", - "build:test": "echo skipped", - "build:samples": "echo skipped.", - "check-format": "echo skipped", - "execute:samples": "echo skipped", - "format": "echo skipped", - "test": "echo skipped", - "prebuild": "echo skipped", - "test:node": "echo skipped", - "test:browser": "echo skipped", - "unit-test": "echo skipped", - "unit-test:node": "echo skipped", - "unit-test:browser": "echo skipped", - "integration-test:browser": "echo skipped", - "integration-test:node": "echo skipped", - "integration-test": "echo skipped", - "docs": "echo skipped" - }, - "sideEffects": false, - "autoPublish": true -} diff --git a/sdk/maps/maps-geolocation/review/maps-geolocation.api.md b/sdk/maps/maps-geolocation/review/maps-geolocation.api.md deleted file mode 100644 index 4e6fc215f5e9..000000000000 --- a/sdk/maps/maps-geolocation/review/maps-geolocation.api.md +++ /dev/null @@ -1,110 +0,0 @@ -## API Report File for "@azure/maps-geolocation" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -import * as coreAuth from '@azure/core-auth'; -import * as coreClient from '@azure/core-client'; - -// @public -export interface CountryRegion { - readonly isoCode?: string; -} - -// @public -export interface ErrorAdditionalInfo { - readonly info?: Record; - readonly type?: string; -} - -// @public -export interface ErrorDetail { - readonly additionalInfo?: ErrorAdditionalInfo[]; - readonly code?: string; - readonly details?: ErrorDetail[]; - readonly message?: string; - readonly target?: string; -} - -// @public -export interface ErrorResponse { - error?: ErrorDetail; -} - -// @public -export type GeographicResourceLocation = string; - -// @public -export type Geography = string; - -// @public -export interface Geolocation { - getIPToLocationPreview(format: ResponseFormat, ip: string, options?: GeolocationGetIPToLocationPreviewOptionalParams): Promise; -} - -// @public (undocumented) -export class GeolocationClient extends GeolocationClientContext { - constructor(credentials: coreAuth.TokenCredential, options?: GeolocationClientOptionalParams); - // (undocumented) - geolocation: Geolocation; -} - -// @public (undocumented) -export class GeolocationClientContext extends coreClient.ServiceClient { - constructor(credentials: coreAuth.TokenCredential, options?: GeolocationClientOptionalParams); - // (undocumented) - apiVersion: string; - // (undocumented) - geography: Geography; - // (undocumented) - xMsClientId?: string; -} - -// @public -export interface GeolocationClientOptionalParams extends coreClient.ServiceClientOptions { - apiVersion?: string; - endpoint?: string; - geography?: Geography; - xMsClientId?: string; -} - -// @public -export interface GeolocationGetIPToLocationPreviewOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type GeolocationGetIPToLocationPreviewResponse = IpAddressToLocationResult; - -// @public -export interface IpAddressToLocationResult { - readonly countryRegion?: CountryRegion; - readonly ipAddress?: string; -} - -// @public -export const enum KnownGeographicResourceLocation { - Eu = "eu", - Us = "us" -} - -// @public -export const enum KnownGeography { - // (undocumented) - Eu = "eu", - // (undocumented) - Us = "us" -} - -// @public -export const enum KnownResponseFormat { - Json = "json" -} - -// @public -export type ResponseFormat = string; - - -// (No @packageDocumentation comment for this package) - -``` diff --git a/sdk/maps/maps-geolocation/rollup.config.js b/sdk/maps/maps-geolocation/rollup.config.js deleted file mode 100644 index 9be1955eb7f1..000000000000 --- a/sdk/maps/maps-geolocation/rollup.config.js +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import nodeResolve from "@rollup/plugin-node-resolve"; -import cjs from "@rollup/plugin-commonjs"; -import sourcemaps from "rollup-plugin-sourcemaps"; -import multiEntry from "@rollup/plugin-multi-entry"; -import json from "@rollup/plugin-json"; - -import nodeBuiltins from "builtin-modules"; - -/** - * Gets the proper configuration needed for rollup's commonJS plugin for @opentelemetry/api. - * - * NOTE: this manual configuration is only needed because OpenTelemetry uses an - * __exportStar downleveled helper function to declare its exports which confuses - * rollup's automatic discovery mechanism. - * - * @returns an object reference that can be `...`'d into your cjs() configuration. - */ -export function openTelemetryCommonJs() { - const namedExports = {}; - - for (const key of [ - "@opentelemetry/api", - "@azure/core-tracing/node_modules/@opentelemetry/api" - ]) { - namedExports[key] = [ - "SpanKind", - "TraceFlags", - "getSpan", - "setSpan", - "SpanStatusCode", - "getSpanContext", - "setSpanContext" - ]; - } - - const releasedOpenTelemetryVersions = ["0.10.2", "1.0.0-rc.0"]; - - for (const version of releasedOpenTelemetryVersions) { - namedExports[ - // working around a limitation in the rollup common.js plugin - it's not able to resolve these modules so the named exports listed above will not get applied. We have to drill down to the actual path. - `../../../common/temp/node_modules/.pnpm/@opentelemetry/api@${version}/node_modules/@opentelemetry/api/build/src/index.js` - ] = [ - "SpanKind", - "TraceFlags", - "getSpan", - "setSpan", - "StatusCode", - "CanonicalCode", - "getSpanContext", - "setSpanContext" - ]; - } - - return namedExports; -} - -// #region Warning Handler - -/** - * A function that can determine whether a rollupwarning should be ignored. If - * the function returns `true`, then the warning will not be displayed. - */ - -function ignoreNiseSinonEvalWarnings(warning) { - return ( - warning.code === "EVAL" && - warning.id && - (warning.id.includes("node_modules/nise") || - warning.id.includes("node_modules/sinon")) === true - ); -} - -function ignoreChaiCircularDependencyWarnings(warning) { - return ( - warning.code === "CIRCULAR_DEPENDENCY" && - warning.importer && warning.importer.includes("node_modules/chai") === true - ); -} - -const warningInhibitors = [ - ignoreChaiCircularDependencyWarnings, - ignoreNiseSinonEvalWarnings -]; - -/** - * Construct a warning handler for the shared rollup configuration - * that ignores certain warnings that are not relevant to testing. - */ -function makeOnWarnForTesting() { - return (warning, warn) => { - // If every inhibitor returns false (i.e. no inhibitors), then show the warning - if (warningInhibitors.every((inhib) => !inhib(warning))) { - warn(warning); - } - }; -} - -// #endregion - -function makeBrowserTestConfig() { - const config = { - input: { - include: ["dist-esm/test/**/*.spec.js"], - exclude: ["dist-esm/test/**/node/**"] - }, - output: { - file: `dist-test/index.browser.js`, - format: "umd", - sourcemap: true - }, - preserveSymlinks: false, - plugins: [ - multiEntry({ exports: false }), - nodeResolve({ - mainFields: ["module", "browser"] - }), - cjs({ - namedExports: { - // Chai's strange internal architecture makes it impossible to statically - // analyze its exports. - chai: [ - "version", - "use", - "util", - "config", - "expect", - "should", - "assert" - ], - ...openTelemetryCommonJs() - } - }), - json(), - sourcemaps() - //viz({ filename: "dist-test/browser-stats.html", sourcemap: true }) - ], - onwarn: makeOnWarnForTesting(), - // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, - // rollup started respecting the "sideEffects" field in package.json. Since - // our package.json sets "sideEffects=false", this also applies to test - // code, which causes all tests to be removed by tree-shaking. - treeshake: false - }; - - return config; -} - -const defaultConfigurationOptions = { - disableBrowserBundle: false -}; - -export function makeConfig(pkg, options) { - options = { - ...defaultConfigurationOptions, - ...(options || {}) - }; - - const baseConfig = { - // Use the package's module field if it has one - input: pkg["module"] || "dist-esm/src/index.js", - external: [ - ...nodeBuiltins, - ...Object.keys(pkg.dependencies), - ...Object.keys(pkg.devDependencies) - ], - output: { file: "dist/index.js", format: "cjs", sourcemap: true }, - preserveSymlinks: false, - plugins: [sourcemaps(), nodeResolve(), cjs()] - }; - - const config = [baseConfig]; - - if (!options.disableBrowserBundle) { - config.push(makeBrowserTestConfig()); - } - - return config; -} - -export default makeConfig(require("./package.json")); diff --git a/sdk/maps/maps-geolocation/src/geolocationClient.ts b/sdk/maps/maps-geolocation/src/geolocationClient.ts deleted file mode 100644 index 336ca08d7f8c..000000000000 --- a/sdk/maps/maps-geolocation/src/geolocationClient.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreAuth from "@azure/core-auth"; -import { GeolocationImpl } from "./operations"; -import { Geolocation } from "./operationsInterfaces"; -import { GeolocationClientContext } from "./geolocationClientContext"; -import { GeolocationClientOptionalParams } from "./models"; - -export class GeolocationClient extends GeolocationClientContext { - /** - * Initializes a new instance of the GeolocationClient class. - * @param credentials Subscription credentials which uniquely identify client subscription. - * @param options The parameter options - */ - constructor( - credentials: coreAuth.TokenCredential, - options?: GeolocationClientOptionalParams - ) { - super(credentials, options); - this.geolocation = new GeolocationImpl(this); - } - - geolocation: Geolocation; -} diff --git a/sdk/maps/maps-geolocation/src/geolocationClientContext.ts b/sdk/maps/maps-geolocation/src/geolocationClientContext.ts deleted file mode 100644 index 726b8fc617c8..000000000000 --- a/sdk/maps/maps-geolocation/src/geolocationClientContext.ts +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; -import * as coreAuth from "@azure/core-auth"; -import { Geography, GeolocationClientOptionalParams } from "./models"; - -export class GeolocationClientContext extends coreClient.ServiceClient { - geography: Geography; - xMsClientId?: string; - apiVersion: string; - - /** - * Initializes a new instance of the GeolocationClientContext class. - * @param credentials Subscription credentials which uniquely identify client subscription. - * @param options The parameter options - */ - constructor( - credentials: coreAuth.TokenCredential, - options?: GeolocationClientOptionalParams - ) { - if (credentials === undefined) { - throw new Error("'credentials' cannot be null"); - } - - // Initializing default values for options - if (!options) { - options = {}; - } - const defaults: GeolocationClientOptionalParams = { - requestContentType: "application/json; charset=utf-8", - credential: credentials - }; - - const packageDetails = `azsdk-js-maps-geolocation/1.0.0-beta.1`; - const userAgentPrefix = - options.userAgentOptions && options.userAgentOptions.userAgentPrefix - ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` - : `${packageDetails}`; - - if (!options.credentialScopes) { - options.credentialScopes = ["https://atlas.microsoft.com/.default"]; - } - const optionsWithDefaults = { - ...defaults, - ...options, - userAgentOptions: { - userAgentPrefix - }, - baseUri: options.endpoint || "https://{geography}.atlas.microsoft.com" - }; - super(optionsWithDefaults); - - // Assigning values to Constant parameters - this.geography = options.geography || "us"; - this.apiVersion = options.apiVersion || "1.0"; - } -} diff --git a/sdk/maps/maps-geolocation/src/index.ts b/sdk/maps/maps-geolocation/src/index.ts deleted file mode 100644 index 9fd9f4ff8f7e..000000000000 --- a/sdk/maps/maps-geolocation/src/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./models"; -export { GeolocationClient } from "./geolocationClient"; -export { GeolocationClientContext } from "./geolocationClientContext"; -export * from "./operationsInterfaces"; diff --git a/sdk/maps/maps-geolocation/src/models/index.ts b/sdk/maps/maps-geolocation/src/models/index.ts deleted file mode 100644 index 558b97c0cd3b..000000000000 --- a/sdk/maps/maps-geolocation/src/models/index.ts +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; - -/** This object is returned from a successful call to IP Address to country/region API */ -export interface IpAddressToLocationResult { - /** - * The object containing the country/region information. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly countryRegion?: CountryRegion; - /** - * The IP Address of the request. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly ipAddress?: string; -} - -/** The object containing the country/region information. */ -export interface CountryRegion { - /** - * The IP Address's 2-character code [(ISO 3166-1)](https://www.iso.org/iso-3166-country-codes.html) of the country or region as assigned by IANA and regional internet authorities. Please note, IP address in ranges reserved for special purpose will return Null for country/region. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly isoCode?: string; -} - -/** Common error response for all Azure Resource Manager APIs to return error details for failed operations. (This also follows the OData error response format.). */ -export interface ErrorResponse { - /** The error object. */ - error?: ErrorDetail; -} - -/** The error detail. */ -export interface ErrorDetail { - /** - * The error code. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly code?: string; - /** - * The error message. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly message?: string; - /** - * The error target. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly target?: string; - /** - * The error details. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly details?: ErrorDetail[]; - /** - * The error additional info. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly additionalInfo?: ErrorAdditionalInfo[]; -} - -/** The resource management error additional info. */ -export interface ErrorAdditionalInfo { - /** - * The additional info type. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly type?: string; - /** - * The additional info. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly info?: Record; -} - -/** Known values of {@link Geography} that the service accepts. */ -export const enum KnownGeography { - Us = "us", - Eu = "eu" -} - -/** - * Defines values for Geography. \ - * {@link KnownGeography} can be used interchangeably with Geography, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **us** \ - * **eu** - */ -export type Geography = string; - -/** Known values of {@link ResponseFormat} that the service accepts. */ -export const enum KnownResponseFormat { - /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ - Json = "json" -} - -/** - * Defines values for ResponseFormat. \ - * {@link KnownResponseFormat} can be used interchangeably with ResponseFormat, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) - */ -export type ResponseFormat = string; - -/** Known values of {@link GeographicResourceLocation} that the service accepts. */ -export const enum KnownGeographicResourceLocation { - /** Used to access an Azure Maps Creator resource in the United States */ - Us = "us", - /** Used to access an Azure Maps Creator resource in Europe */ - Eu = "eu" -} - -/** - * Defines values for GeographicResourceLocation. \ - * {@link KnownGeographicResourceLocation} can be used interchangeably with GeographicResourceLocation, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **us**: Used to access an Azure Maps Creator resource in the United States \ - * **eu**: Used to access an Azure Maps Creator resource in Europe - */ -export type GeographicResourceLocation = string; - -/** Optional parameters. */ -export interface GeolocationGetIPToLocationPreviewOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getIPToLocationPreview operation. */ -export type GeolocationGetIPToLocationPreviewResponse = IpAddressToLocationResult; - -/** Optional parameters. */ -export interface GeolocationClientOptionalParams - extends coreClient.ServiceClientOptions { - /** This parameter specifies where the Azure Maps Creator resource is located. Valid values are us and eu. */ - geography?: Geography; - /** Specifies which account is intended for usage in conjunction with the Azure AD security model. It represents a unique ID for the Azure Maps account and can be retrieved from the Azure Maps management plane Account API. To use Azure AD security in Azure Maps see the following [articles](https://aka.ms/amauthdetails) for guidance. */ - xMsClientId?: string; - /** Api Version */ - apiVersion?: string; - /** Overrides client endpoint. */ - endpoint?: string; -} diff --git a/sdk/maps/maps-geolocation/src/models/mappers.ts b/sdk/maps/maps-geolocation/src/models/mappers.ts deleted file mode 100644 index 8f71f8b6a591..000000000000 --- a/sdk/maps/maps-geolocation/src/models/mappers.ts +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; - -export const IpAddressToLocationResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "IpAddressToLocationResult", - modelProperties: { - countryRegion: { - serializedName: "countryRegion", - type: { - name: "Composite", - className: "CountryRegion" - } - }, - ipAddress: { - serializedName: "ipAddress", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const CountryRegion: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "CountryRegion", - modelProperties: { - isoCode: { - serializedName: "isoCode", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const ErrorResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorResponse", - modelProperties: { - error: { - serializedName: "error", - type: { - name: "Composite", - className: "ErrorDetail" - } - } - } - } -}; - -export const ErrorDetail: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorDetail", - modelProperties: { - code: { - serializedName: "code", - readOnly: true, - type: { - name: "String" - } - }, - message: { - serializedName: "message", - readOnly: true, - type: { - name: "String" - } - }, - target: { - serializedName: "target", - readOnly: true, - type: { - name: "String" - } - }, - details: { - serializedName: "details", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ErrorDetail" - } - } - } - }, - additionalInfo: { - serializedName: "additionalInfo", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ErrorAdditionalInfo" - } - } - } - } - } - } -}; - -export const ErrorAdditionalInfo: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorAdditionalInfo", - modelProperties: { - type: { - serializedName: "type", - readOnly: true, - type: { - name: "String" - } - }, - info: { - serializedName: "info", - readOnly: true, - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - } - } - } -}; diff --git a/sdk/maps/maps-geolocation/src/models/parameters.ts b/sdk/maps/maps-geolocation/src/models/parameters.ts deleted file mode 100644 index 8552925ef08d..000000000000 --- a/sdk/maps/maps-geolocation/src/models/parameters.ts +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { - OperationParameter, - OperationURLParameter, - OperationQueryParameter -} from "@azure/core-client"; - -export const accept: OperationParameter = { - parameterPath: "accept", - mapper: { - defaultValue: "application/json", - isConstant: true, - serializedName: "Accept", - type: { - name: "String" - } - } -}; - -export const geography: OperationURLParameter = { - parameterPath: "geography", - mapper: { - serializedName: "geography", - required: true, - type: { - name: "String" - } - } -}; - -export const xMsClientId: OperationParameter = { - parameterPath: "xMsClientId", - mapper: { - serializedName: "x-ms-client-id", - type: { - name: "String" - } - } -}; - -export const apiVersion: OperationQueryParameter = { - parameterPath: "apiVersion", - mapper: { - defaultValue: "1.0", - isConstant: true, - serializedName: "api-version", - type: { - name: "String" - } - } -}; - -export const format: OperationURLParameter = { - parameterPath: "format", - mapper: { - serializedName: "format", - required: true, - type: { - name: "String" - } - } -}; - -export const ip: OperationQueryParameter = { - parameterPath: "ip", - mapper: { - serializedName: "ip", - required: true, - type: { - name: "String" - } - } -}; diff --git a/sdk/maps/maps-geolocation/src/operations/geolocation.ts b/sdk/maps/maps-geolocation/src/operations/geolocation.ts deleted file mode 100644 index 9eaac1f1a12d..000000000000 --- a/sdk/maps/maps-geolocation/src/operations/geolocation.ts +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { Geolocation } from "../operationsInterfaces"; -import * as coreClient from "@azure/core-client"; -import * as Mappers from "../models/mappers"; -import * as Parameters from "../models/parameters"; -import { GeolocationClientContext } from "../geolocationClientContext"; -import { - ResponseFormat, - GeolocationGetIPToLocationPreviewOptionalParams, - GeolocationGetIPToLocationPreviewResponse -} from "../models"; - -/** Class representing a Geolocation. */ -export class GeolocationImpl implements Geolocation { - private readonly client: GeolocationClientContext; - - /** - * Initialize a new instance of the class Geolocation class. - * @param client Reference to the service client - */ - constructor(client: GeolocationClientContext) { - this.client = client; - } - - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * This service will return the ISO country code for the provided IP address. Developers can use this - * information to block or alter certain content based on geographical locations where the application - * is being viewed from. - * - * - * __Note:__ This service returns results from IANA and does not necessarily reflect the views of - * Microsoft Corporation. - * @param format Desired format of the response. Only `json` format is supported. - * @param ip The IP address. Both IPv4 and IPv6 are allowed. - * @param options The options parameters. - */ - getIPToLocationPreview( - format: ResponseFormat, - ip: string, - options?: GeolocationGetIPToLocationPreviewOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, ip, options }, - getIPToLocationPreviewOperationSpec - ); - } -} -// Operation Specifications -const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); - -const getIPToLocationPreviewOperationSpec: coreClient.OperationSpec = { - path: "/geolocation/ip/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.IpAddressToLocationResult - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion, Parameters.ip], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; diff --git a/sdk/maps/maps-geolocation/src/operations/index.ts b/sdk/maps/maps-geolocation/src/operations/index.ts deleted file mode 100644 index 4dccaaa8afdc..000000000000 --- a/sdk/maps/maps-geolocation/src/operations/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./geolocation"; diff --git a/sdk/maps/maps-geolocation/src/operationsInterfaces/geolocation.ts b/sdk/maps/maps-geolocation/src/operationsInterfaces/geolocation.ts deleted file mode 100644 index acbc4fdb1316..000000000000 --- a/sdk/maps/maps-geolocation/src/operationsInterfaces/geolocation.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { - ResponseFormat, - GeolocationGetIPToLocationPreviewOptionalParams, - GeolocationGetIPToLocationPreviewResponse -} from "../models"; - -/** Interface representing a Geolocation. */ -export interface Geolocation { - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * This service will return the ISO country code for the provided IP address. Developers can use this - * information to block or alter certain content based on geographical locations where the application - * is being viewed from. - * - * - * __Note:__ This service returns results from IANA and does not necessarily reflect the views of - * Microsoft Corporation. - * @param format Desired format of the response. Only `json` format is supported. - * @param ip The IP address. Both IPv4 and IPv6 are allowed. - * @param options The options parameters. - */ - getIPToLocationPreview( - format: ResponseFormat, - ip: string, - options?: GeolocationGetIPToLocationPreviewOptionalParams - ): Promise; -} diff --git a/sdk/maps/maps-geolocation/src/operationsInterfaces/index.ts b/sdk/maps/maps-geolocation/src/operationsInterfaces/index.ts deleted file mode 100644 index 4dccaaa8afdc..000000000000 --- a/sdk/maps/maps-geolocation/src/operationsInterfaces/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./geolocation"; diff --git a/sdk/maps/maps-geolocation/tsconfig.json b/sdk/maps/maps-geolocation/tsconfig.json deleted file mode 100644 index 0ec8659c8e83..000000000000 --- a/sdk/maps/maps-geolocation/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "module": "es6", - "moduleResolution": "node", - "strict": true, - "target": "es6", - "sourceMap": true, - "declarationMap": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "preserveConstEnums": true, - "lib": ["es6", "dom"], - "declaration": true, - "outDir": "./esm", - "importHelpers": true - }, - "include": ["./src/**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/sdk/maps/maps-render/LICENSE.txt b/sdk/maps/maps-render/LICENSE.txt deleted file mode 100644 index ccb63b166732..000000000000 --- a/sdk/maps/maps-render/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2021 Microsoft - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/sdk/maps/maps-render/README.md b/sdk/maps/maps-render/README.md deleted file mode 100644 index dd2805820295..000000000000 --- a/sdk/maps/maps-render/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# Azure Render client library for JavaScript - -This package contains an isomorphic SDK (runs both in Node.js and in browsers) for Azure Render client. - -Azure Maps Render REST APIs - -[Source code](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-render) | -[Package (NPM)](https://www.npmjs.com/package/@azure/maps-render) | -[API reference documentation](https://docs.microsoft.com/javascript/api/@azure/maps-render) | -[Samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-render/samples) - -## Getting started - -### Currently supported environments - -- [LTS versions of Node.js](https://nodejs.org/about/releases/) -- Latest versions of Safari, Chrome, Edge and Firefox. - -### Prerequisites - -- An [Azure subscription][azure_sub]. - -### Install the `@azure/maps-render` package - -Install the Azure Render client library for JavaScript with `npm`: - -```bash -npm install @azure/maps-render -``` - -### Create and authenticate a `RenderClient` - -To create a client object to access the Azure Render API, you will need the `endpoint` of your Azure Render resource and a `credential`. The Azure Render client can use Azure Active Directory credentials to authenticate. -You can find the endpoint for your Azure Render resource in the [Azure Portal][azure_portal]. - -#### Using an Azure Active Directory Credential - -You can authenticate with Azure Active Directory using the [Azure Identity library][azure_identity]. To use the [DefaultAzureCredential][defaultazurecredential] provider shown below, or other credential providers provided with the Azure SDK, please install the `@azure/identity` package: - -```bash -npm install @azure/identity -``` - -You will also need to register a new AAD application and grant access to Azure Render by assigning the suitable role to your service principal (note: roles such as `"Owner"` will not grant the necessary permissions). -Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`. - -```javascript -const { RenderClient } = require("@azure/maps-render"); -const { DefaultAzureCredential } = require("@azure/identity"); -const client = new RenderClient("", new DefaultAzureCredential()); -``` - -## Key concepts - -### RenderClient - -`RenderClient` is the primary interface for developers using the Azure Render client library. Explore the methods on this client object to understand the different features of the Azure Render service that you can access. - -## Troubleshooting - -### Logging - -Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: - -```javascript -import { setLogLevel } from "@azure/logger"; -setLogLevel("info"); -``` - -For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger). - -## Next steps - -Please take a look at the [samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-render/samples) directory for detailed examples on how to use this library. - -## Contributing - -If you'd like to contribute to this library, please read the [contributing guide](https://github.com/Azure/azure-sdk-for-js/blob/master/CONTRIBUTING.md) to learn more about how to build and test the code. - -## Related projects - -- [Microsoft Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) - -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fmaps%2Fmaps-render%2FREADME.png) - -[azure_cli]: https://docs.microsoft.com/cli/azure -[azure_sub]: https://azure.microsoft.com/free/ -[azure_sub]: https://azure.microsoft.com/free/ -[azure_portal]: https://portal.azure.com -[azure_identity]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity -[defaultazurecredential]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity#defaultazurecredential diff --git a/sdk/maps/maps-render/api-extractor.json b/sdk/maps/maps-render/api-extractor.json deleted file mode 100644 index 5fb5b21b56f2..000000000000 --- a/sdk/maps/maps-render/api-extractor.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", - "mainEntryPointFilePath": "./esm/index.d.ts", - "docModel": { "enabled": true }, - "apiReport": { "enabled": true, "reportFolder": "./review" }, - "dtsRollup": { - "enabled": true, - "untrimmedFilePath": "", - "publicTrimmedFilePath": "./esm/index.d.ts" - }, - "messages": { - "tsdocMessageReporting": { "default": { "logLevel": "none" } }, - "extractorMessageReporting": { - "ae-missing-release-tag": { "logLevel": "none" }, - "ae-unresolved-link": { "logLevel": "none" } - } - } -} diff --git a/sdk/maps/maps-render/package.json b/sdk/maps/maps-render/package.json deleted file mode 100644 index dc3145b55e41..000000000000 --- a/sdk/maps/maps-render/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "@azure/maps-render", - "sdk-type": "client", - "author": "Microsoft Corporation", - "description": "A generated SDK for RenderClient.", - "version": "1.0.0-beta.1", - "engines": { "node": ">=12.0.0" }, - "dependencies": { - "@azure/core-client": "^1.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-rest-pipeline": "^1.1.0", - "tslib": "^2.2.0" - }, - "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], - "license": "MIT", - "main": "./dist/index.js", - "module": "./esm/index.js", - "types": "./esm/index.d.ts", - "devDependencies": { - "@microsoft/api-extractor": "7.7.11", - "@rollup/plugin-commonjs": "11.0.2", - "@rollup/plugin-json": "^4.0.0", - "@rollup/plugin-multi-entry": "^3.0.0", - "@rollup/plugin-node-resolve": "^8.0.0", - "mkdirp": "^1.0.4", - "rollup": "^1.16.3", - "rollup-plugin-sourcemaps": "^0.4.2", - "rollup-plugin-node-resolve": "^3.4.0", - "typescript": "~4.2.0", - "uglify-js": "^3.4.9" - }, - "homepage": "https://github.com/Azure/azure-sdk-for-js", - "repository": { - "type": "git", - "url": "https://github.com/Azure/azure-sdk-for-js.git" - }, - "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, - "files": [ - "dist/**/*.js", - "dist/**/*.js.map", - "dist/**/*.d.ts", - "dist/**/*.d.ts.map", - "esm/**/*.js", - "esm/**/*.js.map", - "esm/**/*.d.ts", - "esm/**/*.d.ts.map", - "src/**/*.ts", - "README.md", - "rollup.config.js", - "tsconfig.json", - "review/*", - "CHANGELOG.md" - ], - "scripts": { - "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", - "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js", - "prepack": "npm install && npm run build", - "pack": "npm pack 2>&1", - "extract-api": "mkdirp ./review && api-extractor run --local", - "lint": "echo skipped", - "audit": "echo skipped", - "clean": "echo skipped", - "build:node": "echo skipped", - "build:browser": "echo skipped", - "build:test": "echo skipped", - "build:samples": "echo skipped.", - "check-format": "echo skipped", - "execute:samples": "echo skipped", - "format": "echo skipped", - "test": "echo skipped", - "prebuild": "echo skipped", - "test:node": "echo skipped", - "test:browser": "echo skipped", - "unit-test": "echo skipped", - "unit-test:node": "echo skipped", - "unit-test:browser": "echo skipped", - "integration-test:browser": "echo skipped", - "integration-test:node": "echo skipped", - "integration-test": "echo skipped", - "docs": "echo skipped" - }, - "sideEffects": false, - "autoPublish": true -} diff --git a/sdk/maps/maps-render/review/maps-render.api.md b/sdk/maps/maps-render/review/maps-render.api.md deleted file mode 100644 index 0ffe46397a10..000000000000 --- a/sdk/maps/maps-render/review/maps-render.api.md +++ /dev/null @@ -1,378 +0,0 @@ -## API Report File for "@azure/maps-render" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -import * as coreAuth from '@azure/core-auth'; -import * as coreClient from '@azure/core-client'; - -// @public -export interface ErrorAdditionalInfo { - readonly info?: Record; - readonly type?: string; -} - -// @public -export interface ErrorDetail { - readonly additionalInfo?: ErrorAdditionalInfo[]; - readonly code?: string; - readonly details?: ErrorDetail[]; - readonly message?: string; - readonly target?: string; -} - -// @public -export interface ErrorResponse { - error?: ErrorDetail; -} - -// @public -export type GeographicResourceLocation = string; - -// @public -export type Geography = string; - -// @public -export interface GetCopyrightCaptionResult { - readonly copyrightsCaption?: string; - readonly formatVersion?: string; -} - -// @public -export interface GetCopyrightForTileResult { - readonly formatVersion?: string; - readonly generalCopyrights?: string[]; - readonly regions?: RegionCopyrights[]; -} - -// @public -export interface GetCopyrightForWorldResult { - readonly formatVersion?: string; - readonly generalCopyrights?: string[]; - readonly regions?: RegionCopyrights[]; -} - -// @public -export interface GetCopyrightFromBoundingBoxResult { - readonly formatVersion?: string; - readonly generalCopyrights?: string[]; - readonly regions?: RegionCopyrights[]; -} - -// @public -export type IncludeText = string; - -// @public -export const enum KnownGeographicResourceLocation { - Eu = "eu", - Us = "us" -} - -// @public -export const enum KnownGeography { - // (undocumented) - Eu = "eu", - // (undocumented) - Us = "us" -} - -// @public -export const enum KnownIncludeText { - No = "no", - Yes = "yes" -} - -// @public -export const enum KnownMapImageryStyle { - Satellite = "satellite" -} - -// @public -export const enum KnownMapImageStyle { - Dark = "dark", - Main = "main" -} - -// @public -export const enum KnownMapTileLayer { - Basic = "basic", - Hybrid = "hybrid", - Labels = "labels", - Terra = "terra" -} - -// @public -export const enum KnownMapTileSize { - FiveHundredTwelve = "512", - TwoHundredFiftySix = "256" -} - -// @public -export const enum KnownMapTileStyle { - Dark = "dark", - Main = "main", - ShadedRelief = "shaded_relief" -} - -// @public -export const enum KnownRasterTileFormat { - Png = "png" -} - -// @public -export const enum KnownStaticMapLayer { - Basic = "basic", - Hybrid = "hybrid", - Labels = "labels" -} - -// @public -export const enum KnownTextFormat { - Json = "json", - Xml = "xml" -} - -// @public -export const enum KnownTileFormat { - Pbf = "pbf", - Png = "png" -} - -// @public -export const enum KnownTilesetID { - MicrosoftBase = "microsoft.base", - MicrosoftBaseDarkgrey = "microsoft.base.darkgrey", - MicrosoftBaseHybrid = "microsoft.base.hybrid", - MicrosoftBaseHybridRoad = "microsoft.base.hybrid.road", - MicrosoftBaseLabels = "microsoft.base.labels", - MicrosoftBaseLabelsRoad = "microsoft.base.labels.road", - MicrosoftBaseRoad = "microsoft.base.road", - MicrosoftDem = "microsoft.dem", - MicrosoftImagery = "microsoft.imagery", - MicrosoftTerraMain = "microsoft.terra.main", - MicrosoftWeatherInfraredMain = "microsoft.weather.infrared.main", - MicrosoftWeatherRadarMain = "microsoft.weather.radar.main" -} - -// @public -export const enum KnownTileSize { - FiveHundredTwelve = "512", - TwoHundredFiftySix = "256" -} - -// @public -export type MapImageryStyle = string; - -// @public -export type MapImageStyle = string; - -// @public -export type MapTileLayer = string; - -// @public -export type MapTileSize = string; - -// @public -export type MapTileStyle = string; - -// @public -export type RasterTileFormat = string; - -// @public (undocumented) -export interface RegionCopyrights { - readonly copyrights?: string[]; - readonly country?: RegionCopyrightsCountry; -} - -// @public -export interface RegionCopyrightsCountry { - readonly iso3?: string; - readonly label?: string; -} - -// @public -export interface Render { - getCopyrightCaption(format: TextFormat, options?: RenderGetCopyrightCaptionOptionalParams): Promise; - getCopyrightForTile(format: TextFormat, zoom: number, xTileIndex: number, yTileIndex: number, options?: RenderGetCopyrightForTileOptionalParams): Promise; - getCopyrightForWorld(format: TextFormat, options?: RenderGetCopyrightForWorldOptionalParams): Promise; - getCopyrightFromBoundingBox(format: TextFormat, mincoordinates: string, maxcoordinates: string, options?: RenderGetCopyrightFromBoundingBoxOptionalParams): Promise; - getMapImageryTile(format: RasterTileFormat, style: MapImageryStyle, zoom: number, xTileIndex: number, yTileIndex: number, options?: RenderGetMapImageryTileOptionalParams): Promise; - getMapStateTilePreview(zoom: number, xTileIndex: number, yTileIndex: number, statesetId: string, options?: RenderGetMapStateTilePreviewOptionalParams): Promise; - getMapStaticImage(format: RasterTileFormat, options?: RenderGetMapStaticImageOptionalParams): Promise; - getMapTile(format: TileFormat, layer: MapTileLayer, style: MapTileStyle, zoom: number, xTileIndex: number, yTileIndex: number, options?: RenderGetMapTileOptionalParams): Promise; -} - -// @public (undocumented) -export class RenderClient extends RenderClientContext { - constructor(credentials: coreAuth.TokenCredential, options?: RenderClientOptionalParams); - // (undocumented) - render: Render; - // (undocumented) - renderV2: RenderV2; -} - -// @public (undocumented) -export class RenderClientContext extends coreClient.ServiceClient { - constructor(credentials: coreAuth.TokenCredential, options?: RenderClientOptionalParams); - // (undocumented) - geography: Geography; - // (undocumented) - xMsClientId?: string; -} - -// @public -export interface RenderClientOptionalParams extends coreClient.ServiceClientOptions { - endpoint?: string; - geography?: Geography; - xMsClientId?: string; -} - -// @public -export interface RenderGetCopyrightCaptionOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type RenderGetCopyrightCaptionResponse = GetCopyrightCaptionResult; - -// @public -export interface RenderGetCopyrightForTileOptionalParams extends coreClient.OperationOptions { - text?: IncludeText; -} - -// @public -export type RenderGetCopyrightForTileResponse = GetCopyrightForTileResult; - -// @public -export interface RenderGetCopyrightForWorldOptionalParams extends coreClient.OperationOptions { - text?: IncludeText; -} - -// @public -export type RenderGetCopyrightForWorldResponse = GetCopyrightForWorldResult; - -// @public -export interface RenderGetCopyrightFromBoundingBoxOptionalParams extends coreClient.OperationOptions { - text?: IncludeText; -} - -// @public -export type RenderGetCopyrightFromBoundingBoxResponse = GetCopyrightFromBoundingBoxResult; - -// @public -export interface RenderGetMapImageryTileHeaders { - contentType?: string; -} - -// @public -export interface RenderGetMapImageryTileOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type RenderGetMapImageryTileResponse = RenderGetMapImageryTileHeaders & { - blobBody?: Promise; - readableStreamBody?: NodeJS.ReadableStream; -}; - -// @public -export interface RenderGetMapStateTilePreviewHeaders { - contentType?: string; -} - -// @public -export interface RenderGetMapStateTilePreviewOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type RenderGetMapStateTilePreviewResponse = RenderGetMapStateTilePreviewHeaders & { - blobBody?: Promise; - readableStreamBody?: NodeJS.ReadableStream; -}; - -// @public -export interface RenderGetMapStaticImageHeaders { - contentType?: string; -} - -// @public -export interface RenderGetMapStaticImageOptionalParams extends coreClient.OperationOptions { - bbox?: string; - center?: string; - height?: number; - language?: string; - layer?: StaticMapLayer; - path?: string[]; - pins?: string[]; - style?: MapImageStyle; - view?: string; - width?: number; - zoom?: number; -} - -// @public -export type RenderGetMapStaticImageResponse = RenderGetMapStaticImageHeaders & { - blobBody?: Promise; - readableStreamBody?: NodeJS.ReadableStream; -}; - -// @public -export interface RenderGetMapTileHeaders { - contentType?: string; -} - -// @public -export interface RenderGetMapTileOptionalParams extends coreClient.OperationOptions { - language?: string; - tileSize?: MapTileSize; - view?: string; -} - -// @public -export type RenderGetMapTileResponse = RenderGetMapTileHeaders & { - blobBody?: Promise; - readableStreamBody?: NodeJS.ReadableStream; -}; - -// @public -export interface RenderV2 { - getMapTilePreview(tilesetId: TilesetID, zoom: number, xTileIndex: number, yTileIndex: number, options?: RenderV2GetMapTilePreviewOptionalParams): Promise; -} - -// @public -export interface RenderV2GetMapTilePreviewHeaders { - contentType?: string; -} - -// @public -export interface RenderV2GetMapTilePreviewOptionalParams extends coreClient.OperationOptions { - language?: string; - tileSize?: TileSize; - timeStamp?: string; - view?: string; -} - -// @public -export type RenderV2GetMapTilePreviewResponse = RenderV2GetMapTilePreviewHeaders & { - blobBody?: Promise; - readableStreamBody?: NodeJS.ReadableStream; -}; - -// @public -export type StaticMapLayer = string; - -// @public -export type TextFormat = string; - -// @public -export type TileFormat = string; - -// @public -export type TilesetID = string; - -// @public -export type TileSize = string; - - -// (No @packageDocumentation comment for this package) - -``` diff --git a/sdk/maps/maps-render/rollup.config.js b/sdk/maps/maps-render/rollup.config.js deleted file mode 100644 index 9be1955eb7f1..000000000000 --- a/sdk/maps/maps-render/rollup.config.js +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import nodeResolve from "@rollup/plugin-node-resolve"; -import cjs from "@rollup/plugin-commonjs"; -import sourcemaps from "rollup-plugin-sourcemaps"; -import multiEntry from "@rollup/plugin-multi-entry"; -import json from "@rollup/plugin-json"; - -import nodeBuiltins from "builtin-modules"; - -/** - * Gets the proper configuration needed for rollup's commonJS plugin for @opentelemetry/api. - * - * NOTE: this manual configuration is only needed because OpenTelemetry uses an - * __exportStar downleveled helper function to declare its exports which confuses - * rollup's automatic discovery mechanism. - * - * @returns an object reference that can be `...`'d into your cjs() configuration. - */ -export function openTelemetryCommonJs() { - const namedExports = {}; - - for (const key of [ - "@opentelemetry/api", - "@azure/core-tracing/node_modules/@opentelemetry/api" - ]) { - namedExports[key] = [ - "SpanKind", - "TraceFlags", - "getSpan", - "setSpan", - "SpanStatusCode", - "getSpanContext", - "setSpanContext" - ]; - } - - const releasedOpenTelemetryVersions = ["0.10.2", "1.0.0-rc.0"]; - - for (const version of releasedOpenTelemetryVersions) { - namedExports[ - // working around a limitation in the rollup common.js plugin - it's not able to resolve these modules so the named exports listed above will not get applied. We have to drill down to the actual path. - `../../../common/temp/node_modules/.pnpm/@opentelemetry/api@${version}/node_modules/@opentelemetry/api/build/src/index.js` - ] = [ - "SpanKind", - "TraceFlags", - "getSpan", - "setSpan", - "StatusCode", - "CanonicalCode", - "getSpanContext", - "setSpanContext" - ]; - } - - return namedExports; -} - -// #region Warning Handler - -/** - * A function that can determine whether a rollupwarning should be ignored. If - * the function returns `true`, then the warning will not be displayed. - */ - -function ignoreNiseSinonEvalWarnings(warning) { - return ( - warning.code === "EVAL" && - warning.id && - (warning.id.includes("node_modules/nise") || - warning.id.includes("node_modules/sinon")) === true - ); -} - -function ignoreChaiCircularDependencyWarnings(warning) { - return ( - warning.code === "CIRCULAR_DEPENDENCY" && - warning.importer && warning.importer.includes("node_modules/chai") === true - ); -} - -const warningInhibitors = [ - ignoreChaiCircularDependencyWarnings, - ignoreNiseSinonEvalWarnings -]; - -/** - * Construct a warning handler for the shared rollup configuration - * that ignores certain warnings that are not relevant to testing. - */ -function makeOnWarnForTesting() { - return (warning, warn) => { - // If every inhibitor returns false (i.e. no inhibitors), then show the warning - if (warningInhibitors.every((inhib) => !inhib(warning))) { - warn(warning); - } - }; -} - -// #endregion - -function makeBrowserTestConfig() { - const config = { - input: { - include: ["dist-esm/test/**/*.spec.js"], - exclude: ["dist-esm/test/**/node/**"] - }, - output: { - file: `dist-test/index.browser.js`, - format: "umd", - sourcemap: true - }, - preserveSymlinks: false, - plugins: [ - multiEntry({ exports: false }), - nodeResolve({ - mainFields: ["module", "browser"] - }), - cjs({ - namedExports: { - // Chai's strange internal architecture makes it impossible to statically - // analyze its exports. - chai: [ - "version", - "use", - "util", - "config", - "expect", - "should", - "assert" - ], - ...openTelemetryCommonJs() - } - }), - json(), - sourcemaps() - //viz({ filename: "dist-test/browser-stats.html", sourcemap: true }) - ], - onwarn: makeOnWarnForTesting(), - // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, - // rollup started respecting the "sideEffects" field in package.json. Since - // our package.json sets "sideEffects=false", this also applies to test - // code, which causes all tests to be removed by tree-shaking. - treeshake: false - }; - - return config; -} - -const defaultConfigurationOptions = { - disableBrowserBundle: false -}; - -export function makeConfig(pkg, options) { - options = { - ...defaultConfigurationOptions, - ...(options || {}) - }; - - const baseConfig = { - // Use the package's module field if it has one - input: pkg["module"] || "dist-esm/src/index.js", - external: [ - ...nodeBuiltins, - ...Object.keys(pkg.dependencies), - ...Object.keys(pkg.devDependencies) - ], - output: { file: "dist/index.js", format: "cjs", sourcemap: true }, - preserveSymlinks: false, - plugins: [sourcemaps(), nodeResolve(), cjs()] - }; - - const config = [baseConfig]; - - if (!options.disableBrowserBundle) { - config.push(makeBrowserTestConfig()); - } - - return config; -} - -export default makeConfig(require("./package.json")); diff --git a/sdk/maps/maps-render/src/index.ts b/sdk/maps/maps-render/src/index.ts deleted file mode 100644 index 9bf2302a0f71..000000000000 --- a/sdk/maps/maps-render/src/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./models"; -export { RenderClient } from "./renderClient"; -export { RenderClientContext } from "./renderClientContext"; -export * from "./operationsInterfaces"; diff --git a/sdk/maps/maps-render/src/models/index.ts b/sdk/maps/maps-render/src/models/index.ts deleted file mode 100644 index d32cd3c74218..000000000000 --- a/sdk/maps/maps-render/src/models/index.ts +++ /dev/null @@ -1,1041 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; - -/** Common error response for all Azure Resource Manager APIs to return error details for failed operations. (This also follows the OData error response format.). */ -export interface ErrorResponse { - /** The error object. */ - error?: ErrorDetail; -} - -/** The error detail. */ -export interface ErrorDetail { - /** - * The error code. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly code?: string; - /** - * The error message. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly message?: string; - /** - * The error target. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly target?: string; - /** - * The error details. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly details?: ErrorDetail[]; - /** - * The error additional info. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly additionalInfo?: ErrorAdditionalInfo[]; -} - -/** The resource management error additional info. */ -export interface ErrorAdditionalInfo { - /** - * The additional info type. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly type?: string; - /** - * The additional info. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly info?: Record; -} - -/** This object is returned from a successful Get Copyright Caption call */ -export interface GetCopyrightCaptionResult { - /** - * Format Version property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly formatVersion?: string; - /** - * Copyrights Caption property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly copyrightsCaption?: string; -} - -/** This object is returned from a successful Get Copyright From Bounding Box call */ -export interface GetCopyrightFromBoundingBoxResult { - /** - * Format Version property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly formatVersion?: string; - /** - * General Copyrights array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly generalCopyrights?: string[]; - /** - * Regions array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly regions?: RegionCopyrights[]; -} - -export interface RegionCopyrights { - /** - * Copyrights array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly copyrights?: string[]; - /** - * Country property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly country?: RegionCopyrightsCountry; -} - -/** Country property */ -export interface RegionCopyrightsCountry { - /** - * ISO3 property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly iso3?: string; - /** - * Label property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly label?: string; -} - -/** This object is returned from a successful Get Copyright For Tile call */ -export interface GetCopyrightForTileResult { - /** - * Format Version property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly formatVersion?: string; - /** - * General Copyrights array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly generalCopyrights?: string[]; - /** - * Regions array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly regions?: RegionCopyrights[]; -} - -/** This object is returned from a successful Get Copyright For World call */ -export interface GetCopyrightForWorldResult { - /** - * Format Version property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly formatVersion?: string; - /** - * General Copyrights array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly generalCopyrights?: string[]; - /** - * Regions array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly regions?: RegionCopyrights[]; -} - -/** Defines headers for Render_getMapStaticImage operation. */ -export interface RenderGetMapStaticImageHeaders { - /** The content-type for the response. */ - contentType?: string; -} - -/** Defines headers for Render_getMapTile operation. */ -export interface RenderGetMapTileHeaders { - /** The content-type for the response. */ - contentType?: string; -} - -/** Defines headers for Render_getMapStateTilePreview operation. */ -export interface RenderGetMapStateTilePreviewHeaders { - /** The content-type for the response. */ - contentType?: string; -} - -/** Defines headers for Render_getMapImageryTile operation. */ -export interface RenderGetMapImageryTileHeaders { - /** The content-type for the response. */ - contentType?: string; -} - -/** Defines headers for RenderV2_getMapTilePreview operation. */ -export interface RenderV2GetMapTilePreviewHeaders { - /** The content-type for the response. */ - contentType?: string; -} - -/** Known values of {@link Geography} that the service accepts. */ -export const enum KnownGeography { - Us = "us", - Eu = "eu" -} - -/** - * Defines values for Geography. \ - * {@link KnownGeography} can be used interchangeably with Geography, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **us** \ - * **eu** - */ -export type Geography = string; - -/** Known values of {@link RasterTileFormat} that the service accepts. */ -export const enum KnownRasterTileFormat { - /** An image in the png format. Supports zoom levels 0 through 18. */ - Png = "png" -} - -/** - * Defines values for RasterTileFormat. \ - * {@link KnownRasterTileFormat} can be used interchangeably with RasterTileFormat, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **png**: An image in the png format. Supports zoom levels 0 through 18. - */ -export type RasterTileFormat = string; - -/** Known values of {@link StaticMapLayer} that the service accepts. */ -export const enum KnownStaticMapLayer { - /** Returns an image containing all map features including polygons, borders, roads and labels. */ - Basic = "basic", - /** Returns an image containing borders, roads, and labels, and can be overlaid on other tiles (such as satellite imagery) to produce hybrid tiles. */ - Hybrid = "hybrid", - /** Returns an image of just the map's label information. */ - Labels = "labels" -} - -/** - * Defines values for StaticMapLayer. \ - * {@link KnownStaticMapLayer} can be used interchangeably with StaticMapLayer, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **basic**: Returns an image containing all map features including polygons, borders, roads and labels. \ - * **hybrid**: Returns an image containing borders, roads, and labels, and can be overlaid on other tiles (such as satellite imagery) to produce hybrid tiles. \ - * **labels**: Returns an image of just the map's label information. - */ -export type StaticMapLayer = string; - -/** Known values of {@link MapImageStyle} that the service accepts. */ -export const enum KnownMapImageStyle { - /** Azure Maps main style */ - Main = "main", - /** Dark grey version of the Azure Maps main style */ - Dark = "dark" -} - -/** - * Defines values for MapImageStyle. \ - * {@link KnownMapImageStyle} can be used interchangeably with MapImageStyle, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **main**: Azure Maps main style \ - * **dark**: Dark grey version of the Azure Maps main style - */ -export type MapImageStyle = string; - -/** Known values of {@link TileFormat} that the service accepts. */ -export const enum KnownTileFormat { - /** An image in the png format. Supports zoom levels 0 through 18. */ - Png = "png", - /** Vector graphic in the pbf format. Supports zoom levels 0 through 22. */ - Pbf = "pbf" -} - -/** - * Defines values for TileFormat. \ - * {@link KnownTileFormat} can be used interchangeably with TileFormat, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **png**: An image in the png format. Supports zoom levels 0 through 18. \ - * **pbf**: Vector graphic in the pbf format. Supports zoom levels 0 through 22. - */ -export type TileFormat = string; - -/** Known values of {@link MapTileLayer} that the service accepts. */ -export const enum KnownMapTileLayer { - /** Returns a tile containing all map features including polygons, borders, roads and labels. */ - Basic = "basic", - /** Returns a tile containing borders, roads, and labels, and can be overlaid on other tiles (such as satellite imagery) to produce hybrid tiles. */ - Hybrid = "hybrid", - /** Returns a tile of just the map's label information. */ - Labels = "labels", - /** Map canvas complete with shaded relief tiles. Zoom levels 0-6 (inclusive) are supported. Png is the only supported TileFormat and only available MapTileSize is 512. */ - Terra = "terra" -} - -/** - * Defines values for MapTileLayer. \ - * {@link KnownMapTileLayer} can be used interchangeably with MapTileLayer, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **basic**: Returns a tile containing all map features including polygons, borders, roads and labels. \ - * **hybrid**: Returns a tile containing borders, roads, and labels, and can be overlaid on other tiles (such as satellite imagery) to produce hybrid tiles. \ - * **labels**: Returns a tile of just the map's label information. \ - * **terra**: Map canvas complete with shaded relief tiles. Zoom levels 0-6 (inclusive) are supported. Png is the only supported TileFormat and only available MapTileSize is 512. - */ -export type MapTileLayer = string; - -/** Known values of {@link MapTileStyle} that the service accepts. */ -export const enum KnownMapTileStyle { - /** Azure Maps main style */ - Main = "main", - /** Dark grey version of the Azure Maps main style. PNG is the only supported TileFormat. */ - Dark = "dark", - /** Azure Maps main style completed with shaded relief. Supported by Layer terra. */ - ShadedRelief = "shaded_relief" -} - -/** - * Defines values for MapTileStyle. \ - * {@link KnownMapTileStyle} can be used interchangeably with MapTileStyle, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **main**: Azure Maps main style \ - * **dark**: Dark grey version of the Azure Maps main style. PNG is the only supported TileFormat. \ - * **shaded_relief**: Azure Maps main style completed with shaded relief. Supported by Layer terra. - */ -export type MapTileStyle = string; - -/** Known values of {@link MapTileSize} that the service accepts. */ -export const enum KnownMapTileSize { - /** Return a 256 by 256 pixel tile. */ - TwoHundredFiftySix = "256", - /** Return a 512 by 512 pixel tile. */ - FiveHundredTwelve = "512" -} - -/** - * Defines values for MapTileSize. \ - * {@link KnownMapTileSize} can be used interchangeably with MapTileSize, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **256**: Return a 256 by 256 pixel tile. \ - * **512**: Return a 512 by 512 pixel tile. - */ -export type MapTileSize = string; - -/** Known values of {@link TextFormat} that the service accepts. */ -export const enum KnownTextFormat { - /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ - Json = "json", - /** [The Extensible Markup Language](https://www.w3.org/TR/xml/) */ - Xml = "xml" -} - -/** - * Defines values for TextFormat. \ - * {@link KnownTextFormat} can be used interchangeably with TextFormat, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) \ - * **xml**: [The Extensible Markup Language](https:\/\/www.w3.org\/TR\/xml\/) - */ -export type TextFormat = string; - -/** Known values of {@link MapImageryStyle} that the service accepts. */ -export const enum KnownMapImageryStyle { - /** Satellite imagery */ - Satellite = "satellite" -} - -/** - * Defines values for MapImageryStyle. \ - * {@link KnownMapImageryStyle} can be used interchangeably with MapImageryStyle, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **satellite**: Satellite imagery - */ -export type MapImageryStyle = string; - -/** Known values of {@link IncludeText} that the service accepts. */ -export const enum KnownIncludeText { - /** Include all textual data in response. */ - Yes = "yes", - /** Exclude textual data from response. Only images and country names will be in response. */ - No = "no" -} - -/** - * Defines values for IncludeText. \ - * {@link KnownIncludeText} can be used interchangeably with IncludeText, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **yes**: Include all textual data in response. \ - * **no**: Exclude textual data from response. Only images and country names will be in response. - */ -export type IncludeText = string; - -/** Known values of {@link TilesetID} that the service accepts. */ -export const enum KnownTilesetID { - /** - * A base map is a standard map that displays roads, natural and artificial features along with the labels for those features in a vector tile.
- * - * Supports zoom levels 0 through 22. Format: vector (pbf). - */ - MicrosoftBase = "microsoft.base", - /** - * Displays labels for roads, natural and artificial features in a vector tile.
- * - * Supports zoom levels 0 through 22. Format: vector (pbf). - */ - MicrosoftBaseLabels = "microsoft.base.labels", - /** - * Displays road, boundary and label data in a vector tile.
- * - * Supports zoom levels 0 through 22. Format: vector (pbf). - */ - MicrosoftBaseHybrid = "microsoft.base.hybrid", - /** - * Shaded relief and terra layers.
- * - * Supports zoom levels 0 through 6. Format: raster (png). - */ - MicrosoftTerraMain = "microsoft.terra.main", - /** - * All layers with our main style.
- * - * Supports zoom levels 0 through 22. Format: raster (png). - */ - MicrosoftBaseRoad = "microsoft.base.road", - /** - * All layers with our dark grey style.
- * - * Supports zoom levels 0 through 22. Format: raster (png). - */ - MicrosoftBaseDarkgrey = "microsoft.base.darkgrey", - /** - * Label data in our main style.
- * - * Supports zoom levels 0 through 22. Format: raster (png). - */ - MicrosoftBaseLabelsRoad = "microsoft.base.labels.road", - /** - * Road, boundary and label data in our main style.
- * - * Supports zoom levels 0 through 22. Format: raster (png). - */ - MicrosoftBaseHybridRoad = "microsoft.base.hybrid.road", - /** - * A combination of satellite and aerial imagery. Only available in S1 pricing SKU.
- * - * Supports zoom levels 1 through 19. Format: raster (jpeg). - */ - MicrosoftImagery = "microsoft.imagery", - /** - * Weather radar tiles. Latest weather radar images including areas of rain, snow, ice and mixed conditions. Please see [coverage information](https://aka.ms/AzureMapsWeatherCoverage) for Azure Maps Weather service. To learn more about the Radar data, please see [Weather concepts](https://aka.ms/AzureMapsWeatherConcepts).
- * - * Supports zoom levels 0 through 15. Format: raster (png). - */ - MicrosoftWeatherRadarMain = "microsoft.weather.radar.main", - /** - * Weather infrared tiles. Latest Infrared Satellite images shows clouds by their temperature. Please see [coverage information](https://aka.ms/AzureMapsWeatherCoverage) for Azure Maps Weather service. To learn more about the returned Satellite data, please see [Weather concepts](https://aka.ms/AzureMapsWeatherConcepts).
- * - * Supports zoom levels 0 through 15. Format: raster (png). - */ - MicrosoftWeatherInfraredMain = "microsoft.weather.infrared.main", - /** - * Digital Elevation Model tiles. The tiles are in the GeoTIFF format with a single 32-bit floating point band. The tiles cover the whole landmass of Earth. Some small islands (e.g., atolls) might not be represented accurately.
- * * The vertical unit for measurement of elevation height is meters. An elevation value of -32767.0 is used for points that have no data value, most often returned where there isn't landmass (i.e. water).
- * * The horizontal reference datum is the World Geodetic System 1984 (WGS84-G1150) and the vertical reference datum is the Earth Gravitational Model 2008 (EGM2008).
- * * Tiles are 258x258 pixel squares rather than the standard 256 x 256. This is done to allow for accurate interpolation of values at the tile edges. As such adjacent tiles overlap by 1 pixel along all edges.
- * * Tile data comes from the [Airbus WorldDEM4Ortho product](https://www.intelligence-airbusds.com/worlddem-streaming/). Urban areas are approximately leveled down to ground level. All other areas are represented by the object surface level (e.g., trees).
- * - * Supports zoom level 13 only. Format: raster (tiff). - */ - MicrosoftDem = "microsoft.dem" -} - -/** - * Defines values for TilesetID. \ - * {@link KnownTilesetID} can be used interchangeably with TilesetID, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **microsoft.base**: A base map is a standard map that displays roads, natural and artificial features along with the labels for those features in a vector tile.
- * - * Supports zoom levels 0 through 22. Format: vector (pbf). \ - * **microsoft.base.labels**: Displays labels for roads, natural and artificial features in a vector tile.
- * - * Supports zoom levels 0 through 22. Format: vector (pbf). \ - * **microsoft.base.hybrid**: Displays road, boundary and label data in a vector tile.
- * - * Supports zoom levels 0 through 22. Format: vector (pbf). \ - * **microsoft.terra.main**: Shaded relief and terra layers.
- * - * Supports zoom levels 0 through 6. Format: raster (png). \ - * **microsoft.base.road**: All layers with our main style.
- * - * Supports zoom levels 0 through 22. Format: raster (png). \ - * **microsoft.base.darkgrey**: All layers with our dark grey style.
- * - * Supports zoom levels 0 through 22. Format: raster (png). \ - * **microsoft.base.labels.road**: Label data in our main style.
- * - * Supports zoom levels 0 through 22. Format: raster (png). \ - * **microsoft.base.hybrid.road**: Road, boundary and label data in our main style.
- * - * Supports zoom levels 0 through 22. Format: raster (png). \ - * **microsoft.imagery**: A combination of satellite and aerial imagery. Only available in S1 pricing SKU.
- * - * Supports zoom levels 1 through 19. Format: raster (jpeg). \ - * **microsoft.weather.radar.main**: Weather radar tiles. Latest weather radar images including areas of rain, snow, ice and mixed conditions. Please see [coverage information](https:\/\/aka.ms\/AzureMapsWeatherCoverage) for Azure Maps Weather service. To learn more about the Radar data, please see [Weather concepts](https:\/\/aka.ms\/AzureMapsWeatherConcepts).
- * - * Supports zoom levels 0 through 15. Format: raster (png). \ - * **microsoft.weather.infrared.main**: Weather infrared tiles. Latest Infrared Satellite images shows clouds by their temperature. Please see [coverage information](https:\/\/aka.ms\/AzureMapsWeatherCoverage) for Azure Maps Weather service. To learn more about the returned Satellite data, please see [Weather concepts](https:\/\/aka.ms\/AzureMapsWeatherConcepts).
- * - * Supports zoom levels 0 through 15. Format: raster (png). \ - * **microsoft.dem**: Digital Elevation Model tiles. The tiles are in the GeoTIFF format with a single 32-bit floating point band. The tiles cover the whole landmass of Earth. Some small islands (e.g., atolls) might not be represented accurately.
- * * The vertical unit for measurement of elevation height is meters. An elevation value of -32767.0 is used for points that have no data value, most often returned where there isn't landmass (i.e. water).
- * * The horizontal reference datum is the World Geodetic System 1984 (WGS84-G1150) and the vertical reference datum is the Earth Gravitational Model 2008 (EGM2008).
- * * Tiles are 258x258 pixel squares rather than the standard 256 x 256. This is done to allow for accurate interpolation of values at the tile edges. As such adjacent tiles overlap by 1 pixel along all edges.
- * * Tile data comes from the [Airbus WorldDEM4Ortho product](https:\/\/www.intelligence-airbusds.com\/worlddem-streaming\/). Urban areas are approximately leveled down to ground level. All other areas are represented by the object surface level (e.g., trees).
- * - * Supports zoom level 13 only. Format: raster (tiff). - */ -export type TilesetID = string; - -/** Known values of {@link TileSize} that the service accepts. */ -export const enum KnownTileSize { - /** - * Return a 256 by 256 pixel tile. Available for all tilesetIds except for - * * microsoft.terra.main - */ - TwoHundredFiftySix = "256", - /** - * Return a 512 by 512 pixel tile. Available for all tilesetIds except for - * * microsoft.weather.radar.main - * * microsoft.weather.infrared.main - * * microsoft.base.hybrid - * * microsoft.dem - * * microsoft.imagery - */ - FiveHundredTwelve = "512" -} - -/** - * Defines values for TileSize. \ - * {@link KnownTileSize} can be used interchangeably with TileSize, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **256**: Return a 256 by 256 pixel tile. Available for all tilesetIds except for - * * microsoft.terra.main \ - * **512**: Return a 512 by 512 pixel tile. Available for all tilesetIds except for - * * microsoft.weather.radar.main - * * microsoft.weather.infrared.main - * * microsoft.base.hybrid - * * microsoft.dem - * * microsoft.imagery - */ -export type TileSize = string; - -/** Known values of {@link GeographicResourceLocation} that the service accepts. */ -export const enum KnownGeographicResourceLocation { - /** Used to access an Azure Maps Creator resource in the United States */ - Us = "us", - /** Used to access an Azure Maps Creator resource in Europe */ - Eu = "eu" -} - -/** - * Defines values for GeographicResourceLocation. \ - * {@link KnownGeographicResourceLocation} can be used interchangeably with GeographicResourceLocation, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **us**: Used to access an Azure Maps Creator resource in the United States \ - * **eu**: Used to access an Azure Maps Creator resource in Europe - */ -export type GeographicResourceLocation = string; - -/** Optional parameters. */ -export interface RenderGetMapStaticImageOptionalParams - extends coreClient.OperationOptions { - /** Map layer requested. If layer is set to labels or hybrid, the format should be png. */ - layer?: StaticMapLayer; - /** Map style to be returned. Possible values are main and dark. */ - style?: MapImageStyle; - /** Desired zoom level of the map. Zoom value must be in the range: 0-20 (inclusive). Default value is 12.

Please see [Zoom Levels and Tile Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for details. */ - zoom?: number; - /** - * Coordinates of the center point. Format: 'lon,lat'. Projection used - * - EPSG:3857. Longitude range: -180 to 180. Latitude range: -85 to 85. - * - * Note: Either center or bbox are required parameters. They are - * mutually exclusive. - */ - center?: string; - /** - * Bounding box. Projection used - EPSG:3857. Format : 'minLon, minLat, - * maxLon, maxLat'. - * - * Note: Either bbox or center are required - * parameters. They are mutually exclusive. It shouldn’t be used with - * height or width. - * - * The maximum allowed ranges for Lat and Lon are defined for each zoom level - * in the table at the top of this page. - */ - bbox?: string; - /** - * Height of the resulting image in pixels. Range is 1 to 8192. Default - * is 512. It shouldn’t be used with bbox. - */ - height?: number; - /** Width of the resulting image in pixels. Range is 1 to 8192. Default is 512. It shouldn’t be used with bbox. */ - width?: number; - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. - * - * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. - */ - language?: string; - /** - * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. - * - * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. - */ - view?: string; - /** - * Pushpin style and instances. Use this parameter to optionally add pushpins to the image. - * The pushpin style describes the appearance of the pushpins, and the instances specify - * the coordinates of the pushpins and optional labels for each pin. (Be sure to properly URL-encode values of this - * parameter since it will contain reserved characters such as pipes and punctuation.) - * - * The Azure Maps account S0 SKU only supports a single instance of the pins parameter. Other SKUs - * allow multiple instances of the pins parameter to specify multiple pin styles. - * - * To render a pushpin at latitude 45°N and longitude 122°W using the default built-in pushpin style, add the - * querystring parameter - * - * `pins=default||-122 45` - * - * Note that the longitude comes before the latitude. - * After URL encoding this will look like - * - * `pins=default%7C%7C-122+45` - * - * All of the examples here show the pins - * parameter without URL encoding, for clarity. - * - * To render a pin at multiple locations, separate each location with a pipe character. For example, use - * - * `pins=default||-122 45|-119.5 43.2|-121.67 47.12` - * - * The S0 Azure Maps account SKU only allows five pushpins. Other account SKUs do not have this limitation. - * - * ### Style Modifiers - * - * You can modify the appearance of the pins by adding style modifiers. These are added after the style but before - * the locations and labels. Style modifiers each have a two-letter name. These abbreviated names are used to help - * reduce the length of the URL. - * - * To change the color of the pushpin, use the 'co' style modifier and specify the color using the HTML/CSS RGB color - * format which is a six-digit hexadecimal number (the three-digit form is not supported). For example, to use - * a deep pink color which you would specify as #FF1493 in CSS, use - * - * `pins=default|coFF1493||-122 45` - * - * ### Pushpin Labels - * - * To add a label to the pins, put the label in single quotes just before the coordinates. For example, to label - * three pins with the values '1', '2', and '3', use - * - * `pins=default||'1'-122 45|'2'-119.5 43.2|'3'-121.67 47.12` - * - * There is a built in pushpin style called 'none' that does not display a pushpin image. You can use this if - * you want to display labels without any pin image. For example, - * - * `pins=none||'A'-122 45|'B'-119.5 43.2` - * - * To change the color of the pushpin labels, use the 'lc' label color style modifier. For example, to use pink - * pushpins with black labels, use - * - * `pins=default|coFF1493|lc000000||-122 45` - * - * To change the size of the labels, use the 'ls' label size style modifier. The label size represents the approximate - * height of the label text in pixels. For example, to increase the label size to 12, use - * - * `pins=default|ls12||'A'-122 45|'B'-119 43` - * - * The labels are centered at the pushpin 'label anchor.' The anchor location is predefined for built-in pushpins and - * is at the top center of custom pushpins (see below). To override the label anchor, using the 'la' style modifier - * and provide X and Y pixel coordinates for the anchor. These coordinates are relative to the top left corner of the - * pushpin image. Positive X values move the anchor to the right, and positive Y values move the anchor down. For example, - * to position the label anchor 10 pixels right and 4 pixels above the top left corner of the pushpin image, - * use - * - * `pins=default|la10 -4||'A'-122 45|'B'-119 43` - * - * ### Custom Pushpins - * - * To use a custom pushpin image, use the word 'custom' as the pin style name, and then specify a URL after the - * location and label information. Use two pipe characters to indicate that you're done specifying locations and are - * starting the URL. For example, - * - * `pins=custom||-122 45||http://contoso.com/pushpins/red.png` - * - * After URL encoding, this would look like - * - * `pins=custom%7C%7C-122+45%7C%7Chttp%3A%2F%2Fcontoso.com%2Fpushpins%2Fred.png` - * - * By default, custom pushpin images are drawn centered at the pin coordinates. This usually isn't ideal as it obscures - * the location that you're trying to highlight. To override the anchor location of the pin image, use the 'an' - * style modifier. This uses the same format as the 'la' label anchor style modifier. For example, if your custom - * pin image has the tip of the pin at the top left corner of the image, you can set the anchor to that spot by - * using - * - * `pins=custom|an0 0||-122 45||http://contoso.com/pushpins/red.png` - * - * Note: If you use the 'co' color modifier with a custom pushpin image, the specified color will replace the RGB - * channels of the pixels in the image but will leave the alpha (opacity) channel unchanged. This would usually - * only be done with a solid-color custom image. - * - * ### Getting Pushpins from Azure Maps Data Storage - * - * For all Azure Maps account SKUs other than S0, - * the pushpin image and location information can be obtained from Azure Maps Data Storage. After uploading a pushpin image - * or a GeoJSON document containing pin locations, the Data Storage service returns a Unique Data ID (UDID) that you can use - * to reference the data in the pins parameter. - * - * To use a custom pushpin image from Azure Maps Data Storage, specify the UDID prefixed by 'udid-' as the name of the - * pushpin style. For example, - * - * `pins=udid-fe22c504-3a81-4fcd-adc6-a3507ce866c1||-122 45` - * - * To use the point geometry from an uploaded GeoJSON document as the pin locations, specify the UDID in the locations - * section of the pins parameter. For example, - * - * `pins=default||udid-29dc105a-dee7-409f-a3f9-22b066ae4713` - * - * Note that - * only point and multipoint geometry, points and multipoints from geometry collections, and point geometry from features - * will be used. Linestring and polygon geometry will be ignored. If the point comes from a feature and the feature - * has a string property called "label", the value of that property will be used as the label for the pin. - * - * You can mix pin locations from Data Storage and pin locations specified in the pins parameter. Any of the pipe-delimited - * pin locations can be a longitude and latitude or a UDID. For example, - * - * `pins=default||-122 45|udid-29dc105a-dee7-409f-a3f9-22b066ae4713|-119 43` - * - * ### Scale, Rotation, and Opacity - * - * You can make pushpins and their labels larger or smaller by using the 'sc' scale style modifier. This is a - * value greater than zero. A value of 1 is the standard scale. Values larger than 1 will make the pins larger, and - * values smaller than 1 will make them smaller. For example, to draw the pushpins 50% larger than normal, use - * - * `pins=default|sc1.5||-122 45` - * - * You can rotate pushpins and their labels by using the 'ro' rotation style modifier. This is a number of degrees - * of clockwise rotation. Use a negative number to rotate counter-clockwise. For example, to rotate the pushpins - * 90 degrees clockwise and double their size, use - * - * `pins=default|ro90|sc2||-122 45` - * - * You can make pushpins and their labels partially transparent by specifying the 'al' alpha style modifier. - * This is a number between 0 and 1 indicating the opacity of the pushpins. Zero makes them completely transparent - * (and not visible) and 1 makes them completely opaque (which is the default). For example, to make pushpins - * and their labels only 67% opaque, use - * - * `pins=default|al.67||-122 45` - * - * ### Style Modifier Summary - * - * Modifier | Description | Range - * :--------:|-----------------|------------------ - * al | Alpha (opacity) | 0 to 1 - * an | Pin anchor | * - * co | Pin color | 000000 to FFFFFF - * la | Label anchor | * - * lc | Label color | 000000 to FFFFFF - * ls | Label size | Greater than 0 - * ro | Rotation | -360 to 360 - * sc | Scale | Greater than 0 - * - * * X and Y coordinates can be anywhere within pin image or a margin around it. - * The margin size is the minimum of the pin width and height. - */ - pins?: string[]; - /** - * Path style and locations. Use this parameter to optionally add lines, polygons or circles to the image. - * The path style describes the appearance of the line and fill. (Be sure to properly URL-encode values of this - * parameter since it will contain reserved characters such as pipes and punctuation.) - * - * Path parameter is supported in Azure Maps account SKU starting with S1. Multiple instances of the path parameter - * allow to specify multiple geometries with their styles. Number of parameters per request is limited to 10 and - * number of locations is limited to 100 per path. - * - * To render a circle with radius 100 meters and center point at latitude 45°N and longitude 122°W using the default style, add the - * querystring parameter - * - * `path=ra100||-122 45` - * - * Note that the longitude comes before the latitude. - * After URL encoding this will look like - * - * `path=ra100%7C%7C-122+45` - * - * All of the examples here show the path parameter without URL encoding, for clarity. - * - * To render a line, separate each location with a pipe character. For example, use - * - * `path=||-122 45|-119.5 43.2|-121.67 47.12` - * - * To render a polygon, last location must be equal to the start location. For example, use - * - * `path=||-122 45|-119.5 43.2|-121.67 47.12|-122 45` - * - * Longitude and latitude values for locations of lines and polygons can be in the range from -360 to 360 to allow for rendering of geometries crossing the anti-meridian. - * - * ### Style Modifiers - * - * You can modify the appearance of the path by adding style modifiers. These are added before the locations. - * Style modifiers each have a two-letter name. These abbreviated names are used to help reduce the length - * of the URL. - * - * To change the color of the outline, use the 'lc' style modifier and specify the color using the HTML/CSS RGB color - * format which is a six-digit hexadecimal number (the three-digit form is not supported). For example, to use - * a deep pink color which you would specify as #FF1493 in CSS, use - * - * `path=lcFF1493||-122 45|-119.5 43.2` - * - * Multiple style modifiers may be combined together to create a more complex visual style. - * - * `lc0000FF|lw3|la0.60|fa0.50||-122.2 47.6|-122.2 47.7|-122.3 47.7|-122.3 47.6|-122.2 47.6` - * - * ### Getting Path locations from Azure Maps Data Storage - * - * For all Azure Maps account SKUs other than S0, the path location information can be obtained from Azure Maps Data Storage. - * After uploading a GeoJSON document containing path locations, the Data Storage service returns a Unique Data ID (UDID) that you can use - * to reference the data in the path parameter. - * - * To use the point geometry from an uploaded GeoJSON document as the path locations, specify the UDID in the locations - * section of the path parameter. For example, - * - * `path=||udid-29dc105a-dee7-409f-a3f9-22b066ae4713` - * - * Note the it is not allowed to mix path locations from Data Storage with locations specified in the path parameter. - * - * ### Style Modifier Summary - * - * Modifier | Description | Range - * :--------:|------------------------|------------------ - * lc | Line color | 000000 to FFFFFF - * fc | Fill color | 000000 to FFFFFF - * la | Line alpha (opacity) | 0 to 1 - * fa | Fill alpha (opacity) | 0 to 1 - * lw | Line width | Greater than 0 - * ra | Circle radius (meters) | Greater than 0 - */ - path?: string[]; -} - -/** Contains response data for the getMapStaticImage operation. */ -export type RenderGetMapStaticImageResponse = RenderGetMapStaticImageHeaders & { - /** - * BROWSER ONLY - * - * The response body as a browser Blob. - * Always `undefined` in node.js. - */ - blobBody?: Promise; - /** - * NODEJS ONLY - * - * The response body as a node.js Readable stream. - * Always `undefined` in the browser. - */ - readableStreamBody?: NodeJS.ReadableStream; -}; - -/** Optional parameters. */ -export interface RenderGetMapTileOptionalParams - extends coreClient.OperationOptions { - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. - * - * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. - */ - language?: string; - /** - * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. - * - * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. - */ - view?: string; - /** The size of the returned map tile in pixels. */ - tileSize?: MapTileSize; -} - -/** Contains response data for the getMapTile operation. */ -export type RenderGetMapTileResponse = RenderGetMapTileHeaders & { - /** - * BROWSER ONLY - * - * The response body as a browser Blob. - * Always `undefined` in node.js. - */ - blobBody?: Promise; - /** - * NODEJS ONLY - * - * The response body as a node.js Readable stream. - * Always `undefined` in the browser. - */ - readableStreamBody?: NodeJS.ReadableStream; -}; - -/** Optional parameters. */ -export interface RenderGetMapStateTilePreviewOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getMapStateTilePreview operation. */ -export type RenderGetMapStateTilePreviewResponse = RenderGetMapStateTilePreviewHeaders & { - /** - * BROWSER ONLY - * - * The response body as a browser Blob. - * Always `undefined` in node.js. - */ - blobBody?: Promise; - /** - * NODEJS ONLY - * - * The response body as a node.js Readable stream. - * Always `undefined` in the browser. - */ - readableStreamBody?: NodeJS.ReadableStream; -}; - -/** Optional parameters. */ -export interface RenderGetCopyrightCaptionOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getCopyrightCaption operation. */ -export type RenderGetCopyrightCaptionResponse = GetCopyrightCaptionResult; - -/** Optional parameters. */ -export interface RenderGetMapImageryTileOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getMapImageryTile operation. */ -export type RenderGetMapImageryTileResponse = RenderGetMapImageryTileHeaders & { - /** - * BROWSER ONLY - * - * The response body as a browser Blob. - * Always `undefined` in node.js. - */ - blobBody?: Promise; - /** - * NODEJS ONLY - * - * The response body as a node.js Readable stream. - * Always `undefined` in the browser. - */ - readableStreamBody?: NodeJS.ReadableStream; -}; - -/** Optional parameters. */ -export interface RenderGetCopyrightFromBoundingBoxOptionalParams - extends coreClient.OperationOptions { - /** Yes/no value to exclude textual data from response. Only images and country names will be in response. */ - text?: IncludeText; -} - -/** Contains response data for the getCopyrightFromBoundingBox operation. */ -export type RenderGetCopyrightFromBoundingBoxResponse = GetCopyrightFromBoundingBoxResult; - -/** Optional parameters. */ -export interface RenderGetCopyrightForTileOptionalParams - extends coreClient.OperationOptions { - /** Yes/no value to exclude textual data from response. Only images and country names will be in response. */ - text?: IncludeText; -} - -/** Contains response data for the getCopyrightForTile operation. */ -export type RenderGetCopyrightForTileResponse = GetCopyrightForTileResult; - -/** Optional parameters. */ -export interface RenderGetCopyrightForWorldOptionalParams - extends coreClient.OperationOptions { - /** Yes/no value to exclude textual data from response. Only images and country names will be in response. */ - text?: IncludeText; -} - -/** Contains response data for the getCopyrightForWorld operation. */ -export type RenderGetCopyrightForWorldResponse = GetCopyrightForWorldResult; - -/** Optional parameters. */ -export interface RenderV2GetMapTilePreviewOptionalParams - extends coreClient.OperationOptions { - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. - * - * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. - */ - language?: string; - /** - * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. - * - * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. - */ - view?: string; - /** - * The desired date and time of the requested tile. This parameter must be specified in the standard date-time format (e.g. 2019-11-14T16:03:00-08:00), as defined by [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601). This parameter is only supported when tilesetId parameter is set to one of the values below. - * - * * microsoft.weather.infrared.main: We provide tiles up to 3 hours in the past. Tiles are available in 10-minute intervals. We round the timeStamp value to the nearest 10-minute time frame. - * * microsoft.weather.radar.main: We provide tiles up to 1.5 hours in the past and up to 2 hours in the future. Tiles are available in 5-minute intervals. We round the timeStamp value to the nearest 5-minute time frame. - */ - timeStamp?: string; - /** The size of the returned map tile in pixels. */ - tileSize?: TileSize; -} - -/** Contains response data for the getMapTilePreview operation. */ -export type RenderV2GetMapTilePreviewResponse = RenderV2GetMapTilePreviewHeaders & { - /** - * BROWSER ONLY - * - * The response body as a browser Blob. - * Always `undefined` in node.js. - */ - blobBody?: Promise; - /** - * NODEJS ONLY - * - * The response body as a node.js Readable stream. - * Always `undefined` in the browser. - */ - readableStreamBody?: NodeJS.ReadableStream; -}; - -/** Optional parameters. */ -export interface RenderClientOptionalParams - extends coreClient.ServiceClientOptions { - /** This parameter specifies where the Azure Maps Creator resource is located. Valid values are us and eu. */ - geography?: Geography; - /** Specifies which account is intended for usage in conjunction with the Azure AD security model. It represents a unique ID for the Azure Maps account and can be retrieved from the Azure Maps management plane Account API. To use Azure AD security in Azure Maps see the following [articles](https://aka.ms/amauthdetails) for guidance. */ - xMsClientId?: string; - /** Overrides client endpoint. */ - endpoint?: string; -} diff --git a/sdk/maps/maps-render/src/models/mappers.ts b/sdk/maps/maps-render/src/models/mappers.ts deleted file mode 100644 index ef5a05f15006..000000000000 --- a/sdk/maps/maps-render/src/models/mappers.ts +++ /dev/null @@ -1,377 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; - -export const ErrorResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorResponse", - modelProperties: { - error: { - serializedName: "error", - type: { - name: "Composite", - className: "ErrorDetail" - } - } - } - } -}; - -export const ErrorDetail: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorDetail", - modelProperties: { - code: { - serializedName: "code", - readOnly: true, - type: { - name: "String" - } - }, - message: { - serializedName: "message", - readOnly: true, - type: { - name: "String" - } - }, - target: { - serializedName: "target", - readOnly: true, - type: { - name: "String" - } - }, - details: { - serializedName: "details", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ErrorDetail" - } - } - } - }, - additionalInfo: { - serializedName: "additionalInfo", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ErrorAdditionalInfo" - } - } - } - } - } - } -}; - -export const ErrorAdditionalInfo: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorAdditionalInfo", - modelProperties: { - type: { - serializedName: "type", - readOnly: true, - type: { - name: "String" - } - }, - info: { - serializedName: "info", - readOnly: true, - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - } - } - } -}; - -export const GetCopyrightCaptionResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GetCopyrightCaptionResult", - modelProperties: { - formatVersion: { - serializedName: "formatVersion", - readOnly: true, - type: { - name: "String" - } - }, - copyrightsCaption: { - serializedName: "copyrightsCaption", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const GetCopyrightFromBoundingBoxResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GetCopyrightFromBoundingBoxResult", - modelProperties: { - formatVersion: { - serializedName: "formatVersion", - readOnly: true, - type: { - name: "String" - } - }, - generalCopyrights: { - serializedName: "generalCopyrights", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - regions: { - serializedName: "regions", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "RegionCopyrights" - } - } - } - } - } - } -}; - -export const RegionCopyrights: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RegionCopyrights", - modelProperties: { - copyrights: { - serializedName: "copyrights", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - country: { - serializedName: "country", - type: { - name: "Composite", - className: "RegionCopyrightsCountry" - } - } - } - } -}; - -export const RegionCopyrightsCountry: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RegionCopyrightsCountry", - modelProperties: { - iso3: { - serializedName: "ISO3", - readOnly: true, - type: { - name: "String" - } - }, - label: { - serializedName: "label", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const GetCopyrightForTileResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GetCopyrightForTileResult", - modelProperties: { - formatVersion: { - serializedName: "formatVersion", - readOnly: true, - type: { - name: "String" - } - }, - generalCopyrights: { - serializedName: "generalCopyrights", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - regions: { - serializedName: "regions", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "RegionCopyrights" - } - } - } - } - } - } -}; - -export const GetCopyrightForWorldResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GetCopyrightForWorldResult", - modelProperties: { - formatVersion: { - serializedName: "formatVersion", - readOnly: true, - type: { - name: "String" - } - }, - generalCopyrights: { - serializedName: "generalCopyrights", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - regions: { - serializedName: "regions", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "RegionCopyrights" - } - } - } - } - } - } -}; - -export const RenderGetMapStaticImageHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RenderGetMapStaticImageHeaders", - modelProperties: { - contentType: { - serializedName: "content-type", - type: { - name: "String" - } - } - } - } -}; - -export const RenderGetMapTileHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RenderGetMapTileHeaders", - modelProperties: { - contentType: { - serializedName: "content-type", - type: { - name: "String" - } - } - } - } -}; - -export const RenderGetMapStateTilePreviewHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RenderGetMapStateTilePreviewHeaders", - modelProperties: { - contentType: { - serializedName: "content-type", - type: { - name: "String" - } - } - } - } -}; - -export const RenderGetMapImageryTileHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RenderGetMapImageryTileHeaders", - modelProperties: { - contentType: { - serializedName: "content-type", - type: { - name: "String" - } - } - } - } -}; - -export const RenderV2GetMapTilePreviewHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RenderV2GetMapTilePreviewHeaders", - modelProperties: { - contentType: { - serializedName: "content-type", - type: { - name: "String" - } - } - } - } -}; diff --git a/sdk/maps/maps-render/src/models/parameters.ts b/sdk/maps/maps-render/src/models/parameters.ts deleted file mode 100644 index 75a7be70b9ed..000000000000 --- a/sdk/maps/maps-render/src/models/parameters.ts +++ /dev/null @@ -1,424 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { - OperationParameter, - OperationURLParameter, - OperationQueryParameter -} from "@azure/core-client"; - -export const accept: OperationParameter = { - parameterPath: "accept", - mapper: { - defaultValue: - "application/json, image/jpeg, image/png, image/pbf, application/vnd.mapbox-vector-tile", - isConstant: true, - serializedName: "Accept", - type: { - name: "String" - } - } -}; - -export const geography: OperationURLParameter = { - parameterPath: "geography", - mapper: { - serializedName: "geography", - required: true, - type: { - name: "String" - } - } -}; - -export const xMsClientId: OperationParameter = { - parameterPath: "xMsClientId", - mapper: { - serializedName: "x-ms-client-id", - type: { - name: "String" - } - } -}; - -export const apiVersion: OperationQueryParameter = { - parameterPath: "apiVersion", - mapper: { - defaultValue: "1.0", - isConstant: true, - serializedName: "api-version", - type: { - name: "String" - } - } -}; - -export const format: OperationURLParameter = { - parameterPath: "format", - mapper: { - serializedName: "format", - required: true, - type: { - name: "String" - } - } -}; - -export const layer: OperationQueryParameter = { - parameterPath: ["options", "layer"], - mapper: { - serializedName: "layer", - type: { - name: "String" - } - } -}; - -export const style: OperationQueryParameter = { - parameterPath: ["options", "style"], - mapper: { - serializedName: "style", - type: { - name: "String" - } - } -}; - -export const zoom: OperationQueryParameter = { - parameterPath: ["options", "zoom"], - mapper: { - constraints: { - InclusiveMaximum: 20, - InclusiveMinimum: 0 - }, - serializedName: "zoom", - type: { - name: "Number" - } - } -}; - -export const center: OperationQueryParameter = { - parameterPath: ["options", "center"], - mapper: { - serializedName: "center", - type: { - name: "String" - } - } -}; - -export const bbox: OperationQueryParameter = { - parameterPath: ["options", "bbox"], - mapper: { - serializedName: "bbox", - type: { - name: "String" - } - } -}; - -export const height: OperationQueryParameter = { - parameterPath: ["options", "height"], - mapper: { - constraints: { - InclusiveMaximum: 8192, - InclusiveMinimum: 1 - }, - serializedName: "height", - type: { - name: "Number" - } - } -}; - -export const width: OperationQueryParameter = { - parameterPath: ["options", "width"], - mapper: { - constraints: { - InclusiveMaximum: 8192, - InclusiveMinimum: 1 - }, - serializedName: "width", - type: { - name: "Number" - } - } -}; - -export const language: OperationQueryParameter = { - parameterPath: ["options", "language"], - mapper: { - serializedName: "language", - type: { - name: "String" - } - } -}; - -export const view: OperationQueryParameter = { - parameterPath: ["options", "view"], - mapper: { - serializedName: "view", - type: { - name: "String" - } - } -}; - -export const pins: OperationQueryParameter = { - parameterPath: ["options", "pins"], - mapper: { - serializedName: "pins", - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - collectionFormat: "Multi" -}; - -export const path: OperationQueryParameter = { - parameterPath: ["options", "path"], - mapper: { - serializedName: "path", - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - collectionFormat: "Multi" -}; - -export const format1: OperationURLParameter = { - parameterPath: "format", - mapper: { - serializedName: "format", - required: true, - type: { - name: "String" - } - } -}; - -export const layer1: OperationQueryParameter = { - parameterPath: "layer", - mapper: { - serializedName: "layer", - required: true, - type: { - name: "String" - } - } -}; - -export const style1: OperationQueryParameter = { - parameterPath: "style", - mapper: { - serializedName: "style", - required: true, - type: { - name: "String" - } - } -}; - -export const zoom1: OperationQueryParameter = { - parameterPath: "zoom", - mapper: { - serializedName: "zoom", - required: true, - type: { - name: "Number" - } - } -}; - -export const xTileIndex: OperationQueryParameter = { - parameterPath: "xTileIndex", - mapper: { - serializedName: "x", - required: true, - type: { - name: "Number" - } - } -}; - -export const yTileIndex: OperationQueryParameter = { - parameterPath: "yTileIndex", - mapper: { - serializedName: "y", - required: true, - type: { - name: "Number" - } - } -}; - -export const tileSize: OperationQueryParameter = { - parameterPath: ["options", "tileSize"], - mapper: { - serializedName: "tileSize", - type: { - name: "String" - } - } -}; - -export const accept1: OperationParameter = { - parameterPath: "accept", - mapper: { - defaultValue: "application/vnd.mapbox-vector-tile, application/json", - isConstant: true, - serializedName: "Accept", - type: { - name: "String" - } - } -}; - -export const statesetId: OperationQueryParameter = { - parameterPath: "statesetId", - mapper: { - serializedName: "statesetId", - required: true, - type: { - name: "String" - } - } -}; - -export const accept2: OperationParameter = { - parameterPath: "accept", - mapper: { - defaultValue: "application/json", - isConstant: true, - serializedName: "Accept", - type: { - name: "String" - } - } -}; - -export const format2: OperationURLParameter = { - parameterPath: "format", - mapper: { - serializedName: "format", - required: true, - type: { - name: "String" - } - } -}; - -export const accept3: OperationParameter = { - parameterPath: "accept", - mapper: { - defaultValue: "application/json, image/jpeg, image/png", - isConstant: true, - serializedName: "Accept", - type: { - name: "String" - } - } -}; - -export const style2: OperationQueryParameter = { - parameterPath: "style", - mapper: { - serializedName: "style", - required: true, - type: { - name: "String" - } - } -}; - -export const mincoordinates: OperationQueryParameter = { - parameterPath: "mincoordinates", - mapper: { - serializedName: "mincoordinates", - required: true, - type: { - name: "String" - } - } -}; - -export const maxcoordinates: OperationQueryParameter = { - parameterPath: "maxcoordinates", - mapper: { - serializedName: "maxcoordinates", - required: true, - type: { - name: "String" - } - } -}; - -export const text: OperationQueryParameter = { - parameterPath: ["options", "text"], - mapper: { - serializedName: "text", - type: { - name: "String" - } - } -}; - -export const apiVersion1: OperationQueryParameter = { - parameterPath: "apiVersion", - mapper: { - defaultValue: "2.0", - isConstant: true, - serializedName: "api-version", - type: { - name: "String" - } - } -}; - -export const tilesetId: OperationQueryParameter = { - parameterPath: "tilesetId", - mapper: { - serializedName: "tilesetId", - required: true, - type: { - name: "String" - } - } -}; - -export const timeStamp: OperationQueryParameter = { - parameterPath: ["options", "timeStamp"], - mapper: { - serializedName: "timeStamp", - type: { - name: "String" - } - } -}; - -export const tileSize1: OperationQueryParameter = { - parameterPath: ["options", "tileSize"], - mapper: { - serializedName: "tileSize", - type: { - name: "String" - } - } -}; diff --git a/sdk/maps/maps-render/src/operations/index.ts b/sdk/maps/maps-render/src/operations/index.ts deleted file mode 100644 index 46a2724214fc..000000000000 --- a/sdk/maps/maps-render/src/operations/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./render"; -export * from "./renderV2"; diff --git a/sdk/maps/maps-render/src/operations/render.ts b/sdk/maps/maps-render/src/operations/render.ts deleted file mode 100644 index 17b71d9ce894..000000000000 --- a/sdk/maps/maps-render/src/operations/render.ts +++ /dev/null @@ -1,565 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { Render } from "../operationsInterfaces"; -import * as coreClient from "@azure/core-client"; -import * as Mappers from "../models/mappers"; -import * as Parameters from "../models/parameters"; -import { RenderClientContext } from "../renderClientContext"; -import { - RasterTileFormat, - RenderGetMapStaticImageOptionalParams, - RenderGetMapStaticImageResponse, - TileFormat, - MapTileLayer, - MapTileStyle, - RenderGetMapTileOptionalParams, - RenderGetMapTileResponse, - RenderGetMapStateTilePreviewOptionalParams, - RenderGetMapStateTilePreviewResponse, - TextFormat, - RenderGetCopyrightCaptionOptionalParams, - RenderGetCopyrightCaptionResponse, - MapImageryStyle, - RenderGetMapImageryTileOptionalParams, - RenderGetMapImageryTileResponse, - RenderGetCopyrightFromBoundingBoxOptionalParams, - RenderGetCopyrightFromBoundingBoxResponse, - RenderGetCopyrightForTileOptionalParams, - RenderGetCopyrightForTileResponse, - RenderGetCopyrightForWorldOptionalParams, - RenderGetCopyrightForWorldResponse -} from "../models"; - -/** Class representing a Render. */ -export class RenderImpl implements Render { - private readonly client: RenderClientContext; - - /** - * Initialize a new instance of the class Render class. - * @param client Reference to the service client - */ - constructor(client: RenderClientContext) { - this.client = client; - } - - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * The static image service renders a user-defined, rectangular image containing a map section using a - * zoom level from 0 to 20. The static image service renders a user-defined, rectangular image - * containing a map section using a zoom level from 0 to 20. The supported resolution range for the map - * image is from 1x1 to 8192x8192. If you are deciding when to use the static image service over the - * map tile service, you may want to consider how you would like to interact with the rendered map. If - * the map contents will be relatively unchanging, a static map is a good choice. If you want to - * support a lot of zooming, panning and changing of the map content, the map tile service would be a - * better choice. - * - * Service also provides Image Composition functionality to get a static image back with additional - * data like; pushpins and geometry overlays with following S0 and S1 capabilities. - * - * In S0 you can: - * - Render up to 5 pushpins specified in the request - * - Provide one custom image for the pins referenced in the request - * - Add labels to the pushpins - * - * In S1 you can: - * - Render pushpins through [Azure Maps Data Service](https://aka.ms/AzureMapsMapDataService) - * - Specify multiple pushpin styles - * - Provide custom pushpin images stored in [Azure Maps Data - * Service](https://aka.ms/AzureMapsMapDataService) - * - Render circle, polyline and polygon geometry types. - * - Render of supported GeoJSON geometry types uploaded through [Azure Maps Data - * Service](https://aka.ms/AzureMapsMapDataService) - * - * Please see [How-to-Guide](https://aka.ms/AzureMapsHowToGuideImageCompositor) for detailed examples. - * - * _Note_ : Either **center** or **bbox** parameter must be supplied to the - * API. - *

- * The supported Lat and Lon ranges when using the **bbox** parameter, are as follows: - *

- * - * |Zoom Level | Max Lon Range | Max Lat Range| - * |:----------|:----------------|:-------------| - * |0 | 360.0 | 170.0 | - * |1 | 360.0 | 170.0 | - * |2 | 360.0 | 170.0 | - * |3 | 360.0 | 170.0 | - * |4 | 360.0 | 170.0 | - * |5 | 180.0 | 85.0 | - * |6 | 90.0 | 42.5 | - * |7 | 45.0 | 21.25 | - * |8 | 22.5 | 10.625 | - * |9 | 11.25 | 5.3125 | - * |10 | 5.625 | 2.62625 | - * |11 | 2.8125 | 1.328125 | - * |12 | 1.40625 | 0.6640625 | - * |13 | 0.703125 | 0.33203125 | - * |14 | 0.3515625 | 0.166015625 | - * |15 | 0.17578125 | 0.0830078125 | - * |16 | 0.087890625 | 0.0415039063 | - * |17 | 0.0439453125 | 0.0207519531 | - * |18 | 0.0219726563 | 0.0103759766 | - * |19 | 0.0109863281 | 0.0051879883 | - * |20 | 0.0054931641 | 0.0025939941 | - * @param format Desired format of the response. Possible value: png. - * @param options The options parameters. - */ - getMapStaticImage( - format: RasterTileFormat, - options?: RenderGetMapStaticImageOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, options }, - getMapStaticImageOperationSpec - ); - } - - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Fetches map tiles in vector or raster format typically to be integrated into a new map control or - * SDK. By default, Azure uses vector map tiles for its web map control (see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid)) - * - * **Note**: Weather tiles are only available via [Get Map Tile V2 - * API](https://aka.ms/AzureMapsWeatherTiles). We recommend to start to use the new [Get Map Tile V2 - * API](https://aka.ms/GetMapTileV2). - * @param format Desired format of the response. Possible values are png & pbf. - * @param layer Map layer requested. Possible values are basic, hybrid, labels and terra. - * @param style Map style to be returned. Possible values are main, dark, and shaded_relief. - * @param zoom Zoom level for the desired tile. For _raster_ tiles, value must be in the range: 0-18 - * (inclusive). Terra raster tiles, values must be in the range 0-6 (inclusive). For _vector_ tiles, - * value must be in the range: 0-22 (inclusive). - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param options The options parameters. - */ - getMapTile( - format: TileFormat, - layer: MapTileLayer, - style: MapTileStyle, - zoom: number, - xTileIndex: number, - yTileIndex: number, - options?: RenderGetMapTileOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, layer, style, zoom, xTileIndex, yTileIndex, options }, - getMapTileOperationSpec - ); - } - - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Fetches state tiles in vector format typically to be integrated into indoor maps module of map - * control or SDK. The map control will call this API after user turns on dynamic styling (see [Zoom - * Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid)) - * @param zoom Zoom level for the desired tile. Zoom value must be in the range: 0-20 (inclusive). - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param statesetId The stateset id. - * @param options The options parameters. - */ - getMapStateTilePreview( - zoom: number, - xTileIndex: number, - yTileIndex: number, - statesetId: string, - options?: RenderGetMapStateTilePreviewOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { zoom, xTileIndex, yTileIndex, statesetId, options }, - getMapStateTilePreviewOperationSpec - ); - } - - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * - * Copyrights API is designed to serve copyright information for Render Tile - * service. In addition to basic copyright for the whole map, API is serving - * specific groups of copyrights for some countries. - * - * As an alternative to copyrights for map request, one can receive captions - * for displaying the map provider information on the map. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param options The options parameters. - */ - getCopyrightCaption( - format: TextFormat, - options?: RenderGetCopyrightCaptionOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, options }, - getCopyrightCaptionOperationSpec - ); - } - - /** - * **Applies to:** S1 pricing tier. - * - * - * This service returns a map image tile with size 256x256, given the x and y coordinates and zoom - * level. Zoom level ranges from 1 to 19. The current available style value is 'satellite' which - * provides satellite - * imagery alone. - * - * - * **Note**: We recommend to start to use the new [Get Map Tile V2 API](https://aka.ms/GetMapTileV2). - * @param format Desired format of the response. Possible value: png. - * @param style Map style to be returned. __Possible values:__ satellite. - * @param zoom Zoom level for the desired tile. Zoom value must be in the range: 1-19 (inclusive). - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param options The options parameters. - */ - getMapImageryTile( - format: RasterTileFormat, - style: MapImageryStyle, - zoom: number, - xTileIndex: number, - yTileIndex: number, - options?: RenderGetMapImageryTileOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, style, zoom, xTileIndex, yTileIndex, options }, - getMapImageryTileOperationSpec - ); - } - - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Returns copyright information for a given bounding box. Bounding-box requests should specify the - * minimum and maximum longitude and latitude (EPSG-3857) coordinates - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param mincoordinates Minimum coordinates of bounding box in latitude longitude coordinate system. - * E.g. 52.41064,4.84228 - * @param maxcoordinates Maximum coordinates of bounding box in latitude longitude coordinate system. - * E.g. 52.41064,4.84228 - * @param options The options parameters. - */ - getCopyrightFromBoundingBox( - format: TextFormat, - mincoordinates: string, - maxcoordinates: string, - options?: RenderGetCopyrightFromBoundingBoxOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, mincoordinates, maxcoordinates, options }, - getCopyrightFromBoundingBoxOperationSpec - ); - } - - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * - * Copyrights API is designed to serve copyright information for Render Tile service. In addition to - * basic copyright for the whole map, API is serving specific groups of copyrights for some countries. - * Returns the copyright information for a given tile. To obtain the copyright information for a - * particular tile, the request should specify the tile's zoom level and x and y coordinates (see: Zoom - * Levels and Tile Grid). - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param zoom Zoom level for the desired tile. Zoom value must be in the range: 0-18 (inclusive). - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param options The options parameters. - */ - getCopyrightForTile( - format: TextFormat, - zoom: number, - xTileIndex: number, - yTileIndex: number, - options?: RenderGetCopyrightForTileOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, zoom, xTileIndex, yTileIndex, options }, - getCopyrightForTileOperationSpec - ); - } - - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Copyrights API is designed to serve copyright information for Render Tile service. In addition to - * basic copyright for the whole map, API is serving specific groups of copyrights for some countries. - * Returns the copyright information for the world. To obtain the default copyright information for the - * whole world, do not specify a tile or bounding box. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param options The options parameters. - */ - getCopyrightForWorld( - format: TextFormat, - options?: RenderGetCopyrightForWorldOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, options }, - getCopyrightForWorldOperationSpec - ); - } -} -// Operation Specifications -const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); - -const getMapStaticImageOperationSpec: coreClient.OperationSpec = { - path: "/map/static/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: { - type: { name: "Stream" }, - serializedName: "parsedResponse" - }, - headersMapper: Mappers.RenderGetMapStaticImageHeaders - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.layer, - Parameters.style, - Parameters.zoom, - Parameters.center, - Parameters.bbox, - Parameters.height, - Parameters.width, - Parameters.language, - Parameters.view, - Parameters.pins, - Parameters.path - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getMapTileOperationSpec: coreClient.OperationSpec = { - path: "/map/tile/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: { - type: { name: "Stream" }, - serializedName: "parsedResponse" - }, - headersMapper: Mappers.RenderGetMapTileHeaders - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.language, - Parameters.view, - Parameters.layer1, - Parameters.style1, - Parameters.zoom1, - Parameters.xTileIndex, - Parameters.yTileIndex, - Parameters.tileSize - ], - urlParameters: [Parameters.geography, Parameters.format1], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getMapStateTilePreviewOperationSpec: coreClient.OperationSpec = { - path: "/map/statetile", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: { - type: { name: "Stream" }, - serializedName: "parsedResponse" - }, - headersMapper: Mappers.RenderGetMapStateTilePreviewHeaders - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.zoom1, - Parameters.xTileIndex, - Parameters.yTileIndex, - Parameters.statesetId - ], - urlParameters: [Parameters.geography], - headerParameters: [Parameters.xMsClientId, Parameters.accept1], - serializer -}; -const getCopyrightCaptionOperationSpec: coreClient.OperationSpec = { - path: "/map/copyright/caption/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.GetCopyrightCaptionResult - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.format2], - headerParameters: [Parameters.xMsClientId, Parameters.accept2], - serializer -}; -const getMapImageryTileOperationSpec: coreClient.OperationSpec = { - path: "/map/imagery/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: { - type: { name: "Stream" }, - serializedName: "parsedResponse" - }, - headersMapper: Mappers.RenderGetMapImageryTileHeaders - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.zoom1, - Parameters.xTileIndex, - Parameters.yTileIndex, - Parameters.style2 - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.xMsClientId, Parameters.accept3], - serializer -}; -const getCopyrightFromBoundingBoxOperationSpec: coreClient.OperationSpec = { - path: "/map/copyright/bounding/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.GetCopyrightFromBoundingBoxResult - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.mincoordinates, - Parameters.maxcoordinates, - Parameters.text - ], - urlParameters: [Parameters.geography, Parameters.format2], - headerParameters: [Parameters.xMsClientId, Parameters.accept2], - serializer -}; -const getCopyrightForTileOperationSpec: coreClient.OperationSpec = { - path: "/map/copyright/tile/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.GetCopyrightForTileResult - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.zoom1, - Parameters.xTileIndex, - Parameters.yTileIndex, - Parameters.text - ], - urlParameters: [Parameters.geography, Parameters.format2], - headerParameters: [Parameters.xMsClientId, Parameters.accept2], - serializer -}; -const getCopyrightForWorldOperationSpec: coreClient.OperationSpec = { - path: "/map/copyright/world/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.GetCopyrightForWorldResult - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion, Parameters.text], - urlParameters: [Parameters.geography, Parameters.format2], - headerParameters: [Parameters.xMsClientId, Parameters.accept2], - serializer -}; diff --git a/sdk/maps/maps-render/src/operations/renderV2.ts b/sdk/maps/maps-render/src/operations/renderV2.ts deleted file mode 100644 index c586903df589..000000000000 --- a/sdk/maps/maps-render/src/operations/renderV2.ts +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { RenderV2 } from "../operationsInterfaces"; -import * as coreClient from "@azure/core-client"; -import * as Mappers from "../models/mappers"; -import * as Parameters from "../models/parameters"; -import { RenderClientContext } from "../renderClientContext"; -import { - TilesetID, - RenderV2GetMapTilePreviewOptionalParams, - RenderV2GetMapTilePreviewResponse -} from "../models"; - -/** Class representing a RenderV2. */ -export class RenderV2Impl implements RenderV2 { - private readonly client: RenderClientContext; - - /** - * Initialize a new instance of the class RenderV2 class. - * @param client Reference to the service client - */ - constructor(client: RenderClientContext) { - this.client = client; - } - - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * The Get Map Tiles API allows users to request map tiles in vector or raster formats typically to be - * integrated into a map control or SDK. Some example tiles that can be requested are Azure Maps road - * tiles, real-time Weather Radar tiles or the map tiles created using [Azure Maps - * Creator](https://aka.ms/amcreator). By default, Azure Maps uses vector tiles for its web map - * control (Web SDK) and Android SDK. - * @param tilesetId A tileset is a collection of raster or vector data broken up into a uniform grid of - * square tiles at preset zoom levels. Every tileset has a **tilesetId** to use when making requests. - * The **tilesetId** for tilesets created using [Azure Maps Creator](https://aka.ms/amcreator) are - * generated through the [Tileset Create API](https://docs.microsoft.com/en-us/rest/api/maps/tileset). - * The ready-to-use tilesets supplied by Azure Maps are listed below. For example, microsoft.base. - * @param zoom Zoom level for the desired tile. Please find TilesetID list below for more details on - * supported zoom level for each tilesetId.
- * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param options The options parameters. - */ - getMapTilePreview( - tilesetId: TilesetID, - zoom: number, - xTileIndex: number, - yTileIndex: number, - options?: RenderV2GetMapTilePreviewOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { tilesetId, zoom, xTileIndex, yTileIndex, options }, - getMapTilePreviewOperationSpec - ); - } -} -// Operation Specifications -const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); - -const getMapTilePreviewOperationSpec: coreClient.OperationSpec = { - path: "/map/tile", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: { - type: { name: "Stream" }, - serializedName: "parsedResponse" - }, - headersMapper: Mappers.RenderV2GetMapTilePreviewHeaders - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.language, - Parameters.view, - Parameters.zoom1, - Parameters.xTileIndex, - Parameters.yTileIndex, - Parameters.apiVersion1, - Parameters.tilesetId, - Parameters.timeStamp, - Parameters.tileSize1 - ], - urlParameters: [Parameters.geography], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; diff --git a/sdk/maps/maps-render/src/operationsInterfaces/index.ts b/sdk/maps/maps-render/src/operationsInterfaces/index.ts deleted file mode 100644 index 46a2724214fc..000000000000 --- a/sdk/maps/maps-render/src/operationsInterfaces/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./render"; -export * from "./renderV2"; diff --git a/sdk/maps/maps-render/src/operationsInterfaces/render.ts b/sdk/maps/maps-render/src/operationsInterfaces/render.ts deleted file mode 100644 index f25853d1b1c3..000000000000 --- a/sdk/maps/maps-render/src/operationsInterfaces/render.ts +++ /dev/null @@ -1,310 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { - RasterTileFormat, - RenderGetMapStaticImageOptionalParams, - RenderGetMapStaticImageResponse, - TileFormat, - MapTileLayer, - MapTileStyle, - RenderGetMapTileOptionalParams, - RenderGetMapTileResponse, - RenderGetMapStateTilePreviewOptionalParams, - RenderGetMapStateTilePreviewResponse, - TextFormat, - RenderGetCopyrightCaptionOptionalParams, - RenderGetCopyrightCaptionResponse, - MapImageryStyle, - RenderGetMapImageryTileOptionalParams, - RenderGetMapImageryTileResponse, - RenderGetCopyrightFromBoundingBoxOptionalParams, - RenderGetCopyrightFromBoundingBoxResponse, - RenderGetCopyrightForTileOptionalParams, - RenderGetCopyrightForTileResponse, - RenderGetCopyrightForWorldOptionalParams, - RenderGetCopyrightForWorldResponse -} from "../models"; - -/** Interface representing a Render. */ -export interface Render { - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * The static image service renders a user-defined, rectangular image containing a map section using a - * zoom level from 0 to 20. The static image service renders a user-defined, rectangular image - * containing a map section using a zoom level from 0 to 20. The supported resolution range for the map - * image is from 1x1 to 8192x8192. If you are deciding when to use the static image service over the - * map tile service, you may want to consider how you would like to interact with the rendered map. If - * the map contents will be relatively unchanging, a static map is a good choice. If you want to - * support a lot of zooming, panning and changing of the map content, the map tile service would be a - * better choice. - * - * Service also provides Image Composition functionality to get a static image back with additional - * data like; pushpins and geometry overlays with following S0 and S1 capabilities. - * - * In S0 you can: - * - Render up to 5 pushpins specified in the request - * - Provide one custom image for the pins referenced in the request - * - Add labels to the pushpins - * - * In S1 you can: - * - Render pushpins through [Azure Maps Data Service](https://aka.ms/AzureMapsMapDataService) - * - Specify multiple pushpin styles - * - Provide custom pushpin images stored in [Azure Maps Data - * Service](https://aka.ms/AzureMapsMapDataService) - * - Render circle, polyline and polygon geometry types. - * - Render of supported GeoJSON geometry types uploaded through [Azure Maps Data - * Service](https://aka.ms/AzureMapsMapDataService) - * - * Please see [How-to-Guide](https://aka.ms/AzureMapsHowToGuideImageCompositor) for detailed examples. - * - * _Note_ : Either **center** or **bbox** parameter must be supplied to the - * API. - *

- * The supported Lat and Lon ranges when using the **bbox** parameter, are as follows: - *

- * - * |Zoom Level | Max Lon Range | Max Lat Range| - * |:----------|:----------------|:-------------| - * |0 | 360.0 | 170.0 | - * |1 | 360.0 | 170.0 | - * |2 | 360.0 | 170.0 | - * |3 | 360.0 | 170.0 | - * |4 | 360.0 | 170.0 | - * |5 | 180.0 | 85.0 | - * |6 | 90.0 | 42.5 | - * |7 | 45.0 | 21.25 | - * |8 | 22.5 | 10.625 | - * |9 | 11.25 | 5.3125 | - * |10 | 5.625 | 2.62625 | - * |11 | 2.8125 | 1.328125 | - * |12 | 1.40625 | 0.6640625 | - * |13 | 0.703125 | 0.33203125 | - * |14 | 0.3515625 | 0.166015625 | - * |15 | 0.17578125 | 0.0830078125 | - * |16 | 0.087890625 | 0.0415039063 | - * |17 | 0.0439453125 | 0.0207519531 | - * |18 | 0.0219726563 | 0.0103759766 | - * |19 | 0.0109863281 | 0.0051879883 | - * |20 | 0.0054931641 | 0.0025939941 | - * @param format Desired format of the response. Possible value: png. - * @param options The options parameters. - */ - getMapStaticImage( - format: RasterTileFormat, - options?: RenderGetMapStaticImageOptionalParams - ): Promise; - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Fetches map tiles in vector or raster format typically to be integrated into a new map control or - * SDK. By default, Azure uses vector map tiles for its web map control (see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid)) - * - * **Note**: Weather tiles are only available via [Get Map Tile V2 - * API](https://aka.ms/AzureMapsWeatherTiles). We recommend to start to use the new [Get Map Tile V2 - * API](https://aka.ms/GetMapTileV2). - * @param format Desired format of the response. Possible values are png & pbf. - * @param layer Map layer requested. Possible values are basic, hybrid, labels and terra. - * @param style Map style to be returned. Possible values are main, dark, and shaded_relief. - * @param zoom Zoom level for the desired tile. For _raster_ tiles, value must be in the range: 0-18 - * (inclusive). Terra raster tiles, values must be in the range 0-6 (inclusive). For _vector_ tiles, - * value must be in the range: 0-22 (inclusive). - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param options The options parameters. - */ - getMapTile( - format: TileFormat, - layer: MapTileLayer, - style: MapTileStyle, - zoom: number, - xTileIndex: number, - yTileIndex: number, - options?: RenderGetMapTileOptionalParams - ): Promise; - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Fetches state tiles in vector format typically to be integrated into indoor maps module of map - * control or SDK. The map control will call this API after user turns on dynamic styling (see [Zoom - * Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid)) - * @param zoom Zoom level for the desired tile. Zoom value must be in the range: 0-20 (inclusive). - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param statesetId The stateset id. - * @param options The options parameters. - */ - getMapStateTilePreview( - zoom: number, - xTileIndex: number, - yTileIndex: number, - statesetId: string, - options?: RenderGetMapStateTilePreviewOptionalParams - ): Promise; - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * - * Copyrights API is designed to serve copyright information for Render Tile - * service. In addition to basic copyright for the whole map, API is serving - * specific groups of copyrights for some countries. - * - * As an alternative to copyrights for map request, one can receive captions - * for displaying the map provider information on the map. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param options The options parameters. - */ - getCopyrightCaption( - format: TextFormat, - options?: RenderGetCopyrightCaptionOptionalParams - ): Promise; - /** - * **Applies to:** S1 pricing tier. - * - * - * This service returns a map image tile with size 256x256, given the x and y coordinates and zoom - * level. Zoom level ranges from 1 to 19. The current available style value is 'satellite' which - * provides satellite - * imagery alone. - * - * - * **Note**: We recommend to start to use the new [Get Map Tile V2 API](https://aka.ms/GetMapTileV2). - * @param format Desired format of the response. Possible value: png. - * @param style Map style to be returned. __Possible values:__ satellite. - * @param zoom Zoom level for the desired tile. Zoom value must be in the range: 1-19 (inclusive). - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param options The options parameters. - */ - getMapImageryTile( - format: RasterTileFormat, - style: MapImageryStyle, - zoom: number, - xTileIndex: number, - yTileIndex: number, - options?: RenderGetMapImageryTileOptionalParams - ): Promise; - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Returns copyright information for a given bounding box. Bounding-box requests should specify the - * minimum and maximum longitude and latitude (EPSG-3857) coordinates - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param mincoordinates Minimum coordinates of bounding box in latitude longitude coordinate system. - * E.g. 52.41064,4.84228 - * @param maxcoordinates Maximum coordinates of bounding box in latitude longitude coordinate system. - * E.g. 52.41064,4.84228 - * @param options The options parameters. - */ - getCopyrightFromBoundingBox( - format: TextFormat, - mincoordinates: string, - maxcoordinates: string, - options?: RenderGetCopyrightFromBoundingBoxOptionalParams - ): Promise; - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * - * Copyrights API is designed to serve copyright information for Render Tile service. In addition to - * basic copyright for the whole map, API is serving specific groups of copyrights for some countries. - * Returns the copyright information for a given tile. To obtain the copyright information for a - * particular tile, the request should specify the tile's zoom level and x and y coordinates (see: Zoom - * Levels and Tile Grid). - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param zoom Zoom level for the desired tile. Zoom value must be in the range: 0-18 (inclusive). - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param options The options parameters. - */ - getCopyrightForTile( - format: TextFormat, - zoom: number, - xTileIndex: number, - yTileIndex: number, - options?: RenderGetCopyrightForTileOptionalParams - ): Promise; - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Copyrights API is designed to serve copyright information for Render Tile service. In addition to - * basic copyright for the whole map, API is serving specific groups of copyrights for some countries. - * Returns the copyright information for the world. To obtain the default copyright information for the - * whole world, do not specify a tile or bounding box. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param options The options parameters. - */ - getCopyrightForWorld( - format: TextFormat, - options?: RenderGetCopyrightForWorldOptionalParams - ): Promise; -} diff --git a/sdk/maps/maps-render/src/operationsInterfaces/renderV2.ts b/sdk/maps/maps-render/src/operationsInterfaces/renderV2.ts deleted file mode 100644 index e3180fd984dc..000000000000 --- a/sdk/maps/maps-render/src/operationsInterfaces/renderV2.ts +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { - TilesetID, - RenderV2GetMapTilePreviewOptionalParams, - RenderV2GetMapTilePreviewResponse -} from "../models"; - -/** Interface representing a RenderV2. */ -export interface RenderV2 { - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * The Get Map Tiles API allows users to request map tiles in vector or raster formats typically to be - * integrated into a map control or SDK. Some example tiles that can be requested are Azure Maps road - * tiles, real-time Weather Radar tiles or the map tiles created using [Azure Maps - * Creator](https://aka.ms/amcreator). By default, Azure Maps uses vector tiles for its web map - * control (Web SDK) and Android SDK. - * @param tilesetId A tileset is a collection of raster or vector data broken up into a uniform grid of - * square tiles at preset zoom levels. Every tileset has a **tilesetId** to use when making requests. - * The **tilesetId** for tilesets created using [Azure Maps Creator](https://aka.ms/amcreator) are - * generated through the [Tileset Create API](https://docs.microsoft.com/en-us/rest/api/maps/tileset). - * The ready-to-use tilesets supplied by Azure Maps are listed below. For example, microsoft.base. - * @param zoom Zoom level for the desired tile. Please find TilesetID list below for more details on - * supported zoom level for each tilesetId.
- * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param options The options parameters. - */ - getMapTilePreview( - tilesetId: TilesetID, - zoom: number, - xTileIndex: number, - yTileIndex: number, - options?: RenderV2GetMapTilePreviewOptionalParams - ): Promise; -} diff --git a/sdk/maps/maps-render/src/renderClient.ts b/sdk/maps/maps-render/src/renderClient.ts deleted file mode 100644 index af30456e1efd..000000000000 --- a/sdk/maps/maps-render/src/renderClient.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreAuth from "@azure/core-auth"; -import { RenderImpl, RenderV2Impl } from "./operations"; -import { Render, RenderV2 } from "./operationsInterfaces"; -import { RenderClientContext } from "./renderClientContext"; -import { RenderClientOptionalParams } from "./models"; - -export class RenderClient extends RenderClientContext { - /** - * Initializes a new instance of the RenderClient class. - * @param credentials Subscription credentials which uniquely identify client subscription. - * @param options The parameter options - */ - constructor( - credentials: coreAuth.TokenCredential, - options?: RenderClientOptionalParams - ) { - super(credentials, options); - this.render = new RenderImpl(this); - this.renderV2 = new RenderV2Impl(this); - } - - render: Render; - renderV2: RenderV2; -} diff --git a/sdk/maps/maps-render/src/renderClientContext.ts b/sdk/maps/maps-render/src/renderClientContext.ts deleted file mode 100644 index 9a1fea2a958a..000000000000 --- a/sdk/maps/maps-render/src/renderClientContext.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; -import * as coreAuth from "@azure/core-auth"; -import { Geography, RenderClientOptionalParams } from "./models"; - -export class RenderClientContext extends coreClient.ServiceClient { - geography: Geography; - xMsClientId?: string; - - /** - * Initializes a new instance of the RenderClientContext class. - * @param credentials Subscription credentials which uniquely identify client subscription. - * @param options The parameter options - */ - constructor( - credentials: coreAuth.TokenCredential, - options?: RenderClientOptionalParams - ) { - if (credentials === undefined) { - throw new Error("'credentials' cannot be null"); - } - - // Initializing default values for options - if (!options) { - options = {}; - } - const defaults: RenderClientOptionalParams = { - requestContentType: "application/json; charset=utf-8", - credential: credentials - }; - - const packageDetails = `azsdk-js-maps-render/1.0.0-beta.1`; - const userAgentPrefix = - options.userAgentOptions && options.userAgentOptions.userAgentPrefix - ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` - : `${packageDetails}`; - - if (!options.credentialScopes) { - options.credentialScopes = ["https://atlas.microsoft.com/.default"]; - } - const optionsWithDefaults = { - ...defaults, - ...options, - userAgentOptions: { - userAgentPrefix - }, - baseUri: options.endpoint || "https://{geography}.atlas.microsoft.com" - }; - super(optionsWithDefaults); - - // Assigning values to Constant parameters - this.geography = options.geography || "us"; - } -} diff --git a/sdk/maps/maps-render/tsconfig.json b/sdk/maps/maps-render/tsconfig.json deleted file mode 100644 index 0ec8659c8e83..000000000000 --- a/sdk/maps/maps-render/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "module": "es6", - "moduleResolution": "node", - "strict": true, - "target": "es6", - "sourceMap": true, - "declarationMap": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "preserveConstEnums": true, - "lib": ["es6", "dom"], - "declaration": true, - "outDir": "./esm", - "importHelpers": true - }, - "include": ["./src/**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/sdk/maps/maps-route/LICENSE.txt b/sdk/maps/maps-route/LICENSE.txt deleted file mode 100644 index ccb63b166732..000000000000 --- a/sdk/maps/maps-route/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2021 Microsoft - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/sdk/maps/maps-route/README.md b/sdk/maps/maps-route/README.md deleted file mode 100644 index 9342c4a84d13..000000000000 --- a/sdk/maps/maps-route/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# Azure Route client library for JavaScript - -This package contains an isomorphic SDK (runs both in Node.js and in browsers) for Azure Route client. - -Azure Maps Route REST APIs - -[Source code](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-route) | -[Package (NPM)](https://www.npmjs.com/package/@azure/maps-route) | -[API reference documentation](https://docs.microsoft.com/javascript/api/@azure/maps-route) | -[Samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-route/samples) - -## Getting started - -### Currently supported environments - -- [LTS versions of Node.js](https://nodejs.org/about/releases/) -- Latest versions of Safari, Chrome, Edge and Firefox. - -### Prerequisites - -- An [Azure subscription][azure_sub]. - -### Install the `@azure/maps-route` package - -Install the Azure Route client library for JavaScript with `npm`: - -```bash -npm install @azure/maps-route -``` - -### Create and authenticate a `RouteClient` - -To create a client object to access the Azure Route API, you will need the `endpoint` of your Azure Route resource and a `credential`. The Azure Route client can use Azure Active Directory credentials to authenticate. -You can find the endpoint for your Azure Route resource in the [Azure Portal][azure_portal]. - -#### Using an Azure Active Directory Credential - -You can authenticate with Azure Active Directory using the [Azure Identity library][azure_identity]. To use the [DefaultAzureCredential][defaultazurecredential] provider shown below, or other credential providers provided with the Azure SDK, please install the `@azure/identity` package: - -```bash -npm install @azure/identity -``` - -You will also need to register a new AAD application and grant access to Azure Route by assigning the suitable role to your service principal (note: roles such as `"Owner"` will not grant the necessary permissions). -Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`. - -```javascript -const { RouteClient } = require("@azure/maps-route"); -const { DefaultAzureCredential } = require("@azure/identity"); -const client = new RouteClient("", new DefaultAzureCredential()); -``` - -## Key concepts - -### RouteClient - -`RouteClient` is the primary interface for developers using the Azure Route client library. Explore the methods on this client object to understand the different features of the Azure Route service that you can access. - -## Troubleshooting - -### Logging - -Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: - -```javascript -import { setLogLevel } from "@azure/logger"; -setLogLevel("info"); -``` - -For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger). - -## Next steps - -Please take a look at the [samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-route/samples) directory for detailed examples on how to use this library. - -## Contributing - -If you'd like to contribute to this library, please read the [contributing guide](https://github.com/Azure/azure-sdk-for-js/blob/master/CONTRIBUTING.md) to learn more about how to build and test the code. - -## Related projects - -- [Microsoft Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) - -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fmaps%2Fmaps-route%2FREADME.png) - -[azure_cli]: https://docs.microsoft.com/cli/azure -[azure_sub]: https://azure.microsoft.com/free/ -[azure_sub]: https://azure.microsoft.com/free/ -[azure_portal]: https://portal.azure.com -[azure_identity]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity -[defaultazurecredential]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity#defaultazurecredential diff --git a/sdk/maps/maps-route/api-extractor.json b/sdk/maps/maps-route/api-extractor.json deleted file mode 100644 index 5fb5b21b56f2..000000000000 --- a/sdk/maps/maps-route/api-extractor.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", - "mainEntryPointFilePath": "./esm/index.d.ts", - "docModel": { "enabled": true }, - "apiReport": { "enabled": true, "reportFolder": "./review" }, - "dtsRollup": { - "enabled": true, - "untrimmedFilePath": "", - "publicTrimmedFilePath": "./esm/index.d.ts" - }, - "messages": { - "tsdocMessageReporting": { "default": { "logLevel": "none" } }, - "extractorMessageReporting": { - "ae-missing-release-tag": { "logLevel": "none" }, - "ae-unresolved-link": { "logLevel": "none" } - } - } -} diff --git a/sdk/maps/maps-route/package.json b/sdk/maps/maps-route/package.json deleted file mode 100644 index 16b264a37664..000000000000 --- a/sdk/maps/maps-route/package.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "name": "@azure/maps-route", - "sdk-type": "client", - "author": "Microsoft Corporation", - "description": "A generated SDK for RouteClient.", - "version": "1.0.0-beta.1", - "engines": { "node": ">=12.0.0" }, - "dependencies": { - "@azure/core-lro": "^1.0.6", - "@azure/abort-controller": "^1.0.0", - "@azure/core-client": "^1.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-rest-pipeline": "^1.1.0", - "tslib": "^2.2.0" - }, - "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], - "license": "MIT", - "main": "./dist/index.js", - "module": "./esm/index.js", - "types": "./esm/index.d.ts", - "devDependencies": { - "@microsoft/api-extractor": "7.7.11", - "@rollup/plugin-commonjs": "11.0.2", - "@rollup/plugin-json": "^4.0.0", - "@rollup/plugin-multi-entry": "^3.0.0", - "@rollup/plugin-node-resolve": "^8.0.0", - "mkdirp": "^1.0.4", - "rollup": "^1.16.3", - "rollup-plugin-sourcemaps": "^0.4.2", - "rollup-plugin-node-resolve": "^3.4.0", - "typescript": "~4.2.0", - "uglify-js": "^3.4.9" - }, - "homepage": "https://github.com/Azure/azure-sdk-for-js", - "repository": { - "type": "git", - "url": "https://github.com/Azure/azure-sdk-for-js.git" - }, - "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, - "files": [ - "dist/**/*.js", - "dist/**/*.js.map", - "dist/**/*.d.ts", - "dist/**/*.d.ts.map", - "esm/**/*.js", - "esm/**/*.js.map", - "esm/**/*.d.ts", - "esm/**/*.d.ts.map", - "src/**/*.ts", - "README.md", - "rollup.config.js", - "tsconfig.json", - "review/*", - "CHANGELOG.md" - ], - "scripts": { - "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", - "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js", - "prepack": "npm install && npm run build", - "pack": "npm pack 2>&1", - "extract-api": "mkdirp ./review && api-extractor run --local", - "lint": "echo skipped", - "audit": "echo skipped", - "clean": "echo skipped", - "build:node": "echo skipped", - "build:browser": "echo skipped", - "build:test": "echo skipped", - "build:samples": "echo skipped.", - "check-format": "echo skipped", - "execute:samples": "echo skipped", - "format": "echo skipped", - "test": "echo skipped", - "prebuild": "echo skipped", - "test:node": "echo skipped", - "test:browser": "echo skipped", - "unit-test": "echo skipped", - "unit-test:node": "echo skipped", - "unit-test:browser": "echo skipped", - "integration-test:browser": "echo skipped", - "integration-test:node": "echo skipped", - "integration-test": "echo skipped", - "docs": "echo skipped" - }, - "sideEffects": false, - "autoPublish": true -} diff --git a/sdk/maps/maps-route/review/maps-route.api.md b/sdk/maps/maps-route/review/maps-route.api.md deleted file mode 100644 index 112bebaf9259..000000000000 --- a/sdk/maps/maps-route/review/maps-route.api.md +++ /dev/null @@ -1,882 +0,0 @@ -## API Report File for "@azure/maps-route" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -import * as coreAuth from '@azure/core-auth'; -import * as coreClient from '@azure/core-client'; -import { PollerLike } from '@azure/core-lro'; -import { PollOperationState } from '@azure/core-lro'; - -// @public -export type AlternativeRouteType = string; - -// @public -export interface BatchItem { - readonly statusCode?: number; -} - -// @public -export interface BatchRequestBody { - batchItems?: BatchRequestBodyBatchItemsItem[]; -} - -// @public -export interface BatchRequestBodyBatchItemsItem { - query?: string; -} - -// @public -export interface BatchResponse { - readonly summary?: BatchResponseSummary; -} - -// @public -export interface BatchResponseSummary { - readonly successfulRequests?: number; - readonly totalRequests?: number; -} - -// @public -export type ComputeTravelTimeFor = string; - -// @public -export interface CoordinatesPair { - latitude?: number; - longitude?: number; -} - -// @public -export type DrivingSide = string; - -// @public -export interface ErrorAdditionalInfo { - readonly info?: Record; - readonly type?: string; -} - -// @public -export interface ErrorDetail { - readonly additionalInfo?: ErrorAdditionalInfo[]; - readonly code?: string; - readonly details?: ErrorDetail[]; - readonly message?: string; - readonly target?: string; -} - -// @public -export interface ErrorResponse { - error?: ErrorDetail; -} - -// @public -export type GeographicResourceLocation = string; - -// @public -export type Geography = string; - -// @public -export type GeoJsonFeature = GeoJsonObject & GeoJsonFeatureData & { - type: "Feature"; -}; - -// @public -export type GeoJsonFeatureCollection = GeoJsonObject & GeoJsonFeatureCollectionData & { - type: "FeatureCollection"; -}; - -// @public (undocumented) -export interface GeoJsonFeatureCollectionData { - features: GeoJsonFeature[]; -} - -// @public (undocumented) -export interface GeoJsonFeatureData { - featureType?: string; - geometry: GeoJsonGeometryUnion; - id?: string; - properties?: Record; -} - -// @public -export type GeoJsonGeometry = GeoJsonObject & { - type: "GeoJsonGeometry" | "MultiPoint" | "MultiPolygon" | "Point" | "LineString" | "MultiLineString" | "Polygon" | "GeometryCollection"; -}; - -// @public -export type GeoJsonGeometryCollection = GeoJsonGeometry & GeoJsonGeometryCollectionData & {}; - -// @public (undocumented) -export interface GeoJsonGeometryCollectionData { - geometries: GeoJsonGeometryUnion[]; -} - -// @public (undocumented) -export type GeoJsonGeometryUnion = GeoJsonGeometry | GeoJsonMultiPoint | GeoJsonMultiPolygon | GeoJsonPoint | GeoJsonLineString | GeoJsonMultiLineString | GeoJsonPolygon | GeoJsonGeometryCollection; - -// @public -export type GeoJsonLineString = GeoJsonGeometry & GeoJsonLineStringData & {}; - -// @public (undocumented) -export interface GeoJsonLineStringData { - coordinates: number[][]; -} - -// @public -export type GeoJsonMultiLineString = GeoJsonGeometry & GeoJsonMultiLineStringData & {}; - -// @public (undocumented) -export interface GeoJsonMultiLineStringData { - coordinates: number[][][]; -} - -// @public -export type GeoJsonMultiPoint = GeoJsonGeometry & GeoJsonMultiPointData & {}; - -// @public -export interface GeoJsonMultiPointData { - coordinates: number[][]; -} - -// @public -export type GeoJsonMultiPolygon = GeoJsonGeometry & GeoJsonMultiPolygonData & {}; - -// @public (undocumented) -export interface GeoJsonMultiPolygonData { - coordinates: number[][][][]; -} - -// @public -export interface GeoJsonObject { - type: "GeoJsonGeometry" | "MultiPoint" | "MultiPolygon" | "Point" | "LineString" | "MultiLineString" | "Polygon" | "GeometryCollection" | "Feature" | "FeatureCollection"; -} - -// @public -export type GeoJsonObjectType = string; - -// @public (undocumented) -export type GeoJsonObjectUnion = GeoJsonObject | GeoJsonGeometryUnion | GeoJsonFeature | GeoJsonFeatureCollection; - -// @public -export type GeoJsonPoint = GeoJsonGeometry & GeoJsonPointData & {}; - -// @public -export interface GeoJsonPointData { - coordinates: number[]; -} - -// @public -export type GeoJsonPolygon = GeoJsonGeometry & GeoJsonPolygonData & {}; - -// @public (undocumented) -export interface GeoJsonPolygonData { - coordinates: number[][][]; -} - -// @public -export interface GetRouteRangeResponse { - readonly formatVersion?: string; - reachableRange?: RouteRange; - report?: RouteResponseReport; -} - -// @public -export type GuidanceInstructionType = string; - -// @public -export type GuidanceManeuver = string; - -// @public -export type HillinessDegree = string; - -// @public -export type JunctionType = string; - -// @public -export const enum KnownAlternativeRouteType { - AnyRoute = "anyRoute", - BetterRoute = "betterRoute" -} - -// @public -export const enum KnownComputeTravelTimeFor { - All = "all", - None = "none" -} - -// @public -export const enum KnownDrivingSide { - Left = "LEFT", - Right = "RIGHT" -} - -// @public -export const enum KnownGeographicResourceLocation { - Eu = "eu", - Us = "us" -} - -// @public -export const enum KnownGeography { - // (undocumented) - Eu = "eu", - // (undocumented) - Us = "us" -} - -// @public -export const enum KnownGeoJsonObjectType { - GeoJsonFeature = "Feature", - GeoJsonFeatureCollection = "FeatureCollection", - GeoJsonGeometryCollection = "GeometryCollection", - GeoJsonLineString = "LineString", - GeoJsonMultiLineString = "MultiLineString", - GeoJsonMultiPoint = "MultiPoint", - GeoJsonMultiPolygon = "MultiPolygon", - GeoJsonPoint = "Point", - GeoJsonPolygon = "Polygon" -} - -// @public -export const enum KnownGuidanceInstructionType { - DirectionInfo = "DIRECTION_INFO", - LocationArrival = "LOCATION_ARRIVAL", - LocationDeparture = "LOCATION_DEPARTURE", - LocationWaypoint = "LOCATION_WAYPOINT", - RoadChange = "ROAD_CHANGE", - Turn = "TURN" -} - -// @public -export const enum KnownGuidanceManeuver { - Arrive = "ARRIVE", - ArriveLeft = "ARRIVE_LEFT", - ArriveRight = "ARRIVE_RIGHT", - BearLeft = "BEAR_LEFT", - BearRight = "BEAR_RIGHT", - Depart = "DEPART", - EnterFreeway = "ENTER_FREEWAY", - EnterHighway = "ENTER_HIGHWAY", - EnterMotorway = "ENTER_MOTORWAY", - EntranceRamp = "ENTRANCE_RAMP", - Follow = "FOLLOW", - KeepLeft = "KEEP_LEFT", - KeepRight = "KEEP_RIGHT", - MakeUturn = "MAKE_UTURN", - MotorwayExitLeft = "MOTORWAY_EXIT_LEFT", - MotorwayExitRight = "MOTORWAY_EXIT_RIGHT", - RoundaboutBack = "ROUNDABOUT_BACK", - RoundaboutCross = "ROUNDABOUT_CROSS", - RoundaboutLeft = "ROUNDABOUT_LEFT", - RoundaboutRight = "ROUNDABOUT_RIGHT", - SharpLeft = "SHARP_LEFT", - SharpRight = "SHARP_RIGHT", - Straight = "STRAIGHT", - SwitchMainRoad = "SWITCH_MAIN_ROAD", - SwitchParallelRoad = "SWITCH_PARALLEL_ROAD", - TakeExit = "TAKE_EXIT", - TakeFerry = "TAKE_FERRY", - TRYMakeUturn = "TRY_MAKE_UTURN", - TurnLeft = "TURN_LEFT", - TurnRight = "TURN_RIGHT", - WaypointLeft = "WAYPOINT_LEFT", - WaypointReached = "WAYPOINT_REACHED", - WaypointRight = "WAYPOINT_RIGHT" -} - -// @public -export const enum KnownHillinessDegree { - High = "high", - Low = "low", - Normal = "normal" -} - -// @public -export const enum KnownJunctionType { - Bifurcation = "BIFURCATION", - Regular = "REGULAR", - Roundabout = "ROUNDABOUT" -} - -// @public -export const enum KnownMagnitudeOfDelay { - Four = "4", - One = "1", - Three = "3", - Two = "2", - Zero = "0" -} - -// @public -export const enum KnownResponseFormat { - Json = "json" -} - -// @public -export const enum KnownRouteAvoidType { - AlreadyUsedRoads = "alreadyUsedRoads", - BorderCrossings = "borderCrossings", - Carpools = "carpools", - Ferries = "ferries", - Motorways = "motorways", - TollRoads = "tollRoads", - UnpavedRoads = "unpavedRoads" -} - -// @public -export const enum KnownRouteInstructionsType { - Coded = "coded", - Tagged = "tagged", - Text = "text" -} - -// @public -export const enum KnownRouteRepresentation { - None = "none", - Polyline = "polyline", - SummaryOnly = "summaryOnly" -} - -// @public -export const enum KnownRouteType { - Eco = "eco", - Fastest = "fastest", - Shortest = "shortest", - Thrilling = "thrilling" -} - -// @public -export const enum KnownSectionType { - CarTrain = "carTrain", - Country = "country", - Ferry = "ferry", - Motorway = "motorway", - Pedestrian = "pedestrian", - TollRoad = "tollRoad", - TollVignette = "tollVignette", - Traffic = "traffic", - TravelMode = "travelMode", - Tunnel = "tunnel" -} - -// @public -export const enum KnownTextFormat { - Json = "json", - Xml = "xml" -} - -// @public -export const enum KnownTravelMode { - Bicycle = "bicycle", - Bus = "bus", - Car = "car", - Motorcycle = "motorcycle", - Pedestrian = "pedestrian", - Taxi = "taxi", - Truck = "truck", - Van = "van" -} - -// @public -export const enum KnownVehicleEngineType { - Combustion = "combustion", - Electric = "electric" -} - -// @public -export const enum KnownVehicleLoadType { - OtherHazmatExplosive = "otherHazmatExplosive", - OtherHazmatGeneral = "otherHazmatGeneral", - OtherHazmatHarmfulToWater = "otherHazmatHarmfulToWater", - USHazmatClass1 = "USHazmatClass1", - USHazmatClass2 = "USHazmatClass2", - USHazmatClass3 = "USHazmatClass3", - USHazmatClass4 = "USHazmatClass4", - USHazmatClass5 = "USHazmatClass5", - USHazmatClass6 = "USHazmatClass6", - USHazmatClass7 = "USHazmatClass7", - USHazmatClass8 = "USHazmatClass8", - USHazmatClass9 = "USHazmatClass9" -} - -// @public -export const enum KnownWindingnessLevel { - High = "high", - Low = "low", - Normal = "normal" -} - -// @public -export type MagnitudeOfDelay = string; - -// @public -export interface PostRouteDirectionsRequestBody { - allowVignette?: string[]; - avoidAreas?: GeoJsonMultiPolygon; - avoidVignette?: string[]; - supportingPoints?: Record; -} - -// @public -export interface PostRouteMatrixRequestBody { - destinations?: GeoJsonMultiPoint; - origins?: GeoJsonMultiPoint; -} - -// @public -export type ResponseFormat = string; - -// @public -export interface Route { - beginPostRouteDirectionsBatch(format: ResponseFormat, postRouteDirectionsBatchRequestBody: BatchRequestBody, options?: RoutePostRouteDirectionsBatchOptionalParams): Promise, RoutePostRouteDirectionsBatchResponse>>; - beginPostRouteDirectionsBatchAndWait(format: ResponseFormat, postRouteDirectionsBatchRequestBody: BatchRequestBody, options?: RoutePostRouteDirectionsBatchOptionalParams): Promise; - beginPostRouteMatrix(format: ResponseFormat, postRouteMatrixRequestBody: PostRouteMatrixRequestBody, options?: RoutePostRouteMatrixOptionalParams): Promise, RoutePostRouteMatrixResponse>>; - beginPostRouteMatrixAndWait(format: ResponseFormat, postRouteMatrixRequestBody: PostRouteMatrixRequestBody, options?: RoutePostRouteMatrixOptionalParams): Promise; - getRouteDirections(format: TextFormat, query: string, options?: RouteGetRouteDirectionsOptionalParams): Promise; - getRouteRange(format: TextFormat, query: string, options?: RouteGetRouteRangeOptionalParams): Promise; - postRouteDirections(format: TextFormat, query: string, postRouteDirectionsRequestBody: PostRouteDirectionsRequestBody, options?: RoutePostRouteDirectionsOptionalParams): Promise; - postRouteDirectionsBatchSync(format: ResponseFormat, postRouteDirectionsBatchRequestBody: BatchRequestBody, options?: RoutePostRouteDirectionsBatchSyncOptionalParams): Promise; - postRouteMatrixSync(format: ResponseFormat, postRouteMatrixRequestBody: PostRouteMatrixRequestBody, options?: RoutePostRouteMatrixSyncOptionalParams): Promise; -} - -// @public -export type RouteAvoidType = string; - -// @public (undocumented) -export class RouteClient extends RouteClientContext { - constructor(credentials: coreAuth.TokenCredential, options?: RouteClientOptionalParams); - // (undocumented) - route: Route; -} - -// @public (undocumented) -export class RouteClientContext extends coreClient.ServiceClient { - constructor(credentials: coreAuth.TokenCredential, options?: RouteClientOptionalParams); - // (undocumented) - apiVersion: string; - // (undocumented) - geography: Geography; - // (undocumented) - xMsClientId?: string; -} - -// @public -export interface RouteClientOptionalParams extends coreClient.ServiceClientOptions { - apiVersion?: string; - endpoint?: string; - geography?: Geography; - xMsClientId?: string; -} - -// @public -export type RouteDirectionsBatchItem = BatchItem & { - readonly response?: RouteDirectionsBatchItemResponse; -}; - -// @public -export type RouteDirectionsBatchItemResponse = RouteDirectionsResponse & ErrorResponse & {}; - -// @public -export type RouteDirectionsBatchResponse = BatchResponse & { - readonly batchItems?: RouteDirectionsBatchItem[]; -}; - -// @public -export interface RouteDirectionsResponse { - readonly formatVersion?: string; - readonly optimizedWaypoints?: RouteOptimizedWaypoint[]; - report?: RouteResponseReport; - readonly routes?: RouteDirectionsResult[]; -} - -// @public (undocumented) -export interface RouteDirectionsResult { - readonly guidance?: RouteResultGuidance; - readonly legs?: RouteResultLeg[]; - readonly sections?: RouteResultSection[]; - readonly summary?: RouteDirectionsSummary; -} - -// @public -export interface RouteDirectionsSummary { - readonly arrivalTime?: string; - readonly departureTime?: string; - readonly lengthInMeters?: number; - readonly trafficDelayInSeconds?: number; - readonly travelTimeInSeconds?: number; -} - -// @public -export interface RouteGetRouteDirectionsOptionalParams extends coreClient.OperationOptions { - accelerationEfficiency?: number; - alternativeType?: AlternativeRouteType; - arriveAt?: Date; - auxiliaryPowerInkW?: string; - auxiliaryPowerInLitersPerHour?: number; - avoid?: RouteAvoidType[]; - computeBestOrder?: boolean; - computeTravelTimeFor?: ComputeTravelTimeFor; - constantSpeedConsumptionInkWhPerHundredkm?: string; - constantSpeedConsumptionInLitersPerHundredkm?: number; - currentChargeInkWh?: string; - currentFuelInLiters?: number; - decelerationEfficiency?: number; - departAt?: Date; - downhillEfficiency?: number; - fuelEnergyDensityInMJoulesPerLiter?: number; - hilliness?: HillinessDegree; - instructionsType?: RouteInstructionsType; - language?: string; - maxAlternatives?: number; - maxChargeInkWh?: string; - minDeviationDistance?: number; - minDeviationTime?: number; - report?: string; - routeRepresentation?: RouteRepresentation; - routeType?: RouteType; - sectionType?: SectionType; - traffic?: boolean; - travelMode?: TravelMode; - uphillEfficiency?: number; - vehicleAxleWeight?: number; - vehicleCommercial?: boolean; - vehicleEngineType?: VehicleEngineType; - vehicleHeading?: number; - vehicleHeight?: number; - vehicleLength?: number; - vehicleLoadType?: VehicleLoadType; - vehicleMaxSpeed?: number; - vehicleWeight?: number; - vehicleWidth?: number; - windingness?: WindingnessLevel; -} - -// @public -export type RouteGetRouteDirectionsResponse = RouteDirectionsResponse; - -// @public -export interface RouteGetRouteRangeOptionalParams extends coreClient.OperationOptions { - accelerationEfficiency?: number; - auxiliaryPowerInkW?: string; - auxiliaryPowerInLitersPerHour?: number; - avoid?: RouteAvoidType[]; - constantSpeedConsumptionInkWhPerHundredkm?: string; - constantSpeedConsumptionInLitersPerHundredkm?: number; - currentChargeInkWh?: string; - currentFuelInLiters?: number; - decelerationEfficiency?: number; - departAt?: Date; - distanceBudgetInMeters?: number; - downhillEfficiency?: number; - energyBudgetInkWh?: number; - fuelBudgetInLiters?: number; - fuelEnergyDensityInMJoulesPerLiter?: number; - hilliness?: HillinessDegree; - maxChargeInkWh?: string; - routeType?: RouteType; - timeBudgetInSec?: number; - traffic?: boolean; - travelMode?: TravelMode; - uphillEfficiency?: number; - vehicleAxleWeight?: number; - vehicleCommercial?: boolean; - vehicleEngineType?: VehicleEngineType; - vehicleHeight?: number; - vehicleLength?: number; - vehicleLoadType?: VehicleLoadType; - vehicleMaxSpeed?: number; - vehicleWeight?: number; - vehicleWidth?: number; - windingness?: WindingnessLevel; -} - -// @public -export type RouteGetRouteRangeResponse = GetRouteRangeResponse; - -// @public -export type RouteInstructionsType = string; - -// @public -export interface RouteMatrixResponse { - readonly formatVersion?: string; - readonly matrix?: RouteMatrixResult[][]; - readonly summary?: RouteMatrixSummary; -} - -// @public -export interface RouteMatrixResult { - readonly response?: RouteMatrixResultResponse; - readonly statusCode?: number; -} - -// @public -export interface RouteMatrixResultResponse { - readonly routeSummary?: RouteResultLegSummary; -} - -// @public -export interface RouteMatrixSummary { - readonly successfulRoutes?: number; - readonly totalRoutes?: number; -} - -// @public -export interface RouteOptimizedWaypoint { - readonly optimizedIndex?: number; - readonly providedIndex?: number; -} - -// @public -export interface RoutePostRouteDirectionsBatchHeaders { - location?: string; -} - -// @public -export interface RoutePostRouteDirectionsBatchOptionalParams extends coreClient.OperationOptions { - resumeFrom?: string; - updateIntervalInMs?: number; -} - -// @public -export type RoutePostRouteDirectionsBatchResponse = RouteDirectionsBatchResponse; - -// @public -export interface RoutePostRouteDirectionsBatchSyncOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type RoutePostRouteDirectionsBatchSyncResponse = RouteDirectionsBatchResponse; - -// @public -export interface RoutePostRouteDirectionsOptionalParams extends coreClient.OperationOptions { - accelerationEfficiency?: number; - alternativeType?: AlternativeRouteType; - arriveAt?: Date; - auxiliaryPowerInkW?: string; - auxiliaryPowerInLitersPerHour?: number; - avoid?: RouteAvoidType[]; - computeBestOrder?: boolean; - computeTravelTimeFor?: ComputeTravelTimeFor; - constantSpeedConsumptionInkWhPerHundredkm?: string; - constantSpeedConsumptionInLitersPerHundredkm?: number; - currentChargeInkWh?: string; - currentFuelInLiters?: number; - decelerationEfficiency?: number; - departAt?: Date; - downhillEfficiency?: number; - fuelEnergyDensityInMJoulesPerLiter?: number; - hilliness?: HillinessDegree; - instructionsType?: RouteInstructionsType; - language?: string; - maxAlternatives?: number; - maxChargeInkWh?: string; - minDeviationDistance?: number; - minDeviationTime?: number; - report?: string; - routeRepresentation?: RouteRepresentation; - routeType?: RouteType; - sectionType?: SectionType; - traffic?: boolean; - travelMode?: TravelMode; - uphillEfficiency?: number; - vehicleAxleWeight?: number; - vehicleCommercial?: boolean; - vehicleEngineType?: VehicleEngineType; - vehicleHeading?: number; - vehicleHeight?: number; - vehicleLength?: number; - vehicleLoadType?: VehicleLoadType; - vehicleMaxSpeed?: number; - vehicleWeight?: number; - vehicleWidth?: number; - windingness?: WindingnessLevel; -} - -// @public -export type RoutePostRouteDirectionsResponse = RouteDirectionsResponse; - -// @public -export interface RoutePostRouteMatrixHeaders { - location?: string; -} - -// @public -export interface RoutePostRouteMatrixOptionalParams extends coreClient.OperationOptions { - arriveAt?: Date; - avoid?: RouteAvoidType[]; - computeTravelTimeFor?: ComputeTravelTimeFor; - departAt?: Date; - hilliness?: HillinessDegree; - resumeFrom?: string; - routeType?: RouteType; - sectionType?: SectionType; - traffic?: boolean; - travelMode?: TravelMode; - updateIntervalInMs?: number; - vehicleAxleWeight?: number; - vehicleHeight?: number; - vehicleLength?: number; - vehicleLoadType?: VehicleLoadType; - vehicleMaxSpeed?: number; - vehicleWeight?: number; - vehicleWidth?: number; - waitForResults?: boolean; - windingness?: WindingnessLevel; -} - -// @public -export type RoutePostRouteMatrixResponse = RouteMatrixResponse; - -// @public -export interface RoutePostRouteMatrixSyncOptionalParams extends coreClient.OperationOptions { - arriveAt?: Date; - avoid?: RouteAvoidType[]; - computeTravelTimeFor?: ComputeTravelTimeFor; - departAt?: Date; - hilliness?: HillinessDegree; - routeType?: RouteType; - sectionType?: SectionType; - traffic?: boolean; - travelMode?: TravelMode; - vehicleAxleWeight?: number; - vehicleHeight?: number; - vehicleLength?: number; - vehicleLoadType?: VehicleLoadType; - vehicleMaxSpeed?: number; - vehicleWeight?: number; - vehicleWidth?: number; - waitForResults?: boolean; - windingness?: WindingnessLevel; -} - -// @public -export type RoutePostRouteMatrixSyncResponse = RouteMatrixResponse; - -// @public -export interface RouteRange { - readonly boundary?: CoordinatesPair[]; - center?: CoordinatesPair; -} - -// @public -export type RouteRepresentation = string; - -// @public -export interface RouteResponseReport { - readonly effectiveSettings?: RouteResponseReportEffectiveSetting[]; -} - -// @public -export interface RouteResponseReportEffectiveSetting { - readonly key?: string; - readonly value?: string; -} - -// @public -export interface RouteResultGuidance { - readonly instructionGroups?: RouteResultInstructionGroup[]; - readonly instructions?: RouteResultInstruction[]; -} - -// @public -export interface RouteResultInstruction { - readonly combinedMessage?: string; - readonly countryCode?: string; - readonly drivingSide?: DrivingSide; - readonly exitNumber?: string; - instructionType?: GuidanceInstructionType; - readonly junctionType?: JunctionType; - readonly maneuver?: GuidanceManeuver; - readonly message?: string; - point?: CoordinatesPair; - readonly pointIndex?: number; - readonly possibleCombineWithNext?: boolean; - readonly roadNumbers?: string[]; - readonly roundaboutExitNumber?: string; - readonly routeOffsetInMeters?: number; - readonly signpostText?: string; - readonly stateCode?: string; - readonly street?: string; - readonly travelTimeInSeconds?: number; - readonly turnAngleInDecimalDegrees?: number; -} - -// @public -export interface RouteResultInstructionGroup { - readonly firstInstructionIndex?: number; - readonly groupLengthInMeters?: number; - readonly groupMessage?: string; - readonly lastInstructionIndex?: number; -} - -// @public (undocumented) -export interface RouteResultLeg { - readonly points?: CoordinatesPair[]; - readonly summary?: RouteResultLegSummary; -} - -// @public -export interface RouteResultLegSummary { - readonly arrivalTime?: string; - readonly batteryConsumptionInkWh?: number; - readonly departureTime?: string; - readonly fuelConsumptionInLiters?: number; - readonly historicTrafficTravelTimeInSeconds?: number; - readonly lengthInMeters?: number; - readonly liveTrafficIncidentsTravelTimeInSeconds?: number; - readonly noTrafficTravelTimeInSeconds?: number; - readonly trafficDelayInSeconds?: number; - readonly travelTimeInSeconds?: number; -} - -// @public (undocumented) -export interface RouteResultSection { - readonly delayInSeconds?: number; - readonly effectiveSpeedInKmh?: number; - readonly endPointIndex?: number; - readonly magnitudeOfDelay?: MagnitudeOfDelay; - readonly sectionType?: string; - readonly simpleCategory?: string; - readonly startPointIndex?: number; - tec?: RouteResultSectionTec; - readonly travelMode?: string; -} - -// @public -export interface RouteResultSectionTec { - causes?: RouteResultSectionTecCause[]; - readonly effectCode?: number; -} - -// @public -export interface RouteResultSectionTecCause { - readonly mainCauseCode?: number; - readonly subCauseCode?: number; -} - -// @public -export type RouteType = string; - -// @public -export type SectionType = string; - -// @public -export type TextFormat = string; - -// @public -export type TravelMode = string; - -// @public -export type VehicleEngineType = string; - -// @public -export type VehicleLoadType = string; - -// @public -export type WindingnessLevel = string; - - -// (No @packageDocumentation comment for this package) - -``` diff --git a/sdk/maps/maps-route/rollup.config.js b/sdk/maps/maps-route/rollup.config.js deleted file mode 100644 index 9be1955eb7f1..000000000000 --- a/sdk/maps/maps-route/rollup.config.js +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import nodeResolve from "@rollup/plugin-node-resolve"; -import cjs from "@rollup/plugin-commonjs"; -import sourcemaps from "rollup-plugin-sourcemaps"; -import multiEntry from "@rollup/plugin-multi-entry"; -import json from "@rollup/plugin-json"; - -import nodeBuiltins from "builtin-modules"; - -/** - * Gets the proper configuration needed for rollup's commonJS plugin for @opentelemetry/api. - * - * NOTE: this manual configuration is only needed because OpenTelemetry uses an - * __exportStar downleveled helper function to declare its exports which confuses - * rollup's automatic discovery mechanism. - * - * @returns an object reference that can be `...`'d into your cjs() configuration. - */ -export function openTelemetryCommonJs() { - const namedExports = {}; - - for (const key of [ - "@opentelemetry/api", - "@azure/core-tracing/node_modules/@opentelemetry/api" - ]) { - namedExports[key] = [ - "SpanKind", - "TraceFlags", - "getSpan", - "setSpan", - "SpanStatusCode", - "getSpanContext", - "setSpanContext" - ]; - } - - const releasedOpenTelemetryVersions = ["0.10.2", "1.0.0-rc.0"]; - - for (const version of releasedOpenTelemetryVersions) { - namedExports[ - // working around a limitation in the rollup common.js plugin - it's not able to resolve these modules so the named exports listed above will not get applied. We have to drill down to the actual path. - `../../../common/temp/node_modules/.pnpm/@opentelemetry/api@${version}/node_modules/@opentelemetry/api/build/src/index.js` - ] = [ - "SpanKind", - "TraceFlags", - "getSpan", - "setSpan", - "StatusCode", - "CanonicalCode", - "getSpanContext", - "setSpanContext" - ]; - } - - return namedExports; -} - -// #region Warning Handler - -/** - * A function that can determine whether a rollupwarning should be ignored. If - * the function returns `true`, then the warning will not be displayed. - */ - -function ignoreNiseSinonEvalWarnings(warning) { - return ( - warning.code === "EVAL" && - warning.id && - (warning.id.includes("node_modules/nise") || - warning.id.includes("node_modules/sinon")) === true - ); -} - -function ignoreChaiCircularDependencyWarnings(warning) { - return ( - warning.code === "CIRCULAR_DEPENDENCY" && - warning.importer && warning.importer.includes("node_modules/chai") === true - ); -} - -const warningInhibitors = [ - ignoreChaiCircularDependencyWarnings, - ignoreNiseSinonEvalWarnings -]; - -/** - * Construct a warning handler for the shared rollup configuration - * that ignores certain warnings that are not relevant to testing. - */ -function makeOnWarnForTesting() { - return (warning, warn) => { - // If every inhibitor returns false (i.e. no inhibitors), then show the warning - if (warningInhibitors.every((inhib) => !inhib(warning))) { - warn(warning); - } - }; -} - -// #endregion - -function makeBrowserTestConfig() { - const config = { - input: { - include: ["dist-esm/test/**/*.spec.js"], - exclude: ["dist-esm/test/**/node/**"] - }, - output: { - file: `dist-test/index.browser.js`, - format: "umd", - sourcemap: true - }, - preserveSymlinks: false, - plugins: [ - multiEntry({ exports: false }), - nodeResolve({ - mainFields: ["module", "browser"] - }), - cjs({ - namedExports: { - // Chai's strange internal architecture makes it impossible to statically - // analyze its exports. - chai: [ - "version", - "use", - "util", - "config", - "expect", - "should", - "assert" - ], - ...openTelemetryCommonJs() - } - }), - json(), - sourcemaps() - //viz({ filename: "dist-test/browser-stats.html", sourcemap: true }) - ], - onwarn: makeOnWarnForTesting(), - // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, - // rollup started respecting the "sideEffects" field in package.json. Since - // our package.json sets "sideEffects=false", this also applies to test - // code, which causes all tests to be removed by tree-shaking. - treeshake: false - }; - - return config; -} - -const defaultConfigurationOptions = { - disableBrowserBundle: false -}; - -export function makeConfig(pkg, options) { - options = { - ...defaultConfigurationOptions, - ...(options || {}) - }; - - const baseConfig = { - // Use the package's module field if it has one - input: pkg["module"] || "dist-esm/src/index.js", - external: [ - ...nodeBuiltins, - ...Object.keys(pkg.dependencies), - ...Object.keys(pkg.devDependencies) - ], - output: { file: "dist/index.js", format: "cjs", sourcemap: true }, - preserveSymlinks: false, - plugins: [sourcemaps(), nodeResolve(), cjs()] - }; - - const config = [baseConfig]; - - if (!options.disableBrowserBundle) { - config.push(makeBrowserTestConfig()); - } - - return config; -} - -export default makeConfig(require("./package.json")); diff --git a/sdk/maps/maps-route/src/index.ts b/sdk/maps/maps-route/src/index.ts deleted file mode 100644 index d688000ed82a..000000000000 --- a/sdk/maps/maps-route/src/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./models"; -export { RouteClient } from "./routeClient"; -export { RouteClientContext } from "./routeClientContext"; -export * from "./operationsInterfaces"; diff --git a/sdk/maps/maps-route/src/lro/azureAsyncPolling.ts b/sdk/maps/maps-route/src/lro/azureAsyncPolling.ts deleted file mode 100644 index 0d63c54f6026..000000000000 --- a/sdk/maps/maps-route/src/lro/azureAsyncPolling.ts +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { FullOperationResponse } from "@azure/core-client"; -import { FinalStateVia, LROResult } from "./models"; -import { failureStates, LROState, successStates } from "./stateMachine"; - -function getResponseStatus(rawResponse: FullOperationResponse): string { - const { status } = - rawResponse.parsedBody ?? - (rawResponse.bodyAsText ? JSON.parse(rawResponse.bodyAsText) : {}); - return status?.toLowerCase() ?? "succeeded"; -} - -function isAzureAsyncPollingDone(rawResponse: FullOperationResponse) { - const state = getResponseStatus(rawResponse); - if (failureStates.includes(state)) { - throw new Error(`Operation status: ${state}`); - } - return successStates.includes(state); -} - -export function processAzureAsyncOperationResult( - restrieveResource: (path?: string) => Promise>, - resourceLocation?: string, - finalStateVia?: FinalStateVia -): ( - rawResponse: FullOperationResponse, - flatResponse: TResult -) => LROState { - return ( - rawResponse: FullOperationResponse, - flatResponse: TResult - ): LROState => { - if (isAzureAsyncPollingDone(rawResponse)) { - if (resourceLocation === undefined) { - return { rawResponse, flatResponse, done: true }; - } else { - return { - rawResponse, - flatResponse, - done: false, - next: async () => { - async function sendFinalRequest(): Promise< - LROResult | undefined - > { - switch (finalStateVia) { - case "original-uri": - return restrieveResource(); - case "azure-async-operation": - return Promise.resolve(undefined); - case "location": - default: - return restrieveResource(resourceLocation); - } - } - const finalResponse = await sendFinalRequest(); - return { - ...(finalResponse ?? { - rawResponse, - flatResponse - }), - done: true - }; - } - }; - } - } - return { - rawResponse, - flatResponse, - done: false - }; - }; -} diff --git a/sdk/maps/maps-route/src/lro/bodyPolling.ts b/sdk/maps/maps-route/src/lro/bodyPolling.ts deleted file mode 100644 index 269d8e6799a1..000000000000 --- a/sdk/maps/maps-route/src/lro/bodyPolling.ts +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { FullOperationResponse } from "@azure/core-client"; -import { failureStates, LROState, successStates } from "./stateMachine"; - -function getProvisioningState(rawResponse: FullOperationResponse): string { - const { properties, provisioningState } = - rawResponse.parsedBody ?? - (rawResponse.bodyAsText ? JSON.parse(rawResponse.bodyAsText) : {}); - const state: string | undefined = - properties?.provisioningState ?? provisioningState; - return state?.toLowerCase() ?? "succeeded"; -} - -export function isBodyPollingDone(rawResponse: FullOperationResponse) { - const state = getProvisioningState(rawResponse); - if (failureStates.includes(state)) { - throw new Error(`Provisioning state: ${state}`); - } - return successStates.includes(state); -} - -/** - * Creates a polling strategy based on BodyPolling which uses the provisioning state - * from the result to determine the current operation state - */ -export function processBodyPollingOperationResult( - rawResponse: FullOperationResponse, - flatResponse: TResult -): LROState { - return { - rawResponse, - flatResponse, - done: isBodyPollingDone(rawResponse) - }; -} diff --git a/sdk/maps/maps-route/src/lro/index.ts b/sdk/maps/maps-route/src/lro/index.ts deleted file mode 100644 index 85c2187669e7..000000000000 --- a/sdk/maps/maps-route/src/lro/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export { shouldDeserializeLRO } from "./requestUtils"; -export { LROPoller } from "./lroPoller"; diff --git a/sdk/maps/maps-route/src/lro/locationPolling.ts b/sdk/maps/maps-route/src/lro/locationPolling.ts deleted file mode 100644 index 6fef61938419..000000000000 --- a/sdk/maps/maps-route/src/lro/locationPolling.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { FullOperationResponse } from "@azure/core-client"; -import { LROState } from "./stateMachine"; - -function isLocationPollingDone(rawResponse: FullOperationResponse) { - const code = rawResponse.status; - if (![202, 200].includes(code)) { - throw new Error(`Operation failed`); - } - return code !== 202; -} - -export function processLocationPollingOperationResult( - rawResponse: FullOperationResponse, - flatResponse: TResult -): LROState { - return { - rawResponse, - flatResponse, - done: isLocationPollingDone(rawResponse) - }; -} diff --git a/sdk/maps/maps-route/src/lro/lroPoller.ts b/sdk/maps/maps-route/src/lro/lroPoller.ts deleted file mode 100644 index cd1cd64fe813..000000000000 --- a/sdk/maps/maps-route/src/lro/lroPoller.ts +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { Poller, PollOperationState } from "@azure/core-lro"; -import { OperationArguments, OperationSpec } from "@azure/core-client"; -import { FinalStateVia, SendOperationFn } from "./models"; -import { GenericPollOperation } from "./operation"; - -export interface LROPollerOptions { - /** - * Defines how much time the poller is going to wait before making a new request to the service. - */ - intervalInMs?: number; - /** - * A serialized poller which can be used to resume an existing paused Long-Running-Operation. - */ - resumeFrom?: string; -} - -export class LROPoller extends Poller< - PollOperationState, - TResult -> { - private intervalInMs: number; - - constructor( - { intervalInMs = 2000, resumeFrom }: LROPollerOptions, - initialOperationArguments: OperationArguments, - initialOperationSpec: OperationSpec, - sendOperation: SendOperationFn, - finalStateVia?: FinalStateVia - ) { - const state: PollOperationState = resumeFrom - ? JSON.parse(resumeFrom).state - : {}; - - const operation = new GenericPollOperation( - state, - initialOperationArguments, - initialOperationSpec, - sendOperation, - finalStateVia - ); - super(operation); - - this.intervalInMs = intervalInMs; - operation.setPollerConfig(this as any); - } - - /** - * The method used by the poller to wait before attempting to update its operation. - */ - delay(): Promise { - return new Promise((resolve) => - setTimeout(() => resolve(), this.intervalInMs) - ); - } -} diff --git a/sdk/maps/maps-route/src/lro/models.ts b/sdk/maps/maps-route/src/lro/models.ts deleted file mode 100644 index a4a5a5abd6c2..000000000000 --- a/sdk/maps/maps-route/src/lro/models.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { - FullOperationResponse, - OperationArguments, - OperationSpec -} from "@azure/core-client"; -import { PollOperationState } from "@azure/core-lro"; - -export type FinalStateVia = - | "azure-async-operation" - | "location" - | "original-uri"; - -export interface LROResult { - flatResponse: T; - rawResponse: FullOperationResponse; -} - -export type LROMode = "AzureAsync" | "Location" | "Body"; - -export interface LROConfig { - mode?: LROMode; - resourceLocation?: string; -} - -export type SendOperationFn = ( - args: OperationArguments, - spec: OperationSpec -) => Promise>; - -/** - * Type of a polling operation state that can actually be resumed. - */ -export type ResumablePollOperationState = PollOperationState & { - initialRawResponse?: FullOperationResponse; - config?: LROConfig; - pollingURL?: string; -}; - -export interface PollerConfig { - intervalInMs: number; -} diff --git a/sdk/maps/maps-route/src/lro/operation.ts b/sdk/maps/maps-route/src/lro/operation.ts deleted file mode 100644 index 801d03e7203a..000000000000 --- a/sdk/maps/maps-route/src/lro/operation.ts +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { AbortSignalLike } from "@azure/abort-controller"; -import { OperationArguments, OperationSpec } from "@azure/core-client"; -import { PollOperation, PollOperationState } from "@azure/core-lro"; -import { - FinalStateVia, - PollerConfig, - ResumablePollOperationState, - SendOperationFn -} from "./models"; -import { getPollingURL } from "./requestUtils"; -import { createGetLROState, initializeState, LROState } from "./stateMachine"; - -export class GenericPollOperation - implements PollOperation, TResult> { - private getLROState?: ( - pollingURL: string, - pollerConfig: PollerConfig - ) => Promise>; - private pollerConfig?: PollerConfig; - constructor( - public state: PollOperationState, - private initialOperationArguments: OperationArguments, - private initialOperationSpec: OperationSpec, - private sendOperation: SendOperationFn, - private finalStateVia?: FinalStateVia - ) {} - - public setPollerConfig(pollerConfig: PollerConfig) { - this.pollerConfig = pollerConfig; - } - - /** - * General update function for LROPoller, the general process is as follows - * 1. Check initial operation result to determine the strategy to use - * - Strategies: Location, Azure-AsyncOperation, Original Uri - * 2. Check if the operation result has a terminal state - * - Terminal state will be determined by each strategy - * 2.1 If it is terminal state Check if a final GET request is required, if so - * send final GET request and return result from operation. If no final GET - * is required, just return the result from operation. - * - Determining what to call for final request is responsibility of each strategy - * 2.2 If it is not terminal state, call the polling operation and go to step 1 - * - Determining what to call for polling is responsibility of each strategy - * - Strategies will always use the latest URI for polling if provided otherwise - * the last known one - */ - async update(options?: { - abortSignal?: AbortSignalLike | undefined; - fireProgress?: ((state: PollOperationState) => void) | undefined; - }): Promise, TResult>> { - const state = this.state as ResumablePollOperationState; - const { onResponse, ...restOptions } = - this.initialOperationArguments.options || {}; - if (!state.isStarted) { - await this.sendOperation( - { - ...this.initialOperationArguments, - options: { - ...restOptions, - onResponse: initializeState( - state, - this.initialOperationSpec, - onResponse - ) - } - }, - this.initialOperationSpec - ); - } - - if (!state.isCompleted) { - if (this.getLROState === undefined) { - if (state.config === undefined) { - throw new Error("Bad state: LRO mode is undefined"); - } - this.getLROState = createGetLROState( - this.sendOperation, - this.initialOperationArguments, - this.initialOperationSpec, - state.config, - this.finalStateVia - ); - } - if (state.pollingURL === undefined) { - throw new Error("Bad state: polling URL is undefined"); - } - const currentState = await this.getLROState( - state.pollingURL, - this.pollerConfig! - ); - if (currentState.done) { - state.result = currentState.flatResponse; - state.isCompleted = true; - } else { - this.getLROState = currentState.next ?? this.getLROState; - state.pollingURL = getPollingURL( - currentState.rawResponse, - state.pollingURL - ); - } - } - if (options?.fireProgress !== undefined) { - options.fireProgress(state); - } - return this; - } - - async cancel(): Promise, TResult>> { - this.state.isCancelled = true; - return this; - } - - /** - * Serializes the Poller operation. - */ - public toString(): string { - return JSON.stringify({ - state: this.state - }); - } -} diff --git a/sdk/maps/maps-route/src/lro/passthrough.ts b/sdk/maps/maps-route/src/lro/passthrough.ts deleted file mode 100644 index 64c10380c1b2..000000000000 --- a/sdk/maps/maps-route/src/lro/passthrough.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { FullOperationResponse } from "@azure/core-client"; -import { LROState } from "./stateMachine"; - -export function processPassthroughOperationResult( - rawResponse: FullOperationResponse, - flatResponse: TResult -): LROState { - return { - rawResponse, - flatResponse, - done: true - }; -} diff --git a/sdk/maps/maps-route/src/lro/pollingMethod.ts b/sdk/maps/maps-route/src/lro/pollingMethod.ts deleted file mode 100644 index cb6482bbdea9..000000000000 --- a/sdk/maps/maps-route/src/lro/pollingMethod.ts +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { - OperationArguments, - OperationSpec, - OperationResponseMap -} from "@azure/core-client"; -import { LROMode, LROResult, SendOperationFn } from "./models"; - -export function createPollingMethod( - sendOperationFn: SendOperationFn, - args: OperationArguments, - spec: OperationSpec, - mode?: LROMode -): (path?: string) => Promise> { - /** - * Polling calls will always return a status object i.e. {"status": "success"} - * these intermediate responses are not described in the swagger so we need to - * pass custom mappers at runtime. - * This function replaces all the existing mappers to be able to deserialize a status object - * @param responses Original set of responses defined in the operation - */ - function getCompositeMappers(responses: { - [responseCode: string]: OperationResponseMap; - }): { - [responseCode: string]: OperationResponseMap; - } { - return Object.keys(responses).reduce((acc, statusCode) => { - return { - ...acc, - [statusCode]: { - ...responses[statusCode], - bodyMapper: { - type: { - name: "Composite", - modelProperties: { - status: { - serializedName: "status", - type: { - name: "String" - } - } - } - } - } - } - }; - }, {} as { [responseCode: string]: OperationResponseMap }); - } - // Make sure we don't send any body to the get request - const { requestBody, responses, ...restSpec } = spec; - if (mode === "AzureAsync") { - return async (path?: string) => { - return sendOperationFn(args, { - ...restSpec, - responses: getCompositeMappers(responses), - httpMethod: "GET", - ...(path && { path }) - }); - }; - } - return async (path?: string) => { - return sendOperationFn(args, { - ...restSpec, - responses: responses, - httpMethod: "GET", - ...(path && { path }) - }); - }; -} - -export function createRetrieveAzureAsyncResource( - sendOperationFn: SendOperationFn, - args: OperationArguments, - spec: OperationSpec -): (path?: string) => Promise> { - const updatedArgs = { ...args }; - if (updatedArgs.options) { - (updatedArgs.options as any).shouldDeserialize = true; - } - return createPollingMethod(sendOperationFn, updatedArgs, spec); -} diff --git a/sdk/maps/maps-route/src/lro/requestUtils.ts b/sdk/maps/maps-route/src/lro/requestUtils.ts deleted file mode 100644 index 9162f6633905..000000000000 --- a/sdk/maps/maps-route/src/lro/requestUtils.ts +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { FullOperationResponse, OperationSpec } from "@azure/core-client"; -import { LROConfig } from "./models"; -import { terminalStates } from "./stateMachine"; - -/** - * We need to selectively deserialize our responses, only deserializing if we - * are in a final LRO response, not deserializing any polling non-terminal responses - */ -export function shouldDeserializeLRO(finalStateVia?: string) { - let initialOperationInfo: LROResponseInfo | undefined; - let isInitialRequest = true; - - return (response: FullOperationResponse) => { - if (response.status < 200 || response.status >= 300) { - return true; - } - - if (!initialOperationInfo) { - initialOperationInfo = getLROData(response); - } else { - isInitialRequest = false; - } - - if ( - initialOperationInfo.azureAsyncOperation || - initialOperationInfo.operationLocation - ) { - return ( - !isInitialRequest && - isAsyncOperationFinalResponse( - response, - initialOperationInfo, - finalStateVia - ) - ); - } - - if (initialOperationInfo.location) { - return isLocationFinalResponse(response); - } - - if (initialOperationInfo.requestMethod === "PUT") { - return isBodyPollingFinalResponse(response); - } - - return true; - }; -} - -function isAsyncOperationFinalResponse( - response: FullOperationResponse, - initialOperationInfo: LROResponseInfo, - finalStateVia?: string -): boolean { - const status: string = response.parsedBody?.status || "Succeeded"; - if (!terminalStates.includes(status.toLowerCase())) { - return false; - } - - if (initialOperationInfo.requestMethod === "DELETE") { - return true; - } - - if ( - initialOperationInfo.requestMethod === "PUT" && - finalStateVia && - finalStateVia.toLowerCase() === "azure-asyncoperation" - ) { - return true; - } - - if ( - initialOperationInfo.requestMethod !== "PUT" && - !initialOperationInfo.location - ) { - return true; - } - - return false; -} - -function isLocationFinalResponse(response: FullOperationResponse): boolean { - return response.status !== 202; -} - -function isBodyPollingFinalResponse(response: FullOperationResponse): boolean { - const provisioningState: string = - response.parsedBody?.properties?.provisioningState || "Succeeded"; - - if (terminalStates.includes(provisioningState.toLowerCase())) { - return true; - } - - return false; -} - -interface LROResponseInfo { - requestMethod: string; - azureAsyncOperation?: string; - operationLocation?: string; - location?: string; -} - -function getLROData(result: FullOperationResponse): LROResponseInfo { - return { - azureAsyncOperation: result.headers.get("azure-asyncoperation"), - operationLocation: result.headers.get("operation-location"), - location: result.headers.get("location"), - requestMethod: result.request.method - }; -} - -/** - * Detects where the continuation token is and returns it. Notice that azure-asyncoperation - * must be checked first before the other location headers because there are scenarios - * where both azure-asyncoperation and location could be present in the same response but - * azure-asyncoperation should be the one to use for polling. - */ -export function getPollingURL( - rawResponse: FullOperationResponse, - defaultPath: string -): string { - return ( - getAzureAsyncoperation(rawResponse) ?? - getLocation(rawResponse) ?? - getOperationLocation(rawResponse) ?? - defaultPath - ); -} - -function getLocation(rawResponse: FullOperationResponse): string | undefined { - return rawResponse.headers?.get("location"); -} - -function getOperationLocation( - rawResponse: FullOperationResponse -): string | undefined { - return rawResponse.headers?.get("operation-location"); -} - -function getAzureAsyncoperation( - rawResponse: FullOperationResponse -): string | undefined { - return rawResponse.headers?.get("azure-asyncoperation"); -} - -export function inferLROMode( - spec: OperationSpec, - rawResponse: FullOperationResponse -): LROConfig { - const requestMethod = spec.httpMethod; - if (getAzureAsyncoperation(rawResponse) !== undefined) { - return { - mode: "AzureAsync", - resourceLocation: - requestMethod === "PUT" - ? spec.path - : requestMethod === "POST" - ? getLocation(rawResponse) - : undefined - }; - } else if ( - getLocation(rawResponse) !== undefined || - getOperationLocation(rawResponse) !== undefined - ) { - return { - mode: "Location" - }; - } else if (["PUT", "PATCH"].includes(requestMethod)) { - return { - mode: "Body" - }; - } - return {}; -} - -export function getSpecPath(spec: OperationSpec): string { - if (spec.path) { - return spec.path; - } else { - throw Error("Bad spec: request path is not found!"); - } -} diff --git a/sdk/maps/maps-route/src/lro/stateMachine.ts b/sdk/maps/maps-route/src/lro/stateMachine.ts deleted file mode 100644 index b2a69b554601..000000000000 --- a/sdk/maps/maps-route/src/lro/stateMachine.ts +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { - FullOperationResponse, - OperationArguments, - OperationSpec, - RawResponseCallback -} from "@azure/core-client"; -import { processAzureAsyncOperationResult } from "./azureAsyncPolling"; -import { - isBodyPollingDone, - processBodyPollingOperationResult -} from "./bodyPolling"; -import { processLocationPollingOperationResult } from "./locationPolling"; -import { - FinalStateVia, - LROConfig, - LROResult, - PollerConfig, - ResumablePollOperationState, - SendOperationFn -} from "./models"; -import { processPassthroughOperationResult } from "./passthrough"; -import { - createPollingMethod, - createRetrieveAzureAsyncResource -} from "./pollingMethod"; -import { getPollingURL, getSpecPath, inferLROMode } from "./requestUtils"; - -export const successStates = ["succeeded"]; -export const failureStates = ["failed", "canceled", "cancelled"]; -export const terminalStates = successStates.concat(failureStates); - -/** - * The type of a terminal state of an LRO. - */ -interface LROTerminalState extends LROResult { - /** - * Whether the operation has finished. - */ - done: true; -} - -/** - * The type of an in-progress state of an LRO. - */ -interface LROInProgressState extends LROResult { - /** - * Whether the operation has finished. - */ - done: false; - /** - * The request to be sent next if it is different from the standard polling one. - * Notice that it will disregard any polling URLs provided to it. - */ - next?: () => Promise>; -} - -/** - * The type of an LRO state which is a tagged union of terminal and in-progress states. - */ -export type LROState = LROTerminalState | LROInProgressState; - -/** - * creates a stepping function that maps an LRO state to another. - */ -function createTransition( - sendOperationFn: SendOperationFn, - args: OperationArguments, - spec: OperationSpec, - config: LROConfig, - finalStateVia?: FinalStateVia -): ( - rawResponse: FullOperationResponse, - flatResponse: TResult -) => LROState { - switch (config.mode) { - case "AzureAsync": { - return processAzureAsyncOperationResult( - createRetrieveAzureAsyncResource(sendOperationFn, args, spec), - config.resourceLocation, - finalStateVia - ); - } - case "Location": { - return processLocationPollingOperationResult; - } - case "Body": { - return processBodyPollingOperationResult; - } - default: { - return processPassthroughOperationResult; - } - } -} - -/** - * Creates a polling operation that returns a LRO state. - */ -export function createGetLROState( - sendOperationFn: SendOperationFn, - args: OperationArguments, - spec: OperationSpec, - config: LROConfig, - finalStateVia?: FinalStateVia -): ( - pollingURL: string, - pollerConfig: PollerConfig -) => Promise> { - const step = createTransition( - sendOperationFn, - args, - spec, - config, - finalStateVia - ); - const customerCallback = args?.options?.onResponse; - let response: LROState | undefined = undefined; - let retryAfter: string | undefined = undefined; - const poll = createPollingMethod( - sendOperationFn, - { - ...args, - options: { - ...args.options, - onResponse: ( - rawResponse: FullOperationResponse, - flatResponse: unknown - ): void => { - response = step(rawResponse, flatResponse as TResult); - retryAfter = rawResponse.headers.get("Retry-After"); - if (response.done) { - customerCallback?.(rawResponse, flatResponse); - } - } - } - }, - spec, - config.mode - ); - return async ( - path: string, - pollerConfig: PollerConfig - ): Promise> => { - await poll(path); - if (retryAfter !== undefined) { - const retryAfterInMs = parseInt(retryAfter); - pollerConfig.intervalInMs = isNaN(retryAfterInMs) - ? calculatePollingIntervalFromDate( - new Date(retryAfter), - pollerConfig.intervalInMs - ) - : retryAfterInMs; - } - return response!; - }; -} - -function calculatePollingIntervalFromDate( - retryAfterDate: Date, - defaultIntervalInMs: number -): number { - const timeNow = Math.floor(new Date().getTime()); - const retryAfterTime = retryAfterDate.getTime(); - if (timeNow < retryAfterTime) { - return retryAfterTime - timeNow; - } - return defaultIntervalInMs; -} - -/** - * Creates a callback to be used to initialize the polling operation state. - * @param state of the polling operation - * @param operationSpec of the LRO - * @param callback callback to be called when the operation is done - * @returns callback that initializes the state of the polling operation - */ -export function initializeState( - state: ResumablePollOperationState, - operationSpec: OperationSpec, - callback?: RawResponseCallback -): (rawResponse: FullOperationResponse, flatResponse: unknown) => void { - return (rawResponse: FullOperationResponse, flatResponse: unknown) => { - state.initialRawResponse = rawResponse; - state.isStarted = true; - state.pollingURL = getPollingURL( - state.initialRawResponse, - getSpecPath(operationSpec) - ); - state.config = inferLROMode(operationSpec, state.initialRawResponse); - /** short circuit polling if body polling is done in the initial request */ - if ( - state.config.mode === undefined || - (state.config.mode === "Body" && - isBodyPollingDone(state.initialRawResponse)) - ) { - state.result = flatResponse as TResult; - state.isCompleted = true; - /** - * We need to check if the LRO operation is finished inside the - * call back so that we can call the customer-provided callback - * on that result. - */ - callback?.(rawResponse, flatResponse); - } - }; -} diff --git a/sdk/maps/maps-route/src/models/index.ts b/sdk/maps/maps-route/src/models/index.ts deleted file mode 100644 index c8916bdd526c..000000000000 --- a/sdk/maps/maps-route/src/models/index.ts +++ /dev/null @@ -1,2287 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; - -export type GeoJsonObjectUnion = - | GeoJsonObject - | GeoJsonGeometryUnion - | GeoJsonFeature - | GeoJsonFeatureCollection; -export type GeoJsonGeometryUnion = - | GeoJsonGeometry - | GeoJsonMultiPoint - | GeoJsonMultiPolygon - | GeoJsonPoint - | GeoJsonLineString - | GeoJsonMultiLineString - | GeoJsonPolygon - | GeoJsonGeometryCollection; - -/** An object with a matrix of coordinates. */ -export interface PostRouteMatrixRequestBody { - /** A valid `GeoJSON MultiPoint` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.3) for details. */ - origins?: GeoJsonMultiPoint; - /** A valid `GeoJSON MultiPoint` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.3) for details. */ - destinations?: GeoJsonMultiPoint; -} - -/** A valid `GeoJSON` object. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3) for details. */ -export interface GeoJsonObject { - /** Polymorphic discriminator, which specifies the different types this object can be */ - type: - | "GeoJsonGeometry" - | "MultiPoint" - | "MultiPolygon" - | "Point" - | "LineString" - | "MultiLineString" - | "Polygon" - | "GeometryCollection" - | "Feature" - | "FeatureCollection"; -} - -/** Data contained by a `GeoJson MultiPoint`. */ -export interface GeoJsonMultiPointData { - /** Coordinates for the `GeoJson MultiPoint` geometry. */ - coordinates: number[][]; -} - -/** This object is returned from a successful Route Matrix call. For ex, if 2 origins and 3 destinations are provided, there are going to 2 arrays with 3 elements in each. Each element's content depends on the options provided in the query. */ -export interface RouteMatrixResponse { - /** - * Format Version property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly formatVersion?: string; - /** - * Results as a 2 dimensional array of route summaries. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly matrix?: RouteMatrixResult[][]; - /** - * Summary object - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly summary?: RouteMatrixSummary; -} - -/** Matrix result object */ -export interface RouteMatrixResult { - /** - * StatusCode property for the current cell in the input matrix. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly statusCode?: number; - /** - * Response object of the current cell in the input matrix. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly response?: RouteMatrixResultResponse; -} - -/** Response object of the current cell in the input matrix. */ -export interface RouteMatrixResultResponse { - /** - * Summary object for route section. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly routeSummary?: RouteResultLegSummary; -} - -/** Summary object for route section. */ -export interface RouteResultLegSummary { - /** - * Length In Meters property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly lengthInMeters?: number; - /** - * Estimated travel time in seconds property that includes the delay due to real-time traffic. Note that even when traffic=false travelTimeInSeconds still includes the delay due to traffic. If DepartAt is in the future, travel time is calculated using time-dependent historic traffic data. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly travelTimeInSeconds?: number; - /** - * Estimated delay in seconds caused by the real-time incident(s) according to traffic information. For routes planned with departure time in the future, delays is always 0. To return additional travel times using different types of traffic information, parameter computeTravelTimeFor=all needs to be added. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly trafficDelayInSeconds?: number; - /** - * Departure Time property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly departureTime?: string; - /** - * Arrival Time property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly arrivalTime?: string; - /** - * Estimated travel time calculated as if there are no delays on the route due to traffic conditions (e.g. congestion). Included only if computeTravelTimeFor = all is used in the query. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly noTrafficTravelTimeInSeconds?: number; - /** - * Estimated travel time calculated using time-dependent historic traffic data. Included only if computeTravelTimeFor = all is used in the query. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly historicTrafficTravelTimeInSeconds?: number; - /** - * Estimated travel time calculated using real-time speed data. Included only if computeTravelTimeFor = all is used in the query. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly liveTrafficIncidentsTravelTimeInSeconds?: number; - /** - * Estimated fuel consumption in liters using the Combustion Consumption Model. Included if vehicleEngineType is set to _combustion_ and constantSpeedConsumptionInLitersPerHundredkm is specified. The value will be non-negative. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly fuelConsumptionInLiters?: number; - /** - * Estimated electric energy consumption in kilowatt hours (kWh) using the Electric Consumption Model. Included if vehicleEngineType is set to electric and constantSpeedConsumptionInkWhPerHundredkm is specified. The value of batteryConsumptionInkWh includes the recuperated electric energy and can therefore be negative (which indicates gaining energy). If both maxChargeInkWh and currentChargeInkWh are specified, recuperation will be capped to ensure that the battery charge level never exceeds maxChargeInkWh. If neither maxChargeInkWh nor currentChargeInkWh are specified, unconstrained recuperation is assumed in the consumption calculation. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly batteryConsumptionInkWh?: number; -} - -/** Summary object */ -export interface RouteMatrixSummary { - /** - * Number of successful routes in the response. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly successfulRoutes?: number; - /** - * Total number of routes requested. Number of cells in the input matrix. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly totalRoutes?: number; -} - -/** Common error response for all Azure Resource Manager APIs to return error details for failed operations. (This also follows the OData error response format.). */ -export interface ErrorResponse { - /** The error object. */ - error?: ErrorDetail; -} - -/** The error detail. */ -export interface ErrorDetail { - /** - * The error code. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly code?: string; - /** - * The error message. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly message?: string; - /** - * The error target. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly target?: string; - /** - * The error details. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly details?: ErrorDetail[]; - /** - * The error additional info. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly additionalInfo?: ErrorAdditionalInfo[]; -} - -/** The resource management error additional info. */ -export interface ErrorAdditionalInfo { - /** - * The additional info type. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly type?: string; - /** - * The additional info. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly info?: Record; -} - -/** This object is returned from a successful Route Directions call */ -export interface RouteDirectionsResponse { - /** - * Format Version property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly formatVersion?: string; - /** - * Routes array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly routes?: RouteDirectionsResult[]; - /** - * Optimized sequence of waypoints. It shows the index from the user provided waypoint sequence for the original and optimized list. For instance, a response: - * - * ``` - * - * - * - * - * - * ``` - * - * means that the original sequence is [0, 1, 2] and optimized sequence is [1, 2, 0]. Since the index starts by 0 the original is "first, second, third" while the optimized is "second, third, first". - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly optimizedWaypoints?: RouteOptimizedWaypoint[]; - /** Reports the effective settings used in the current call. */ - report?: RouteResponseReport; -} - -export interface RouteDirectionsResult { - /** - * Summary object - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly summary?: RouteDirectionsSummary; - /** - * Legs array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly legs?: RouteResultLeg[]; - /** - * Sections array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly sections?: RouteResultSection[]; - /** - * Contains guidance related elements. This field is present only when guidance was requested and is available. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly guidance?: RouteResultGuidance; -} - -/** Summary object */ -export interface RouteDirectionsSummary { - /** - * Length In Meters property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly lengthInMeters?: number; - /** - * Estimated travel time in seconds property that includes the delay due to real-time traffic. Note that even when traffic=false travelTimeInSeconds still includes the delay due to traffic. If DepartAt is in the future, travel time is calculated using time-dependent historic traffic data. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly travelTimeInSeconds?: number; - /** - * Estimated delay in seconds caused by the real-time incident(s) according to traffic information. For routes planned with departure time in the future, delays is always 0. To return additional travel times using different types of traffic information, parameter computeTravelTimeFor=all needs to be added. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly trafficDelayInSeconds?: number; - /** - * Departure Time property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly departureTime?: string; - /** - * Arrival Time property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly arrivalTime?: string; -} - -export interface RouteResultLeg { - /** - * Summary object for route section. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly summary?: RouteResultLegSummary; - /** - * Points array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly points?: CoordinatesPair[]; -} - -/** A location represented as a latitude and longitude. */ -export interface CoordinatesPair { - /** Latitude property */ - latitude?: number; - /** Longitude property */ - longitude?: number; -} - -export interface RouteResultSection { - /** - * Start Point Index property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly startPointIndex?: number; - /** - * End Point Index property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly endPointIndex?: number; - /** - * Section Type property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly sectionType?: string; - /** - * Travel Mode property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly travelMode?: string; - /** - * Type of the incident. Can currently be JAM, ROAD_WORK, ROAD_CLOSURE, or OTHER. See "tec" for detailed information. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly simpleCategory?: string; - /** - * Effective speed of the incident in km/h, averaged over its entire length. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly effectiveSpeedInKmh?: number; - /** - * Delay in seconds caused by the incident. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly delayInSeconds?: number; - /** - * The magnitude of delay caused by the incident. These values correspond to the values of the response field ty of the [Get Traffic Incident Detail API](https://docs.microsoft.com/rest/api/maps/traffic/gettrafficincidentdetail). - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly magnitudeOfDelay?: MagnitudeOfDelay; - /** Details of the traffic event, using definitions in the [TPEG2-TEC](https://www.iso.org/standard/63116.html) standard. Can contain effectCode and causes elements. */ - tec?: RouteResultSectionTec; -} - -/** Details of the traffic event, using definitions in the [TPEG2-TEC](https://www.iso.org/standard/63116.html) standard. Can contain effectCode and causes elements. */ -export interface RouteResultSectionTec { - /** - * The effect on the traffic flow. Contains a value in the tec001:EffectCode table, as defined in the [TPEG2-TEC](https://www.iso.org/standard/63116.html) standard. Can be used to color-code traffic events according to severity. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly effectCode?: number; - /** Causes array */ - causes?: RouteResultSectionTecCause[]; -} - -/** The cause of the traffic event. Can contain mainCauseCode and subCauseCode elements. Can be used to define iconography and descriptions. */ -export interface RouteResultSectionTecCause { - /** - * The main cause of the traffic event. Contains a value in the tec002:CauseCode table, as defined in the [TPEG2-TEC](https://www.iso.org/standard/63116.html) standard. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly mainCauseCode?: number; - /** - * The subcause of the traffic event. Contains a value in the sub cause table defined by the mainCauseCode, as defined in the [TPEG2-TEC](https://www.iso.org/standard/63116.html) standard. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly subCauseCode?: number; -} - -/** Contains guidance related elements. This field is present only when guidance was requested and is available. */ -export interface RouteResultGuidance { - /** - * A list of instructions describing maneuvers. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly instructions?: RouteResultInstruction[]; - /** - * Groups a sequence of instruction elements which are related to each other. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly instructionGroups?: RouteResultInstructionGroup[]; -} - -/** A set of attributes describing a maneuver, e.g. 'Turn right', 'Keep left', 'Take the ferry', 'Take the motorway', 'Arrive'. */ -export interface RouteResultInstruction { - /** - * Distance from the start of the route to the point of the instruction. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly routeOffsetInMeters?: number; - /** - * Estimated travel time up to the point corresponding to routeOffsetInMeters. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly travelTimeInSeconds?: number; - /** A location represented as a latitude and longitude. */ - point?: CoordinatesPair; - /** - * The index of the point in the list of polyline "points" corresponding to the point of the instruction. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly pointIndex?: number; - /** Type of the instruction, e.g., turn or change of road form. */ - instructionType?: GuidanceInstructionType; - /** - * The road number(s) of the next significant road segment(s) after the maneuver, or of the road(s) to be followed. Example: ["E34", "N205"] - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly roadNumbers?: string[]; - /** - * The number(s) of a highway exit taken by the current maneuver. If an exit has multiple exit numbers, they will be separated by "," and possibly aggregated by "-", e.g., "10, 13-15". - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly exitNumber?: string; - /** - * Street name of the next significant road segment after the maneuver, or of the street that should be followed. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly street?: string; - /** - * The text on a signpost which is most relevant to the maneuver, or to the direction that should be followed. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly signpostText?: string; - /** - * 3-character [ISO 3166-1](https://www.iso.org/iso-3166-country-codes.html) alpha-3 country code. E.g. USA. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly countryCode?: string; - /** - * A subdivision (e.g., state) of the country, represented by the second part of an [ISO 3166-2](https://www.iso.org/standard/63546.html) code. This is only available for some countries like the US, Canada, and Mexico. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly stateCode?: string; - /** - * The type of the junction where the maneuver takes place. For larger roundabouts, two separate instructions are generated for entering and leaving the roundabout. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly junctionType?: JunctionType; - /** - * Indicates the direction of an instruction. If junctionType indicates a turn instruction: - * - * * 180 = U-turn - * * [-179, -1] = Left turn - * * 0 = Straight on (a '0 degree' turn) - * * [1, 179] = Right turn - * - * If junctionType indicates a bifurcation instruction: - * - * * <0 - keep left - * * \>0 - keep right - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly turnAngleInDecimalDegrees?: number; - /** - * This indicates which exit to take at a roundabout. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly roundaboutExitNumber?: string; - /** - * It is possible to optionally combine the instruction with the next one. This can be used to build messages like "Turn left and then turn right". - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly possibleCombineWithNext?: boolean; - /** - * Indicates left-hand vs. right-hand side driving at the point of the maneuver. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly drivingSide?: DrivingSide; - /** - * A code identifying the maneuver. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly maneuver?: GuidanceManeuver; - /** - * A human-readable message for the maneuver. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly message?: string; - /** - * A human-readable message for the maneuver combined with the message from the next instruction. Sometimes it is possible to combine two successive instructions into a single instruction making it easier to follow. When this is the case the possibleCombineWithNext flag will be true. For example: - * - * ``` - * 10. Turn left onto Einsteinweg/A10/E22 towards Ring Amsterdam - * 11. Follow Einsteinweg/A10/E22 towards Ring Amsterdam - * ``` - * - * The possibleCombineWithNext flag on instruction 10 is true. This indicates to the clients of coded guidance that it can be combined with instruction 11. The instructions will be combined automatically for clients requesting human-readable guidance. The combinedMessage field contains the combined message: - * - * ``` - * Turn left onto Einsteinweg/A10/E22 towards Ring Amsterdam - * then follow Einsteinweg/A10/E22 towards Ring Amsterdam. - * ``` - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly combinedMessage?: string; -} - -/** Groups a sequence of instruction elements which are related to each other. The sequence range is constrained with firstInstructionIndex and lastInstructionIndex. When human-readable text messages are requested for guidance (instructionType=text or tagged), then the instructionGroup has a summary message returned when available. */ -export interface RouteResultInstructionGroup { - /** - * Index of the first instruction. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly firstInstructionIndex?: number; - /** - * Index of the last instruction. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly lastInstructionIndex?: number; - /** - * Length of the group. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly groupLengthInMeters?: number; - /** - * Summary message when human-readable text messages are requested for guidance (instructionType=text or tagged). - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly groupMessage?: string; -} - -/** Optimized way point object. */ -export interface RouteOptimizedWaypoint { - /** - * Way point index provided by the user. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly providedIndex?: number; - /** - * Optimized way point index from the system. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly optimizedIndex?: number; -} - -/** Reports the effective settings used in the current call. */ -export interface RouteResponseReport { - /** - * Effective parameters or data used when calling this Route API. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly effectiveSettings?: RouteResponseReportEffectiveSetting[]; -} - -/** Effective parameter or data used when calling this Route API. */ -export interface RouteResponseReportEffectiveSetting { - /** - * Name of the parameter used. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly key?: string; - /** - * Value of the parameter used. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly value?: string; -} - -/** Post body parameters for Route directions. */ -export interface PostRouteDirectionsRequestBody { - /** - * A GeoJSON Geometry collection representing sequence of coordinates used as input for route reconstruction and for calculating zero or more alternative routes to this reference route. - * - The provided sequence of supporting points is used as input for route reconstruction. - * - The alternative routes are calculated between the origin and destination points specified in the base path parameter locations. - * - If both _minDeviationDistance_ and _minDeviationTime_ are set to zero, then these origin and destination points are - * expected to be at (or very near) the beginning and end of the reference route, respectively. - * - Intermediate locations (_waypoints_) are not supported when using <_supportingPoints_>. - * - The reference route may contain traffic incidents of type _ROAD_CLOSURE_, which are - * ignored for the calculation of the reference route's travel time and traffic delay. - */ - supportingPoints?: Record; - /** This is a list of 3-character, ISO 3166-1, alpha-3 country codes of countries in which all toll roads with vignettes are to be avoided, e.g. "AUS,CHE". Toll roads with vignettes in countries not in the list are unaffected. Note: It is an error to specify both **avoidVignette** and **allowVignette**. */ - avoidVignette?: string[]; - /** This is a list of 3-character, ISO 3166-1, alpha-3 country codes of countries in which toll roads with vignettes are allowed, e.g. "AUS,CHE". Specifying **allowVignette** with some countries X is equivalent to specifying **avoidVignette** with all countries but X. Specifying **allowVignette** with an empty list is the same as avoiding all toll roads with vignettes. Note: It is an error to specify both **avoidVignette** and **allowVignette**. */ - allowVignette?: string[]; - /** A GeoJSON MultiPolygon representing list of areas to avoid. Only rectangle polygons are supported. The maximum size of a rectangle is about 160x160 km. Maximum number of avoided areas is **10**. It cannot cross the 180th meridian. It must be between -80 and +80 degrees of latitude. */ - avoidAreas?: GeoJsonMultiPolygon; -} - -export interface GeoJsonMultiPolygonData { - /** Contains a list of valid `GeoJSON Polygon` objects. **Note** that coordinates in GeoJSON are in x, y order (longitude, latitude). */ - coordinates: number[][][][]; -} - -/** This object is returned from a successful Route Reachable Range call */ -export interface GetRouteRangeResponse { - /** - * Format Version property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly formatVersion?: string; - /** Reachable Range */ - reachableRange?: RouteRange; - /** Reports the effective settings used in the current call. */ - report?: RouteResponseReport; -} - -/** Reachable Range */ -export interface RouteRange { - /** Center point of the reachable range */ - center?: CoordinatesPair; - /** - * Polygon boundary of the reachable range represented as a list of points. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly boundary?: CoordinatesPair[]; -} - -/** This type represents the request body for the Batch service. */ -export interface BatchRequestBody { - /** The list of queries to process. */ - batchItems?: BatchRequestBodyBatchItemsItem[]; -} - -/** Batch Query object */ -export interface BatchRequestBodyBatchItemsItem { - /** Partial query string. */ - query?: string; -} - -/** This object is returned from a successful Batch service call. Extend with 'batchItems' property. */ -export interface BatchResponse { - /** - * Summary for the batch request - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly summary?: BatchResponseSummary; -} - -/** Summary for the batch request */ -export interface BatchResponseSummary { - /** - * Number of successful requests in the batch - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly successfulRequests?: number; - /** - * Total number of requests in the batch - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly totalRequests?: number; -} - -/** An item returned from Batch API. Extend with 'response' property. */ -export interface BatchItem { - /** - * HTTP request status code. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly statusCode?: number; -} - -/** Data contained by a `GeoJson Point`. */ -export interface GeoJsonPointData { - /** A `Position` is an array of numbers with two or more elements. The first two elements are _longitude_ and _latitude_, precisely in that order. _Altitude/Elevation_ is an optional third element. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.1) for details. */ - coordinates: number[]; -} - -export interface GeoJsonLineStringData { - /** Coordinates for the `GeoJson LineString` geometry. */ - coordinates: number[][]; -} - -export interface GeoJsonMultiLineStringData { - /** Coordinates for the `GeoJson MultiLineString` geometry. */ - coordinates: number[][][]; -} - -export interface GeoJsonPolygonData { - /** Coordinates for the `GeoJson Polygon` geometry type. */ - coordinates: number[][][]; -} - -export interface GeoJsonGeometryCollectionData { - /** Contains a list of valid `GeoJSON` geometry objects. **Note** that coordinates in GeoJSON are in x, y order (longitude, latitude). */ - geometries: GeoJsonGeometryUnion[]; -} - -export interface GeoJsonFeatureData { - /** A valid `GeoJSON` geometry object. The type must be one of the seven valid GeoJSON geometry types - Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon and GeometryCollection. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1) for details. */ - geometry: GeoJsonGeometryUnion; - /** Properties can contain any additional metadata about the `Feature`. Value can be any JSON object or a JSON null value */ - properties?: Record; - /** Identifier for the feature. */ - id?: string; - /** The type of the feature. The value depends on the data model the current feature is part of. Some data models may have an empty value. */ - featureType?: string; -} - -export interface GeoJsonFeatureCollectionData { - /** Contains a list of valid `GeoJSON Feature` objects. */ - features: GeoJsonFeature[]; -} - -/** A valid `GeoJSON` geometry object. The type must be one of the seven valid GeoJSON geometry types - Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon and GeometryCollection. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1) for details. */ -export type GeoJsonGeometry = GeoJsonObject & { - /** Polymorphic discriminator, which specifies the different types this object can be */ - type: - | "GeoJsonGeometry" - | "MultiPoint" - | "MultiPolygon" - | "Point" - | "LineString" - | "MultiLineString" - | "Polygon" - | "GeometryCollection"; -}; - -/** A valid `GeoJSON Feature` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.2) for details. */ -export type GeoJsonFeature = GeoJsonObject & - GeoJsonFeatureData & { - /** Polymorphic discriminator, which specifies the different types this object can be */ - type: "Feature"; - }; - -/** A valid `GeoJSON FeatureCollection` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. */ -export type GeoJsonFeatureCollection = GeoJsonObject & - GeoJsonFeatureCollectionData & { - /** Polymorphic discriminator, which specifies the different types this object can be */ - type: "FeatureCollection"; - }; - -/** A valid `GeoJSON MultiPoint` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.3) for details. */ -export type GeoJsonMultiPoint = GeoJsonGeometry & GeoJsonMultiPointData & {}; - -/** The result of the query. RouteDirectionsResponse if the query completed successfully, ErrorResponse otherwise. */ -export type RouteDirectionsBatchItemResponse = RouteDirectionsResponse & - ErrorResponse & {}; - -/** A valid `GeoJSON MultiPolygon` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.7) for details. */ -export type GeoJsonMultiPolygon = GeoJsonGeometry & - GeoJsonMultiPolygonData & {}; - -/** This object is returned from a successful Route Directions Batch service call. */ -export type RouteDirectionsBatchResponse = BatchResponse & { - /** - * Array containing the batch results. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly batchItems?: RouteDirectionsBatchItem[]; -}; - -/** An item returned from Route Directions Batch service call. */ -export type RouteDirectionsBatchItem = BatchItem & { - /** - * The result of the query. RouteDirectionsResponse if the query completed successfully, ErrorResponse otherwise. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly response?: RouteDirectionsBatchItemResponse; -}; - -/** A valid `GeoJSON Point` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.2) for details. */ -export type GeoJsonPoint = GeoJsonGeometry & GeoJsonPointData & {}; - -/** A valid `GeoJSON LineString` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.4) for details. */ -export type GeoJsonLineString = GeoJsonGeometry & GeoJsonLineStringData & {}; - -/** A valid `GeoJSON MultiLineString` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.5) for details. */ -export type GeoJsonMultiLineString = GeoJsonGeometry & - GeoJsonMultiLineStringData & {}; - -/** A valid `GeoJSON Polygon` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.6) for details. */ -export type GeoJsonPolygon = GeoJsonGeometry & GeoJsonPolygonData & {}; - -/** A valid `GeoJSON GeometryCollection` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.8) for details. */ -export type GeoJsonGeometryCollection = GeoJsonGeometry & - GeoJsonGeometryCollectionData & {}; - -/** Defines headers for Route_postRouteMatrix operation. */ -export interface RoutePostRouteMatrixHeaders { - /** New URL to check for the results of the long running process. */ - location?: string; -} - -/** Defines headers for Route_postRouteDirectionsBatch operation. */ -export interface RoutePostRouteDirectionsBatchHeaders { - /** New URL to check for the results of the long running process. */ - location?: string; -} - -/** Known values of {@link Geography} that the service accepts. */ -export const enum KnownGeography { - Us = "us", - Eu = "eu" -} - -/** - * Defines values for Geography. \ - * {@link KnownGeography} can be used interchangeably with Geography, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **us** \ - * **eu** - */ -export type Geography = string; - -/** Known values of {@link ResponseFormat} that the service accepts. */ -export const enum KnownResponseFormat { - /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ - Json = "json" -} - -/** - * Defines values for ResponseFormat. \ - * {@link KnownResponseFormat} can be used interchangeably with ResponseFormat, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) - */ -export type ResponseFormat = string; - -/** Known values of {@link ComputeTravelTimeFor} that the service accepts. */ -export const enum KnownComputeTravelTimeFor { - /** Does not compute additional travel times. */ - None = "none", - /** Computes travel times for all types of traffic information and specifies all results in the fields noTrafficTravelTimeInSeconds, historicTrafficTravelTimeInSeconds and liveTrafficIncidentsTravelTimeInSeconds being included in the summaries in the route response. */ - All = "all" -} - -/** - * Defines values for ComputeTravelTimeFor. \ - * {@link KnownComputeTravelTimeFor} can be used interchangeably with ComputeTravelTimeFor, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **none**: Does not compute additional travel times. \ - * **all**: Computes travel times for all types of traffic information and specifies all results in the fields noTrafficTravelTimeInSeconds, historicTrafficTravelTimeInSeconds and liveTrafficIncidentsTravelTimeInSeconds being included in the summaries in the route response. - */ -export type ComputeTravelTimeFor = string; - -/** Known values of {@link SectionType} that the service accepts. */ -export const enum KnownSectionType { - /** Get sections if the route includes car trains. */ - CarTrain = "carTrain", - /** Countries the route has parts in. */ - Country = "country", - /** Get sections if the route includes ferries. */ - Ferry = "ferry", - /** Get sections if the route includes motorways. */ - Motorway = "motorway", - /** Get sections which are suited for pedestrians. */ - Pedestrian = "pedestrian", - /** Get sections which require a toll to be payed. */ - TollRoad = "tollRoad", - /** Get sections which require a toll vignette to be present. */ - TollVignette = "tollVignette", - /** Get sections which contain traffic information. */ - Traffic = "traffic", - /** Get sections in relation to the request parameter `travelMode`. */ - TravelMode = "travelMode", - /** Get sections if the route includes tunnels. */ - Tunnel = "tunnel" -} - -/** - * Defines values for SectionType. \ - * {@link KnownSectionType} can be used interchangeably with SectionType, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **carTrain**: Get sections if the route includes car trains. \ - * **country**: Countries the route has parts in. \ - * **ferry**: Get sections if the route includes ferries. \ - * **motorway**: Get sections if the route includes motorways. \ - * **pedestrian**: Get sections which are suited for pedestrians. \ - * **tollRoad**: Get sections which require a toll to be payed. \ - * **tollVignette**: Get sections which require a toll vignette to be present. \ - * **traffic**: Get sections which contain traffic information. \ - * **travelMode**: Get sections in relation to the request parameter `travelMode`. \ - * **tunnel**: Get sections if the route includes tunnels. - */ -export type SectionType = string; - -/** Known values of {@link WindingnessLevel} that the service accepts. */ -export const enum KnownWindingnessLevel { - /** low */ - Low = "low", - /** normal */ - Normal = "normal", - /** high */ - High = "high" -} - -/** - * Defines values for WindingnessLevel. \ - * {@link KnownWindingnessLevel} can be used interchangeably with WindingnessLevel, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **low**: low \ - * **normal**: normal \ - * **high**: high - */ -export type WindingnessLevel = string; - -/** Known values of {@link HillinessDegree} that the service accepts. */ -export const enum KnownHillinessDegree { - /** low */ - Low = "low", - /** normal */ - Normal = "normal", - /** high */ - High = "high" -} - -/** - * Defines values for HillinessDegree. \ - * {@link KnownHillinessDegree} can be used interchangeably with HillinessDegree, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **low**: low \ - * **normal**: normal \ - * **high**: high - */ -export type HillinessDegree = string; - -/** Known values of {@link TravelMode} that the service accepts. */ -export const enum KnownTravelMode { - /** The returned routes are optimized for cars. */ - Car = "car", - /** The returned routes are optimized for commercial vehicles, like for trucks. */ - Truck = "truck", - /** The returned routes are optimized for taxis. BETA functionality. */ - Taxi = "taxi", - /** The returned routes are optimized for buses, including the use of bus only lanes. BETA functionality. */ - Bus = "bus", - /** The returned routes are optimized for vans. BETA functionality. */ - Van = "van", - /** The returned routes are optimized for motorcycles. BETA functionality. */ - Motorcycle = "motorcycle", - /** The returned routes are optimized for bicycles, including use of bicycle lanes. */ - Bicycle = "bicycle", - /** The returned routes are optimized for pedestrians, including the use of sidewalks. */ - Pedestrian = "pedestrian" -} - -/** - * Defines values for TravelMode. \ - * {@link KnownTravelMode} can be used interchangeably with TravelMode, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **car**: The returned routes are optimized for cars. \ - * **truck**: The returned routes are optimized for commercial vehicles, like for trucks. \ - * **taxi**: The returned routes are optimized for taxis. BETA functionality. \ - * **bus**: The returned routes are optimized for buses, including the use of bus only lanes. BETA functionality. \ - * **van**: The returned routes are optimized for vans. BETA functionality. \ - * **motorcycle**: The returned routes are optimized for motorcycles. BETA functionality. \ - * **bicycle**: The returned routes are optimized for bicycles, including use of bicycle lanes. \ - * **pedestrian**: The returned routes are optimized for pedestrians, including the use of sidewalks. - */ -export type TravelMode = string; - -/** Known values of {@link RouteAvoidType} that the service accepts. */ -export const enum KnownRouteAvoidType { - /** Avoids toll roads. */ - TollRoads = "tollRoads", - /** Avoids motorways */ - Motorways = "motorways", - /** Avoids ferries */ - Ferries = "ferries", - /** Avoids unpaved roads */ - UnpavedRoads = "unpavedRoads", - /** Avoids routes that require the use of carpool (HOV/High Occupancy Vehicle) lanes. */ - Carpools = "carpools", - /** Avoids using the same road multiple times. Most useful in conjunction with `routeType`=thrilling. */ - AlreadyUsedRoads = "alreadyUsedRoads", - /** Avoids border crossings in route calculation. */ - BorderCrossings = "borderCrossings" -} - -/** - * Defines values for RouteAvoidType. \ - * {@link KnownRouteAvoidType} can be used interchangeably with RouteAvoidType, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **tollRoads**: Avoids toll roads. \ - * **motorways**: Avoids motorways \ - * **ferries**: Avoids ferries \ - * **unpavedRoads**: Avoids unpaved roads \ - * **carpools**: Avoids routes that require the use of carpool (HOV\/High Occupancy Vehicle) lanes. \ - * **alreadyUsedRoads**: Avoids using the same road multiple times. Most useful in conjunction with `routeType`=thrilling. \ - * **borderCrossings**: Avoids border crossings in route calculation. - */ -export type RouteAvoidType = string; - -/** Known values of {@link RouteType} that the service accepts. */ -export const enum KnownRouteType { - /** The fastest route. */ - Fastest = "fastest", - /** The shortest route by distance. */ - Shortest = "shortest", - /** A route balanced by economy and speed. */ - Eco = "eco", - /** Includes interesting or challenging roads and uses as few motorways as possible. You can choose the level of turns included and also the degree of hilliness. See the hilliness and windingness parameters for how to set this. There is a limit of 900 km on routes planned with `routeType`=thrilling */ - Thrilling = "thrilling" -} - -/** - * Defines values for RouteType. \ - * {@link KnownRouteType} can be used interchangeably with RouteType, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **fastest**: The fastest route. \ - * **shortest**: The shortest route by distance. \ - * **eco**: A route balanced by economy and speed. \ - * **thrilling**: Includes interesting or challenging roads and uses as few motorways as possible. You can choose the level of turns included and also the degree of hilliness. See the hilliness and windingness parameters for how to set this. There is a limit of 900 km on routes planned with `routeType`=thrilling - */ -export type RouteType = string; - -/** Known values of {@link VehicleLoadType} that the service accepts. */ -export const enum KnownVehicleLoadType { - /** Explosives */ - USHazmatClass1 = "USHazmatClass1", - /** Compressed gas */ - USHazmatClass2 = "USHazmatClass2", - /** Flammable liquids */ - USHazmatClass3 = "USHazmatClass3", - /** Flammable solids */ - USHazmatClass4 = "USHazmatClass4", - /** Oxidizers */ - USHazmatClass5 = "USHazmatClass5", - /** Poisons */ - USHazmatClass6 = "USHazmatClass6", - /** Radioactive */ - USHazmatClass7 = "USHazmatClass7", - /** Corrosives */ - USHazmatClass8 = "USHazmatClass8", - /** Miscellaneous */ - USHazmatClass9 = "USHazmatClass9", - /** Explosives */ - OtherHazmatExplosive = "otherHazmatExplosive", - /** Miscellaneous */ - OtherHazmatGeneral = "otherHazmatGeneral", - /** Harmful to water */ - OtherHazmatHarmfulToWater = "otherHazmatHarmfulToWater" -} - -/** - * Defines values for VehicleLoadType. \ - * {@link KnownVehicleLoadType} can be used interchangeably with VehicleLoadType, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **USHazmatClass1**: Explosives \ - * **USHazmatClass2**: Compressed gas \ - * **USHazmatClass3**: Flammable liquids \ - * **USHazmatClass4**: Flammable solids \ - * **USHazmatClass5**: Oxidizers \ - * **USHazmatClass6**: Poisons \ - * **USHazmatClass7**: Radioactive \ - * **USHazmatClass8**: Corrosives \ - * **USHazmatClass9**: Miscellaneous \ - * **otherHazmatExplosive**: Explosives \ - * **otherHazmatGeneral**: Miscellaneous \ - * **otherHazmatHarmfulToWater**: Harmful to water - */ -export type VehicleLoadType = string; - -/** Known values of {@link GeoJsonObjectType} that the service accepts. */ -export const enum KnownGeoJsonObjectType { - /** `GeoJSON Point` geometry. */ - GeoJsonPoint = "Point", - /** `GeoJSON MultiPoint` geometry. */ - GeoJsonMultiPoint = "MultiPoint", - /** `GeoJSON LineString` geometry. */ - GeoJsonLineString = "LineString", - /** `GeoJSON MultiLineString` geometry. */ - GeoJsonMultiLineString = "MultiLineString", - /** `GeoJSON Polygon` geometry. */ - GeoJsonPolygon = "Polygon", - /** `GeoJSON MultiPolygon` geometry. */ - GeoJsonMultiPolygon = "MultiPolygon", - /** `GeoJSON GeometryCollection` geometry. */ - GeoJsonGeometryCollection = "GeometryCollection", - /** `GeoJSON Feature` object. */ - GeoJsonFeature = "Feature", - /** `GeoJSON FeatureCollection` object. */ - GeoJsonFeatureCollection = "FeatureCollection" -} - -/** - * Defines values for GeoJsonObjectType. \ - * {@link KnownGeoJsonObjectType} can be used interchangeably with GeoJsonObjectType, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **Point**: `GeoJSON Point` geometry. \ - * **MultiPoint**: `GeoJSON MultiPoint` geometry. \ - * **LineString**: `GeoJSON LineString` geometry. \ - * **MultiLineString**: `GeoJSON MultiLineString` geometry. \ - * **Polygon**: `GeoJSON Polygon` geometry. \ - * **MultiPolygon**: `GeoJSON MultiPolygon` geometry. \ - * **GeometryCollection**: `GeoJSON GeometryCollection` geometry. \ - * **Feature**: `GeoJSON Feature` object. \ - * **FeatureCollection**: `GeoJSON FeatureCollection` object. - */ -export type GeoJsonObjectType = string; - -/** Known values of {@link TextFormat} that the service accepts. */ -export const enum KnownTextFormat { - /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ - Json = "json", - /** [The Extensible Markup Language](https://www.w3.org/TR/xml/) */ - Xml = "xml" -} - -/** - * Defines values for TextFormat. \ - * {@link KnownTextFormat} can be used interchangeably with TextFormat, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) \ - * **xml**: [The Extensible Markup Language](https:\/\/www.w3.org\/TR\/xml\/) - */ -export type TextFormat = string; - -/** Known values of {@link AlternativeRouteType} that the service accepts. */ -export const enum KnownAlternativeRouteType { - /** Allow any alternative route to be returned irrespective of how it compares to the reference route in terms of optimality. */ - AnyRoute = "anyRoute", - /** Return an alternative route only if it is better than the reference route according to the given planning criteria. */ - BetterRoute = "betterRoute" -} - -/** - * Defines values for AlternativeRouteType. \ - * {@link KnownAlternativeRouteType} can be used interchangeably with AlternativeRouteType, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **anyRoute**: Allow any alternative route to be returned irrespective of how it compares to the reference route in terms of optimality. \ - * **betterRoute**: Return an alternative route only if it is better than the reference route according to the given planning criteria. - */ -export type AlternativeRouteType = string; - -/** Known values of {@link RouteInstructionsType} that the service accepts. */ -export const enum KnownRouteInstructionsType { - /** Returns raw instruction data without human-readable messages. */ - Coded = "coded", - /** Returns raw instructions data with human-readable messages in plain text. */ - Text = "text", - /** - * Returns raw instruction data with tagged human-readable messages to permit formatting. A human-readable message is built up from repeatable identified elements. These are tagged to allow client applications to format them correctly. The following message components are tagged when instructionsType=tagged: street, roadNumber, signpostText, exitNumber, roundaboutExitNumber. - * - * Example of tagged 'Turn left' message:​ - * - * ``` - * Turn left onto A4/E19 - * towards Den Haag - * ``` - */ - Tagged = "tagged" -} - -/** - * Defines values for RouteInstructionsType. \ - * {@link KnownRouteInstructionsType} can be used interchangeably with RouteInstructionsType, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **coded**: Returns raw instruction data without human-readable messages. \ - * **text**: Returns raw instructions data with human-readable messages in plain text. \ - * **tagged**: Returns raw instruction data with tagged human-readable messages to permit formatting. A human-readable message is built up from repeatable identified elements. These are tagged to allow client applications to format them correctly. The following message components are tagged when instructionsType=tagged: street, roadNumber, signpostText, exitNumber, roundaboutExitNumber. - * - * Example of tagged 'Turn left' message:​ - * - * ``` - * Turn left onto A4<\/roadNumber>\/E19<\/roadNumber> - * towards Den Haag<\/signpostText> - * ``` - */ -export type RouteInstructionsType = string; - -/** Known values of {@link RouteRepresentation} that the service accepts. */ -export const enum KnownRouteRepresentation { - /** Includes route geometry in the response. */ - Polyline = "polyline", - /** Summary as per polyline but excluding the point geometry elements for the routes in the response. */ - SummaryOnly = "summaryOnly", - /** Includes only the optimized waypoint indices but does not include the route geometry in the response. */ - None = "none" -} - -/** - * Defines values for RouteRepresentation. \ - * {@link KnownRouteRepresentation} can be used interchangeably with RouteRepresentation, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **polyline**: Includes route geometry in the response. \ - * **summaryOnly**: Summary as per polyline but excluding the point geometry elements for the routes in the response. \ - * **none**: Includes only the optimized waypoint indices but does not include the route geometry in the response. - */ -export type RouteRepresentation = string; - -/** Known values of {@link VehicleEngineType} that the service accepts. */ -export const enum KnownVehicleEngineType { - /** Internal combustion engine. */ - Combustion = "combustion", - /** Electric engine. */ - Electric = "electric" -} - -/** - * Defines values for VehicleEngineType. \ - * {@link KnownVehicleEngineType} can be used interchangeably with VehicleEngineType, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **combustion**: Internal combustion engine. \ - * **electric**: Electric engine. - */ -export type VehicleEngineType = string; - -/** Known values of {@link MagnitudeOfDelay} that the service accepts. */ -export const enum KnownMagnitudeOfDelay { - /** Unknown. */ - Zero = "0", - /** Minor. */ - One = "1", - /** Moderate. */ - Two = "2", - /** Major. */ - Three = "3", - /** Undefined, used for road closures and other indefinite delays. */ - Four = "4" -} - -/** - * Defines values for MagnitudeOfDelay. \ - * {@link KnownMagnitudeOfDelay} can be used interchangeably with MagnitudeOfDelay, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **0**: Unknown. \ - * **1**: Minor. \ - * **2**: Moderate. \ - * **3**: Major. \ - * **4**: Undefined, used for road closures and other indefinite delays. - */ -export type MagnitudeOfDelay = string; - -/** Known values of {@link GuidanceInstructionType} that the service accepts. */ -export const enum KnownGuidanceInstructionType { - /** Turn. */ - Turn = "TURN", - /** Road Change. */ - RoadChange = "ROAD_CHANGE", - /** Departure location. */ - LocationDeparture = "LOCATION_DEPARTURE", - /** Arrival location. */ - LocationArrival = "LOCATION_ARRIVAL", - /** Direction information. */ - DirectionInfo = "DIRECTION_INFO", - /** Way point location. */ - LocationWaypoint = "LOCATION_WAYPOINT" -} - -/** - * Defines values for GuidanceInstructionType. \ - * {@link KnownGuidanceInstructionType} can be used interchangeably with GuidanceInstructionType, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **TURN**: Turn. \ - * **ROAD_CHANGE**: Road Change. \ - * **LOCATION_DEPARTURE**: Departure location. \ - * **LOCATION_ARRIVAL**: Arrival location. \ - * **DIRECTION_INFO**: Direction information. \ - * **LOCATION_WAYPOINT**: Way point location. - */ -export type GuidanceInstructionType = string; - -/** Known values of {@link JunctionType} that the service accepts. */ -export const enum KnownJunctionType { - /** regular */ - Regular = "REGULAR", - /** roundabout */ - Roundabout = "ROUNDABOUT", - /** bifurcation */ - Bifurcation = "BIFURCATION" -} - -/** - * Defines values for JunctionType. \ - * {@link KnownJunctionType} can be used interchangeably with JunctionType, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **REGULAR**: regular \ - * **ROUNDABOUT**: roundabout \ - * **BIFURCATION**: bifurcation - */ -export type JunctionType = string; - -/** Known values of {@link DrivingSide} that the service accepts. */ -export const enum KnownDrivingSide { - /** Left side. */ - Left = "LEFT", - /** Right side. */ - Right = "RIGHT" -} - -/** - * Defines values for DrivingSide. \ - * {@link KnownDrivingSide} can be used interchangeably with DrivingSide, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **LEFT**: Left side. \ - * **RIGHT**: Right side. - */ -export type DrivingSide = string; - -/** Known values of {@link GuidanceManeuver} that the service accepts. */ -export const enum KnownGuidanceManeuver { - /** You have arrived. */ - Arrive = "ARRIVE", - /** You have arrived. Your destination is on the left. */ - ArriveLeft = "ARRIVE_LEFT", - /** You have arrived. Your destination is on the right. */ - ArriveRight = "ARRIVE_RIGHT", - /** Leave. */ - Depart = "DEPART", - /** Keep straight on. */ - Straight = "STRAIGHT", - /** Keep right. */ - KeepRight = "KEEP_RIGHT", - /** Bear right. */ - BearRight = "BEAR_RIGHT", - /** Turn right. */ - TurnRight = "TURN_RIGHT", - /** Turn sharp right. */ - SharpRight = "SHARP_RIGHT", - /** Keep left. */ - KeepLeft = "KEEP_LEFT", - /** Bear left. */ - BearLeft = "BEAR_LEFT", - /** Turn left. */ - TurnLeft = "TURN_LEFT", - /** Turn sharp left. */ - SharpLeft = "SHARP_LEFT", - /** Make a U-turn. */ - MakeUturn = "MAKE_UTURN", - /** Take the motorway. */ - EnterMotorway = "ENTER_MOTORWAY", - /** Take the freeway. */ - EnterFreeway = "ENTER_FREEWAY", - /** Take the highway. */ - EnterHighway = "ENTER_HIGHWAY", - /** Take the exit. */ - TakeExit = "TAKE_EXIT", - /** Take the left exit. */ - MotorwayExitLeft = "MOTORWAY_EXIT_LEFT", - /** Take the right exit. */ - MotorwayExitRight = "MOTORWAY_EXIT_RIGHT", - /** Take the ferry. */ - TakeFerry = "TAKE_FERRY", - /** Cross the roundabout. */ - RoundaboutCross = "ROUNDABOUT_CROSS", - /** At the roundabout take the exit on the right. */ - RoundaboutRight = "ROUNDABOUT_RIGHT", - /** At the roundabout take the exit on the left. */ - RoundaboutLeft = "ROUNDABOUT_LEFT", - /** Go around the roundabout. */ - RoundaboutBack = "ROUNDABOUT_BACK", - /** Try to make a U-turn. */ - TRYMakeUturn = "TRY_MAKE_UTURN", - /** Follow. */ - Follow = "FOLLOW", - /** Switch to the parallel road. */ - SwitchParallelRoad = "SWITCH_PARALLEL_ROAD", - /** Switch to the main road. */ - SwitchMainRoad = "SWITCH_MAIN_ROAD", - /** Take the ramp. */ - EntranceRamp = "ENTRANCE_RAMP", - /** You have reached the waypoint. It is on the left. */ - WaypointLeft = "WAYPOINT_LEFT", - /** You have reached the waypoint. It is on the right. */ - WaypointRight = "WAYPOINT_RIGHT", - /** You have reached the waypoint. */ - WaypointReached = "WAYPOINT_REACHED" -} - -/** - * Defines values for GuidanceManeuver. \ - * {@link KnownGuidanceManeuver} can be used interchangeably with GuidanceManeuver, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **ARRIVE**: You have arrived. \ - * **ARRIVE_LEFT**: You have arrived. Your destination is on the left. \ - * **ARRIVE_RIGHT**: You have arrived. Your destination is on the right. \ - * **DEPART**: Leave. \ - * **STRAIGHT**: Keep straight on. \ - * **KEEP_RIGHT**: Keep right. \ - * **BEAR_RIGHT**: Bear right. \ - * **TURN_RIGHT**: Turn right. \ - * **SHARP_RIGHT**: Turn sharp right. \ - * **KEEP_LEFT**: Keep left. \ - * **BEAR_LEFT**: Bear left. \ - * **TURN_LEFT**: Turn left. \ - * **SHARP_LEFT**: Turn sharp left. \ - * **MAKE_UTURN**: Make a U-turn. \ - * **ENTER_MOTORWAY**: Take the motorway. \ - * **ENTER_FREEWAY**: Take the freeway. \ - * **ENTER_HIGHWAY**: Take the highway. \ - * **TAKE_EXIT**: Take the exit. \ - * **MOTORWAY_EXIT_LEFT**: Take the left exit. \ - * **MOTORWAY_EXIT_RIGHT**: Take the right exit. \ - * **TAKE_FERRY**: Take the ferry. \ - * **ROUNDABOUT_CROSS**: Cross the roundabout. \ - * **ROUNDABOUT_RIGHT**: At the roundabout take the exit on the right. \ - * **ROUNDABOUT_LEFT**: At the roundabout take the exit on the left. \ - * **ROUNDABOUT_BACK**: Go around the roundabout. \ - * **TRY_MAKE_UTURN**: Try to make a U-turn. \ - * **FOLLOW**: Follow. \ - * **SWITCH_PARALLEL_ROAD**: Switch to the parallel road. \ - * **SWITCH_MAIN_ROAD**: Switch to the main road. \ - * **ENTRANCE_RAMP**: Take the ramp. \ - * **WAYPOINT_LEFT**: You have reached the waypoint. It is on the left. \ - * **WAYPOINT_RIGHT**: You have reached the waypoint. It is on the right. \ - * **WAYPOINT_REACHED**: You have reached the waypoint. - */ -export type GuidanceManeuver = string; - -/** Known values of {@link GeographicResourceLocation} that the service accepts. */ -export const enum KnownGeographicResourceLocation { - /** Used to access an Azure Maps Creator resource in the United States */ - Us = "us", - /** Used to access an Azure Maps Creator resource in Europe */ - Eu = "eu" -} - -/** - * Defines values for GeographicResourceLocation. \ - * {@link KnownGeographicResourceLocation} can be used interchangeably with GeographicResourceLocation, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **us**: Used to access an Azure Maps Creator resource in the United States \ - * **eu**: Used to access an Azure Maps Creator resource in Europe - */ -export type GeographicResourceLocation = string; - -/** Optional parameters. */ -export interface RoutePostRouteMatrixOptionalParams - extends coreClient.OperationOptions { - /** Boolean to indicate whether to execute the request synchronously. If set to true, user will get a 200 response if the request is finished under 120 seconds. Otherwise, user will get a 202 response right away. Please refer to the API description for more details on 202 response. **Supported only for async request**. */ - waitForResults?: boolean; - /** Specifies whether to return additional travel times using different types of traffic information (none, historic, live) as well as the default best-estimate travel time. */ - computeTravelTimeFor?: ComputeTravelTimeFor; - /** Specifies which of the section types is reported in the route response.

For example if sectionType = pedestrian the sections which are suited for pedestrians only are returned. Multiple types can be used. The default sectionType refers to the travelMode input. By default travelMode is set to car */ - sectionType?: SectionType; - /** The date and time of arrival at the destination point. It must be specified as a dateTime. When a time zone offset is not specified it will be assumed to be that of the destination point. The arriveAt value must be in the future. The arriveAt parameter cannot be used in conjunction with departAt, minDeviationDistance or minDeviationTime. */ - arriveAt?: Date; - /** The date and time of departure from the origin point. Departure times apart from now must be specified as a dateTime. When a time zone offset is not specified, it will be assumed to be that of the origin point. The departAt value must be in the future in the date-time format (1996-12-19T16:39:57-08:00). */ - departAt?: Date; - /** Weight per axle of the vehicle in kg. A value of 0 means that weight restrictions per axle are not considered. */ - vehicleAxleWeight?: number; - /** Length of the vehicle in meters. A value of 0 means that length restrictions are not considered. */ - vehicleLength?: number; - /** Height of the vehicle in meters. A value of 0 means that height restrictions are not considered. */ - vehicleHeight?: number; - /** Width of the vehicle in meters. A value of 0 means that width restrictions are not considered. */ - vehicleWidth?: number; - /** - * Maximum speed of the vehicle in km/hour. The max speed in the vehicle profile is used to check whether a vehicle is allowed on motorways. - * - * * A value of 0 means that an appropriate value for the vehicle will be determined and applied during route planning. - * - * * A non-zero value may be overridden during route planning. For example, the current traffic flow is 60 km/hour. If the vehicle maximum speed is set to 50 km/hour, the routing engine will consider 60 km/hour as this is the current situation. If the maximum speed of the vehicle is provided as 80 km/hour but the current traffic flow is 60 km/hour, then routing engine will again use 60 km/hour. - */ - vehicleMaxSpeed?: number; - /** Weight of the vehicle in kilograms. */ - vehicleWeight?: number; - /** Level of turns for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ - windingness?: WindingnessLevel; - /** Degree of hilliness for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ - hilliness?: HillinessDegree; - /** The mode of travel for the requested route. If not defined, default is 'car'. Note that the requested travelMode may not be available for the entire route. Where the requested travelMode is not available for a particular section, the travelMode element of the response for that section will be "other". Note that travel modes bus, motorcycle, taxi and van are BETA functionality. Full restriction data is not available in all areas. In **calculateReachableRange** requests, the values bicycle and pedestrian must not be used. */ - travelMode?: TravelMode; - /** Specifies something that the route calculation should try to avoid when determining the route. Can be specified multiple times in one request, for example, '&avoid=motorways&avoid=tollRoads&avoid=ferries'. In calculateReachableRange requests, the value alreadyUsedRoads must not be used. */ - avoid?: RouteAvoidType[]; - /** - * Possible values: - * * true - Do consider all available traffic information during routing - * * false - Ignore current traffic data during routing. Note that although the current traffic data is ignored - * during routing, the effect of historic traffic on effective road speeds is still incorporated. - */ - traffic?: boolean; - /** The type of route requested. */ - routeType?: RouteType; - /** Types of cargo that may be classified as hazardous materials and restricted from some roads. Available vehicleLoadType values are US Hazmat classes 1 through 9, plus generic classifications for use in other countries. Values beginning with USHazmat are for US routing while otherHazmat should be used for all other countries. vehicleLoadType can be specified multiple times. This parameter is currently only considered for travelMode=truck. */ - vehicleLoadType?: VehicleLoadType; - /** Delay to wait until next poll, in milliseconds. */ - updateIntervalInMs?: number; - /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ - resumeFrom?: string; -} - -/** Contains response data for the postRouteMatrix operation. */ -export type RoutePostRouteMatrixResponse = RouteMatrixResponse; - -/** Optional parameters. */ -export interface RoutePostRouteMatrixSyncOptionalParams - extends coreClient.OperationOptions { - /** Boolean to indicate whether to execute the request synchronously. If set to true, user will get a 200 response if the request is finished under 120 seconds. Otherwise, user will get a 202 response right away. Please refer to the API description for more details on 202 response. **Supported only for async request**. */ - waitForResults?: boolean; - /** Specifies whether to return additional travel times using different types of traffic information (none, historic, live) as well as the default best-estimate travel time. */ - computeTravelTimeFor?: ComputeTravelTimeFor; - /** Specifies which of the section types is reported in the route response.

For example if sectionType = pedestrian the sections which are suited for pedestrians only are returned. Multiple types can be used. The default sectionType refers to the travelMode input. By default travelMode is set to car */ - sectionType?: SectionType; - /** The date and time of arrival at the destination point. It must be specified as a dateTime. When a time zone offset is not specified it will be assumed to be that of the destination point. The arriveAt value must be in the future. The arriveAt parameter cannot be used in conjunction with departAt, minDeviationDistance or minDeviationTime. */ - arriveAt?: Date; - /** The date and time of departure from the origin point. Departure times apart from now must be specified as a dateTime. When a time zone offset is not specified, it will be assumed to be that of the origin point. The departAt value must be in the future in the date-time format (1996-12-19T16:39:57-08:00). */ - departAt?: Date; - /** Weight per axle of the vehicle in kg. A value of 0 means that weight restrictions per axle are not considered. */ - vehicleAxleWeight?: number; - /** Length of the vehicle in meters. A value of 0 means that length restrictions are not considered. */ - vehicleLength?: number; - /** Height of the vehicle in meters. A value of 0 means that height restrictions are not considered. */ - vehicleHeight?: number; - /** Width of the vehicle in meters. A value of 0 means that width restrictions are not considered. */ - vehicleWidth?: number; - /** - * Maximum speed of the vehicle in km/hour. The max speed in the vehicle profile is used to check whether a vehicle is allowed on motorways. - * - * * A value of 0 means that an appropriate value for the vehicle will be determined and applied during route planning. - * - * * A non-zero value may be overridden during route planning. For example, the current traffic flow is 60 km/hour. If the vehicle maximum speed is set to 50 km/hour, the routing engine will consider 60 km/hour as this is the current situation. If the maximum speed of the vehicle is provided as 80 km/hour but the current traffic flow is 60 km/hour, then routing engine will again use 60 km/hour. - */ - vehicleMaxSpeed?: number; - /** Weight of the vehicle in kilograms. */ - vehicleWeight?: number; - /** Level of turns for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ - windingness?: WindingnessLevel; - /** Degree of hilliness for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ - hilliness?: HillinessDegree; - /** The mode of travel for the requested route. If not defined, default is 'car'. Note that the requested travelMode may not be available for the entire route. Where the requested travelMode is not available for a particular section, the travelMode element of the response for that section will be "other". Note that travel modes bus, motorcycle, taxi and van are BETA functionality. Full restriction data is not available in all areas. In **calculateReachableRange** requests, the values bicycle and pedestrian must not be used. */ - travelMode?: TravelMode; - /** Specifies something that the route calculation should try to avoid when determining the route. Can be specified multiple times in one request, for example, '&avoid=motorways&avoid=tollRoads&avoid=ferries'. In calculateReachableRange requests, the value alreadyUsedRoads must not be used. */ - avoid?: RouteAvoidType[]; - /** - * Possible values: - * * true - Do consider all available traffic information during routing - * * false - Ignore current traffic data during routing. Note that although the current traffic data is ignored - * during routing, the effect of historic traffic on effective road speeds is still incorporated. - */ - traffic?: boolean; - /** The type of route requested. */ - routeType?: RouteType; - /** Types of cargo that may be classified as hazardous materials and restricted from some roads. Available vehicleLoadType values are US Hazmat classes 1 through 9, plus generic classifications for use in other countries. Values beginning with USHazmat are for US routing while otherHazmat should be used for all other countries. vehicleLoadType can be specified multiple times. This parameter is currently only considered for travelMode=truck. */ - vehicleLoadType?: VehicleLoadType; -} - -/** Contains response data for the postRouteMatrixSync operation. */ -export type RoutePostRouteMatrixSyncResponse = RouteMatrixResponse; - -/** Optional parameters. */ -export interface RouteGetRouteDirectionsOptionalParams - extends coreClient.OperationOptions { - /** Specifies whether to return additional travel times using different types of traffic information (none, historic, live) as well as the default best-estimate travel time. */ - computeTravelTimeFor?: ComputeTravelTimeFor; - /** Specifies which of the section types is reported in the route response.

For example if sectionType = pedestrian the sections which are suited for pedestrians only are returned. Multiple types can be used. The default sectionType refers to the travelMode input. By default travelMode is set to car */ - sectionType?: SectionType; - /** The date and time of arrival at the destination point. It must be specified as a dateTime. When a time zone offset is not specified it will be assumed to be that of the destination point. The arriveAt value must be in the future. The arriveAt parameter cannot be used in conjunction with departAt, minDeviationDistance or minDeviationTime. */ - arriveAt?: Date; - /** The date and time of departure from the origin point. Departure times apart from now must be specified as a dateTime. When a time zone offset is not specified, it will be assumed to be that of the origin point. The departAt value must be in the future in the date-time format (1996-12-19T16:39:57-08:00). */ - departAt?: Date; - /** Weight per axle of the vehicle in kg. A value of 0 means that weight restrictions per axle are not considered. */ - vehicleAxleWeight?: number; - /** Length of the vehicle in meters. A value of 0 means that length restrictions are not considered. */ - vehicleLength?: number; - /** Height of the vehicle in meters. A value of 0 means that height restrictions are not considered. */ - vehicleHeight?: number; - /** Width of the vehicle in meters. A value of 0 means that width restrictions are not considered. */ - vehicleWidth?: number; - /** - * Maximum speed of the vehicle in km/hour. The max speed in the vehicle profile is used to check whether a vehicle is allowed on motorways. - * - * * A value of 0 means that an appropriate value for the vehicle will be determined and applied during route planning. - * - * * A non-zero value may be overridden during route planning. For example, the current traffic flow is 60 km/hour. If the vehicle maximum speed is set to 50 km/hour, the routing engine will consider 60 km/hour as this is the current situation. If the maximum speed of the vehicle is provided as 80 km/hour but the current traffic flow is 60 km/hour, then routing engine will again use 60 km/hour. - */ - vehicleMaxSpeed?: number; - /** - * Weight of the vehicle in kilograms. - * - * * It is mandatory if any of the *Efficiency parameters are set. - * - * * It must be strictly positive when used in the context of the Consumption Model. Weight restrictions are considered. - * - * * If no detailed **Consumption Model** is specified and the value of **vehicleWeight** is non-zero, then weight restrictions are considered. - * - * * In all other cases, this parameter is ignored. - * - * Sensible Values : for **Combustion Model** : 1600, for **Electric Model** : 1900 - */ - vehicleWeight?: number; - /** Level of turns for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ - windingness?: WindingnessLevel; - /** Degree of hilliness for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ - hilliness?: HillinessDegree; - /** The mode of travel for the requested route. If not defined, default is 'car'. Note that the requested travelMode may not be available for the entire route. Where the requested travelMode is not available for a particular section, the travelMode element of the response for that section will be "other". Note that travel modes bus, motorcycle, taxi and van are BETA functionality. Full restriction data is not available in all areas. In **calculateReachableRange** requests, the values bicycle and pedestrian must not be used. */ - travelMode?: TravelMode; - /** Specifies something that the route calculation should try to avoid when determining the route. Can be specified multiple times in one request, for example, '&avoid=motorways&avoid=tollRoads&avoid=ferries'. In calculateReachableRange requests, the value alreadyUsedRoads must not be used. */ - avoid?: RouteAvoidType[]; - /** - * Possible values: - * * true - Do consider all available traffic information during routing - * * false - Ignore current traffic data during routing. Note that although the current traffic data is ignored - * during routing, the effect of historic traffic on effective road speeds is still incorporated. - */ - traffic?: boolean; - /** The type of route requested. */ - routeType?: RouteType; - /** Types of cargo that may be classified as hazardous materials and restricted from some roads. Available vehicleLoadType values are US Hazmat classes 1 through 9, plus generic classifications for use in other countries. Values beginning with USHazmat are for US routing while otherHazmat should be used for all other countries. vehicleLoadType can be specified multiple times. This parameter is currently only considered for travelMode=truck. */ - vehicleLoadType?: VehicleLoadType; - /** Number of desired alternative routes to be calculated. Default: 0, minimum: 0 and maximum: 5 */ - maxAlternatives?: number; - /** Controls the optimality, with respect to the given planning criteria, of the calculated alternatives compared to the reference route. */ - alternativeType?: AlternativeRouteType; - /** All alternative routes returned will follow the reference route (see section POST Requests) from the origin point of the calculateRoute request for at least this number of meters. Can only be used when reconstructing a route. The minDeviationDistance parameter cannot be used in conjunction with arriveAt */ - minDeviationDistance?: number; - /** - * All alternative routes returned will follow the reference route (see section POST Requests) from the origin point of the calculateRoute request for at least this number of seconds. Can only be used when reconstructing a route. The minDeviationTime parameter cannot be used in conjunction with arriveAt. Default value is 0. Setting )minDeviationTime_ to a value greater than zero has the following consequences: - * - The origin point of the _calculateRoute_ Request must be on - * (or very near) the input reference route. - * - If this is not the case, an error is returned. - * - However, the origin point does not need to be at the beginning - * of the input reference route (it can be thought of as the current - * vehicle position on the reference route). - * - The reference route, returned as the first route in the _calculateRoute_ - * Response, will start at the origin point specified in the _calculateRoute_ - * Request. The initial part of the input reference route up until the origin - * point will be excluded from the Response. - * - The values of _minDeviationDistance_ and _minDeviationTime_ determine - * how far alternative routes will be guaranteed to follow the reference - * route from the origin point onwards. - * - The route must use _departAt_. - * - The _vehicleHeading_ is ignored. - */ - minDeviationTime?: number; - /** If specified, guidance instructions will be returned. Note that the instructionsType parameter cannot be used in conjunction with routeRepresentation=none */ - instructionsType?: RouteInstructionsType; - /** - * The language parameter determines the language of the guidance messages. Proper nouns (the names of streets, plazas, etc.) are returned in the specified language, or if that is not available, they are returned in an available language that is close to it. Allowed values are (a subset of) the IETF language tags. The currently supported languages are listed in the [Supported languages section](https://docs.microsoft.com/azure/azure-maps/supported-languages). - * - * Default value: en-GB - */ - language?: string; - /** Re-order the route waypoints using a fast heuristic algorithm to reduce the route length. Yields best results when used in conjunction with routeType _shortest_. Notice that origin and destination are excluded from the optimized waypoint indices. To include origin and destination in the response, please increase all the indices by 1 to account for the origin, and then add the destination as the final index. Possible values are true or false. True computes a better order if possible, but is not allowed to be used in conjunction with maxAlternatives value greater than 0 or in conjunction with circle waypoints. False will use the locations in the given order and not allowed to be used in conjunction with routeRepresentation _none_. */ - computeBestOrder?: boolean; - /** Specifies the representation of the set of routes provided as response. This parameter value can only be used in conjunction with computeBestOrder=true. */ - routeRepresentation?: RouteRepresentation; - /** The directional heading of the vehicle in degrees starting at true North and continuing in clockwise direction. North is 0 degrees, east is 90 degrees, south is 180 degrees, west is 270 degrees. Possible values 0-359 */ - vehicleHeading?: number; - /** Specifies which data should be reported for diagnosis purposes. The only possible value is _effectiveSettings_. Reports the effective parameters or data used when calling the API. In the case of defaulted parameters the default will be reflected where the parameter was not specified by the caller. */ - report?: string; - /** Vehicle is used for commercial purposes and thus may not be allowed to drive on some roads. */ - vehicleCommercial?: boolean; - /** Engine type of the vehicle. When a detailed Consumption Model is specified, it must be consistent with the value of **vehicleEngineType**. */ - vehicleEngineType?: VehicleEngineType; - /** - * - * Specifies the speed-dependent component of consumption. - * - * Provided as an unordered list of colon-delimited speed & consumption-rate pairs. The list defines points on a consumption curve. Consumption rates for speeds not in the list are found as follows: - * - * * by linear interpolation, if the given speed lies in between two speeds in the list - * - * * by linear extrapolation otherwise, assuming a constant (ΔConsumption/ΔSpeed) determined by the nearest two points in the list - * - * The list must contain between 1 and 25 points (inclusive), and may not contain duplicate points for the same speed. If it only contains a single point, then the consumption rate of that point is used without further processing. - * - * Consumption specified for the largest speed must be greater than or equal to that of the penultimate largest speed. This ensures that extrapolation does not lead to negative consumption rates. - * - * Similarly, consumption values specified for the two smallest speeds in the list cannot lead to a negative consumption rate for any smaller speed. - * - * The valid range for the consumption values(expressed in l/100km) is between 0.01 and 100000.0. - * - * Sensible Values : 50,6.3:130,11.5 - * - * **Note** : This parameter is required for **The Combustion Consumption Model**. - */ - constantSpeedConsumptionInLitersPerHundredkm?: number; - /** - * Specifies the current supply of fuel in liters. - * - * Sensible Values : 55 - */ - currentFuelInLiters?: number; - /** - * Specifies the amount of fuel consumed for sustaining auxiliary systems of the vehicle, in liters per hour. - * - * It can be used to specify consumption due to devices and systems such as AC systems, radio, heating, etc. - * - * Sensible Values : 0.2 - */ - auxiliaryPowerInLitersPerHour?: number; - /** - * Specifies the amount of chemical energy stored in one liter of fuel in megajoules (MJ). It is used in conjunction with the ***Efficiency** parameters for conversions between saved or consumed energy and fuel. For example, energy density is 34.2 MJ/l for gasoline, and 35.8 MJ/l for Diesel fuel. - * - * This parameter is required if any ***Efficiency** parameter is set. - * - * Sensible Values : 34.2 - */ - fuelEnergyDensityInMJoulesPerLiter?: number; - /** - * Specifies the efficiency of converting chemical energy stored in fuel to kinetic energy when the vehicle accelerates _(i.e. KineticEnergyGained/ChemicalEnergyConsumed). ChemicalEnergyConsumed_ is obtained by converting consumed fuel to chemical energy using **fuelEnergyDensityInMJoulesPerLiter**. - * - * Must be paired with **decelerationEfficiency**. - * - * The range of values allowed are 0.0 to 1/**decelerationEfficiency**. - * - * Sensible Values : for **Combustion Model** : 0.33, for **Electric Model** : 0.66 - */ - accelerationEfficiency?: number; - /** - * Specifies the efficiency of converting kinetic energy to saved (not consumed) fuel when the vehicle decelerates _(i.e. ChemicalEnergySaved/KineticEnergyLost). ChemicalEnergySaved_ is obtained by converting saved (not consumed) fuel to energy using **fuelEnergyDensityInMJoulesPerLiter**. - * - * Must be paired with **accelerationEfficiency**. - * - * The range of values allowed are 0.0 to 1/**accelerationEfficiency**. - * - * Sensible Values : for **Combustion Model** : 0.83, for **Electric Model** : 0.91 - */ - decelerationEfficiency?: number; - /** - * Specifies the efficiency of converting chemical energy stored in fuel to potential energy when the vehicle gains elevation _(i.e. PotentialEnergyGained/ChemicalEnergyConsumed). ChemicalEnergyConsumed_ is obtained by converting consumed fuel to chemical energy using **fuelEnergyDensityInMJoulesPerLiter**. - * - * Must be paired with **downhillEfficiency**. - * - * The range of values allowed are 0.0 to 1/**downhillEfficiency**. - * - * Sensible Values : for **Combustion Model** : 0.27, for **Electric Model** : 0.74 - */ - uphillEfficiency?: number; - /** - * Specifies the efficiency of converting potential energy to saved (not consumed) fuel when the vehicle loses elevation _(i.e. ChemicalEnergySaved/PotentialEnergyLost). ChemicalEnergySaved_ is obtained by converting saved (not consumed) fuel to energy using **fuelEnergyDensityInMJoulesPerLiter**. - * - * Must be paired with **uphillEfficiency**. - * - * The range of values allowed are 0.0 to 1/**uphillEfficiency**. - * - * Sensible Values : for **Combustion Model** : 0.51, for **Electric Model** : 0.73 - */ - downhillEfficiency?: number; - /** - * Specifies the speed-dependent component of consumption. - * - * Provided as an unordered list of speed/consumption-rate pairs. The list defines points on a consumption curve. Consumption rates for speeds not in the list are found as follows: - * - * * by linear interpolation, if the given speed lies in between two speeds in the list - * - * * by linear extrapolation otherwise, assuming a constant (ΔConsumption/ΔSpeed) determined by the nearest two points in the list - * - * The list must contain between 1 and 25 points (inclusive), and may not contain duplicate points for the same speed. If it only contains a single point, then the consumption rate of that point is used without further processing. - * - * Consumption specified for the largest speed must be greater than or equal to that of the penultimate largest speed. This ensures that extrapolation does not lead to negative consumption rates. - * - * Similarly, consumption values specified for the two smallest speeds in the list cannot lead to a negative consumption rate for any smaller speed. - * - * The valid range for the consumption values(expressed in kWh/100km) is between 0.01 and 100000.0. - * - * Sensible Values : 50,8.2:130,21.3 - * - * This parameter is required for **Electric consumption model**. - */ - constantSpeedConsumptionInkWhPerHundredkm?: string; - /** - * Specifies the current electric energy supply in kilowatt hours (kWh). - * - * This parameter co-exists with **maxChargeInkWh** parameter. - * - * The range of values allowed are 0.0 to **maxChargeInkWh**. - * - * Sensible Values : 43 - */ - currentChargeInkWh?: string; - /** - * Specifies the maximum electric energy supply in kilowatt hours (kWh) that may be stored in the vehicle's battery. - * - * This parameter co-exists with **currentChargeInkWh** parameter. - * - * Minimum value has to be greater than or equal to **currentChargeInkWh**. - * - * Sensible Values : 85 - */ - maxChargeInkWh?: string; - /** - * Specifies the amount of power consumed for sustaining auxiliary systems, in kilowatts (kW). - * - * It can be used to specify consumption due to devices and systems such as AC systems, radio, heating, etc. - * - * Sensible Values : 1.7 - */ - auxiliaryPowerInkW?: string; -} - -/** Contains response data for the getRouteDirections operation. */ -export type RouteGetRouteDirectionsResponse = RouteDirectionsResponse; - -/** Optional parameters. */ -export interface RoutePostRouteDirectionsOptionalParams - extends coreClient.OperationOptions { - /** Specifies whether to return additional travel times using different types of traffic information (none, historic, live) as well as the default best-estimate travel time. */ - computeTravelTimeFor?: ComputeTravelTimeFor; - /** Specifies which of the section types is reported in the route response.

For example if sectionType = pedestrian the sections which are suited for pedestrians only are returned. Multiple types can be used. The default sectionType refers to the travelMode input. By default travelMode is set to car */ - sectionType?: SectionType; - /** The date and time of arrival at the destination point. It must be specified as a dateTime. When a time zone offset is not specified it will be assumed to be that of the destination point. The arriveAt value must be in the future. The arriveAt parameter cannot be used in conjunction with departAt, minDeviationDistance or minDeviationTime. */ - arriveAt?: Date; - /** The date and time of departure from the origin point. Departure times apart from now must be specified as a dateTime. When a time zone offset is not specified, it will be assumed to be that of the origin point. The departAt value must be in the future in the date-time format (1996-12-19T16:39:57-08:00). */ - departAt?: Date; - /** Weight per axle of the vehicle in kg. A value of 0 means that weight restrictions per axle are not considered. */ - vehicleAxleWeight?: number; - /** Length of the vehicle in meters. A value of 0 means that length restrictions are not considered. */ - vehicleLength?: number; - /** Height of the vehicle in meters. A value of 0 means that height restrictions are not considered. */ - vehicleHeight?: number; - /** Width of the vehicle in meters. A value of 0 means that width restrictions are not considered. */ - vehicleWidth?: number; - /** - * Maximum speed of the vehicle in km/hour. The max speed in the vehicle profile is used to check whether a vehicle is allowed on motorways. - * - * * A value of 0 means that an appropriate value for the vehicle will be determined and applied during route planning. - * - * * A non-zero value may be overridden during route planning. For example, the current traffic flow is 60 km/hour. If the vehicle maximum speed is set to 50 km/hour, the routing engine will consider 60 km/hour as this is the current situation. If the maximum speed of the vehicle is provided as 80 km/hour but the current traffic flow is 60 km/hour, then routing engine will again use 60 km/hour. - */ - vehicleMaxSpeed?: number; - /** - * Weight of the vehicle in kilograms. - * - * * It is mandatory if any of the *Efficiency parameters are set. - * - * * It must be strictly positive when used in the context of the Consumption Model. Weight restrictions are considered. - * - * * If no detailed **Consumption Model** is specified and the value of **vehicleWeight** is non-zero, then weight restrictions are considered. - * - * * In all other cases, this parameter is ignored. - * - * Sensible Values : for **Combustion Model** : 1600, for **Electric Model** : 1900 - */ - vehicleWeight?: number; - /** Level of turns for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ - windingness?: WindingnessLevel; - /** Degree of hilliness for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ - hilliness?: HillinessDegree; - /** The mode of travel for the requested route. If not defined, default is 'car'. Note that the requested travelMode may not be available for the entire route. Where the requested travelMode is not available for a particular section, the travelMode element of the response for that section will be "other". Note that travel modes bus, motorcycle, taxi and van are BETA functionality. Full restriction data is not available in all areas. In **calculateReachableRange** requests, the values bicycle and pedestrian must not be used. */ - travelMode?: TravelMode; - /** Specifies something that the route calculation should try to avoid when determining the route. Can be specified multiple times in one request, for example, '&avoid=motorways&avoid=tollRoads&avoid=ferries'. In calculateReachableRange requests, the value alreadyUsedRoads must not be used. */ - avoid?: RouteAvoidType[]; - /** - * Possible values: - * * true - Do consider all available traffic information during routing - * * false - Ignore current traffic data during routing. Note that although the current traffic data is ignored - * during routing, the effect of historic traffic on effective road speeds is still incorporated. - */ - traffic?: boolean; - /** The type of route requested. */ - routeType?: RouteType; - /** Types of cargo that may be classified as hazardous materials and restricted from some roads. Available vehicleLoadType values are US Hazmat classes 1 through 9, plus generic classifications for use in other countries. Values beginning with USHazmat are for US routing while otherHazmat should be used for all other countries. vehicleLoadType can be specified multiple times. This parameter is currently only considered for travelMode=truck. */ - vehicleLoadType?: VehicleLoadType; - /** Number of desired alternative routes to be calculated. Default: 0, minimum: 0 and maximum: 5 */ - maxAlternatives?: number; - /** Controls the optimality, with respect to the given planning criteria, of the calculated alternatives compared to the reference route. */ - alternativeType?: AlternativeRouteType; - /** All alternative routes returned will follow the reference route (see section POST Requests) from the origin point of the calculateRoute request for at least this number of meters. Can only be used when reconstructing a route. The minDeviationDistance parameter cannot be used in conjunction with arriveAt */ - minDeviationDistance?: number; - /** - * All alternative routes returned will follow the reference route (see section POST Requests) from the origin point of the calculateRoute request for at least this number of seconds. Can only be used when reconstructing a route. The minDeviationTime parameter cannot be used in conjunction with arriveAt. Default value is 0. Setting )minDeviationTime_ to a value greater than zero has the following consequences: - * - The origin point of the _calculateRoute_ Request must be on - * (or very near) the input reference route. - * - If this is not the case, an error is returned. - * - However, the origin point does not need to be at the beginning - * of the input reference route (it can be thought of as the current - * vehicle position on the reference route). - * - The reference route, returned as the first route in the _calculateRoute_ - * Response, will start at the origin point specified in the _calculateRoute_ - * Request. The initial part of the input reference route up until the origin - * point will be excluded from the Response. - * - The values of _minDeviationDistance_ and _minDeviationTime_ determine - * how far alternative routes will be guaranteed to follow the reference - * route from the origin point onwards. - * - The route must use _departAt_. - * - The _vehicleHeading_ is ignored. - */ - minDeviationTime?: number; - /** If specified, guidance instructions will be returned. Note that the instructionsType parameter cannot be used in conjunction with routeRepresentation=none */ - instructionsType?: RouteInstructionsType; - /** The language parameter determines the language of the guidance messages. It does not affect proper nouns (the names of streets, plazas, etc.) It has no effect when instructionsType=coded. Allowed values are (a subset of) the IETF language tags described */ - language?: string; - /** Re-order the route waypoints using a fast heuristic algorithm to reduce the route length. Yields best results when used in conjunction with routeType _shortest_. Notice that origin and destination are excluded from the optimized waypoint indices. To include origin and destination in the response, please increase all the indices by 1 to account for the origin, and then add the destination as the final index. Possible values are true or false. True computes a better order if possible, but is not allowed to be used in conjunction with maxAlternatives value greater than 0 or in conjunction with circle waypoints. False will use the locations in the given order and not allowed to be used in conjunction with routeRepresentation _none_. */ - computeBestOrder?: boolean; - /** Specifies the representation of the set of routes provided as response. This parameter value can only be used in conjunction with computeBestOrder=true. */ - routeRepresentation?: RouteRepresentation; - /** The directional heading of the vehicle in degrees starting at true North and continuing in clockwise direction. North is 0 degrees, east is 90 degrees, south is 180 degrees, west is 270 degrees. Possible values 0-359 */ - vehicleHeading?: number; - /** Specifies which data should be reported for diagnosis purposes. The only possible value is _effectiveSettings_. Reports the effective parameters or data used when calling the API. In the case of defaulted parameters the default will be reflected where the parameter was not specified by the caller. */ - report?: string; - /** Vehicle is used for commercial purposes and thus may not be allowed to drive on some roads. */ - vehicleCommercial?: boolean; - /** Engine type of the vehicle. When a detailed Consumption Model is specified, it must be consistent with the value of **vehicleEngineType**. */ - vehicleEngineType?: VehicleEngineType; - /** - * - * Specifies the speed-dependent component of consumption. - * - * Provided as an unordered list of colon-delimited speed & consumption-rate pairs. The list defines points on a consumption curve. Consumption rates for speeds not in the list are found as follows: - * - * * by linear interpolation, if the given speed lies in between two speeds in the list - * - * * by linear extrapolation otherwise, assuming a constant (ΔConsumption/ΔSpeed) determined by the nearest two points in the list - * - * The list must contain between 1 and 25 points (inclusive), and may not contain duplicate points for the same speed. If it only contains a single point, then the consumption rate of that point is used without further processing. - * - * Consumption specified for the largest speed must be greater than or equal to that of the penultimate largest speed. This ensures that extrapolation does not lead to negative consumption rates. - * - * Similarly, consumption values specified for the two smallest speeds in the list cannot lead to a negative consumption rate for any smaller speed. - * - * The valid range for the consumption values(expressed in l/100km) is between 0.01 and 100000.0. - * - * Sensible Values : 50,6.3:130,11.5 - * - * **Note** : This parameter is required for **The Combustion Consumption Model**. - */ - constantSpeedConsumptionInLitersPerHundredkm?: number; - /** - * Specifies the current supply of fuel in liters. - * - * Sensible Values : 55 - */ - currentFuelInLiters?: number; - /** - * Specifies the amount of fuel consumed for sustaining auxiliary systems of the vehicle, in liters per hour. - * - * It can be used to specify consumption due to devices and systems such as AC systems, radio, heating, etc. - * - * Sensible Values : 0.2 - */ - auxiliaryPowerInLitersPerHour?: number; - /** - * Specifies the amount of chemical energy stored in one liter of fuel in megajoules (MJ). It is used in conjunction with the ***Efficiency** parameters for conversions between saved or consumed energy and fuel. For example, energy density is 34.2 MJ/l for gasoline, and 35.8 MJ/l for Diesel fuel. - * - * This parameter is required if any ***Efficiency** parameter is set. - * - * Sensible Values : 34.2 - */ - fuelEnergyDensityInMJoulesPerLiter?: number; - /** - * Specifies the efficiency of converting chemical energy stored in fuel to kinetic energy when the vehicle accelerates _(i.e. KineticEnergyGained/ChemicalEnergyConsumed). ChemicalEnergyConsumed_ is obtained by converting consumed fuel to chemical energy using **fuelEnergyDensityInMJoulesPerLiter**. - * - * Must be paired with **decelerationEfficiency**. - * - * The range of values allowed are 0.0 to 1/**decelerationEfficiency**. - * - * Sensible Values : for **Combustion Model** : 0.33, for **Electric Model** : 0.66 - */ - accelerationEfficiency?: number; - /** - * Specifies the efficiency of converting kinetic energy to saved (not consumed) fuel when the vehicle decelerates _(i.e. ChemicalEnergySaved/KineticEnergyLost). ChemicalEnergySaved_ is obtained by converting saved (not consumed) fuel to energy using **fuelEnergyDensityInMJoulesPerLiter**. - * - * Must be paired with **accelerationEfficiency**. - * - * The range of values allowed are 0.0 to 1/**accelerationEfficiency**. - * - * Sensible Values : for **Combustion Model** : 0.83, for **Electric Model** : 0.91 - */ - decelerationEfficiency?: number; - /** - * Specifies the efficiency of converting chemical energy stored in fuel to potential energy when the vehicle gains elevation _(i.e. PotentialEnergyGained/ChemicalEnergyConsumed). ChemicalEnergyConsumed_ is obtained by converting consumed fuel to chemical energy using **fuelEnergyDensityInMJoulesPerLiter**. - * - * Must be paired with **downhillEfficiency**. - * - * The range of values allowed are 0.0 to 1/**downhillEfficiency**. - * - * Sensible Values : for **Combustion Model** : 0.27, for **Electric Model** : 0.74 - */ - uphillEfficiency?: number; - /** - * Specifies the efficiency of converting potential energy to saved (not consumed) fuel when the vehicle loses elevation _(i.e. ChemicalEnergySaved/PotentialEnergyLost). ChemicalEnergySaved_ is obtained by converting saved (not consumed) fuel to energy using **fuelEnergyDensityInMJoulesPerLiter**. - * - * Must be paired with **uphillEfficiency**. - * - * The range of values allowed are 0.0 to 1/**uphillEfficiency**. - * - * Sensible Values : for **Combustion Model** : 0.51, for **Electric Model** : 0.73 - */ - downhillEfficiency?: number; - /** - * Specifies the speed-dependent component of consumption. - * - * Provided as an unordered list of speed/consumption-rate pairs. The list defines points on a consumption curve. Consumption rates for speeds not in the list are found as follows: - * - * * by linear interpolation, if the given speed lies in between two speeds in the list - * - * * by linear extrapolation otherwise, assuming a constant (ΔConsumption/ΔSpeed) determined by the nearest two points in the list - * - * The list must contain between 1 and 25 points (inclusive), and may not contain duplicate points for the same speed. If it only contains a single point, then the consumption rate of that point is used without further processing. - * - * Consumption specified for the largest speed must be greater than or equal to that of the penultimate largest speed. This ensures that extrapolation does not lead to negative consumption rates. - * - * Similarly, consumption values specified for the two smallest speeds in the list cannot lead to a negative consumption rate for any smaller speed. - * - * The valid range for the consumption values(expressed in kWh/100km) is between 0.01 and 100000.0. - * - * Sensible Values : 50,8.2:130,21.3 - * - * This parameter is required for **Electric consumption model**. - */ - constantSpeedConsumptionInkWhPerHundredkm?: string; - /** - * Specifies the current electric energy supply in kilowatt hours (kWh). - * - * This parameter co-exists with **maxChargeInkWh** parameter. - * - * The range of values allowed are 0.0 to **maxChargeInkWh**. - * - * Sensible Values : 43 - */ - currentChargeInkWh?: string; - /** - * Specifies the maximum electric energy supply in kilowatt hours (kWh) that may be stored in the vehicle's battery. - * - * This parameter co-exists with **currentChargeInkWh** parameter. - * - * Minimum value has to be greater than or equal to **currentChargeInkWh**. - * - * Sensible Values : 85 - */ - maxChargeInkWh?: string; - /** - * Specifies the amount of power consumed for sustaining auxiliary systems, in kilowatts (kW). - * - * It can be used to specify consumption due to devices and systems such as AC systems, radio, heating, etc. - * - * Sensible Values : 1.7 - */ - auxiliaryPowerInkW?: string; -} - -/** Contains response data for the postRouteDirections operation. */ -export type RoutePostRouteDirectionsResponse = RouteDirectionsResponse; - -/** Optional parameters. */ -export interface RouteGetRouteRangeOptionalParams - extends coreClient.OperationOptions { - /** The date and time of departure from the origin point. Departure times apart from now must be specified as a dateTime. When a time zone offset is not specified, it will be assumed to be that of the origin point. The departAt value must be in the future in the date-time format (1996-12-19T16:39:57-08:00). */ - departAt?: Date; - /** Weight per axle of the vehicle in kg. A value of 0 means that weight restrictions per axle are not considered. */ - vehicleAxleWeight?: number; - /** Length of the vehicle in meters. A value of 0 means that length restrictions are not considered. */ - vehicleLength?: number; - /** Height of the vehicle in meters. A value of 0 means that height restrictions are not considered. */ - vehicleHeight?: number; - /** Width of the vehicle in meters. A value of 0 means that width restrictions are not considered. */ - vehicleWidth?: number; - /** - * Maximum speed of the vehicle in km/hour. The max speed in the vehicle profile is used to check whether a vehicle is allowed on motorways. - * - * * A value of 0 means that an appropriate value for the vehicle will be determined and applied during route planning. - * - * * A non-zero value may be overridden during route planning. For example, the current traffic flow is 60 km/hour. If the vehicle maximum speed is set to 50 km/hour, the routing engine will consider 60 km/hour as this is the current situation. If the maximum speed of the vehicle is provided as 80 km/hour but the current traffic flow is 60 km/hour, then routing engine will again use 60 km/hour. - */ - vehicleMaxSpeed?: number; - /** - * Weight of the vehicle in kilograms. - * - * * It is mandatory if any of the *Efficiency parameters are set. - * - * * It must be strictly positive when used in the context of the Consumption Model. Weight restrictions are considered. - * - * * If no detailed **Consumption Model** is specified and the value of **vehicleWeight** is non-zero, then weight restrictions are considered. - * - * * In all other cases, this parameter is ignored. - * - * Sensible Values : for **Combustion Model** : 1600, for **Electric Model** : 1900 - */ - vehicleWeight?: number; - /** Level of turns for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ - windingness?: WindingnessLevel; - /** Degree of hilliness for thrilling route. This parameter can only be used in conjunction with `routeType`=thrilling. */ - hilliness?: HillinessDegree; - /** The mode of travel for the requested route. If not defined, default is 'car'. Note that the requested travelMode may not be available for the entire route. Where the requested travelMode is not available for a particular section, the travelMode element of the response for that section will be "other". Note that travel modes bus, motorcycle, taxi and van are BETA functionality. Full restriction data is not available in all areas. In **calculateReachableRange** requests, the values bicycle and pedestrian must not be used. */ - travelMode?: TravelMode; - /** Specifies something that the route calculation should try to avoid when determining the route. Can be specified multiple times in one request, for example, '&avoid=motorways&avoid=tollRoads&avoid=ferries'. In calculateReachableRange requests, the value alreadyUsedRoads must not be used. */ - avoid?: RouteAvoidType[]; - /** - * Possible values: - * * true - Do consider all available traffic information during routing - * * false - Ignore current traffic data during routing. Note that although the current traffic data is ignored - * during routing, the effect of historic traffic on effective road speeds is still incorporated. - */ - traffic?: boolean; - /** The type of route requested. */ - routeType?: RouteType; - /** Types of cargo that may be classified as hazardous materials and restricted from some roads. Available vehicleLoadType values are US Hazmat classes 1 through 9, plus generic classifications for use in other countries. Values beginning with USHazmat are for US routing while otherHazmat should be used for all other countries. vehicleLoadType can be specified multiple times. This parameter is currently only considered for travelMode=truck. */ - vehicleLoadType?: VehicleLoadType; - /** Vehicle is used for commercial purposes and thus may not be allowed to drive on some roads. */ - vehicleCommercial?: boolean; - /** Engine type of the vehicle. When a detailed Consumption Model is specified, it must be consistent with the value of **vehicleEngineType**. */ - vehicleEngineType?: VehicleEngineType; - /** - * - * Specifies the speed-dependent component of consumption. - * - * Provided as an unordered list of colon-delimited speed & consumption-rate pairs. The list defines points on a consumption curve. Consumption rates for speeds not in the list are found as follows: - * - * * by linear interpolation, if the given speed lies in between two speeds in the list - * - * * by linear extrapolation otherwise, assuming a constant (ΔConsumption/ΔSpeed) determined by the nearest two points in the list - * - * The list must contain between 1 and 25 points (inclusive), and may not contain duplicate points for the same speed. If it only contains a single point, then the consumption rate of that point is used without further processing. - * - * Consumption specified for the largest speed must be greater than or equal to that of the penultimate largest speed. This ensures that extrapolation does not lead to negative consumption rates. - * - * Similarly, consumption values specified for the two smallest speeds in the list cannot lead to a negative consumption rate for any smaller speed. - * - * The valid range for the consumption values(expressed in l/100km) is between 0.01 and 100000.0. - * - * Sensible Values : 50,6.3:130,11.5 - * - * **Note** : This parameter is required for **The Combustion Consumption Model**. - */ - constantSpeedConsumptionInLitersPerHundredkm?: number; - /** - * Specifies the current supply of fuel in liters. - * - * Sensible Values : 55 - */ - currentFuelInLiters?: number; - /** - * Specifies the amount of fuel consumed for sustaining auxiliary systems of the vehicle, in liters per hour. - * - * It can be used to specify consumption due to devices and systems such as AC systems, radio, heating, etc. - * - * Sensible Values : 0.2 - */ - auxiliaryPowerInLitersPerHour?: number; - /** - * Specifies the amount of chemical energy stored in one liter of fuel in megajoules (MJ). It is used in conjunction with the ***Efficiency** parameters for conversions between saved or consumed energy and fuel. For example, energy density is 34.2 MJ/l for gasoline, and 35.8 MJ/l for Diesel fuel. - * - * This parameter is required if any ***Efficiency** parameter is set. - * - * Sensible Values : 34.2 - */ - fuelEnergyDensityInMJoulesPerLiter?: number; - /** - * Specifies the efficiency of converting chemical energy stored in fuel to kinetic energy when the vehicle accelerates _(i.e. KineticEnergyGained/ChemicalEnergyConsumed). ChemicalEnergyConsumed_ is obtained by converting consumed fuel to chemical energy using **fuelEnergyDensityInMJoulesPerLiter**. - * - * Must be paired with **decelerationEfficiency**. - * - * The range of values allowed are 0.0 to 1/**decelerationEfficiency**. - * - * Sensible Values : for **Combustion Model** : 0.33, for **Electric Model** : 0.66 - */ - accelerationEfficiency?: number; - /** - * Specifies the efficiency of converting kinetic energy to saved (not consumed) fuel when the vehicle decelerates _(i.e. ChemicalEnergySaved/KineticEnergyLost). ChemicalEnergySaved_ is obtained by converting saved (not consumed) fuel to energy using **fuelEnergyDensityInMJoulesPerLiter**. - * - * Must be paired with **accelerationEfficiency**. - * - * The range of values allowed are 0.0 to 1/**accelerationEfficiency**. - * - * Sensible Values : for **Combustion Model** : 0.83, for **Electric Model** : 0.91 - */ - decelerationEfficiency?: number; - /** - * Specifies the efficiency of converting chemical energy stored in fuel to potential energy when the vehicle gains elevation _(i.e. PotentialEnergyGained/ChemicalEnergyConsumed). ChemicalEnergyConsumed_ is obtained by converting consumed fuel to chemical energy using **fuelEnergyDensityInMJoulesPerLiter**. - * - * Must be paired with **downhillEfficiency**. - * - * The range of values allowed are 0.0 to 1/**downhillEfficiency**. - * - * Sensible Values : for **Combustion Model** : 0.27, for **Electric Model** : 0.74 - */ - uphillEfficiency?: number; - /** - * Specifies the efficiency of converting potential energy to saved (not consumed) fuel when the vehicle loses elevation _(i.e. ChemicalEnergySaved/PotentialEnergyLost). ChemicalEnergySaved_ is obtained by converting saved (not consumed) fuel to energy using **fuelEnergyDensityInMJoulesPerLiter**. - * - * Must be paired with **uphillEfficiency**. - * - * The range of values allowed are 0.0 to 1/**uphillEfficiency**. - * - * Sensible Values : for **Combustion Model** : 0.51, for **Electric Model** : 0.73 - */ - downhillEfficiency?: number; - /** - * Specifies the speed-dependent component of consumption. - * - * Provided as an unordered list of speed/consumption-rate pairs. The list defines points on a consumption curve. Consumption rates for speeds not in the list are found as follows: - * - * * by linear interpolation, if the given speed lies in between two speeds in the list - * - * * by linear extrapolation otherwise, assuming a constant (ΔConsumption/ΔSpeed) determined by the nearest two points in the list - * - * The list must contain between 1 and 25 points (inclusive), and may not contain duplicate points for the same speed. If it only contains a single point, then the consumption rate of that point is used without further processing. - * - * Consumption specified for the largest speed must be greater than or equal to that of the penultimate largest speed. This ensures that extrapolation does not lead to negative consumption rates. - * - * Similarly, consumption values specified for the two smallest speeds in the list cannot lead to a negative consumption rate for any smaller speed. - * - * The valid range for the consumption values(expressed in kWh/100km) is between 0.01 and 100000.0. - * - * Sensible Values : 50,8.2:130,21.3 - * - * This parameter is required for **Electric consumption model**. - */ - constantSpeedConsumptionInkWhPerHundredkm?: string; - /** - * Specifies the current electric energy supply in kilowatt hours (kWh). - * - * This parameter co-exists with **maxChargeInkWh** parameter. - * - * The range of values allowed are 0.0 to **maxChargeInkWh**. - * - * Sensible Values : 43 - */ - currentChargeInkWh?: string; - /** - * Specifies the maximum electric energy supply in kilowatt hours (kWh) that may be stored in the vehicle's battery. - * - * This parameter co-exists with **currentChargeInkWh** parameter. - * - * Minimum value has to be greater than or equal to **currentChargeInkWh**. - * - * Sensible Values : 85 - */ - maxChargeInkWh?: string; - /** - * Specifies the amount of power consumed for sustaining auxiliary systems, in kilowatts (kW). - * - * It can be used to specify consumption due to devices and systems such as AC systems, radio, heating, etc. - * - * Sensible Values : 1.7 - */ - auxiliaryPowerInkW?: string; - /** Fuel budget in liters that determines maximal range which can be travelled using the specified Combustion Consumption Model.
When fuelBudgetInLiters is used, it is mandatory to specify a detailed Combustion Consumption Model.
Exactly one budget (fuelBudgetInLiters, energyBudgetInkWh, timeBudgetInSec, or distanceBudgetInMeters) must be used. */ - fuelBudgetInLiters?: number; - /** Electric energy budget in kilowatt hours (kWh) that determines maximal range which can be travelled using the specified Electric Consumption Model.
When energyBudgetInkWh is used, it is mandatory to specify a detailed Electric Consumption Model.
Exactly one budget (fuelBudgetInLiters, energyBudgetInkWh, timeBudgetInSec, or distanceBudgetInMeters) must be used. */ - energyBudgetInkWh?: number; - /** Time budget in seconds that determines maximal range which can be travelled using driving time. The Consumption Model will only affect the range when routeType is eco.
Exactly one budget (fuelBudgetInLiters, energyBudgetInkWh, timeBudgetInSec, or distanceBudgetInMeters) must be used. */ - timeBudgetInSec?: number; - /** Distance budget in meters that determines maximal range which can be travelled using driving distance. The Consumption Model will only affect the range when routeType is eco.
Exactly one budget (fuelBudgetInLiters, energyBudgetInkWh, timeBudgetInSec, or distanceBudgetInMeters) must be used. */ - distanceBudgetInMeters?: number; -} - -/** Contains response data for the getRouteRange operation. */ -export type RouteGetRouteRangeResponse = GetRouteRangeResponse; - -/** Optional parameters. */ -export interface RoutePostRouteDirectionsBatchOptionalParams - extends coreClient.OperationOptions { - /** Delay to wait until next poll, in milliseconds. */ - updateIntervalInMs?: number; - /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ - resumeFrom?: string; -} - -/** Contains response data for the postRouteDirectionsBatch operation. */ -export type RoutePostRouteDirectionsBatchResponse = RouteDirectionsBatchResponse; - -/** Optional parameters. */ -export interface RoutePostRouteDirectionsBatchSyncOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the postRouteDirectionsBatchSync operation. */ -export type RoutePostRouteDirectionsBatchSyncResponse = RouteDirectionsBatchResponse; - -/** Optional parameters. */ -export interface RouteClientOptionalParams - extends coreClient.ServiceClientOptions { - /** This parameter specifies where the Azure Maps Creator resource is located. Valid values are us and eu. */ - geography?: Geography; - /** Specifies which account is intended for usage in conjunction with the Azure AD security model. It represents a unique ID for the Azure Maps account and can be retrieved from the Azure Maps management plane Account API. To use Azure AD security in Azure Maps see the following [articles](https://aka.ms/amauthdetails) for guidance. */ - xMsClientId?: string; - /** Api Version */ - apiVersion?: string; - /** Overrides client endpoint. */ - endpoint?: string; -} diff --git a/sdk/maps/maps-route/src/models/mappers.ts b/sdk/maps/maps-route/src/models/mappers.ts deleted file mode 100644 index 6e03ac2cf778..000000000000 --- a/sdk/maps/maps-route/src/models/mappers.ts +++ /dev/null @@ -1,1619 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; - -export const PostRouteMatrixRequestBody: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "PostRouteMatrixRequestBody", - modelProperties: { - origins: { - serializedName: "origins", - type: { - name: "Composite", - className: "GeoJsonMultiPoint" - } - }, - destinations: { - serializedName: "destinations", - type: { - name: "Composite", - className: "GeoJsonMultiPoint" - } - } - } - } -}; - -export const GeoJsonObject: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonObject", - uberParent: "GeoJsonObject", - polymorphicDiscriminator: { - serializedName: "type", - clientName: "type" - }, - modelProperties: { - type: { - serializedName: "type", - required: true, - type: { - name: "String" - } - } - } - } -}; - -export const GeoJsonMultiPointData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonMultiPointData", - modelProperties: { - coordinates: { - serializedName: "coordinates", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } - } - } -}; - -export const RouteMatrixResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteMatrixResponse", - modelProperties: { - formatVersion: { - serializedName: "formatVersion", - readOnly: true, - type: { - name: "String" - } - }, - matrix: { - serializedName: "matrix", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "RouteMatrixResult" - } - } - } - } - } - }, - summary: { - serializedName: "summary", - type: { - name: "Composite", - className: "RouteMatrixSummary" - } - } - } - } -}; - -export const RouteMatrixResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteMatrixResult", - modelProperties: { - statusCode: { - serializedName: "statusCode", - readOnly: true, - type: { - name: "Number" - } - }, - response: { - serializedName: "response", - type: { - name: "Composite", - className: "RouteMatrixResultResponse" - } - } - } - } -}; - -export const RouteMatrixResultResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteMatrixResultResponse", - modelProperties: { - routeSummary: { - serializedName: "routeSummary", - type: { - name: "Composite", - className: "RouteResultLegSummary" - } - } - } - } -}; - -export const RouteResultLegSummary: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteResultLegSummary", - modelProperties: { - lengthInMeters: { - serializedName: "lengthInMeters", - readOnly: true, - type: { - name: "Number" - } - }, - travelTimeInSeconds: { - serializedName: "travelTimeInSeconds", - readOnly: true, - type: { - name: "Number" - } - }, - trafficDelayInSeconds: { - serializedName: "trafficDelayInSeconds", - readOnly: true, - type: { - name: "Number" - } - }, - departureTime: { - serializedName: "departureTime", - readOnly: true, - type: { - name: "String" - } - }, - arrivalTime: { - serializedName: "arrivalTime", - readOnly: true, - type: { - name: "String" - } - }, - noTrafficTravelTimeInSeconds: { - serializedName: "noTrafficTravelTimeInSeconds", - readOnly: true, - type: { - name: "Number" - } - }, - historicTrafficTravelTimeInSeconds: { - serializedName: "historicTrafficTravelTimeInSeconds", - readOnly: true, - type: { - name: "Number" - } - }, - liveTrafficIncidentsTravelTimeInSeconds: { - serializedName: "liveTrafficIncidentsTravelTimeInSeconds", - readOnly: true, - type: { - name: "Number" - } - }, - fuelConsumptionInLiters: { - serializedName: "fuelConsumptionInLiters", - readOnly: true, - type: { - name: "Number" - } - }, - batteryConsumptionInkWh: { - serializedName: "batteryConsumptionInkWh", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const RouteMatrixSummary: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteMatrixSummary", - modelProperties: { - successfulRoutes: { - serializedName: "successfulRoutes", - readOnly: true, - type: { - name: "Number" - } - }, - totalRoutes: { - serializedName: "totalRoutes", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const ErrorResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorResponse", - modelProperties: { - error: { - serializedName: "error", - type: { - name: "Composite", - className: "ErrorDetail" - } - } - } - } -}; - -export const ErrorDetail: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorDetail", - modelProperties: { - code: { - serializedName: "code", - readOnly: true, - type: { - name: "String" - } - }, - message: { - serializedName: "message", - readOnly: true, - type: { - name: "String" - } - }, - target: { - serializedName: "target", - readOnly: true, - type: { - name: "String" - } - }, - details: { - serializedName: "details", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ErrorDetail" - } - } - } - }, - additionalInfo: { - serializedName: "additionalInfo", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ErrorAdditionalInfo" - } - } - } - } - } - } -}; - -export const ErrorAdditionalInfo: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorAdditionalInfo", - modelProperties: { - type: { - serializedName: "type", - readOnly: true, - type: { - name: "String" - } - }, - info: { - serializedName: "info", - readOnly: true, - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - } - } - } -}; - -export const RouteDirectionsResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteDirectionsResponse", - modelProperties: { - formatVersion: { - serializedName: "formatVersion", - readOnly: true, - type: { - name: "String" - } - }, - routes: { - serializedName: "routes", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "RouteDirectionsResult" - } - } - } - }, - optimizedWaypoints: { - serializedName: "optimizedWaypoints", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "RouteOptimizedWaypoint" - } - } - } - }, - report: { - serializedName: "report", - type: { - name: "Composite", - className: "RouteResponseReport" - } - } - } - } -}; - -export const RouteDirectionsResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteDirectionsResult", - modelProperties: { - summary: { - serializedName: "summary", - type: { - name: "Composite", - className: "RouteDirectionsSummary" - } - }, - legs: { - serializedName: "legs", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "RouteResultLeg" - } - } - } - }, - sections: { - serializedName: "sections", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "RouteResultSection" - } - } - } - }, - guidance: { - serializedName: "guidance", - type: { - name: "Composite", - className: "RouteResultGuidance" - } - } - } - } -}; - -export const RouteDirectionsSummary: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteDirectionsSummary", - modelProperties: { - lengthInMeters: { - serializedName: "lengthInMeters", - readOnly: true, - type: { - name: "Number" - } - }, - travelTimeInSeconds: { - serializedName: "travelTimeInSeconds", - readOnly: true, - type: { - name: "Number" - } - }, - trafficDelayInSeconds: { - serializedName: "trafficDelayInSeconds", - readOnly: true, - type: { - name: "Number" - } - }, - departureTime: { - serializedName: "departureTime", - readOnly: true, - type: { - name: "String" - } - }, - arrivalTime: { - serializedName: "arrivalTime", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const RouteResultLeg: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteResultLeg", - modelProperties: { - summary: { - serializedName: "summary", - type: { - name: "Composite", - className: "RouteResultLegSummary" - } - }, - points: { - serializedName: "points", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "CoordinatesPair" - } - } - } - } - } - } -}; - -export const CoordinatesPair: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "CoordinatesPair", - modelProperties: { - latitude: { - serializedName: "latitude", - type: { - name: "Number" - } - }, - longitude: { - serializedName: "longitude", - type: { - name: "Number" - } - } - } - } -}; - -export const RouteResultSection: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteResultSection", - modelProperties: { - startPointIndex: { - serializedName: "startPointIndex", - readOnly: true, - type: { - name: "Number" - } - }, - endPointIndex: { - serializedName: "endPointIndex", - readOnly: true, - type: { - name: "Number" - } - }, - sectionType: { - serializedName: "sectionType", - readOnly: true, - type: { - name: "String" - } - }, - travelMode: { - serializedName: "travelMode", - readOnly: true, - type: { - name: "String" - } - }, - simpleCategory: { - serializedName: "simpleCategory", - readOnly: true, - type: { - name: "String" - } - }, - effectiveSpeedInKmh: { - serializedName: "effectiveSpeedInKmh", - readOnly: true, - type: { - name: "Number" - } - }, - delayInSeconds: { - serializedName: "delayInSeconds", - readOnly: true, - type: { - name: "Number" - } - }, - magnitudeOfDelay: { - serializedName: "magnitudeOfDelay", - readOnly: true, - type: { - name: "String" - } - }, - tec: { - serializedName: "tec", - type: { - name: "Composite", - className: "RouteResultSectionTec" - } - } - } - } -}; - -export const RouteResultSectionTec: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteResultSectionTec", - modelProperties: { - effectCode: { - serializedName: "effectCode", - readOnly: true, - type: { - name: "Number" - } - }, - causes: { - serializedName: "causes", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "RouteResultSectionTecCause" - } - } - } - } - } - } -}; - -export const RouteResultSectionTecCause: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteResultSectionTecCause", - modelProperties: { - mainCauseCode: { - serializedName: "mainCauseCode", - readOnly: true, - type: { - name: "Number" - } - }, - subCauseCode: { - serializedName: "subCauseCode", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const RouteResultGuidance: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteResultGuidance", - modelProperties: { - instructions: { - serializedName: "instructions", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "RouteResultInstruction" - } - } - } - }, - instructionGroups: { - serializedName: "instructionGroups", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "RouteResultInstructionGroup" - } - } - } - } - } - } -}; - -export const RouteResultInstruction: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteResultInstruction", - modelProperties: { - routeOffsetInMeters: { - serializedName: "routeOffsetInMeters", - readOnly: true, - type: { - name: "Number" - } - }, - travelTimeInSeconds: { - serializedName: "travelTimeInSeconds", - readOnly: true, - type: { - name: "Number" - } - }, - point: { - serializedName: "point", - type: { - name: "Composite", - className: "CoordinatesPair" - } - }, - pointIndex: { - serializedName: "pointIndex", - readOnly: true, - type: { - name: "Number" - } - }, - instructionType: { - serializedName: "instructionType", - type: { - name: "String" - } - }, - roadNumbers: { - serializedName: "roadNumbers", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - exitNumber: { - serializedName: "exitNumber", - readOnly: true, - type: { - name: "String" - } - }, - street: { - serializedName: "street", - readOnly: true, - type: { - name: "String" - } - }, - signpostText: { - serializedName: "signpostText", - readOnly: true, - type: { - name: "String" - } - }, - countryCode: { - serializedName: "countryCode", - readOnly: true, - type: { - name: "String" - } - }, - stateCode: { - serializedName: "stateCode", - readOnly: true, - type: { - name: "String" - } - }, - junctionType: { - serializedName: "junctionType", - readOnly: true, - type: { - name: "String" - } - }, - turnAngleInDecimalDegrees: { - serializedName: "turnAngleInDecimalDegrees", - readOnly: true, - type: { - name: "Number" - } - }, - roundaboutExitNumber: { - serializedName: "roundaboutExitNumber", - readOnly: true, - type: { - name: "String" - } - }, - possibleCombineWithNext: { - serializedName: "possibleCombineWithNext", - readOnly: true, - type: { - name: "Boolean" - } - }, - drivingSide: { - serializedName: "drivingSide", - readOnly: true, - type: { - name: "String" - } - }, - maneuver: { - serializedName: "maneuver", - readOnly: true, - type: { - name: "String" - } - }, - message: { - serializedName: "message", - readOnly: true, - type: { - name: "String" - } - }, - combinedMessage: { - serializedName: "combinedMessage", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const RouteResultInstructionGroup: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteResultInstructionGroup", - modelProperties: { - firstInstructionIndex: { - serializedName: "firstInstructionIndex", - readOnly: true, - type: { - name: "Number" - } - }, - lastInstructionIndex: { - serializedName: "lastInstructionIndex", - readOnly: true, - type: { - name: "Number" - } - }, - groupLengthInMeters: { - serializedName: "groupLengthInMeters", - readOnly: true, - type: { - name: "Number" - } - }, - groupMessage: { - serializedName: "groupMessage", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const RouteOptimizedWaypoint: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteOptimizedWaypoint", - modelProperties: { - providedIndex: { - serializedName: "providedIndex", - readOnly: true, - type: { - name: "Number" - } - }, - optimizedIndex: { - serializedName: "optimizedIndex", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const RouteResponseReport: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteResponseReport", - modelProperties: { - effectiveSettings: { - serializedName: "effectiveSettings", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "RouteResponseReportEffectiveSetting" - } - } - } - } - } - } -}; - -export const RouteResponseReportEffectiveSetting: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteResponseReportEffectiveSetting", - modelProperties: { - key: { - serializedName: "key", - readOnly: true, - type: { - name: "String" - } - }, - value: { - serializedName: "value", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const PostRouteDirectionsRequestBody: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "PostRouteDirectionsRequestBody", - modelProperties: { - supportingPoints: { - serializedName: "supportingPoints", - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - }, - avoidVignette: { - serializedName: "avoidVignette", - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - allowVignette: { - serializedName: "allowVignette", - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - avoidAreas: { - serializedName: "avoidAreas", - type: { - name: "Composite", - className: "GeoJsonMultiPolygon" - } - } - } - } -}; - -export const GeoJsonMultiPolygonData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonMultiPolygonData", - modelProperties: { - coordinates: { - serializedName: "coordinates", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } - } - } - } - } - } - } -}; - -export const GetRouteRangeResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GetRouteRangeResponse", - modelProperties: { - formatVersion: { - serializedName: "formatVersion", - readOnly: true, - type: { - name: "String" - } - }, - reachableRange: { - serializedName: "reachableRange", - type: { - name: "Composite", - className: "RouteRange" - } - }, - report: { - serializedName: "report", - type: { - name: "Composite", - className: "RouteResponseReport" - } - } - } - } -}; - -export const RouteRange: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteRange", - modelProperties: { - center: { - serializedName: "center", - type: { - name: "Composite", - className: "CoordinatesPair" - } - }, - boundary: { - serializedName: "boundary", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "CoordinatesPair" - } - } - } - } - } - } -}; - -export const BatchRequestBody: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "BatchRequestBody", - modelProperties: { - batchItems: { - serializedName: "batchItems", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "BatchRequestBodyBatchItemsItem" - } - } - } - } - } - } -}; - -export const BatchRequestBodyBatchItemsItem: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "BatchRequestBodyBatchItemsItem", - modelProperties: { - query: { - serializedName: "query", - type: { - name: "String" - } - } - } - } -}; - -export const BatchResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "BatchResponse", - modelProperties: { - summary: { - serializedName: "summary", - type: { - name: "Composite", - className: "BatchResponseSummary" - } - } - } - } -}; - -export const BatchResponseSummary: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "BatchResponseSummary", - modelProperties: { - successfulRequests: { - serializedName: "successfulRequests", - readOnly: true, - type: { - name: "Number" - } - }, - totalRequests: { - serializedName: "totalRequests", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const BatchItem: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "BatchItem", - modelProperties: { - statusCode: { - serializedName: "statusCode", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const GeoJsonPointData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonPointData", - modelProperties: { - coordinates: { - serializedName: "coordinates", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } -}; - -export const GeoJsonLineStringData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonLineStringData", - modelProperties: { - coordinates: { - serializedName: "coordinates", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } - } - } -}; - -export const GeoJsonMultiLineStringData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonMultiLineStringData", - modelProperties: { - coordinates: { - serializedName: "coordinates", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } - } - } - } - } -}; - -export const GeoJsonPolygonData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonPolygonData", - modelProperties: { - coordinates: { - serializedName: "coordinates", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } - } - } - } - } -}; - -export const GeoJsonGeometryCollectionData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonGeometryCollectionData", - modelProperties: { - geometries: { - serializedName: "geometries", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "GeoJsonGeometry" - } - } - } - } - } - } -}; - -export const GeoJsonFeatureData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonFeatureData", - modelProperties: { - geometry: { - serializedName: "geometry", - type: { - name: "Composite", - className: "GeoJsonGeometry" - } - }, - properties: { - serializedName: "properties", - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - }, - id: { - serializedName: "id", - type: { - name: "String" - } - }, - featureType: { - serializedName: "featureType", - type: { - name: "String" - } - } - } - } -}; - -export const GeoJsonFeatureCollectionData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonFeatureCollectionData", - modelProperties: { - features: { - serializedName: "features", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "GeoJsonFeature" - } - } - } - } - } - } -}; - -export const GeoJsonGeometry: coreClient.CompositeMapper = { - serializedName: "GeoJsonGeometry", - type: { - name: "Composite", - className: "GeoJsonGeometry", - uberParent: "GeoJsonObject", - polymorphicDiscriminator: { - serializedName: "type", - clientName: "type" - }, - modelProperties: { - ...GeoJsonObject.type.modelProperties - } - } -}; - -export const GeoJsonFeature: coreClient.CompositeMapper = { - serializedName: "Feature", - type: { - name: "Composite", - className: "GeoJsonFeature", - uberParent: "GeoJsonObject", - polymorphicDiscriminator: GeoJsonObject.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonObject.type.modelProperties, - ...GeoJsonFeatureData.type.modelProperties - } - } -}; - -export const GeoJsonFeatureCollection: coreClient.CompositeMapper = { - serializedName: "FeatureCollection", - type: { - name: "Composite", - className: "GeoJsonFeatureCollection", - uberParent: "GeoJsonObject", - polymorphicDiscriminator: GeoJsonObject.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonObject.type.modelProperties, - ...GeoJsonFeatureCollectionData.type.modelProperties - } - } -}; - -export const GeoJsonMultiPoint: coreClient.CompositeMapper = { - serializedName: "MultiPoint", - type: { - name: "Composite", - className: "GeoJsonMultiPoint", - uberParent: "GeoJsonMultiPointData", - polymorphicDiscriminator: - GeoJsonMultiPointData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonMultiPointData.type.modelProperties - } - } -}; - -export const RouteDirectionsBatchItemResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteDirectionsBatchItemResponse", - modelProperties: { - ...RouteDirectionsResponse.type.modelProperties, - ...ErrorResponse.type.modelProperties - } - } -}; - -export const GeoJsonMultiPolygon: coreClient.CompositeMapper = { - serializedName: "MultiPolygon", - type: { - name: "Composite", - className: "GeoJsonMultiPolygon", - uberParent: "GeoJsonMultiPolygonData", - polymorphicDiscriminator: - GeoJsonMultiPolygonData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonMultiPolygonData.type.modelProperties - } - } -}; - -export const RouteDirectionsBatchResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteDirectionsBatchResponse", - modelProperties: { - ...BatchResponse.type.modelProperties, - batchItems: { - serializedName: "batchItems", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "RouteDirectionsBatchItem" - } - } - } - } - } - } -}; - -export const RouteDirectionsBatchItem: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RouteDirectionsBatchItem", - modelProperties: { - ...BatchItem.type.modelProperties, - response: { - serializedName: "response", - type: { - name: "Composite", - className: "RouteDirectionsBatchItemResponse" - } - } - } - } -}; - -export const GeoJsonPoint: coreClient.CompositeMapper = { - serializedName: "Point", - type: { - name: "Composite", - className: "GeoJsonPoint", - uberParent: "GeoJsonPointData", - polymorphicDiscriminator: GeoJsonPointData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonPointData.type.modelProperties - } - } -}; - -export const GeoJsonLineString: coreClient.CompositeMapper = { - serializedName: "LineString", - type: { - name: "Composite", - className: "GeoJsonLineString", - uberParent: "GeoJsonLineStringData", - polymorphicDiscriminator: - GeoJsonLineStringData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonLineStringData.type.modelProperties - } - } -}; - -export const GeoJsonMultiLineString: coreClient.CompositeMapper = { - serializedName: "MultiLineString", - type: { - name: "Composite", - className: "GeoJsonMultiLineString", - uberParent: "GeoJsonMultiLineStringData", - polymorphicDiscriminator: - GeoJsonMultiLineStringData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonMultiLineStringData.type.modelProperties - } - } -}; - -export const GeoJsonPolygon: coreClient.CompositeMapper = { - serializedName: "Polygon", - type: { - name: "Composite", - className: "GeoJsonPolygon", - uberParent: "GeoJsonPolygonData", - polymorphicDiscriminator: GeoJsonPolygonData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonPolygonData.type.modelProperties - } - } -}; - -export const GeoJsonGeometryCollection: coreClient.CompositeMapper = { - serializedName: "GeometryCollection", - type: { - name: "Composite", - className: "GeoJsonGeometryCollection", - uberParent: "GeoJsonGeometryCollectionData", - polymorphicDiscriminator: - GeoJsonGeometryCollectionData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonGeometryCollectionData.type.modelProperties - } - } -}; - -export const RoutePostRouteMatrixHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RoutePostRouteMatrixHeaders", - modelProperties: { - location: { - serializedName: "location", - type: { - name: "String" - } - } - } - } -}; - -export const RoutePostRouteDirectionsBatchHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RoutePostRouteDirectionsBatchHeaders", - modelProperties: { - location: { - serializedName: "location", - type: { - name: "String" - } - } - } - } -}; - -export let discriminators = { - GeoJsonObject: GeoJsonObject, - "GeoJsonObject.GeoJsonGeometry": GeoJsonGeometry, - "GeoJsonObject.Feature": GeoJsonFeature, - "GeoJsonObject.FeatureCollection": GeoJsonFeatureCollection, - "GeoJsonMultiPointData.MultiPoint": GeoJsonMultiPoint, - "GeoJsonMultiPolygonData.MultiPolygon": GeoJsonMultiPolygon, - "GeoJsonPointData.Point": GeoJsonPoint, - "GeoJsonLineStringData.LineString": GeoJsonLineString, - "GeoJsonMultiLineStringData.MultiLineString": GeoJsonMultiLineString, - "GeoJsonPolygonData.Polygon": GeoJsonPolygon, - "GeoJsonGeometryCollectionData.GeometryCollection": GeoJsonGeometryCollection -}; diff --git a/sdk/maps/maps-route/src/models/parameters.ts b/sdk/maps/maps-route/src/models/parameters.ts deleted file mode 100644 index 3fe77bf57e09..000000000000 --- a/sdk/maps/maps-route/src/models/parameters.ts +++ /dev/null @@ -1,597 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { - OperationParameter, - OperationURLParameter, - OperationQueryParameter -} from "@azure/core-client"; -import { - PostRouteMatrixRequestBody as PostRouteMatrixRequestBodyMapper, - PostRouteDirectionsRequestBody as PostRouteDirectionsRequestBodyMapper, - BatchRequestBody as BatchRequestBodyMapper -} from "../models/mappers"; - -export const contentType: OperationParameter = { - parameterPath: ["options", "contentType"], - mapper: { - defaultValue: "application/json", - isConstant: true, - serializedName: "Content-Type", - type: { - name: "String" - } - } -}; - -export const postRouteMatrixRequestBody: OperationParameter = { - parameterPath: "postRouteMatrixRequestBody", - mapper: PostRouteMatrixRequestBodyMapper -}; - -export const accept: OperationParameter = { - parameterPath: "accept", - mapper: { - defaultValue: "application/json", - isConstant: true, - serializedName: "Accept", - type: { - name: "String" - } - } -}; - -export const geography: OperationURLParameter = { - parameterPath: "geography", - mapper: { - serializedName: "geography", - required: true, - type: { - name: "String" - } - } -}; - -export const xMsClientId: OperationParameter = { - parameterPath: "xMsClientId", - mapper: { - serializedName: "x-ms-client-id", - type: { - name: "String" - } - } -}; - -export const apiVersion: OperationQueryParameter = { - parameterPath: "apiVersion", - mapper: { - defaultValue: "1.0", - isConstant: true, - serializedName: "api-version", - type: { - name: "String" - } - } -}; - -export const format: OperationURLParameter = { - parameterPath: "format", - mapper: { - serializedName: "format", - required: true, - type: { - name: "String" - } - } -}; - -export const waitForResults: OperationQueryParameter = { - parameterPath: ["options", "waitForResults"], - mapper: { - serializedName: "waitForResults", - type: { - name: "Boolean" - } - } -}; - -export const computeTravelTimeFor: OperationQueryParameter = { - parameterPath: ["options", "computeTravelTimeFor"], - mapper: { - serializedName: "computeTravelTimeFor", - type: { - name: "String" - } - } -}; - -export const sectionType: OperationQueryParameter = { - parameterPath: ["options", "sectionType"], - mapper: { - serializedName: "sectionType", - type: { - name: "String" - } - } -}; - -export const arriveAt: OperationQueryParameter = { - parameterPath: ["options", "arriveAt"], - mapper: { - serializedName: "arriveAt", - type: { - name: "DateTime" - } - } -}; - -export const departAt: OperationQueryParameter = { - parameterPath: ["options", "departAt"], - mapper: { - serializedName: "departAt", - type: { - name: "DateTime" - } - } -}; - -export const vehicleAxleWeight: OperationQueryParameter = { - parameterPath: ["options", "vehicleAxleWeight"], - mapper: { - serializedName: "vehicleAxleWeight", - type: { - name: "Number" - } - } -}; - -export const vehicleLength: OperationQueryParameter = { - parameterPath: ["options", "vehicleLength"], - mapper: { - serializedName: "vehicleLength", - type: { - name: "Number" - } - } -}; - -export const vehicleHeight: OperationQueryParameter = { - parameterPath: ["options", "vehicleHeight"], - mapper: { - serializedName: "vehicleHeight", - type: { - name: "Number" - } - } -}; - -export const vehicleWidth: OperationQueryParameter = { - parameterPath: ["options", "vehicleWidth"], - mapper: { - serializedName: "vehicleWidth", - type: { - name: "Number" - } - } -}; - -export const vehicleMaxSpeed: OperationQueryParameter = { - parameterPath: ["options", "vehicleMaxSpeed"], - mapper: { - serializedName: "vehicleMaxSpeed", - type: { - name: "Number" - } - } -}; - -export const vehicleWeight: OperationQueryParameter = { - parameterPath: ["options", "vehicleWeight"], - mapper: { - serializedName: "vehicleWeight", - type: { - name: "Number" - } - } -}; - -export const windingness: OperationQueryParameter = { - parameterPath: ["options", "windingness"], - mapper: { - serializedName: "windingness", - type: { - name: "String" - } - } -}; - -export const hilliness: OperationQueryParameter = { - parameterPath: ["options", "hilliness"], - mapper: { - serializedName: "hilliness", - type: { - name: "String" - } - } -}; - -export const travelMode: OperationQueryParameter = { - parameterPath: ["options", "travelMode"], - mapper: { - serializedName: "travelMode", - type: { - name: "String" - } - } -}; - -export const avoid: OperationQueryParameter = { - parameterPath: ["options", "avoid"], - mapper: { - serializedName: "avoid", - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - collectionFormat: "Multi" -}; - -export const traffic: OperationQueryParameter = { - parameterPath: ["options", "traffic"], - mapper: { - serializedName: "traffic", - type: { - name: "Boolean" - } - } -}; - -export const routeType: OperationQueryParameter = { - parameterPath: ["options", "routeType"], - mapper: { - serializedName: "routeType", - type: { - name: "String" - } - } -}; - -export const vehicleLoadType: OperationQueryParameter = { - parameterPath: ["options", "vehicleLoadType"], - mapper: { - serializedName: "vehicleLoadType", - type: { - name: "String" - } - } -}; - -export const format1: OperationURLParameter = { - parameterPath: "format", - mapper: { - serializedName: "format", - required: true, - type: { - name: "String" - } - } -}; - -export const query: OperationQueryParameter = { - parameterPath: "query", - mapper: { - serializedName: "query", - required: true, - type: { - name: "String" - } - } -}; - -export const maxAlternatives: OperationQueryParameter = { - parameterPath: ["options", "maxAlternatives"], - mapper: { - constraints: { - InclusiveMaximum: 5, - InclusiveMinimum: 0 - }, - serializedName: "maxAlternatives", - type: { - name: "Number" - } - } -}; - -export const alternativeType: OperationQueryParameter = { - parameterPath: ["options", "alternativeType"], - mapper: { - serializedName: "alternativeType", - type: { - name: "String" - } - } -}; - -export const minDeviationDistance: OperationQueryParameter = { - parameterPath: ["options", "minDeviationDistance"], - mapper: { - serializedName: "minDeviationDistance", - type: { - name: "Number" - } - } -}; - -export const minDeviationTime: OperationQueryParameter = { - parameterPath: ["options", "minDeviationTime"], - mapper: { - serializedName: "minDeviationTime", - type: { - name: "Number" - } - } -}; - -export const instructionsType: OperationQueryParameter = { - parameterPath: ["options", "instructionsType"], - mapper: { - serializedName: "instructionsType", - type: { - name: "String" - } - } -}; - -export const language: OperationQueryParameter = { - parameterPath: ["options", "language"], - mapper: { - serializedName: "language", - type: { - name: "String" - } - } -}; - -export const computeBestOrder: OperationQueryParameter = { - parameterPath: ["options", "computeBestOrder"], - mapper: { - serializedName: "computeBestOrder", - type: { - name: "Boolean" - } - } -}; - -export const routeRepresentation: OperationQueryParameter = { - parameterPath: ["options", "routeRepresentation"], - mapper: { - serializedName: "routeRepresentation", - type: { - name: "String" - } - } -}; - -export const vehicleHeading: OperationQueryParameter = { - parameterPath: ["options", "vehicleHeading"], - mapper: { - constraints: { - InclusiveMaximum: 359, - InclusiveMinimum: 0 - }, - serializedName: "vehicleHeading", - type: { - name: "Number" - } - } -}; - -export const report: OperationQueryParameter = { - parameterPath: ["options", "report"], - mapper: { - serializedName: "report", - type: { - name: "String" - } - } -}; - -export const vehicleCommercial: OperationQueryParameter = { - parameterPath: ["options", "vehicleCommercial"], - mapper: { - serializedName: "vehicleCommercial", - type: { - name: "Boolean" - } - } -}; - -export const vehicleEngineType: OperationQueryParameter = { - parameterPath: ["options", "vehicleEngineType"], - mapper: { - serializedName: "vehicleEngineType", - type: { - name: "String" - } - } -}; - -export const constantSpeedConsumptionInLitersPerHundredkm: OperationQueryParameter = { - parameterPath: ["options", "constantSpeedConsumptionInLitersPerHundredkm"], - mapper: { - serializedName: "constantSpeedConsumptionInLitersPerHundredkm", - type: { - name: "Number" - } - } -}; - -export const currentFuelInLiters: OperationQueryParameter = { - parameterPath: ["options", "currentFuelInLiters"], - mapper: { - serializedName: "currentFuelInLiters", - type: { - name: "Number" - } - } -}; - -export const auxiliaryPowerInLitersPerHour: OperationQueryParameter = { - parameterPath: ["options", "auxiliaryPowerInLitersPerHour"], - mapper: { - serializedName: "auxiliaryPowerInLitersPerHour", - type: { - name: "Number" - } - } -}; - -export const fuelEnergyDensityInMJoulesPerLiter: OperationQueryParameter = { - parameterPath: ["options", "fuelEnergyDensityInMJoulesPerLiter"], - mapper: { - serializedName: "fuelEnergyDensityInMJoulesPerLiter", - type: { - name: "Number" - } - } -}; - -export const accelerationEfficiency: OperationQueryParameter = { - parameterPath: ["options", "accelerationEfficiency"], - mapper: { - serializedName: "accelerationEfficiency", - type: { - name: "Number" - } - } -}; - -export const decelerationEfficiency: OperationQueryParameter = { - parameterPath: ["options", "decelerationEfficiency"], - mapper: { - serializedName: "decelerationEfficiency", - type: { - name: "Number" - } - } -}; - -export const uphillEfficiency: OperationQueryParameter = { - parameterPath: ["options", "uphillEfficiency"], - mapper: { - serializedName: "uphillEfficiency", - type: { - name: "Number" - } - } -}; - -export const downhillEfficiency: OperationQueryParameter = { - parameterPath: ["options", "downhillEfficiency"], - mapper: { - serializedName: "downhillEfficiency", - type: { - name: "Number" - } - } -}; - -export const constantSpeedConsumptionInkWhPerHundredkm: OperationQueryParameter = { - parameterPath: ["options", "constantSpeedConsumptionInkWhPerHundredkm"], - mapper: { - serializedName: "constantSpeedConsumptionInkWhPerHundredkm", - type: { - name: "String" - } - } -}; - -export const currentChargeInkWh: OperationQueryParameter = { - parameterPath: ["options", "currentChargeInkWh"], - mapper: { - serializedName: "currentChargeInkWh", - type: { - name: "String" - } - } -}; - -export const maxChargeInkWh: OperationQueryParameter = { - parameterPath: ["options", "maxChargeInkWh"], - mapper: { - serializedName: "maxChargeInkWh", - type: { - name: "String" - } - } -}; - -export const auxiliaryPowerInkW: OperationQueryParameter = { - parameterPath: ["options", "auxiliaryPowerInkW"], - mapper: { - serializedName: "auxiliaryPowerInkW", - type: { - name: "String" - } - } -}; - -export const postRouteDirectionsRequestBody: OperationParameter = { - parameterPath: "postRouteDirectionsRequestBody", - mapper: PostRouteDirectionsRequestBodyMapper -}; - -export const fuelBudgetInLiters: OperationQueryParameter = { - parameterPath: ["options", "fuelBudgetInLiters"], - mapper: { - serializedName: "fuelBudgetInLiters", - type: { - name: "Number" - } - } -}; - -export const energyBudgetInkWh: OperationQueryParameter = { - parameterPath: ["options", "energyBudgetInkWh"], - mapper: { - serializedName: "energyBudgetInkWh", - type: { - name: "Number" - } - } -}; - -export const timeBudgetInSec: OperationQueryParameter = { - parameterPath: ["options", "timeBudgetInSec"], - mapper: { - serializedName: "timeBudgetInSec", - type: { - name: "Number" - } - } -}; - -export const distanceBudgetInMeters: OperationQueryParameter = { - parameterPath: ["options", "distanceBudgetInMeters"], - mapper: { - serializedName: "distanceBudgetInMeters", - type: { - name: "Number" - } - } -}; - -export const postRouteDirectionsBatchRequestBody: OperationParameter = { - parameterPath: "postRouteDirectionsBatchRequestBody", - mapper: BatchRequestBodyMapper -}; diff --git a/sdk/maps/maps-route/src/operations/index.ts b/sdk/maps/maps-route/src/operations/index.ts deleted file mode 100644 index d08176bec180..000000000000 --- a/sdk/maps/maps-route/src/operations/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./route"; diff --git a/sdk/maps/maps-route/src/operations/route.ts b/sdk/maps/maps-route/src/operations/route.ts deleted file mode 100644 index 06192578bc78..000000000000 --- a/sdk/maps/maps-route/src/operations/route.ts +++ /dev/null @@ -1,1595 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { Route } from "../operationsInterfaces"; -import * as coreClient from "@azure/core-client"; -import * as Mappers from "../models/mappers"; -import * as Parameters from "../models/parameters"; -import { RouteClientContext } from "../routeClientContext"; -import { LROPoller, shouldDeserializeLRO } from "../lro"; -import { PollerLike, PollOperationState } from "@azure/core-lro"; -import { - PostRouteMatrixRequestBody, - ResponseFormat, - RoutePostRouteMatrixOptionalParams, - RoutePostRouteMatrixResponse, - RoutePostRouteMatrixSyncOptionalParams, - RoutePostRouteMatrixSyncResponse, - TextFormat, - RouteGetRouteDirectionsOptionalParams, - RouteGetRouteDirectionsResponse, - PostRouteDirectionsRequestBody, - RoutePostRouteDirectionsOptionalParams, - RoutePostRouteDirectionsResponse, - RouteGetRouteRangeOptionalParams, - RouteGetRouteRangeResponse, - BatchRequestBody, - RoutePostRouteDirectionsBatchOptionalParams, - RoutePostRouteDirectionsBatchResponse, - RoutePostRouteDirectionsBatchSyncOptionalParams, - RoutePostRouteDirectionsBatchSyncResponse -} from "../models"; - -/** Class representing a Route. */ -export class RouteImpl implements Route { - private readonly client: RouteClientContext; - - /** - * Initialize a new instance of the class Route class. - * @param client Reference to the service client - */ - constructor(client: RouteClientContext) { - this.client = client; - } - - /** - * - * **Applies to**: S1 pricing tier. - * - * The Matrix Routing service allows calculation of a matrix of route summaries for a set of routes - * defined by origin and destination locations by using an asynchronous (async) or synchronous (sync) - * POST request. For every given origin, the service calculates the cost of routing from that origin to - * every given destination. The set of origins and the set of destinations can be thought of as the - * column and row headers of a table and each cell in the table contains the costs of routing from the - * origin to the destination for that cell. As an example, let's say a food delivery company has 20 - * drivers and they need to find the closest driver to pick up the delivery from the restaurant. To - * solve this use case, they can call Matrix Route API. - * - * - * For each route, the travel times and distances are returned. You can use the computed costs to - * determine which detailed routes to calculate using the Route Directions API. - * - * - * The maximum size of a matrix for async request is **700** and for sync request it's **100** (the - * number of origins multiplied by the number of destinations). - * - * - * - * ### Submit Synchronous Route Matrix Request - * If your scenario requires synchronous requests and the maximum size of the matrix is less than or - * equal to 100, you might want to make synchronous request. The maximum size of a matrix for this API - * is **100** (the number of origins multiplied by the number of destinations). With that constraint in - * mind, examples of possible matrix dimensions are: 10x10, 6x8, 9x8 (it does not need to be square). - * - * ``` - * POST - * https://atlas.microsoft.com/route/matrix/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * - * ### Submit Asynchronous Route Matrix Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex routing - * requests. When you make a request by using async request, by default the service returns a 202 - * response code along a redirect URL in the Location field of the response header. This URL should be - * checked periodically until the response data or error information is available. If `waitForResults` - * parameter in the request is set to true, user will get a 200 response if the request is finished - * under 120 seconds. - * - * - * The maximum size of a matrix for this API is **700** (the number of origins multiplied by the number - * of destinations). With that constraint in mind, examples of possible matrix dimensions are: 50x10, - * 10x10, 28x25. 10x70 (it does not need to be square). - * - * - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * - * - * - * ``` - * POST - * https://atlas.microsoft.com/route/matrix/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * - * Here's a typical sequence of asynchronous operations: - * 1. Client sends a Route Matrix POST request to Azure Maps - * - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Route Matrix request has been accepted. - * - * > HTTP `Error` - There was an error processing your Route Matrix request. This could either be a - * 400 Bad Request or any other Error status code. - * - * - * 3. If the Matrix Route request was accepted successfully, the Location header in the response - * contains the URL to download the results of the request. This status URI looks like the following: - * - * ``` - * GET - * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} - * ``` - * - * - * 4. Client issues a GET request on the download URL obtained in Step 3 to download the results - * - * ### Download Sync Results - * When you make a POST request for Route Matrix Sync API, the service returns 200 response code for - * successful request and a response array. The response body will contain the data and there will be - * no possibility to retrieve the results later. - * - * ### Download Async Results - * When a request issues a `202 Accepted` response, the request is being processed using our async - * pipeline. You will be given a URL to check the progress of your async request in the location - * header of the response. This status URI looks like the following: - * ``` - * GET - * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} - * ``` - * - * The URL provided by the location header will return the following responses when a `GET` request is - * issued. - * - * > HTTP `202 Accepted` - Matrix request was accepted but is still being processed. Please try again - * in some time. - * - * > HTTP `200 OK` - Matrix request successfully processed. The response body contains all of the - * results. - * @param format Desired format of the response. Only `json` format is supported. - * @param postRouteMatrixRequestBody The matrix of origin and destination coordinates to compute the - * route distance, travel time and other summary for each cell of the matrix based on the input - * parameters. The minimum and the maximum cell count supported are 1 and **700** for async and **100** - * for sync respectively. For example, it can be 35 origins and 20 destinations or 25 origins and 25 - * destinations for async API. - * @param options The options parameters. - */ - async beginPostRouteMatrix( - format: ResponseFormat, - postRouteMatrixRequestBody: PostRouteMatrixRequestBody, - options?: RoutePostRouteMatrixOptionalParams - ): Promise< - PollerLike< - PollOperationState, - RoutePostRouteMatrixResponse - > - > { - const directSendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ): Promise => { - return this.client.sendOperationRequest(args, spec); - }; - const sendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ) => { - let currentRawResponse: - | coreClient.FullOperationResponse - | undefined = undefined; - const providedCallback = args.options?.onResponse; - const callback: coreClient.RawResponseCallback = ( - rawResponse: coreClient.FullOperationResponse, - flatResponse: unknown - ) => { - currentRawResponse = rawResponse; - providedCallback?.(rawResponse, flatResponse); - }; - const updatedArgs = { - ...args, - options: { - ...args.options, - onResponse: callback - } - }; - const flatResponse = await directSendOperation(updatedArgs, spec); - return { flatResponse, rawResponse: currentRawResponse! }; - }; - - return new LROPoller( - { intervalInMs: options?.updateIntervalInMs }, - { format, postRouteMatrixRequestBody, options }, - postRouteMatrixOperationSpec, - sendOperation, - "location" - ); - } - - /** - * - * **Applies to**: S1 pricing tier. - * - * The Matrix Routing service allows calculation of a matrix of route summaries for a set of routes - * defined by origin and destination locations by using an asynchronous (async) or synchronous (sync) - * POST request. For every given origin, the service calculates the cost of routing from that origin to - * every given destination. The set of origins and the set of destinations can be thought of as the - * column and row headers of a table and each cell in the table contains the costs of routing from the - * origin to the destination for that cell. As an example, let's say a food delivery company has 20 - * drivers and they need to find the closest driver to pick up the delivery from the restaurant. To - * solve this use case, they can call Matrix Route API. - * - * - * For each route, the travel times and distances are returned. You can use the computed costs to - * determine which detailed routes to calculate using the Route Directions API. - * - * - * The maximum size of a matrix for async request is **700** and for sync request it's **100** (the - * number of origins multiplied by the number of destinations). - * - * - * - * ### Submit Synchronous Route Matrix Request - * If your scenario requires synchronous requests and the maximum size of the matrix is less than or - * equal to 100, you might want to make synchronous request. The maximum size of a matrix for this API - * is **100** (the number of origins multiplied by the number of destinations). With that constraint in - * mind, examples of possible matrix dimensions are: 10x10, 6x8, 9x8 (it does not need to be square). - * - * ``` - * POST - * https://atlas.microsoft.com/route/matrix/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * - * ### Submit Asynchronous Route Matrix Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex routing - * requests. When you make a request by using async request, by default the service returns a 202 - * response code along a redirect URL in the Location field of the response header. This URL should be - * checked periodically until the response data or error information is available. If `waitForResults` - * parameter in the request is set to true, user will get a 200 response if the request is finished - * under 120 seconds. - * - * - * The maximum size of a matrix for this API is **700** (the number of origins multiplied by the number - * of destinations). With that constraint in mind, examples of possible matrix dimensions are: 50x10, - * 10x10, 28x25. 10x70 (it does not need to be square). - * - * - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * - * - * - * ``` - * POST - * https://atlas.microsoft.com/route/matrix/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * - * Here's a typical sequence of asynchronous operations: - * 1. Client sends a Route Matrix POST request to Azure Maps - * - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Route Matrix request has been accepted. - * - * > HTTP `Error` - There was an error processing your Route Matrix request. This could either be a - * 400 Bad Request or any other Error status code. - * - * - * 3. If the Matrix Route request was accepted successfully, the Location header in the response - * contains the URL to download the results of the request. This status URI looks like the following: - * - * ``` - * GET - * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} - * ``` - * - * - * 4. Client issues a GET request on the download URL obtained in Step 3 to download the results - * - * ### Download Sync Results - * When you make a POST request for Route Matrix Sync API, the service returns 200 response code for - * successful request and a response array. The response body will contain the data and there will be - * no possibility to retrieve the results later. - * - * ### Download Async Results - * When a request issues a `202 Accepted` response, the request is being processed using our async - * pipeline. You will be given a URL to check the progress of your async request in the location - * header of the response. This status URI looks like the following: - * ``` - * GET - * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} - * ``` - * - * The URL provided by the location header will return the following responses when a `GET` request is - * issued. - * - * > HTTP `202 Accepted` - Matrix request was accepted but is still being processed. Please try again - * in some time. - * - * > HTTP `200 OK` - Matrix request successfully processed. The response body contains all of the - * results. - * @param format Desired format of the response. Only `json` format is supported. - * @param postRouteMatrixRequestBody The matrix of origin and destination coordinates to compute the - * route distance, travel time and other summary for each cell of the matrix based on the input - * parameters. The minimum and the maximum cell count supported are 1 and **700** for async and **100** - * for sync respectively. For example, it can be 35 origins and 20 destinations or 25 origins and 25 - * destinations for async API. - * @param options The options parameters. - */ - async beginPostRouteMatrixAndWait( - format: ResponseFormat, - postRouteMatrixRequestBody: PostRouteMatrixRequestBody, - options?: RoutePostRouteMatrixOptionalParams - ): Promise { - const poller = await this.beginPostRouteMatrix( - format, - postRouteMatrixRequestBody, - options - ); - return poller.pollUntilDone(); - } - - /** - * - * **Applies to**: S1 pricing tier. - * - * The Matrix Routing service allows calculation of a matrix of route summaries for a set of routes - * defined by origin and destination locations by using an asynchronous (async) or synchronous (sync) - * POST request. For every given origin, the service calculates the cost of routing from that origin to - * every given destination. The set of origins and the set of destinations can be thought of as the - * column and row headers of a table and each cell in the table contains the costs of routing from the - * origin to the destination for that cell. As an example, let's say a food delivery company has 20 - * drivers and they need to find the closest driver to pick up the delivery from the restaurant. To - * solve this use case, they can call Matrix Route API. - * - * - * For each route, the travel times and distances are returned. You can use the computed costs to - * determine which detailed routes to calculate using the Route Directions API. - * - * - * The maximum size of a matrix for async request is **700** and for sync request it's **100** (the - * number of origins multiplied by the number of destinations). - * - * - * - * ### Submit Synchronous Route Matrix Request - * If your scenario requires synchronous requests and the maximum size of the matrix is less than or - * equal to 100, you might want to make synchronous request. The maximum size of a matrix for this API - * is **100** (the number of origins multiplied by the number of destinations). With that constraint in - * mind, examples of possible matrix dimensions are: 10x10, 6x8, 9x8 (it does not need to be square). - * - * ``` - * POST - * https://atlas.microsoft.com/route/matrix/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * - * ### Submit Asynchronous Route Matrix Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex routing - * requests. When you make a request by using async request, by default the service returns a 202 - * response code along a redirect URL in the Location field of the response header. This URL should be - * checked periodically until the response data or error information is available. If `waitForResults` - * parameter in the request is set to true, user will get a 200 response if the request is finished - * under 120 seconds. - * - * - * The maximum size of a matrix for this API is **700** (the number of origins multiplied by the number - * of destinations). With that constraint in mind, examples of possible matrix dimensions are: 50x10, - * 10x10, 28x25. 10x70 (it does not need to be square). - * - * - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * - * - * - * ``` - * POST - * https://atlas.microsoft.com/route/matrix/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * - * Here's a typical sequence of asynchronous operations: - * 1. Client sends a Route Matrix POST request to Azure Maps - * - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Route Matrix request has been accepted. - * - * > HTTP `Error` - There was an error processing your Route Matrix request. This could either be a - * 400 Bad Request or any other Error status code. - * - * - * 3. If the Matrix Route request was accepted successfully, the Location header in the response - * contains the URL to download the results of the request. This status URI looks like the following: - * - * ``` - * GET - * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} - * ``` - * - * - * 4. Client issues a GET request on the download URL obtained in Step 3 to download the results - * - * ### Download Sync Results - * When you make a POST request for Route Matrix Sync API, the service returns 200 response code for - * successful request and a response array. The response body will contain the data and there will be - * no possibility to retrieve the results later. - * - * ### Download Async Results - * When a request issues a `202 Accepted` response, the request is being processed using our async - * pipeline. You will be given a URL to check the progress of your async request in the location - * header of the response. This status URI looks like the following: - * ``` - * GET - * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} - * ``` - * - * The URL provided by the location header will return the following responses when a `GET` request is - * issued. - * - * > HTTP `202 Accepted` - Matrix request was accepted but is still being processed. Please try again - * in some time. - * - * > HTTP `200 OK` - Matrix request successfully processed. The response body contains all of the - * results. - * @param format Desired format of the response. Only `json` format is supported. - * @param postRouteMatrixRequestBody The matrix of origin and destination coordinates to compute the - * route distance, travel time and other summary for each cell of the matrix based on the input - * parameters. The minimum and the maximum cell count supported are 1 and **700** for async and **100** - * for sync respectively. For example, it can be 35 origins and 20 destinations or 25 origins and 25 - * destinations for async API. - * @param options The options parameters. - */ - postRouteMatrixSync( - format: ResponseFormat, - postRouteMatrixRequestBody: PostRouteMatrixRequestBody, - options?: RoutePostRouteMatrixSyncOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, postRouteMatrixRequestBody, options }, - postRouteMatrixSyncOperationSpec - ); - } - - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Returns a route between an origin and a destination, passing through waypoints if they are - * specified. The route will take into account factors such as current traffic and the typical road - * speeds on the requested day of the week and time of day. - * - * Information returned includes the distance, estimated travel time, and a representation of the route - * geometry. Additional routing information such as optimized waypoint order or turn by turn - * instructions is also available, depending on the options selected. - * - * Routing service provides a set of parameters for a detailed description of vehicle-specific - * Consumption Model. Please check [Consumption - * Model](https://docs.microsoft.com/azure/azure-maps/consumption-model) for detailed explanation of - * the concepts and parameters involved. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The Coordinates through which the route is calculated, delimited by a colon. A minimum - * of two coordinates is required. The first one is the origin and the last is the destination of the - * route. Optional coordinates in-between act as WayPoints in the route. You can pass up to 150 - * WayPoints. - * @param options The options parameters. - */ - getRouteDirections( - format: TextFormat, - query: string, - options?: RouteGetRouteDirectionsOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getRouteDirectionsOperationSpec - ); - } - - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Returns a route between an origin and a destination, passing through waypoints if they are - * specified. The route will take into account factors such as current traffic and the typical road - * speeds on the requested day of the week and time of day. - * - * Information returned includes the distance, estimated travel time, and a representation of the route - * geometry. Additional routing information such as optimized waypoint order or turn by turn - * instructions is also available, depending on the options selected. - * - * Routing service provides a set of parameters for a detailed description of a vehicle-specific - * Consumption Model. Please check [Consumption - * Model](https://docs.microsoft.com/azure/azure-maps/consumption-model) for detailed explanation of - * the concepts and parameters involved. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The Coordinates through which the route is calculated. Needs two coordinates at least. - * Delimited by colon. First one is the origin and the last is the destination of the route. The - * coordinates are in a lat,long format. Optional coordinates in between act as WayPoints in the - * route. - * @param postRouteDirectionsRequestBody Used for reconstructing a route and for calculating zero or - * more alternative routes to this reference route. The provided sequence of coordinates is used as - * input for route reconstruction. The alternative routes are calculated between the origin and - * destination points specified in the base path parameter locations. If both minDeviationDistance and - * minDeviationTime are set to zero, then these origin and destination points are expected to be at - * (or very near) the beginning and end of the reference route, respectively. Intermediate locations - * (waypoints) are not supported when using supportingPoints. - * - * Setting at least one of minDeviationDistance or minDeviationTime to a value greater than zero has - * the following consequences: - * - * * The origin point of the calculateRoute request must be on (or very near) the input reference - * route. If this is not the case, an error is returned. However, the origin point does not need to be - * at the beginning of the input reference route (it can be thought of as the current vehicle position - * on the reference route). - * * The reference route, returned as the first route in the calculateRoute response, will start at - * the origin point specified in the calculateRoute request. The initial part of the input reference - * route up until the origin point will be excluded from the response. - * * The values of minDeviationDistance and minDeviationTime determine how far alternative routes will - * be guaranteed to follow the reference route from the origin point onwards. - * * The route must use departAt. - * * The vehicleHeading is ignored. - * @param options The options parameters. - */ - postRouteDirections( - format: TextFormat, - query: string, - postRouteDirectionsRequestBody: PostRouteDirectionsRequestBody, - options?: RoutePostRouteDirectionsOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, postRouteDirectionsRequestBody, options }, - postRouteDirectionsOperationSpec - ); - } - - /** - * __Route Range (Isochrone) API__ - * - * - * **Applies to**: S1 pricing tier. - * - * This service will calculate a set of locations that can be reached from the origin point based on - * fuel, energy, time or distance budget that is specified. A polygon boundary (or Isochrone) is - * returned in a counterclockwise orientation as well as the precise polygon center which was the - * result of the origin point. - * - * The returned polygon can be used for further processing such as [Search Inside - * Geometry](https://docs.microsoft.com/rest/api/maps/search/postsearchinsidegeometry) to search for - * POIs within the provided Isochrone. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The Coordinate from which the range calculation should start. - * @param options The options parameters. - */ - getRouteRange( - format: TextFormat, - query: string, - options?: RouteGetRouteRangeOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getRouteRangeOperationSpec - ); - } - - /** - * **Route Directions Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Route Directions Batch API sends batches of queries to [Route Directions - * API](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections) using just a single - * API call. You can call Route Directions Batch API to run either asynchronously (async) or - * synchronously (sync). The async API allows caller to batch up to **700** queries and sync API up to - * **100** queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/route/directions/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex route requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **700** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Route Directions Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` GET https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0 ``` - * Note:- Please remember to add AUTH information (subscription-key/azure_auth - See - * [Security](#security)) to the _status URI_ before running it.
- * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _route directions_ queries you will use a `POST` request where the request body will - * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 3 _route directions_ queries: - * - * - * ```json - * { - * "batchItems": [ - * { "query": - * "?query=47.620659,-122.348934:47.610101,-122.342015&travelMode=bicycle&routeType=eco&traffic=false" - * }, - * { "query": - * "?query=40.759856,-73.985108:40.771136,-73.973506&travelMode=pedestrian&routeType=shortest" }, - * { "query": "?query=48.923159,-122.557362:32.621279,-116.840362" } - * ] - * } - * ``` - * - * A _route directions_ query in a batch is just a partial URL _without_ the protocol, base URL, path, - * api-version and subscription-key. It can accept any of the supported _route directions_ [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#uri-parameters). - * The string values in the _route directions_ query must be properly escaped (e.g. " character should - * be escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **700** queries and sync API up to **100** queries, and - * the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`RouteDirectionsResponse`](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#routedirectionsresponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 1 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 1, - * "totalRequests": 2 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": { - * "routes": [ - * { - * "summary": { - * "lengthInMeters": 1758, - * "travelTimeInSeconds": 387, - * "trafficDelayInSeconds": 0, - * "departureTime": "2018-07-17T00:49:56+00:00", - * "arrivalTime": "2018-07-17T00:56:22+00:00" - * }, - * "legs": [ - * { - * "summary": { - * "lengthInMeters": 1758, - * "travelTimeInSeconds": 387, - * "trafficDelayInSeconds": 0, - * "departureTime": "2018-07-17T00:49:56+00:00", - * "arrivalTime": "2018-07-17T00:56:22+00:00" - * }, - * "points": [ - * { - * "latitude": 47.62094, - * "longitude": -122.34892 - * }, - * { - * "latitude": 47.62094, - * "longitude": -122.3485 - * }, - * { - * "latitude": 47.62095, - * "longitude": -122.3476 - * } - * ] - * } - * ], - * "sections": [ - * { - * "startPointIndex": 0, - * "endPointIndex": 40, - * "sectionType": "TRAVEL_MODE", - * "travelMode": "bicycle" - * } - * ] - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param postRouteDirectionsBatchRequestBody The list of route directions queries/requests to process. - * The list can contain a max of 700 queries for async and 100 queries for sync version and must - * contain at least 1 query. - * @param options The options parameters. - */ - async beginPostRouteDirectionsBatch( - format: ResponseFormat, - postRouteDirectionsBatchRequestBody: BatchRequestBody, - options?: RoutePostRouteDirectionsBatchOptionalParams - ): Promise< - PollerLike< - PollOperationState, - RoutePostRouteDirectionsBatchResponse - > - > { - const directSendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ): Promise => { - return this.client.sendOperationRequest(args, spec); - }; - const sendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ) => { - let currentRawResponse: - | coreClient.FullOperationResponse - | undefined = undefined; - const providedCallback = args.options?.onResponse; - const callback: coreClient.RawResponseCallback = ( - rawResponse: coreClient.FullOperationResponse, - flatResponse: unknown - ) => { - currentRawResponse = rawResponse; - providedCallback?.(rawResponse, flatResponse); - }; - const updatedArgs = { - ...args, - options: { - ...args.options, - onResponse: callback - } - }; - const flatResponse = await directSendOperation(updatedArgs, spec); - return { flatResponse, rawResponse: currentRawResponse! }; - }; - - return new LROPoller( - { intervalInMs: options?.updateIntervalInMs }, - { format, postRouteDirectionsBatchRequestBody, options }, - postRouteDirectionsBatchOperationSpec, - sendOperation, - "location" - ); - } - - /** - * **Route Directions Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Route Directions Batch API sends batches of queries to [Route Directions - * API](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections) using just a single - * API call. You can call Route Directions Batch API to run either asynchronously (async) or - * synchronously (sync). The async API allows caller to batch up to **700** queries and sync API up to - * **100** queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/route/directions/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex route requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **700** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Route Directions Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` GET https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0 ``` - * Note:- Please remember to add AUTH information (subscription-key/azure_auth - See - * [Security](#security)) to the _status URI_ before running it.
- * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _route directions_ queries you will use a `POST` request where the request body will - * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 3 _route directions_ queries: - * - * - * ```json - * { - * "batchItems": [ - * { "query": - * "?query=47.620659,-122.348934:47.610101,-122.342015&travelMode=bicycle&routeType=eco&traffic=false" - * }, - * { "query": - * "?query=40.759856,-73.985108:40.771136,-73.973506&travelMode=pedestrian&routeType=shortest" }, - * { "query": "?query=48.923159,-122.557362:32.621279,-116.840362" } - * ] - * } - * ``` - * - * A _route directions_ query in a batch is just a partial URL _without_ the protocol, base URL, path, - * api-version and subscription-key. It can accept any of the supported _route directions_ [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#uri-parameters). - * The string values in the _route directions_ query must be properly escaped (e.g. " character should - * be escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **700** queries and sync API up to **100** queries, and - * the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`RouteDirectionsResponse`](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#routedirectionsresponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 1 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 1, - * "totalRequests": 2 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": { - * "routes": [ - * { - * "summary": { - * "lengthInMeters": 1758, - * "travelTimeInSeconds": 387, - * "trafficDelayInSeconds": 0, - * "departureTime": "2018-07-17T00:49:56+00:00", - * "arrivalTime": "2018-07-17T00:56:22+00:00" - * }, - * "legs": [ - * { - * "summary": { - * "lengthInMeters": 1758, - * "travelTimeInSeconds": 387, - * "trafficDelayInSeconds": 0, - * "departureTime": "2018-07-17T00:49:56+00:00", - * "arrivalTime": "2018-07-17T00:56:22+00:00" - * }, - * "points": [ - * { - * "latitude": 47.62094, - * "longitude": -122.34892 - * }, - * { - * "latitude": 47.62094, - * "longitude": -122.3485 - * }, - * { - * "latitude": 47.62095, - * "longitude": -122.3476 - * } - * ] - * } - * ], - * "sections": [ - * { - * "startPointIndex": 0, - * "endPointIndex": 40, - * "sectionType": "TRAVEL_MODE", - * "travelMode": "bicycle" - * } - * ] - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param postRouteDirectionsBatchRequestBody The list of route directions queries/requests to process. - * The list can contain a max of 700 queries for async and 100 queries for sync version and must - * contain at least 1 query. - * @param options The options parameters. - */ - async beginPostRouteDirectionsBatchAndWait( - format: ResponseFormat, - postRouteDirectionsBatchRequestBody: BatchRequestBody, - options?: RoutePostRouteDirectionsBatchOptionalParams - ): Promise { - const poller = await this.beginPostRouteDirectionsBatch( - format, - postRouteDirectionsBatchRequestBody, - options - ); - return poller.pollUntilDone(); - } - - /** - * **Route Directions Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Route Directions Batch API sends batches of queries to [Route Directions - * API](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections) using just a single - * API call. You can call Route Directions Batch API to run either asynchronously (async) or - * synchronously (sync). The async API allows caller to batch up to **700** queries and sync API up to - * **100** queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/route/directions/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex route requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **700** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Route Directions Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` GET https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0 ``` - * Note:- Please remember to add AUTH information (subscription-key/azure_auth - See - * [Security](#security)) to the _status URI_ before running it.
- * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _route directions_ queries you will use a `POST` request where the request body will - * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 3 _route directions_ queries: - * - * - * ```json - * { - * "batchItems": [ - * { "query": - * "?query=47.620659,-122.348934:47.610101,-122.342015&travelMode=bicycle&routeType=eco&traffic=false" - * }, - * { "query": - * "?query=40.759856,-73.985108:40.771136,-73.973506&travelMode=pedestrian&routeType=shortest" }, - * { "query": "?query=48.923159,-122.557362:32.621279,-116.840362" } - * ] - * } - * ``` - * - * A _route directions_ query in a batch is just a partial URL _without_ the protocol, base URL, path, - * api-version and subscription-key. It can accept any of the supported _route directions_ [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#uri-parameters). - * The string values in the _route directions_ query must be properly escaped (e.g. " character should - * be escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **700** queries and sync API up to **100** queries, and - * the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`RouteDirectionsResponse`](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#routedirectionsresponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 1 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 1, - * "totalRequests": 2 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": { - * "routes": [ - * { - * "summary": { - * "lengthInMeters": 1758, - * "travelTimeInSeconds": 387, - * "trafficDelayInSeconds": 0, - * "departureTime": "2018-07-17T00:49:56+00:00", - * "arrivalTime": "2018-07-17T00:56:22+00:00" - * }, - * "legs": [ - * { - * "summary": { - * "lengthInMeters": 1758, - * "travelTimeInSeconds": 387, - * "trafficDelayInSeconds": 0, - * "departureTime": "2018-07-17T00:49:56+00:00", - * "arrivalTime": "2018-07-17T00:56:22+00:00" - * }, - * "points": [ - * { - * "latitude": 47.62094, - * "longitude": -122.34892 - * }, - * { - * "latitude": 47.62094, - * "longitude": -122.3485 - * }, - * { - * "latitude": 47.62095, - * "longitude": -122.3476 - * } - * ] - * } - * ], - * "sections": [ - * { - * "startPointIndex": 0, - * "endPointIndex": 40, - * "sectionType": "TRAVEL_MODE", - * "travelMode": "bicycle" - * } - * ] - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param postRouteDirectionsBatchRequestBody The list of route directions queries/requests to process. - * The list can contain a max of 700 queries for async and 100 queries for sync version and must - * contain at least 1 query. - * @param options The options parameters. - */ - postRouteDirectionsBatchSync( - format: ResponseFormat, - postRouteDirectionsBatchRequestBody: BatchRequestBody, - options?: RoutePostRouteDirectionsBatchSyncOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, postRouteDirectionsBatchRequestBody, options }, - postRouteDirectionsBatchSyncOperationSpec - ); - } -} -// Operation Specifications -const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); - -const postRouteMatrixOperationSpec: coreClient.OperationSpec = { - path: "/route/matrix/{format}", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.RouteMatrixResponse - }, - 201: { - bodyMapper: Mappers.RouteMatrixResponse - }, - 202: { - bodyMapper: Mappers.RouteMatrixResponse - }, - 204: { - bodyMapper: Mappers.RouteMatrixResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.postRouteMatrixRequestBody, - queryParameters: [ - Parameters.apiVersion, - Parameters.waitForResults, - Parameters.computeTravelTimeFor, - Parameters.sectionType, - Parameters.arriveAt, - Parameters.departAt, - Parameters.vehicleAxleWeight, - Parameters.vehicleLength, - Parameters.vehicleHeight, - Parameters.vehicleWidth, - Parameters.vehicleMaxSpeed, - Parameters.vehicleWeight, - Parameters.windingness, - Parameters.hilliness, - Parameters.travelMode, - Parameters.avoid, - Parameters.traffic, - Parameters.routeType, - Parameters.vehicleLoadType - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [ - Parameters.contentType, - Parameters.accept, - Parameters.xMsClientId - ], - mediaType: "json", - serializer -}; -const postRouteMatrixSyncOperationSpec: coreClient.OperationSpec = { - path: "/route/matrix/sync/{format}", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.RouteMatrixResponse - }, - 408: { - bodyMapper: Mappers.ErrorResponse, - isError: true - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.postRouteMatrixRequestBody, - queryParameters: [ - Parameters.apiVersion, - Parameters.waitForResults, - Parameters.computeTravelTimeFor, - Parameters.sectionType, - Parameters.arriveAt, - Parameters.departAt, - Parameters.vehicleAxleWeight, - Parameters.vehicleLength, - Parameters.vehicleHeight, - Parameters.vehicleWidth, - Parameters.vehicleMaxSpeed, - Parameters.vehicleWeight, - Parameters.windingness, - Parameters.hilliness, - Parameters.travelMode, - Parameters.avoid, - Parameters.traffic, - Parameters.routeType, - Parameters.vehicleLoadType - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [ - Parameters.contentType, - Parameters.accept, - Parameters.xMsClientId - ], - mediaType: "json", - serializer -}; -const getRouteDirectionsOperationSpec: coreClient.OperationSpec = { - path: "/route/directions/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.RouteDirectionsResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.computeTravelTimeFor, - Parameters.sectionType, - Parameters.arriveAt, - Parameters.departAt, - Parameters.vehicleAxleWeight, - Parameters.vehicleLength, - Parameters.vehicleHeight, - Parameters.vehicleWidth, - Parameters.vehicleMaxSpeed, - Parameters.vehicleWeight, - Parameters.windingness, - Parameters.hilliness, - Parameters.travelMode, - Parameters.avoid, - Parameters.traffic, - Parameters.routeType, - Parameters.vehicleLoadType, - Parameters.query, - Parameters.maxAlternatives, - Parameters.alternativeType, - Parameters.minDeviationDistance, - Parameters.minDeviationTime, - Parameters.instructionsType, - Parameters.language, - Parameters.computeBestOrder, - Parameters.routeRepresentation, - Parameters.vehicleHeading, - Parameters.report, - Parameters.vehicleCommercial, - Parameters.vehicleEngineType, - Parameters.constantSpeedConsumptionInLitersPerHundredkm, - Parameters.currentFuelInLiters, - Parameters.auxiliaryPowerInLitersPerHour, - Parameters.fuelEnergyDensityInMJoulesPerLiter, - Parameters.accelerationEfficiency, - Parameters.decelerationEfficiency, - Parameters.uphillEfficiency, - Parameters.downhillEfficiency, - Parameters.constantSpeedConsumptionInkWhPerHundredkm, - Parameters.currentChargeInkWh, - Parameters.maxChargeInkWh, - Parameters.auxiliaryPowerInkW - ], - urlParameters: [Parameters.geography, Parameters.format1], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const postRouteDirectionsOperationSpec: coreClient.OperationSpec = { - path: "/route/directions/{format}", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.RouteDirectionsResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.postRouteDirectionsRequestBody, - queryParameters: [ - Parameters.apiVersion, - Parameters.computeTravelTimeFor, - Parameters.sectionType, - Parameters.arriveAt, - Parameters.departAt, - Parameters.vehicleAxleWeight, - Parameters.vehicleLength, - Parameters.vehicleHeight, - Parameters.vehicleWidth, - Parameters.vehicleMaxSpeed, - Parameters.vehicleWeight, - Parameters.windingness, - Parameters.hilliness, - Parameters.travelMode, - Parameters.avoid, - Parameters.traffic, - Parameters.routeType, - Parameters.vehicleLoadType, - Parameters.query, - Parameters.maxAlternatives, - Parameters.alternativeType, - Parameters.minDeviationDistance, - Parameters.minDeviationTime, - Parameters.instructionsType, - Parameters.language, - Parameters.computeBestOrder, - Parameters.routeRepresentation, - Parameters.vehicleHeading, - Parameters.report, - Parameters.vehicleCommercial, - Parameters.vehicleEngineType, - Parameters.constantSpeedConsumptionInLitersPerHundredkm, - Parameters.currentFuelInLiters, - Parameters.auxiliaryPowerInLitersPerHour, - Parameters.fuelEnergyDensityInMJoulesPerLiter, - Parameters.accelerationEfficiency, - Parameters.decelerationEfficiency, - Parameters.uphillEfficiency, - Parameters.downhillEfficiency, - Parameters.constantSpeedConsumptionInkWhPerHundredkm, - Parameters.currentChargeInkWh, - Parameters.maxChargeInkWh, - Parameters.auxiliaryPowerInkW - ], - urlParameters: [Parameters.geography, Parameters.format1], - headerParameters: [ - Parameters.contentType, - Parameters.accept, - Parameters.xMsClientId - ], - mediaType: "json", - serializer -}; -const getRouteRangeOperationSpec: coreClient.OperationSpec = { - path: "/route/range/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.GetRouteRangeResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.departAt, - Parameters.vehicleAxleWeight, - Parameters.vehicleLength, - Parameters.vehicleHeight, - Parameters.vehicleWidth, - Parameters.vehicleMaxSpeed, - Parameters.vehicleWeight, - Parameters.windingness, - Parameters.hilliness, - Parameters.travelMode, - Parameters.avoid, - Parameters.traffic, - Parameters.routeType, - Parameters.vehicleLoadType, - Parameters.query, - Parameters.vehicleCommercial, - Parameters.vehicleEngineType, - Parameters.constantSpeedConsumptionInLitersPerHundredkm, - Parameters.currentFuelInLiters, - Parameters.auxiliaryPowerInLitersPerHour, - Parameters.fuelEnergyDensityInMJoulesPerLiter, - Parameters.accelerationEfficiency, - Parameters.decelerationEfficiency, - Parameters.uphillEfficiency, - Parameters.downhillEfficiency, - Parameters.constantSpeedConsumptionInkWhPerHundredkm, - Parameters.currentChargeInkWh, - Parameters.maxChargeInkWh, - Parameters.auxiliaryPowerInkW, - Parameters.fuelBudgetInLiters, - Parameters.energyBudgetInkWh, - Parameters.timeBudgetInSec, - Parameters.distanceBudgetInMeters - ], - urlParameters: [Parameters.geography, Parameters.format1], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const postRouteDirectionsBatchOperationSpec: coreClient.OperationSpec = { - path: "/route/directions/batch/{format}", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.RouteDirectionsBatchResponse - }, - 201: { - bodyMapper: Mappers.RouteDirectionsBatchResponse - }, - 202: { - bodyMapper: Mappers.RouteDirectionsBatchResponse - }, - 204: { - bodyMapper: Mappers.RouteDirectionsBatchResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.postRouteDirectionsBatchRequestBody, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [ - Parameters.contentType, - Parameters.accept, - Parameters.xMsClientId - ], - mediaType: "json", - serializer -}; -const postRouteDirectionsBatchSyncOperationSpec: coreClient.OperationSpec = { - path: "/route/directions/batch/sync/{format}", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.RouteDirectionsBatchResponse - }, - 408: { - bodyMapper: Mappers.ErrorResponse, - isError: true - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.postRouteDirectionsBatchRequestBody, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [ - Parameters.contentType, - Parameters.accept, - Parameters.xMsClientId - ], - mediaType: "json", - serializer -}; diff --git a/sdk/maps/maps-route/src/operationsInterfaces/index.ts b/sdk/maps/maps-route/src/operationsInterfaces/index.ts deleted file mode 100644 index d08176bec180..000000000000 --- a/sdk/maps/maps-route/src/operationsInterfaces/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./route"; diff --git a/sdk/maps/maps-route/src/operationsInterfaces/route.ts b/sdk/maps/maps-route/src/operationsInterfaces/route.ts deleted file mode 100644 index f367eb1e9a59..000000000000 --- a/sdk/maps/maps-route/src/operationsInterfaces/route.ts +++ /dev/null @@ -1,1118 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { PollerLike, PollOperationState } from "@azure/core-lro"; -import { - PostRouteMatrixRequestBody, - ResponseFormat, - RoutePostRouteMatrixOptionalParams, - RoutePostRouteMatrixResponse, - RoutePostRouteMatrixSyncOptionalParams, - RoutePostRouteMatrixSyncResponse, - TextFormat, - RouteGetRouteDirectionsOptionalParams, - RouteGetRouteDirectionsResponse, - PostRouteDirectionsRequestBody, - RoutePostRouteDirectionsOptionalParams, - RoutePostRouteDirectionsResponse, - RouteGetRouteRangeOptionalParams, - RouteGetRouteRangeResponse, - BatchRequestBody, - RoutePostRouteDirectionsBatchOptionalParams, - RoutePostRouteDirectionsBatchResponse, - RoutePostRouteDirectionsBatchSyncOptionalParams, - RoutePostRouteDirectionsBatchSyncResponse -} from "../models"; - -/** Interface representing a Route. */ -export interface Route { - /** - * - * **Applies to**: S1 pricing tier. - * - * The Matrix Routing service allows calculation of a matrix of route summaries for a set of routes - * defined by origin and destination locations by using an asynchronous (async) or synchronous (sync) - * POST request. For every given origin, the service calculates the cost of routing from that origin to - * every given destination. The set of origins and the set of destinations can be thought of as the - * column and row headers of a table and each cell in the table contains the costs of routing from the - * origin to the destination for that cell. As an example, let's say a food delivery company has 20 - * drivers and they need to find the closest driver to pick up the delivery from the restaurant. To - * solve this use case, they can call Matrix Route API. - * - * - * For each route, the travel times and distances are returned. You can use the computed costs to - * determine which detailed routes to calculate using the Route Directions API. - * - * - * The maximum size of a matrix for async request is **700** and for sync request it's **100** (the - * number of origins multiplied by the number of destinations). - * - * - * - * ### Submit Synchronous Route Matrix Request - * If your scenario requires synchronous requests and the maximum size of the matrix is less than or - * equal to 100, you might want to make synchronous request. The maximum size of a matrix for this API - * is **100** (the number of origins multiplied by the number of destinations). With that constraint in - * mind, examples of possible matrix dimensions are: 10x10, 6x8, 9x8 (it does not need to be square). - * - * ``` - * POST - * https://atlas.microsoft.com/route/matrix/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * - * ### Submit Asynchronous Route Matrix Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex routing - * requests. When you make a request by using async request, by default the service returns a 202 - * response code along a redirect URL in the Location field of the response header. This URL should be - * checked periodically until the response data or error information is available. If `waitForResults` - * parameter in the request is set to true, user will get a 200 response if the request is finished - * under 120 seconds. - * - * - * The maximum size of a matrix for this API is **700** (the number of origins multiplied by the number - * of destinations). With that constraint in mind, examples of possible matrix dimensions are: 50x10, - * 10x10, 28x25. 10x70 (it does not need to be square). - * - * - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * - * - * - * ``` - * POST - * https://atlas.microsoft.com/route/matrix/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * - * Here's a typical sequence of asynchronous operations: - * 1. Client sends a Route Matrix POST request to Azure Maps - * - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Route Matrix request has been accepted. - * - * > HTTP `Error` - There was an error processing your Route Matrix request. This could either be a - * 400 Bad Request or any other Error status code. - * - * - * 3. If the Matrix Route request was accepted successfully, the Location header in the response - * contains the URL to download the results of the request. This status URI looks like the following: - * - * ``` - * GET - * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} - * ``` - * - * - * 4. Client issues a GET request on the download URL obtained in Step 3 to download the results - * - * ### Download Sync Results - * When you make a POST request for Route Matrix Sync API, the service returns 200 response code for - * successful request and a response array. The response body will contain the data and there will be - * no possibility to retrieve the results later. - * - * ### Download Async Results - * When a request issues a `202 Accepted` response, the request is being processed using our async - * pipeline. You will be given a URL to check the progress of your async request in the location - * header of the response. This status URI looks like the following: - * ``` - * GET - * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} - * ``` - * - * The URL provided by the location header will return the following responses when a `GET` request is - * issued. - * - * > HTTP `202 Accepted` - Matrix request was accepted but is still being processed. Please try again - * in some time. - * - * > HTTP `200 OK` - Matrix request successfully processed. The response body contains all of the - * results. - * @param format Desired format of the response. Only `json` format is supported. - * @param postRouteMatrixRequestBody The matrix of origin and destination coordinates to compute the - * route distance, travel time and other summary for each cell of the matrix based on the input - * parameters. The minimum and the maximum cell count supported are 1 and **700** for async and **100** - * for sync respectively. For example, it can be 35 origins and 20 destinations or 25 origins and 25 - * destinations for async API. - * @param options The options parameters. - */ - beginPostRouteMatrix( - format: ResponseFormat, - postRouteMatrixRequestBody: PostRouteMatrixRequestBody, - options?: RoutePostRouteMatrixOptionalParams - ): Promise< - PollerLike< - PollOperationState, - RoutePostRouteMatrixResponse - > - >; - /** - * - * **Applies to**: S1 pricing tier. - * - * The Matrix Routing service allows calculation of a matrix of route summaries for a set of routes - * defined by origin and destination locations by using an asynchronous (async) or synchronous (sync) - * POST request. For every given origin, the service calculates the cost of routing from that origin to - * every given destination. The set of origins and the set of destinations can be thought of as the - * column and row headers of a table and each cell in the table contains the costs of routing from the - * origin to the destination for that cell. As an example, let's say a food delivery company has 20 - * drivers and they need to find the closest driver to pick up the delivery from the restaurant. To - * solve this use case, they can call Matrix Route API. - * - * - * For each route, the travel times and distances are returned. You can use the computed costs to - * determine which detailed routes to calculate using the Route Directions API. - * - * - * The maximum size of a matrix for async request is **700** and for sync request it's **100** (the - * number of origins multiplied by the number of destinations). - * - * - * - * ### Submit Synchronous Route Matrix Request - * If your scenario requires synchronous requests and the maximum size of the matrix is less than or - * equal to 100, you might want to make synchronous request. The maximum size of a matrix for this API - * is **100** (the number of origins multiplied by the number of destinations). With that constraint in - * mind, examples of possible matrix dimensions are: 10x10, 6x8, 9x8 (it does not need to be square). - * - * ``` - * POST - * https://atlas.microsoft.com/route/matrix/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * - * ### Submit Asynchronous Route Matrix Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex routing - * requests. When you make a request by using async request, by default the service returns a 202 - * response code along a redirect URL in the Location field of the response header. This URL should be - * checked periodically until the response data or error information is available. If `waitForResults` - * parameter in the request is set to true, user will get a 200 response if the request is finished - * under 120 seconds. - * - * - * The maximum size of a matrix for this API is **700** (the number of origins multiplied by the number - * of destinations). With that constraint in mind, examples of possible matrix dimensions are: 50x10, - * 10x10, 28x25. 10x70 (it does not need to be square). - * - * - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * - * - * - * ``` - * POST - * https://atlas.microsoft.com/route/matrix/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * - * Here's a typical sequence of asynchronous operations: - * 1. Client sends a Route Matrix POST request to Azure Maps - * - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Route Matrix request has been accepted. - * - * > HTTP `Error` - There was an error processing your Route Matrix request. This could either be a - * 400 Bad Request or any other Error status code. - * - * - * 3. If the Matrix Route request was accepted successfully, the Location header in the response - * contains the URL to download the results of the request. This status URI looks like the following: - * - * ``` - * GET - * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} - * ``` - * - * - * 4. Client issues a GET request on the download URL obtained in Step 3 to download the results - * - * ### Download Sync Results - * When you make a POST request for Route Matrix Sync API, the service returns 200 response code for - * successful request and a response array. The response body will contain the data and there will be - * no possibility to retrieve the results later. - * - * ### Download Async Results - * When a request issues a `202 Accepted` response, the request is being processed using our async - * pipeline. You will be given a URL to check the progress of your async request in the location - * header of the response. This status URI looks like the following: - * ``` - * GET - * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} - * ``` - * - * The URL provided by the location header will return the following responses when a `GET` request is - * issued. - * - * > HTTP `202 Accepted` - Matrix request was accepted but is still being processed. Please try again - * in some time. - * - * > HTTP `200 OK` - Matrix request successfully processed. The response body contains all of the - * results. - * @param format Desired format of the response. Only `json` format is supported. - * @param postRouteMatrixRequestBody The matrix of origin and destination coordinates to compute the - * route distance, travel time and other summary for each cell of the matrix based on the input - * parameters. The minimum and the maximum cell count supported are 1 and **700** for async and **100** - * for sync respectively. For example, it can be 35 origins and 20 destinations or 25 origins and 25 - * destinations for async API. - * @param options The options parameters. - */ - beginPostRouteMatrixAndWait( - format: ResponseFormat, - postRouteMatrixRequestBody: PostRouteMatrixRequestBody, - options?: RoutePostRouteMatrixOptionalParams - ): Promise; - /** - * - * **Applies to**: S1 pricing tier. - * - * The Matrix Routing service allows calculation of a matrix of route summaries for a set of routes - * defined by origin and destination locations by using an asynchronous (async) or synchronous (sync) - * POST request. For every given origin, the service calculates the cost of routing from that origin to - * every given destination. The set of origins and the set of destinations can be thought of as the - * column and row headers of a table and each cell in the table contains the costs of routing from the - * origin to the destination for that cell. As an example, let's say a food delivery company has 20 - * drivers and they need to find the closest driver to pick up the delivery from the restaurant. To - * solve this use case, they can call Matrix Route API. - * - * - * For each route, the travel times and distances are returned. You can use the computed costs to - * determine which detailed routes to calculate using the Route Directions API. - * - * - * The maximum size of a matrix for async request is **700** and for sync request it's **100** (the - * number of origins multiplied by the number of destinations). - * - * - * - * ### Submit Synchronous Route Matrix Request - * If your scenario requires synchronous requests and the maximum size of the matrix is less than or - * equal to 100, you might want to make synchronous request. The maximum size of a matrix for this API - * is **100** (the number of origins multiplied by the number of destinations). With that constraint in - * mind, examples of possible matrix dimensions are: 10x10, 6x8, 9x8 (it does not need to be square). - * - * ``` - * POST - * https://atlas.microsoft.com/route/matrix/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * - * ### Submit Asynchronous Route Matrix Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex routing - * requests. When you make a request by using async request, by default the service returns a 202 - * response code along a redirect URL in the Location field of the response header. This URL should be - * checked periodically until the response data or error information is available. If `waitForResults` - * parameter in the request is set to true, user will get a 200 response if the request is finished - * under 120 seconds. - * - * - * The maximum size of a matrix for this API is **700** (the number of origins multiplied by the number - * of destinations). With that constraint in mind, examples of possible matrix dimensions are: 50x10, - * 10x10, 28x25. 10x70 (it does not need to be square). - * - * - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * - * - * - * ``` - * POST - * https://atlas.microsoft.com/route/matrix/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * - * Here's a typical sequence of asynchronous operations: - * 1. Client sends a Route Matrix POST request to Azure Maps - * - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Route Matrix request has been accepted. - * - * > HTTP `Error` - There was an error processing your Route Matrix request. This could either be a - * 400 Bad Request or any other Error status code. - * - * - * 3. If the Matrix Route request was accepted successfully, the Location header in the response - * contains the URL to download the results of the request. This status URI looks like the following: - * - * ``` - * GET - * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} - * ``` - * - * - * 4. Client issues a GET request on the download URL obtained in Step 3 to download the results - * - * ### Download Sync Results - * When you make a POST request for Route Matrix Sync API, the service returns 200 response code for - * successful request and a response array. The response body will contain the data and there will be - * no possibility to retrieve the results later. - * - * ### Download Async Results - * When a request issues a `202 Accepted` response, the request is being processed using our async - * pipeline. You will be given a URL to check the progress of your async request in the location - * header of the response. This status URI looks like the following: - * ``` - * GET - * https://atlas.microsoft.com/route/matrix/{matrixId}?api-version=1.0?subscription-key={subscription-key} - * ``` - * - * The URL provided by the location header will return the following responses when a `GET` request is - * issued. - * - * > HTTP `202 Accepted` - Matrix request was accepted but is still being processed. Please try again - * in some time. - * - * > HTTP `200 OK` - Matrix request successfully processed. The response body contains all of the - * results. - * @param format Desired format of the response. Only `json` format is supported. - * @param postRouteMatrixRequestBody The matrix of origin and destination coordinates to compute the - * route distance, travel time and other summary for each cell of the matrix based on the input - * parameters. The minimum and the maximum cell count supported are 1 and **700** for async and **100** - * for sync respectively. For example, it can be 35 origins and 20 destinations or 25 origins and 25 - * destinations for async API. - * @param options The options parameters. - */ - postRouteMatrixSync( - format: ResponseFormat, - postRouteMatrixRequestBody: PostRouteMatrixRequestBody, - options?: RoutePostRouteMatrixSyncOptionalParams - ): Promise; - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Returns a route between an origin and a destination, passing through waypoints if they are - * specified. The route will take into account factors such as current traffic and the typical road - * speeds on the requested day of the week and time of day. - * - * Information returned includes the distance, estimated travel time, and a representation of the route - * geometry. Additional routing information such as optimized waypoint order or turn by turn - * instructions is also available, depending on the options selected. - * - * Routing service provides a set of parameters for a detailed description of vehicle-specific - * Consumption Model. Please check [Consumption - * Model](https://docs.microsoft.com/azure/azure-maps/consumption-model) for detailed explanation of - * the concepts and parameters involved. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The Coordinates through which the route is calculated, delimited by a colon. A minimum - * of two coordinates is required. The first one is the origin and the last is the destination of the - * route. Optional coordinates in-between act as WayPoints in the route. You can pass up to 150 - * WayPoints. - * @param options The options parameters. - */ - getRouteDirections( - format: TextFormat, - query: string, - options?: RouteGetRouteDirectionsOptionalParams - ): Promise; - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Returns a route between an origin and a destination, passing through waypoints if they are - * specified. The route will take into account factors such as current traffic and the typical road - * speeds on the requested day of the week and time of day. - * - * Information returned includes the distance, estimated travel time, and a representation of the route - * geometry. Additional routing information such as optimized waypoint order or turn by turn - * instructions is also available, depending on the options selected. - * - * Routing service provides a set of parameters for a detailed description of a vehicle-specific - * Consumption Model. Please check [Consumption - * Model](https://docs.microsoft.com/azure/azure-maps/consumption-model) for detailed explanation of - * the concepts and parameters involved. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The Coordinates through which the route is calculated. Needs two coordinates at least. - * Delimited by colon. First one is the origin and the last is the destination of the route. The - * coordinates are in a lat,long format. Optional coordinates in between act as WayPoints in the - * route. - * @param postRouteDirectionsRequestBody Used for reconstructing a route and for calculating zero or - * more alternative routes to this reference route. The provided sequence of coordinates is used as - * input for route reconstruction. The alternative routes are calculated between the origin and - * destination points specified in the base path parameter locations. If both minDeviationDistance and - * minDeviationTime are set to zero, then these origin and destination points are expected to be at - * (or very near) the beginning and end of the reference route, respectively. Intermediate locations - * (waypoints) are not supported when using supportingPoints. - * - * Setting at least one of minDeviationDistance or minDeviationTime to a value greater than zero has - * the following consequences: - * - * * The origin point of the calculateRoute request must be on (or very near) the input reference - * route. If this is not the case, an error is returned. However, the origin point does not need to be - * at the beginning of the input reference route (it can be thought of as the current vehicle position - * on the reference route). - * * The reference route, returned as the first route in the calculateRoute response, will start at - * the origin point specified in the calculateRoute request. The initial part of the input reference - * route up until the origin point will be excluded from the response. - * * The values of minDeviationDistance and minDeviationTime determine how far alternative routes will - * be guaranteed to follow the reference route from the origin point onwards. - * * The route must use departAt. - * * The vehicleHeading is ignored. - * @param options The options parameters. - */ - postRouteDirections( - format: TextFormat, - query: string, - postRouteDirectionsRequestBody: PostRouteDirectionsRequestBody, - options?: RoutePostRouteDirectionsOptionalParams - ): Promise; - /** - * __Route Range (Isochrone) API__ - * - * - * **Applies to**: S1 pricing tier. - * - * This service will calculate a set of locations that can be reached from the origin point based on - * fuel, energy, time or distance budget that is specified. A polygon boundary (or Isochrone) is - * returned in a counterclockwise orientation as well as the precise polygon center which was the - * result of the origin point. - * - * The returned polygon can be used for further processing such as [Search Inside - * Geometry](https://docs.microsoft.com/rest/api/maps/search/postsearchinsidegeometry) to search for - * POIs within the provided Isochrone. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The Coordinate from which the range calculation should start. - * @param options The options parameters. - */ - getRouteRange( - format: TextFormat, - query: string, - options?: RouteGetRouteRangeOptionalParams - ): Promise; - /** - * **Route Directions Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Route Directions Batch API sends batches of queries to [Route Directions - * API](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections) using just a single - * API call. You can call Route Directions Batch API to run either asynchronously (async) or - * synchronously (sync). The async API allows caller to batch up to **700** queries and sync API up to - * **100** queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/route/directions/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex route requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **700** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Route Directions Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` GET https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0 ``` - * Note:- Please remember to add AUTH information (subscription-key/azure_auth - See - * [Security](#security)) to the _status URI_ before running it.
- * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _route directions_ queries you will use a `POST` request where the request body will - * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 3 _route directions_ queries: - * - * - * ```json - * { - * "batchItems": [ - * { "query": - * "?query=47.620659,-122.348934:47.610101,-122.342015&travelMode=bicycle&routeType=eco&traffic=false" - * }, - * { "query": - * "?query=40.759856,-73.985108:40.771136,-73.973506&travelMode=pedestrian&routeType=shortest" }, - * { "query": "?query=48.923159,-122.557362:32.621279,-116.840362" } - * ] - * } - * ``` - * - * A _route directions_ query in a batch is just a partial URL _without_ the protocol, base URL, path, - * api-version and subscription-key. It can accept any of the supported _route directions_ [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#uri-parameters). - * The string values in the _route directions_ query must be properly escaped (e.g. " character should - * be escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **700** queries and sync API up to **100** queries, and - * the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`RouteDirectionsResponse`](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#routedirectionsresponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 1 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 1, - * "totalRequests": 2 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": { - * "routes": [ - * { - * "summary": { - * "lengthInMeters": 1758, - * "travelTimeInSeconds": 387, - * "trafficDelayInSeconds": 0, - * "departureTime": "2018-07-17T00:49:56+00:00", - * "arrivalTime": "2018-07-17T00:56:22+00:00" - * }, - * "legs": [ - * { - * "summary": { - * "lengthInMeters": 1758, - * "travelTimeInSeconds": 387, - * "trafficDelayInSeconds": 0, - * "departureTime": "2018-07-17T00:49:56+00:00", - * "arrivalTime": "2018-07-17T00:56:22+00:00" - * }, - * "points": [ - * { - * "latitude": 47.62094, - * "longitude": -122.34892 - * }, - * { - * "latitude": 47.62094, - * "longitude": -122.3485 - * }, - * { - * "latitude": 47.62095, - * "longitude": -122.3476 - * } - * ] - * } - * ], - * "sections": [ - * { - * "startPointIndex": 0, - * "endPointIndex": 40, - * "sectionType": "TRAVEL_MODE", - * "travelMode": "bicycle" - * } - * ] - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param postRouteDirectionsBatchRequestBody The list of route directions queries/requests to process. - * The list can contain a max of 700 queries for async and 100 queries for sync version and must - * contain at least 1 query. - * @param options The options parameters. - */ - beginPostRouteDirectionsBatch( - format: ResponseFormat, - postRouteDirectionsBatchRequestBody: BatchRequestBody, - options?: RoutePostRouteDirectionsBatchOptionalParams - ): Promise< - PollerLike< - PollOperationState, - RoutePostRouteDirectionsBatchResponse - > - >; - /** - * **Route Directions Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Route Directions Batch API sends batches of queries to [Route Directions - * API](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections) using just a single - * API call. You can call Route Directions Batch API to run either asynchronously (async) or - * synchronously (sync). The async API allows caller to batch up to **700** queries and sync API up to - * **100** queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/route/directions/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex route requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **700** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Route Directions Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` GET https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0 ``` - * Note:- Please remember to add AUTH information (subscription-key/azure_auth - See - * [Security](#security)) to the _status URI_ before running it.
- * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _route directions_ queries you will use a `POST` request where the request body will - * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 3 _route directions_ queries: - * - * - * ```json - * { - * "batchItems": [ - * { "query": - * "?query=47.620659,-122.348934:47.610101,-122.342015&travelMode=bicycle&routeType=eco&traffic=false" - * }, - * { "query": - * "?query=40.759856,-73.985108:40.771136,-73.973506&travelMode=pedestrian&routeType=shortest" }, - * { "query": "?query=48.923159,-122.557362:32.621279,-116.840362" } - * ] - * } - * ``` - * - * A _route directions_ query in a batch is just a partial URL _without_ the protocol, base URL, path, - * api-version and subscription-key. It can accept any of the supported _route directions_ [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#uri-parameters). - * The string values in the _route directions_ query must be properly escaped (e.g. " character should - * be escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **700** queries and sync API up to **100** queries, and - * the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`RouteDirectionsResponse`](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#routedirectionsresponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 1 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 1, - * "totalRequests": 2 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": { - * "routes": [ - * { - * "summary": { - * "lengthInMeters": 1758, - * "travelTimeInSeconds": 387, - * "trafficDelayInSeconds": 0, - * "departureTime": "2018-07-17T00:49:56+00:00", - * "arrivalTime": "2018-07-17T00:56:22+00:00" - * }, - * "legs": [ - * { - * "summary": { - * "lengthInMeters": 1758, - * "travelTimeInSeconds": 387, - * "trafficDelayInSeconds": 0, - * "departureTime": "2018-07-17T00:49:56+00:00", - * "arrivalTime": "2018-07-17T00:56:22+00:00" - * }, - * "points": [ - * { - * "latitude": 47.62094, - * "longitude": -122.34892 - * }, - * { - * "latitude": 47.62094, - * "longitude": -122.3485 - * }, - * { - * "latitude": 47.62095, - * "longitude": -122.3476 - * } - * ] - * } - * ], - * "sections": [ - * { - * "startPointIndex": 0, - * "endPointIndex": 40, - * "sectionType": "TRAVEL_MODE", - * "travelMode": "bicycle" - * } - * ] - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param postRouteDirectionsBatchRequestBody The list of route directions queries/requests to process. - * The list can contain a max of 700 queries for async and 100 queries for sync version and must - * contain at least 1 query. - * @param options The options parameters. - */ - beginPostRouteDirectionsBatchAndWait( - format: ResponseFormat, - postRouteDirectionsBatchRequestBody: BatchRequestBody, - options?: RoutePostRouteDirectionsBatchOptionalParams - ): Promise; - /** - * **Route Directions Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Route Directions Batch API sends batches of queries to [Route Directions - * API](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections) using just a single - * API call. You can call Route Directions Batch API to run either asynchronously (async) or - * synchronously (sync). The async API allows caller to batch up to **700** queries and sync API up to - * **100** queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/route/directions/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex route requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **700** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Route Directions Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` GET https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0 ``` - * Note:- Please remember to add AUTH information (subscription-key/azure_auth - See - * [Security](#security)) to the _status URI_ before running it.
- * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _route directions_ queries you will use a `POST` request where the request body will - * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 3 _route directions_ queries: - * - * - * ```json - * { - * "batchItems": [ - * { "query": - * "?query=47.620659,-122.348934:47.610101,-122.342015&travelMode=bicycle&routeType=eco&traffic=false" - * }, - * { "query": - * "?query=40.759856,-73.985108:40.771136,-73.973506&travelMode=pedestrian&routeType=shortest" }, - * { "query": "?query=48.923159,-122.557362:32.621279,-116.840362" } - * ] - * } - * ``` - * - * A _route directions_ query in a batch is just a partial URL _without_ the protocol, base URL, path, - * api-version and subscription-key. It can accept any of the supported _route directions_ [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#uri-parameters). - * The string values in the _route directions_ query must be properly escaped (e.g. " character should - * be escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **700** queries and sync API up to **100** queries, and - * the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`RouteDirectionsResponse`](https://docs.microsoft.com/en-us/rest/api/maps/route/getroutedirections#routedirectionsresponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 1 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 1, - * "totalRequests": 2 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": { - * "routes": [ - * { - * "summary": { - * "lengthInMeters": 1758, - * "travelTimeInSeconds": 387, - * "trafficDelayInSeconds": 0, - * "departureTime": "2018-07-17T00:49:56+00:00", - * "arrivalTime": "2018-07-17T00:56:22+00:00" - * }, - * "legs": [ - * { - * "summary": { - * "lengthInMeters": 1758, - * "travelTimeInSeconds": 387, - * "trafficDelayInSeconds": 0, - * "departureTime": "2018-07-17T00:49:56+00:00", - * "arrivalTime": "2018-07-17T00:56:22+00:00" - * }, - * "points": [ - * { - * "latitude": 47.62094, - * "longitude": -122.34892 - * }, - * { - * "latitude": 47.62094, - * "longitude": -122.3485 - * }, - * { - * "latitude": 47.62095, - * "longitude": -122.3476 - * } - * ] - * } - * ], - * "sections": [ - * { - * "startPointIndex": 0, - * "endPointIndex": 40, - * "sectionType": "TRAVEL_MODE", - * "travelMode": "bicycle" - * } - * ] - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param postRouteDirectionsBatchRequestBody The list of route directions queries/requests to process. - * The list can contain a max of 700 queries for async and 100 queries for sync version and must - * contain at least 1 query. - * @param options The options parameters. - */ - postRouteDirectionsBatchSync( - format: ResponseFormat, - postRouteDirectionsBatchRequestBody: BatchRequestBody, - options?: RoutePostRouteDirectionsBatchSyncOptionalParams - ): Promise; -} diff --git a/sdk/maps/maps-route/src/routeClient.ts b/sdk/maps/maps-route/src/routeClient.ts deleted file mode 100644 index 0df8eb7bd22e..000000000000 --- a/sdk/maps/maps-route/src/routeClient.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreAuth from "@azure/core-auth"; -import { RouteImpl } from "./operations"; -import { Route } from "./operationsInterfaces"; -import { RouteClientContext } from "./routeClientContext"; -import { RouteClientOptionalParams } from "./models"; - -export class RouteClient extends RouteClientContext { - /** - * Initializes a new instance of the RouteClient class. - * @param credentials Subscription credentials which uniquely identify client subscription. - * @param options The parameter options - */ - constructor( - credentials: coreAuth.TokenCredential, - options?: RouteClientOptionalParams - ) { - super(credentials, options); - this.route = new RouteImpl(this); - } - - route: Route; -} diff --git a/sdk/maps/maps-route/src/routeClientContext.ts b/sdk/maps/maps-route/src/routeClientContext.ts deleted file mode 100644 index 399437f978eb..000000000000 --- a/sdk/maps/maps-route/src/routeClientContext.ts +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; -import * as coreAuth from "@azure/core-auth"; -import { Geography, RouteClientOptionalParams } from "./models"; - -export class RouteClientContext extends coreClient.ServiceClient { - geography: Geography; - xMsClientId?: string; - apiVersion: string; - - /** - * Initializes a new instance of the RouteClientContext class. - * @param credentials Subscription credentials which uniquely identify client subscription. - * @param options The parameter options - */ - constructor( - credentials: coreAuth.TokenCredential, - options?: RouteClientOptionalParams - ) { - if (credentials === undefined) { - throw new Error("'credentials' cannot be null"); - } - - // Initializing default values for options - if (!options) { - options = {}; - } - const defaults: RouteClientOptionalParams = { - requestContentType: "application/json; charset=utf-8", - credential: credentials - }; - - const packageDetails = `azsdk-js-maps-route/1.0.0-beta.1`; - const userAgentPrefix = - options.userAgentOptions && options.userAgentOptions.userAgentPrefix - ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` - : `${packageDetails}`; - - if (!options.credentialScopes) { - options.credentialScopes = ["https://atlas.microsoft.com/.default"]; - } - const optionsWithDefaults = { - ...defaults, - ...options, - userAgentOptions: { - userAgentPrefix - }, - baseUri: options.endpoint || "https://{geography}.atlas.microsoft.com" - }; - super(optionsWithDefaults); - - // Assigning values to Constant parameters - this.geography = options.geography || "us"; - this.apiVersion = options.apiVersion || "1.0"; - } -} diff --git a/sdk/maps/maps-route/tsconfig.json b/sdk/maps/maps-route/tsconfig.json deleted file mode 100644 index 0ec8659c8e83..000000000000 --- a/sdk/maps/maps-route/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "module": "es6", - "moduleResolution": "node", - "strict": true, - "target": "es6", - "sourceMap": true, - "declarationMap": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "preserveConstEnums": true, - "lib": ["es6", "dom"], - "declaration": true, - "outDir": "./esm", - "importHelpers": true - }, - "include": ["./src/**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/sdk/maps/maps-search/LICENSE.txt b/sdk/maps/maps-search/LICENSE.txt deleted file mode 100644 index ccb63b166732..000000000000 --- a/sdk/maps/maps-search/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2021 Microsoft - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/sdk/maps/maps-search/README.md b/sdk/maps/maps-search/README.md deleted file mode 100644 index 00ee1e5fc6ea..000000000000 --- a/sdk/maps/maps-search/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# Azure Search client library for JavaScript - -This package contains an isomorphic SDK (runs both in Node.js and in browsers) for Azure Search client. - -Azure Maps Search REST APIs - -[Source code](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-search) | -[Package (NPM)](https://www.npmjs.com/package/@azure/maps-search) | -[API reference documentation](https://docs.microsoft.com/javascript/api/@azure/maps-search) | -[Samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-search/samples) - -## Getting started - -### Currently supported environments - -- [LTS versions of Node.js](https://nodejs.org/about/releases/) -- Latest versions of Safari, Chrome, Edge and Firefox. - -### Prerequisites - -- An [Azure subscription][azure_sub]. - -### Install the `@azure/maps-search` package - -Install the Azure Search client library for JavaScript with `npm`: - -```bash -npm install @azure/maps-search -``` - -### Create and authenticate a `SearchClient` - -To create a client object to access the Azure Search API, you will need the `endpoint` of your Azure Search resource and a `credential`. The Azure Search client can use Azure Active Directory credentials to authenticate. -You can find the endpoint for your Azure Search resource in the [Azure Portal][azure_portal]. - -#### Using an Azure Active Directory Credential - -You can authenticate with Azure Active Directory using the [Azure Identity library][azure_identity]. To use the [DefaultAzureCredential][defaultazurecredential] provider shown below, or other credential providers provided with the Azure SDK, please install the `@azure/identity` package: - -```bash -npm install @azure/identity -``` - -You will also need to register a new AAD application and grant access to Azure Search by assigning the suitable role to your service principal (note: roles such as `"Owner"` will not grant the necessary permissions). -Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`. - -```javascript -const { SearchClient } = require("@azure/maps-search"); -const { DefaultAzureCredential } = require("@azure/identity"); -const client = new SearchClient("", new DefaultAzureCredential()); -``` - -## Key concepts - -### SearchClient - -`SearchClient` is the primary interface for developers using the Azure Search client library. Explore the methods on this client object to understand the different features of the Azure Search service that you can access. - -## Troubleshooting - -### Logging - -Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: - -```javascript -import { setLogLevel } from "@azure/logger"; -setLogLevel("info"); -``` - -For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger). - -## Next steps - -Please take a look at the [samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-search/samples) directory for detailed examples on how to use this library. - -## Contributing - -If you'd like to contribute to this library, please read the [contributing guide](https://github.com/Azure/azure-sdk-for-js/blob/master/CONTRIBUTING.md) to learn more about how to build and test the code. - -## Related projects - -- [Microsoft Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) - -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fmaps%2Fmaps-search%2FREADME.png) - -[azure_cli]: https://docs.microsoft.com/cli/azure -[azure_sub]: https://azure.microsoft.com/free/ -[azure_sub]: https://azure.microsoft.com/free/ -[azure_portal]: https://portal.azure.com -[azure_identity]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity -[defaultazurecredential]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity#defaultazurecredential diff --git a/sdk/maps/maps-search/api-extractor.json b/sdk/maps/maps-search/api-extractor.json deleted file mode 100644 index 5fb5b21b56f2..000000000000 --- a/sdk/maps/maps-search/api-extractor.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", - "mainEntryPointFilePath": "./esm/index.d.ts", - "docModel": { "enabled": true }, - "apiReport": { "enabled": true, "reportFolder": "./review" }, - "dtsRollup": { - "enabled": true, - "untrimmedFilePath": "", - "publicTrimmedFilePath": "./esm/index.d.ts" - }, - "messages": { - "tsdocMessageReporting": { "default": { "logLevel": "none" } }, - "extractorMessageReporting": { - "ae-missing-release-tag": { "logLevel": "none" }, - "ae-unresolved-link": { "logLevel": "none" } - } - } -} diff --git a/sdk/maps/maps-search/package.json b/sdk/maps/maps-search/package.json deleted file mode 100644 index c5bdc9fb4a47..000000000000 --- a/sdk/maps/maps-search/package.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "name": "@azure/maps-search", - "sdk-type": "client", - "author": "Microsoft Corporation", - "description": "A generated SDK for SearchClient.", - "version": "1.0.0-beta.1", - "engines": { "node": ">=12.0.0" }, - "dependencies": { - "@azure/core-lro": "^1.0.6", - "@azure/abort-controller": "^1.0.0", - "@azure/core-client": "^1.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-rest-pipeline": "^1.1.0", - "tslib": "^2.2.0" - }, - "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], - "license": "MIT", - "main": "./dist/index.js", - "module": "./esm/index.js", - "types": "./esm/index.d.ts", - "devDependencies": { - "@microsoft/api-extractor": "7.7.11", - "@rollup/plugin-commonjs": "11.0.2", - "@rollup/plugin-json": "^4.0.0", - "@rollup/plugin-multi-entry": "^3.0.0", - "@rollup/plugin-node-resolve": "^8.0.0", - "mkdirp": "^1.0.4", - "rollup": "^1.16.3", - "rollup-plugin-sourcemaps": "^0.4.2", - "rollup-plugin-node-resolve": "^3.4.0", - "typescript": "~4.2.0", - "uglify-js": "^3.4.9" - }, - "homepage": "https://github.com/Azure/azure-sdk-for-js", - "repository": { - "type": "git", - "url": "https://github.com/Azure/azure-sdk-for-js.git" - }, - "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, - "files": [ - "dist/**/*.js", - "dist/**/*.js.map", - "dist/**/*.d.ts", - "dist/**/*.d.ts.map", - "esm/**/*.js", - "esm/**/*.js.map", - "esm/**/*.d.ts", - "esm/**/*.d.ts.map", - "src/**/*.ts", - "README.md", - "rollup.config.js", - "tsconfig.json", - "review/*", - "CHANGELOG.md" - ], - "scripts": { - "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", - "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js", - "prepack": "npm install && npm run build", - "pack": "npm pack 2>&1", - "extract-api": "mkdirp ./review && api-extractor run --local", - "lint": "echo skipped", - "audit": "echo skipped", - "clean": "echo skipped", - "build:node": "echo skipped", - "build:browser": "echo skipped", - "build:test": "echo skipped", - "build:samples": "echo skipped.", - "check-format": "echo skipped", - "execute:samples": "echo skipped", - "format": "echo skipped", - "test": "echo skipped", - "prebuild": "echo skipped", - "test:node": "echo skipped", - "test:browser": "echo skipped", - "unit-test": "echo skipped", - "unit-test:node": "echo skipped", - "unit-test:browser": "echo skipped", - "integration-test:browser": "echo skipped", - "integration-test:node": "echo skipped", - "integration-test": "echo skipped", - "docs": "echo skipped" - }, - "sideEffects": false, - "autoPublish": true -} diff --git a/sdk/maps/maps-search/review/maps-search.api.md b/sdk/maps/maps-search/review/maps-search.api.md deleted file mode 100644 index 9a413fb69e21..000000000000 --- a/sdk/maps/maps-search/review/maps-search.api.md +++ /dev/null @@ -1,850 +0,0 @@ -## API Report File for "@azure/maps-search" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -import * as coreAuth from '@azure/core-auth'; -import * as coreClient from '@azure/core-client'; -import { PollerLike } from '@azure/core-lro'; -import { PollOperationState } from '@azure/core-lro'; - -// @public -export interface BatchItem { - readonly statusCode?: number; -} - -// @public -export interface BatchRequestBody { - batchItems?: BatchRequestBodyBatchItemsItem[]; -} - -// @public -export interface BatchRequestBodyBatchItemsItem { - query?: string; -} - -// @public -export interface BatchResponse { - readonly summary?: BatchResponseSummary; -} - -// @public -export interface BatchResponseSummary { - readonly successfulRequests?: number; - readonly totalRequests?: number; -} - -// @public -export type ConnectorSet = string; - -// @public -export interface CoordinatesPairAbbreviated { - lat?: number; - lon?: number; -} - -// @public -export interface DataSources { - geometry?: DataSourcesGeometry; -} - -// @public -export interface DataSourcesGeometry { - readonly id?: string; -} - -// @public -export type EntityType = string; - -// @public -export type EntryPointType = string; - -// @public -export interface ErrorAdditionalInfo { - readonly info?: Record; - readonly type?: string; -} - -// @public -export interface ErrorDetail { - readonly additionalInfo?: ErrorAdditionalInfo[]; - readonly code?: string; - readonly details?: ErrorDetail[]; - readonly message?: string; - readonly target?: string; -} - -// @public -export interface ErrorResponse { - error?: ErrorDetail; -} - -// @public -export type GeographicResourceLocation = string; - -// @public -export type Geography = string; - -// @public -export type GeoJsonFeature = GeoJsonObject & GeoJsonFeatureData & { - type: "Feature"; -}; - -// @public -export type GeoJsonFeatureCollection = GeoJsonObject & GeoJsonFeatureCollectionData & { - type: "FeatureCollection"; -}; - -// @public (undocumented) -export interface GeoJsonFeatureCollectionData { - features: GeoJsonFeature[]; -} - -// @public (undocumented) -export interface GeoJsonFeatureData { - featureType?: string; - geometry: GeoJsonGeometryUnion; - id?: string; - properties?: Record; -} - -// @public -export type GeoJsonGeometry = GeoJsonObject & { - type: "GeoJsonGeometry" | "LineString" | "Point" | "MultiPoint" | "MultiLineString" | "Polygon" | "MultiPolygon" | "GeometryCollection"; -}; - -// @public -export type GeoJsonGeometryCollection = GeoJsonGeometry & GeoJsonGeometryCollectionData & {}; - -// @public (undocumented) -export interface GeoJsonGeometryCollectionData { - geometries: GeoJsonGeometryUnion[]; -} - -// @public (undocumented) -export type GeoJsonGeometryUnion = GeoJsonGeometry | GeoJsonLineString | GeoJsonPoint | GeoJsonMultiPoint | GeoJsonMultiLineString | GeoJsonPolygon | GeoJsonMultiPolygon | GeoJsonGeometryCollection; - -// @public -export type GeoJsonLineString = GeoJsonGeometry & GeoJsonLineStringData & {}; - -// @public (undocumented) -export interface GeoJsonLineStringData { - coordinates: number[][]; -} - -// @public -export type GeoJsonMultiLineString = GeoJsonGeometry & GeoJsonMultiLineStringData & {}; - -// @public (undocumented) -export interface GeoJsonMultiLineStringData { - coordinates: number[][][]; -} - -// @public -export type GeoJsonMultiPoint = GeoJsonGeometry & GeoJsonMultiPointData & {}; - -// @public -export interface GeoJsonMultiPointData { - coordinates: number[][]; -} - -// @public -export type GeoJsonMultiPolygon = GeoJsonGeometry & GeoJsonMultiPolygonData & {}; - -// @public (undocumented) -export interface GeoJsonMultiPolygonData { - coordinates: number[][][][]; -} - -// @public -export interface GeoJsonObject { - type: "GeoJsonGeometry" | "LineString" | "Point" | "MultiPoint" | "MultiLineString" | "Polygon" | "MultiPolygon" | "GeometryCollection" | "Feature" | "FeatureCollection"; -} - -// @public -export type GeoJsonObjectType = string; - -// @public (undocumented) -export type GeoJsonObjectUnion = GeoJsonObject | GeoJsonGeometryUnion | GeoJsonFeature | GeoJsonFeatureCollection; - -// @public -export type GeoJsonPoint = GeoJsonGeometry & GeoJsonPointData & {}; - -// @public -export interface GeoJsonPointData { - coordinates: number[]; -} - -// @public -export type GeoJsonPolygon = GeoJsonGeometry & GeoJsonPolygonData & {}; - -// @public (undocumented) -export interface GeoJsonPolygonData { - coordinates: number[][][]; -} - -// @public -export const enum KnownConnectorSet { - Chademo = "Chademo", - IEC60309AC1PhaseBlue = "IEC60309AC1PhaseBlue", - IEC60309DCWhite = "IEC60309DCWhite", - IEC62196Type1 = "IEC62196Type1", - IEC62196Type1CCS = "IEC62196Type1CCS", - IEC62196Type2CableAttached = "IEC62196Type2CableAttached", - IEC62196Type2CCS = "IEC62196Type2CCS", - IEC62196Type2Outlet = "IEC62196Type2Outlet", - IEC62196Type3 = "IEC62196Type3", - StandardHouseholdCountrySpecific = "StandardHouseholdCountrySpecific", - Tesla = "Tesla" -} - -// @public -export const enum KnownEntityType { - Country = "Country", - CountrySecondarySubdivision = "CountrySecondarySubdivision", - CountrySubdivision = "CountrySubdivision", - CountryTertiarySubdivision = "CountryTertiarySubdivision", - Municipality = "Municipality", - MunicipalitySubdivision = "MunicipalitySubdivision", - Neighbourhood = "Neighbourhood", - PostalCodeArea = "PostalCodeArea" -} - -// @public -export const enum KnownEntryPointType { - // (undocumented) - Main = "main", - // (undocumented) - Minor = "minor" -} - -// @public -export const enum KnownGeographicResourceLocation { - Eu = "eu", - Us = "us" -} - -// @public -export const enum KnownGeography { - // (undocumented) - Eu = "eu", - // (undocumented) - Us = "us" -} - -// @public -export const enum KnownGeoJsonObjectType { - GeoJsonFeature = "Feature", - GeoJsonFeatureCollection = "FeatureCollection", - GeoJsonGeometryCollection = "GeometryCollection", - GeoJsonLineString = "LineString", - GeoJsonMultiLineString = "MultiLineString", - GeoJsonMultiPoint = "MultiPoint", - GeoJsonMultiPolygon = "MultiPolygon", - GeoJsonPoint = "Point", - GeoJsonPolygon = "Polygon" -} - -// @public -export const enum KnownOpeningHours { - NextSevenDays = "nextSevenDays" -} - -// @public -export const enum KnownResponseFormat { - Json = "json" -} - -// @public -export const enum KnownSearchIndexSet { - Addr = "Addr", - Geo = "Geo", - PAD = "PAD", - POI = "POI", - Str = "Str", - Xstr = "Xstr" -} - -// @public -export const enum KnownTextFormat { - Json = "json", - Xml = "xml" -} - -// @public -export type OpeningHours = string; - -// @public -export interface PoiCategoryResult { - readonly childCategoryIds?: number[]; - readonly id?: number; - readonly name?: string; - readonly synonyms?: string[]; -} - -// @public -export type ResponseFormat = string; - -// @public -export interface Search { - beginPostSearchAddressBatch(format: ResponseFormat, searchAddressBatchRequestBody: BatchRequestBody, options?: SearchPostSearchAddressBatchOptionalParams): Promise, SearchPostSearchAddressBatchResponse>>; - beginPostSearchAddressBatchAndWait(format: ResponseFormat, searchAddressBatchRequestBody: BatchRequestBody, options?: SearchPostSearchAddressBatchOptionalParams): Promise; - beginPostSearchAddressReverseBatch(format: ResponseFormat, searchAddressReverseBatchRequestBody: BatchRequestBody, options?: SearchPostSearchAddressReverseBatchOptionalParams): Promise, SearchPostSearchAddressReverseBatchResponse>>; - beginPostSearchAddressReverseBatchAndWait(format: ResponseFormat, searchAddressReverseBatchRequestBody: BatchRequestBody, options?: SearchPostSearchAddressReverseBatchOptionalParams): Promise; - beginPostSearchFuzzyBatch(format: ResponseFormat, searchFuzzyBatchRequestBody: BatchRequestBody, options?: SearchPostSearchFuzzyBatchOptionalParams): Promise, SearchPostSearchFuzzyBatchResponse>>; - beginPostSearchFuzzyBatchAndWait(format: ResponseFormat, searchFuzzyBatchRequestBody: BatchRequestBody, options?: SearchPostSearchFuzzyBatchOptionalParams): Promise; - getSearchAddress(format: TextFormat, query: string, options?: SearchGetSearchAddressOptionalParams): Promise; - getSearchAddressReverse(format: TextFormat, query: string, options?: SearchGetSearchAddressReverseOptionalParams): Promise; - getSearchAddressReverseCrossStreet(format: TextFormat, query: string, options?: SearchGetSearchAddressReverseCrossStreetOptionalParams): Promise; - getSearchAddressStructured(format: TextFormat, options?: SearchGetSearchAddressStructuredOptionalParams): Promise; - getSearchFuzzy(format: TextFormat, query: string, options?: SearchGetSearchFuzzyOptionalParams): Promise; - getSearchNearby(format: TextFormat, lat: number, lon: number, options?: SearchGetSearchNearbyOptionalParams): Promise; - getSearchPOI(format: TextFormat, query: string, options?: SearchGetSearchPOIOptionalParams): Promise; - getSearchPOICategory(format: TextFormat, query: string, options?: SearchGetSearchPOICategoryOptionalParams): Promise; - getSearchPOICategoryTreePreview(format: ResponseFormat, options?: SearchGetSearchPOICategoryTreePreviewOptionalParams): Promise; - getSearchPolygon(format: ResponseFormat, geometries: string[], options?: SearchGetSearchPolygonOptionalParams): Promise; - postSearchAddressBatchSync(format: ResponseFormat, searchAddressBatchRequestBody: BatchRequestBody, options?: SearchPostSearchAddressBatchSyncOptionalParams): Promise; - postSearchAddressReverseBatchSync(format: ResponseFormat, searchAddressReverseBatchRequestBody: BatchRequestBody, options?: SearchPostSearchAddressReverseBatchSyncOptionalParams): Promise; - postSearchAlongRoute(format: TextFormat, query: string, maxDetourTime: number, searchAlongRouteRequestBody: SearchAlongRouteRequestBody, options?: SearchPostSearchAlongRouteOptionalParams): Promise; - postSearchFuzzyBatchSync(format: ResponseFormat, searchFuzzyBatchRequestBody: BatchRequestBody, options?: SearchPostSearchFuzzyBatchSyncOptionalParams): Promise; - postSearchInsideGeometry(format: TextFormat, query: string, searchInsideGeometryRequestBody: SearchInsideGeometryRequestBody, options?: SearchPostSearchInsideGeometryOptionalParams): Promise; -} - -// @public -export type SearchAddressBatchItem = BatchItem & { - readonly response?: SearchAddressBatchItemResponse; -}; - -// @public -export type SearchAddressBatchItemResponse = SearchCommonResponse & ErrorResponse & {}; - -// @public -export type SearchAddressBatchResponse = BatchResponse & { - readonly batchItems?: SearchAddressBatchItem[]; -}; - -// @public -export type SearchAddressReverseBatchItem = BatchItem & { - readonly response?: SearchAddressReverseBatchItemResponse; -}; - -// @public -export type SearchAddressReverseBatchItemResponse = SearchAddressReverseResponse & ErrorResponse & {}; - -// @public -export type SearchAddressReverseBatchResponse = BatchResponse & { - readonly batchItems?: SearchAddressReverseBatchItem[]; -}; - -// @public -export interface SearchAddressReverseCrossStreetResponse { - readonly addresses?: SearchAddressReverseCrossStreetResult[]; - readonly summary?: SearchCommonSummary; -} - -// @public -export interface SearchAddressReverseCrossStreetResult { - readonly address?: SearchResultAddress; - readonly position?: string; -} - -// @public -export interface SearchAddressReverseResponse { - readonly addresses?: SearchAddressReverseResult[]; - readonly summary?: SearchCommonSummary; -} - -// @public -export interface SearchAddressReverseResult { - readonly address?: SearchResultAddress; - readonly matchType?: string; - readonly position?: string; -} - -// @public -export interface SearchAlongRouteRequestBody { - route?: GeoJsonLineString; -} - -// @public (undocumented) -export class SearchClient extends SearchClientContext { - constructor(credentials: coreAuth.TokenCredential, options?: SearchClientOptionalParams); - // (undocumented) - search: Search; -} - -// @public (undocumented) -export class SearchClientContext extends coreClient.ServiceClient { - constructor(credentials: coreAuth.TokenCredential, options?: SearchClientOptionalParams); - // (undocumented) - apiVersion: string; - // (undocumented) - geography: Geography; - // (undocumented) - xMsClientId?: string; -} - -// @public -export interface SearchClientOptionalParams extends coreClient.ServiceClientOptions { - apiVersion?: string; - endpoint?: string; - geography?: Geography; - xMsClientId?: string; -} - -// @public -export interface SearchCommonResponse { - readonly results?: SearchCommonResult[]; - readonly summary?: SearchCommonSummary; -} - -// @public -export interface SearchCommonResult { - readonly address?: SearchResultAddress; - readonly addressRanges?: SearchResultAddressRanges; - readonly dataSources?: DataSources; - readonly detourTime?: number; - readonly dist?: number; - entityType?: EntityType; - readonly entryPoints?: SearchResultEntryPoint[]; - readonly id?: string; - readonly info?: string; - readonly matchType?: string; - readonly poi?: SearchResultPoi; - position?: CoordinatesPairAbbreviated; - readonly score?: number; - readonly type?: string; - readonly viewport?: SearchResultViewport; -} - -// @public -export interface SearchCommonSummary { - readonly fuzzyLevel?: number; - readonly geoBias?: SearchCommonSummaryGeoBias; - readonly limit?: number; - readonly numResults?: number; - readonly offset?: number; - readonly query?: string; - readonly queryTime?: number; - readonly queryType?: string; - readonly totalResults?: number; -} - -// @public -export type SearchCommonSummaryGeoBias = CoordinatesPairAbbreviated & {}; - -// @public -export type SearchFuzzyBatchItem = BatchItem & { - readonly response?: SearchFuzzyBatchItemResponse; -}; - -// @public -export type SearchFuzzyBatchItemResponse = SearchCommonResponse & ErrorResponse & {}; - -// @public -export type SearchFuzzyBatchResponse = BatchResponse & { - readonly batchItems?: SearchFuzzyBatchItem[]; -}; - -// @public -export interface SearchGetSearchAddressOptionalParams extends coreClient.OperationOptions { - btmRight?: string; - countrySet?: string[]; - extendedPostalCodesFor?: string; - language?: string; - lat?: number; - limit?: number; - lon?: number; - ofs?: number; - radius?: number; - topLeft?: string; - typeahead?: boolean; - view?: string; -} - -// @public -export type SearchGetSearchAddressResponse = SearchCommonResponse; - -// @public -export interface SearchGetSearchAddressReverseCrossStreetOptionalParams extends coreClient.OperationOptions { - heading?: number; - language?: string; - limit?: number; - radius?: number; - view?: string; -} - -// @public -export type SearchGetSearchAddressReverseCrossStreetResponse = SearchAddressReverseCrossStreetResponse; - -// @public -export interface SearchGetSearchAddressReverseOptionalParams extends coreClient.OperationOptions { - allowFreeformNewline?: boolean; - entityType?: EntityType; - heading?: number; - language?: string; - numberParam?: string; - radius?: number; - returnMatchType?: boolean; - returnRoadUse?: boolean; - returnSpeedLimit?: boolean; - roadUse?: string; - view?: string; -} - -// @public -export type SearchGetSearchAddressReverseResponse = SearchAddressReverseResponse; - -// @public -export interface SearchGetSearchAddressStructuredOptionalParams extends coreClient.OperationOptions { - countryCode?: string; - countrySecondarySubdivision?: string; - countrySubdivision?: string; - countryTertiarySubdivision?: string; - crossStreet?: string; - extendedPostalCodesFor?: string; - language?: string; - limit?: number; - municipality?: string; - municipalitySubdivision?: string; - ofs?: number; - postalCode?: string; - streetName?: string; - streetNumber?: string; - view?: string; -} - -// @public -export type SearchGetSearchAddressStructuredResponse = SearchCommonResponse; - -// @public -export interface SearchGetSearchFuzzyOptionalParams extends coreClient.OperationOptions { - brandSet?: string[]; - btmRight?: string; - categorySet?: number[]; - connectorSet?: ConnectorSet[]; - countrySet?: string[]; - extendedPostalCodesFor?: string; - idxSet?: SearchIndexSet[]; - language?: string; - lat?: number; - limit?: number; - lon?: number; - maxFuzzyLevel?: number; - minFuzzyLevel?: number; - ofs?: number; - openingHours?: OpeningHours; - radius?: number; - topLeft?: string; - typeahead?: boolean; - view?: string; -} - -// @public -export type SearchGetSearchFuzzyResponse = SearchCommonResponse; - -// @public -export interface SearchGetSearchNearbyOptionalParams extends coreClient.OperationOptions { - brandSet?: string[]; - categorySet?: number[]; - connectorSet?: ConnectorSet[]; - countrySet?: string[]; - extendedPostalCodesFor?: string; - language?: string; - limit?: number; - ofs?: number; - radius?: number; - view?: string; -} - -// @public -export type SearchGetSearchNearbyResponse = SearchCommonResponse; - -// @public -export interface SearchGetSearchPOICategoryOptionalParams extends coreClient.OperationOptions { - brandSet?: string[]; - btmRight?: string; - categorySet?: number[]; - connectorSet?: ConnectorSet[]; - countrySet?: string[]; - extendedPostalCodesFor?: string; - language?: string; - lat?: number; - limit?: number; - lon?: number; - ofs?: number; - openingHours?: OpeningHours; - radius?: number; - topLeft?: string; - typeahead?: boolean; - view?: string; -} - -// @public -export type SearchGetSearchPOICategoryResponse = SearchCommonResponse; - -// @public -export interface SearchGetSearchPOICategoryTreePreviewOptionalParams extends coreClient.OperationOptions { - language?: string; -} - -// @public -export type SearchGetSearchPOICategoryTreePreviewResponse = SearchPoiCategoryTreeResponse; - -// @public -export interface SearchGetSearchPOIOptionalParams extends coreClient.OperationOptions { - brandSet?: string[]; - btmRight?: string; - categorySet?: number[]; - connectorSet?: ConnectorSet[]; - countrySet?: string[]; - extendedPostalCodesFor?: string; - language?: string; - lat?: number; - limit?: number; - lon?: number; - ofs?: number; - openingHours?: OpeningHours; - radius?: number; - topLeft?: string; - typeahead?: boolean; - view?: string; -} - -// @public -export type SearchGetSearchPOIResponse = SearchCommonResponse; - -// @public -export interface SearchGetSearchPolygonOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type SearchGetSearchPolygonResponse = SearchPolygonResponse; - -// @public -export type SearchIndexSet = string; - -// @public -export interface SearchInsideGeometryRequestBody { - geometry?: Record; -} - -// @public -export interface SearchPoiCategoryTreeResponse { - readonly poiCategories?: PoiCategoryResult[]; -} - -// @public -export interface SearchPolygonResponse { - readonly additionalData?: SearchPolygonResult[]; -} - -// @public (undocumented) -export interface SearchPolygonResult { - readonly error?: string; - geometryData?: GeoJsonObjectUnion; - readonly providerID?: string; -} - -// @public -export interface SearchPostSearchAddressBatchHeaders { - location?: string; -} - -// @public -export interface SearchPostSearchAddressBatchOptionalParams extends coreClient.OperationOptions { - resumeFrom?: string; - updateIntervalInMs?: number; -} - -// @public -export type SearchPostSearchAddressBatchResponse = SearchAddressBatchResponse; - -// @public -export interface SearchPostSearchAddressBatchSyncOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type SearchPostSearchAddressBatchSyncResponse = SearchAddressBatchResponse; - -// @public -export interface SearchPostSearchAddressReverseBatchHeaders { - location?: string; -} - -// @public -export interface SearchPostSearchAddressReverseBatchOptionalParams extends coreClient.OperationOptions { - resumeFrom?: string; - updateIntervalInMs?: number; -} - -// @public -export type SearchPostSearchAddressReverseBatchResponse = SearchAddressReverseBatchResponse; - -// @public -export interface SearchPostSearchAddressReverseBatchSyncOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type SearchPostSearchAddressReverseBatchSyncResponse = SearchAddressReverseBatchResponse; - -// @public -export interface SearchPostSearchAlongRouteOptionalParams extends coreClient.OperationOptions { - brandSet?: string[]; - categorySet?: number[]; - connectorSet?: ConnectorSet[]; - limit?: number; - openingHours?: OpeningHours; - view?: string; -} - -// @public -export type SearchPostSearchAlongRouteResponse = SearchCommonResponse; - -// @public -export interface SearchPostSearchFuzzyBatchHeaders { - location?: string; -} - -// @public -export interface SearchPostSearchFuzzyBatchOptionalParams extends coreClient.OperationOptions { - resumeFrom?: string; - updateIntervalInMs?: number; -} - -// @public -export type SearchPostSearchFuzzyBatchResponse = SearchFuzzyBatchResponse; - -// @public -export interface SearchPostSearchFuzzyBatchSyncOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type SearchPostSearchFuzzyBatchSyncResponse = SearchFuzzyBatchResponse; - -// @public -export interface SearchPostSearchInsideGeometryOptionalParams extends coreClient.OperationOptions { - categorySet?: number[]; - extendedPostalCodesFor?: string; - idxSet?: SearchIndexSet[]; - language?: string; - limit?: number; - openingHours?: OpeningHours; - view?: string; -} - -// @public -export type SearchPostSearchInsideGeometryResponse = SearchCommonResponse; - -// @public -export interface SearchResultAddress { - readonly boundingBox?: Record; - readonly buildingNumber?: string; - readonly country?: string; - readonly countryCode?: string; - readonly countryCodeISO3?: string; - readonly countrySecondarySubdivision?: string; - readonly countrySubdivision?: string; - readonly countrySubdivisionName?: string; - readonly countryTertiarySubdivision?: string; - readonly crossStreet?: string; - readonly extendedPostalCode?: string; - readonly freeformAddress?: string; - readonly localName?: string; - readonly municipality?: string; - readonly municipalitySubdivision?: string; - readonly postalCode?: string; - readonly routeNumbers?: number[]; - readonly street?: string; - readonly streetName?: string; - readonly streetNameAndNumber?: string; - readonly streetNumber?: string; -} - -// @public -export interface SearchResultAddressRanges { - from?: CoordinatesPairAbbreviated; - rangeLeft?: string; - rangeRight?: string; - to?: CoordinatesPairAbbreviated; -} - -// @public -export interface SearchResultEntryPoint { - position?: CoordinatesPairAbbreviated; - readonly type?: EntryPointType; -} - -// @public -export interface SearchResultPoi { - readonly brands?: SearchResultPoiBrand[]; - readonly categories?: string[]; - readonly categorySet?: SearchResultPoiCategorySet[]; - readonly classifications?: SearchResultPoiClassification[]; - readonly name?: string; - openingHours?: SearchResultPoiOpeningHours; - readonly phone?: string; - readonly url?: string; -} - -// @public -export interface SearchResultPoiBrand { - readonly name?: string; -} - -// @public -export interface SearchResultPoiCategorySet { - readonly id?: number; -} - -// @public -export interface SearchResultPoiClassification { - readonly code?: string; - readonly names?: SearchResultPoiClassificationName[]; -} - -// @public -export interface SearchResultPoiClassificationName { - readonly name?: string; - readonly nameLocale?: string; -} - -// @public -export interface SearchResultPoiOpeningHours { - readonly mode?: string; - readonly timeRanges?: SearchResultPoiOpeningHoursTimeRange[]; -} - -// @public -export interface SearchResultPoiOpeningHoursTimeRange { - endTime?: SearchResultPoiOpeningHoursTimeRangeTime; - startTime?: SearchResultPoiOpeningHoursTimeRangeTime; -} - -// @public -export interface SearchResultPoiOpeningHoursTimeRangeTime { - readonly date?: string; - readonly hour?: number; - readonly minute?: number; -} - -// @public -export interface SearchResultViewport { - btmRightPoint?: CoordinatesPairAbbreviated; - topLeftPoint?: CoordinatesPairAbbreviated; -} - -// @public -export interface SearchSummaryGeoBias { - readonly lat?: number; - readonly lon?: number; -} - -// @public -export type TextFormat = string; - - -// (No @packageDocumentation comment for this package) - -``` diff --git a/sdk/maps/maps-search/rollup.config.js b/sdk/maps/maps-search/rollup.config.js deleted file mode 100644 index 9be1955eb7f1..000000000000 --- a/sdk/maps/maps-search/rollup.config.js +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import nodeResolve from "@rollup/plugin-node-resolve"; -import cjs from "@rollup/plugin-commonjs"; -import sourcemaps from "rollup-plugin-sourcemaps"; -import multiEntry from "@rollup/plugin-multi-entry"; -import json from "@rollup/plugin-json"; - -import nodeBuiltins from "builtin-modules"; - -/** - * Gets the proper configuration needed for rollup's commonJS plugin for @opentelemetry/api. - * - * NOTE: this manual configuration is only needed because OpenTelemetry uses an - * __exportStar downleveled helper function to declare its exports which confuses - * rollup's automatic discovery mechanism. - * - * @returns an object reference that can be `...`'d into your cjs() configuration. - */ -export function openTelemetryCommonJs() { - const namedExports = {}; - - for (const key of [ - "@opentelemetry/api", - "@azure/core-tracing/node_modules/@opentelemetry/api" - ]) { - namedExports[key] = [ - "SpanKind", - "TraceFlags", - "getSpan", - "setSpan", - "SpanStatusCode", - "getSpanContext", - "setSpanContext" - ]; - } - - const releasedOpenTelemetryVersions = ["0.10.2", "1.0.0-rc.0"]; - - for (const version of releasedOpenTelemetryVersions) { - namedExports[ - // working around a limitation in the rollup common.js plugin - it's not able to resolve these modules so the named exports listed above will not get applied. We have to drill down to the actual path. - `../../../common/temp/node_modules/.pnpm/@opentelemetry/api@${version}/node_modules/@opentelemetry/api/build/src/index.js` - ] = [ - "SpanKind", - "TraceFlags", - "getSpan", - "setSpan", - "StatusCode", - "CanonicalCode", - "getSpanContext", - "setSpanContext" - ]; - } - - return namedExports; -} - -// #region Warning Handler - -/** - * A function that can determine whether a rollupwarning should be ignored. If - * the function returns `true`, then the warning will not be displayed. - */ - -function ignoreNiseSinonEvalWarnings(warning) { - return ( - warning.code === "EVAL" && - warning.id && - (warning.id.includes("node_modules/nise") || - warning.id.includes("node_modules/sinon")) === true - ); -} - -function ignoreChaiCircularDependencyWarnings(warning) { - return ( - warning.code === "CIRCULAR_DEPENDENCY" && - warning.importer && warning.importer.includes("node_modules/chai") === true - ); -} - -const warningInhibitors = [ - ignoreChaiCircularDependencyWarnings, - ignoreNiseSinonEvalWarnings -]; - -/** - * Construct a warning handler for the shared rollup configuration - * that ignores certain warnings that are not relevant to testing. - */ -function makeOnWarnForTesting() { - return (warning, warn) => { - // If every inhibitor returns false (i.e. no inhibitors), then show the warning - if (warningInhibitors.every((inhib) => !inhib(warning))) { - warn(warning); - } - }; -} - -// #endregion - -function makeBrowserTestConfig() { - const config = { - input: { - include: ["dist-esm/test/**/*.spec.js"], - exclude: ["dist-esm/test/**/node/**"] - }, - output: { - file: `dist-test/index.browser.js`, - format: "umd", - sourcemap: true - }, - preserveSymlinks: false, - plugins: [ - multiEntry({ exports: false }), - nodeResolve({ - mainFields: ["module", "browser"] - }), - cjs({ - namedExports: { - // Chai's strange internal architecture makes it impossible to statically - // analyze its exports. - chai: [ - "version", - "use", - "util", - "config", - "expect", - "should", - "assert" - ], - ...openTelemetryCommonJs() - } - }), - json(), - sourcemaps() - //viz({ filename: "dist-test/browser-stats.html", sourcemap: true }) - ], - onwarn: makeOnWarnForTesting(), - // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, - // rollup started respecting the "sideEffects" field in package.json. Since - // our package.json sets "sideEffects=false", this also applies to test - // code, which causes all tests to be removed by tree-shaking. - treeshake: false - }; - - return config; -} - -const defaultConfigurationOptions = { - disableBrowserBundle: false -}; - -export function makeConfig(pkg, options) { - options = { - ...defaultConfigurationOptions, - ...(options || {}) - }; - - const baseConfig = { - // Use the package's module field if it has one - input: pkg["module"] || "dist-esm/src/index.js", - external: [ - ...nodeBuiltins, - ...Object.keys(pkg.dependencies), - ...Object.keys(pkg.devDependencies) - ], - output: { file: "dist/index.js", format: "cjs", sourcemap: true }, - preserveSymlinks: false, - plugins: [sourcemaps(), nodeResolve(), cjs()] - }; - - const config = [baseConfig]; - - if (!options.disableBrowserBundle) { - config.push(makeBrowserTestConfig()); - } - - return config; -} - -export default makeConfig(require("./package.json")); diff --git a/sdk/maps/maps-search/src/index.ts b/sdk/maps/maps-search/src/index.ts deleted file mode 100644 index 315fa97e7e45..000000000000 --- a/sdk/maps/maps-search/src/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./models"; -export { SearchClient } from "./searchClient"; -export { SearchClientContext } from "./searchClientContext"; -export * from "./operationsInterfaces"; diff --git a/sdk/maps/maps-search/src/lro/azureAsyncPolling.ts b/sdk/maps/maps-search/src/lro/azureAsyncPolling.ts deleted file mode 100644 index 0d63c54f6026..000000000000 --- a/sdk/maps/maps-search/src/lro/azureAsyncPolling.ts +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { FullOperationResponse } from "@azure/core-client"; -import { FinalStateVia, LROResult } from "./models"; -import { failureStates, LROState, successStates } from "./stateMachine"; - -function getResponseStatus(rawResponse: FullOperationResponse): string { - const { status } = - rawResponse.parsedBody ?? - (rawResponse.bodyAsText ? JSON.parse(rawResponse.bodyAsText) : {}); - return status?.toLowerCase() ?? "succeeded"; -} - -function isAzureAsyncPollingDone(rawResponse: FullOperationResponse) { - const state = getResponseStatus(rawResponse); - if (failureStates.includes(state)) { - throw new Error(`Operation status: ${state}`); - } - return successStates.includes(state); -} - -export function processAzureAsyncOperationResult( - restrieveResource: (path?: string) => Promise>, - resourceLocation?: string, - finalStateVia?: FinalStateVia -): ( - rawResponse: FullOperationResponse, - flatResponse: TResult -) => LROState { - return ( - rawResponse: FullOperationResponse, - flatResponse: TResult - ): LROState => { - if (isAzureAsyncPollingDone(rawResponse)) { - if (resourceLocation === undefined) { - return { rawResponse, flatResponse, done: true }; - } else { - return { - rawResponse, - flatResponse, - done: false, - next: async () => { - async function sendFinalRequest(): Promise< - LROResult | undefined - > { - switch (finalStateVia) { - case "original-uri": - return restrieveResource(); - case "azure-async-operation": - return Promise.resolve(undefined); - case "location": - default: - return restrieveResource(resourceLocation); - } - } - const finalResponse = await sendFinalRequest(); - return { - ...(finalResponse ?? { - rawResponse, - flatResponse - }), - done: true - }; - } - }; - } - } - return { - rawResponse, - flatResponse, - done: false - }; - }; -} diff --git a/sdk/maps/maps-search/src/lro/bodyPolling.ts b/sdk/maps/maps-search/src/lro/bodyPolling.ts deleted file mode 100644 index 269d8e6799a1..000000000000 --- a/sdk/maps/maps-search/src/lro/bodyPolling.ts +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { FullOperationResponse } from "@azure/core-client"; -import { failureStates, LROState, successStates } from "./stateMachine"; - -function getProvisioningState(rawResponse: FullOperationResponse): string { - const { properties, provisioningState } = - rawResponse.parsedBody ?? - (rawResponse.bodyAsText ? JSON.parse(rawResponse.bodyAsText) : {}); - const state: string | undefined = - properties?.provisioningState ?? provisioningState; - return state?.toLowerCase() ?? "succeeded"; -} - -export function isBodyPollingDone(rawResponse: FullOperationResponse) { - const state = getProvisioningState(rawResponse); - if (failureStates.includes(state)) { - throw new Error(`Provisioning state: ${state}`); - } - return successStates.includes(state); -} - -/** - * Creates a polling strategy based on BodyPolling which uses the provisioning state - * from the result to determine the current operation state - */ -export function processBodyPollingOperationResult( - rawResponse: FullOperationResponse, - flatResponse: TResult -): LROState { - return { - rawResponse, - flatResponse, - done: isBodyPollingDone(rawResponse) - }; -} diff --git a/sdk/maps/maps-search/src/lro/index.ts b/sdk/maps/maps-search/src/lro/index.ts deleted file mode 100644 index 85c2187669e7..000000000000 --- a/sdk/maps/maps-search/src/lro/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export { shouldDeserializeLRO } from "./requestUtils"; -export { LROPoller } from "./lroPoller"; diff --git a/sdk/maps/maps-search/src/lro/locationPolling.ts b/sdk/maps/maps-search/src/lro/locationPolling.ts deleted file mode 100644 index 6fef61938419..000000000000 --- a/sdk/maps/maps-search/src/lro/locationPolling.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { FullOperationResponse } from "@azure/core-client"; -import { LROState } from "./stateMachine"; - -function isLocationPollingDone(rawResponse: FullOperationResponse) { - const code = rawResponse.status; - if (![202, 200].includes(code)) { - throw new Error(`Operation failed`); - } - return code !== 202; -} - -export function processLocationPollingOperationResult( - rawResponse: FullOperationResponse, - flatResponse: TResult -): LROState { - return { - rawResponse, - flatResponse, - done: isLocationPollingDone(rawResponse) - }; -} diff --git a/sdk/maps/maps-search/src/lro/lroPoller.ts b/sdk/maps/maps-search/src/lro/lroPoller.ts deleted file mode 100644 index cd1cd64fe813..000000000000 --- a/sdk/maps/maps-search/src/lro/lroPoller.ts +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { Poller, PollOperationState } from "@azure/core-lro"; -import { OperationArguments, OperationSpec } from "@azure/core-client"; -import { FinalStateVia, SendOperationFn } from "./models"; -import { GenericPollOperation } from "./operation"; - -export interface LROPollerOptions { - /** - * Defines how much time the poller is going to wait before making a new request to the service. - */ - intervalInMs?: number; - /** - * A serialized poller which can be used to resume an existing paused Long-Running-Operation. - */ - resumeFrom?: string; -} - -export class LROPoller extends Poller< - PollOperationState, - TResult -> { - private intervalInMs: number; - - constructor( - { intervalInMs = 2000, resumeFrom }: LROPollerOptions, - initialOperationArguments: OperationArguments, - initialOperationSpec: OperationSpec, - sendOperation: SendOperationFn, - finalStateVia?: FinalStateVia - ) { - const state: PollOperationState = resumeFrom - ? JSON.parse(resumeFrom).state - : {}; - - const operation = new GenericPollOperation( - state, - initialOperationArguments, - initialOperationSpec, - sendOperation, - finalStateVia - ); - super(operation); - - this.intervalInMs = intervalInMs; - operation.setPollerConfig(this as any); - } - - /** - * The method used by the poller to wait before attempting to update its operation. - */ - delay(): Promise { - return new Promise((resolve) => - setTimeout(() => resolve(), this.intervalInMs) - ); - } -} diff --git a/sdk/maps/maps-search/src/lro/models.ts b/sdk/maps/maps-search/src/lro/models.ts deleted file mode 100644 index a4a5a5abd6c2..000000000000 --- a/sdk/maps/maps-search/src/lro/models.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { - FullOperationResponse, - OperationArguments, - OperationSpec -} from "@azure/core-client"; -import { PollOperationState } from "@azure/core-lro"; - -export type FinalStateVia = - | "azure-async-operation" - | "location" - | "original-uri"; - -export interface LROResult { - flatResponse: T; - rawResponse: FullOperationResponse; -} - -export type LROMode = "AzureAsync" | "Location" | "Body"; - -export interface LROConfig { - mode?: LROMode; - resourceLocation?: string; -} - -export type SendOperationFn = ( - args: OperationArguments, - spec: OperationSpec -) => Promise>; - -/** - * Type of a polling operation state that can actually be resumed. - */ -export type ResumablePollOperationState = PollOperationState & { - initialRawResponse?: FullOperationResponse; - config?: LROConfig; - pollingURL?: string; -}; - -export interface PollerConfig { - intervalInMs: number; -} diff --git a/sdk/maps/maps-search/src/lro/operation.ts b/sdk/maps/maps-search/src/lro/operation.ts deleted file mode 100644 index 801d03e7203a..000000000000 --- a/sdk/maps/maps-search/src/lro/operation.ts +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { AbortSignalLike } from "@azure/abort-controller"; -import { OperationArguments, OperationSpec } from "@azure/core-client"; -import { PollOperation, PollOperationState } from "@azure/core-lro"; -import { - FinalStateVia, - PollerConfig, - ResumablePollOperationState, - SendOperationFn -} from "./models"; -import { getPollingURL } from "./requestUtils"; -import { createGetLROState, initializeState, LROState } from "./stateMachine"; - -export class GenericPollOperation - implements PollOperation, TResult> { - private getLROState?: ( - pollingURL: string, - pollerConfig: PollerConfig - ) => Promise>; - private pollerConfig?: PollerConfig; - constructor( - public state: PollOperationState, - private initialOperationArguments: OperationArguments, - private initialOperationSpec: OperationSpec, - private sendOperation: SendOperationFn, - private finalStateVia?: FinalStateVia - ) {} - - public setPollerConfig(pollerConfig: PollerConfig) { - this.pollerConfig = pollerConfig; - } - - /** - * General update function for LROPoller, the general process is as follows - * 1. Check initial operation result to determine the strategy to use - * - Strategies: Location, Azure-AsyncOperation, Original Uri - * 2. Check if the operation result has a terminal state - * - Terminal state will be determined by each strategy - * 2.1 If it is terminal state Check if a final GET request is required, if so - * send final GET request and return result from operation. If no final GET - * is required, just return the result from operation. - * - Determining what to call for final request is responsibility of each strategy - * 2.2 If it is not terminal state, call the polling operation and go to step 1 - * - Determining what to call for polling is responsibility of each strategy - * - Strategies will always use the latest URI for polling if provided otherwise - * the last known one - */ - async update(options?: { - abortSignal?: AbortSignalLike | undefined; - fireProgress?: ((state: PollOperationState) => void) | undefined; - }): Promise, TResult>> { - const state = this.state as ResumablePollOperationState; - const { onResponse, ...restOptions } = - this.initialOperationArguments.options || {}; - if (!state.isStarted) { - await this.sendOperation( - { - ...this.initialOperationArguments, - options: { - ...restOptions, - onResponse: initializeState( - state, - this.initialOperationSpec, - onResponse - ) - } - }, - this.initialOperationSpec - ); - } - - if (!state.isCompleted) { - if (this.getLROState === undefined) { - if (state.config === undefined) { - throw new Error("Bad state: LRO mode is undefined"); - } - this.getLROState = createGetLROState( - this.sendOperation, - this.initialOperationArguments, - this.initialOperationSpec, - state.config, - this.finalStateVia - ); - } - if (state.pollingURL === undefined) { - throw new Error("Bad state: polling URL is undefined"); - } - const currentState = await this.getLROState( - state.pollingURL, - this.pollerConfig! - ); - if (currentState.done) { - state.result = currentState.flatResponse; - state.isCompleted = true; - } else { - this.getLROState = currentState.next ?? this.getLROState; - state.pollingURL = getPollingURL( - currentState.rawResponse, - state.pollingURL - ); - } - } - if (options?.fireProgress !== undefined) { - options.fireProgress(state); - } - return this; - } - - async cancel(): Promise, TResult>> { - this.state.isCancelled = true; - return this; - } - - /** - * Serializes the Poller operation. - */ - public toString(): string { - return JSON.stringify({ - state: this.state - }); - } -} diff --git a/sdk/maps/maps-search/src/lro/passthrough.ts b/sdk/maps/maps-search/src/lro/passthrough.ts deleted file mode 100644 index 64c10380c1b2..000000000000 --- a/sdk/maps/maps-search/src/lro/passthrough.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { FullOperationResponse } from "@azure/core-client"; -import { LROState } from "./stateMachine"; - -export function processPassthroughOperationResult( - rawResponse: FullOperationResponse, - flatResponse: TResult -): LROState { - return { - rawResponse, - flatResponse, - done: true - }; -} diff --git a/sdk/maps/maps-search/src/lro/pollingMethod.ts b/sdk/maps/maps-search/src/lro/pollingMethod.ts deleted file mode 100644 index cb6482bbdea9..000000000000 --- a/sdk/maps/maps-search/src/lro/pollingMethod.ts +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { - OperationArguments, - OperationSpec, - OperationResponseMap -} from "@azure/core-client"; -import { LROMode, LROResult, SendOperationFn } from "./models"; - -export function createPollingMethod( - sendOperationFn: SendOperationFn, - args: OperationArguments, - spec: OperationSpec, - mode?: LROMode -): (path?: string) => Promise> { - /** - * Polling calls will always return a status object i.e. {"status": "success"} - * these intermediate responses are not described in the swagger so we need to - * pass custom mappers at runtime. - * This function replaces all the existing mappers to be able to deserialize a status object - * @param responses Original set of responses defined in the operation - */ - function getCompositeMappers(responses: { - [responseCode: string]: OperationResponseMap; - }): { - [responseCode: string]: OperationResponseMap; - } { - return Object.keys(responses).reduce((acc, statusCode) => { - return { - ...acc, - [statusCode]: { - ...responses[statusCode], - bodyMapper: { - type: { - name: "Composite", - modelProperties: { - status: { - serializedName: "status", - type: { - name: "String" - } - } - } - } - } - } - }; - }, {} as { [responseCode: string]: OperationResponseMap }); - } - // Make sure we don't send any body to the get request - const { requestBody, responses, ...restSpec } = spec; - if (mode === "AzureAsync") { - return async (path?: string) => { - return sendOperationFn(args, { - ...restSpec, - responses: getCompositeMappers(responses), - httpMethod: "GET", - ...(path && { path }) - }); - }; - } - return async (path?: string) => { - return sendOperationFn(args, { - ...restSpec, - responses: responses, - httpMethod: "GET", - ...(path && { path }) - }); - }; -} - -export function createRetrieveAzureAsyncResource( - sendOperationFn: SendOperationFn, - args: OperationArguments, - spec: OperationSpec -): (path?: string) => Promise> { - const updatedArgs = { ...args }; - if (updatedArgs.options) { - (updatedArgs.options as any).shouldDeserialize = true; - } - return createPollingMethod(sendOperationFn, updatedArgs, spec); -} diff --git a/sdk/maps/maps-search/src/lro/requestUtils.ts b/sdk/maps/maps-search/src/lro/requestUtils.ts deleted file mode 100644 index 9162f6633905..000000000000 --- a/sdk/maps/maps-search/src/lro/requestUtils.ts +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { FullOperationResponse, OperationSpec } from "@azure/core-client"; -import { LROConfig } from "./models"; -import { terminalStates } from "./stateMachine"; - -/** - * We need to selectively deserialize our responses, only deserializing if we - * are in a final LRO response, not deserializing any polling non-terminal responses - */ -export function shouldDeserializeLRO(finalStateVia?: string) { - let initialOperationInfo: LROResponseInfo | undefined; - let isInitialRequest = true; - - return (response: FullOperationResponse) => { - if (response.status < 200 || response.status >= 300) { - return true; - } - - if (!initialOperationInfo) { - initialOperationInfo = getLROData(response); - } else { - isInitialRequest = false; - } - - if ( - initialOperationInfo.azureAsyncOperation || - initialOperationInfo.operationLocation - ) { - return ( - !isInitialRequest && - isAsyncOperationFinalResponse( - response, - initialOperationInfo, - finalStateVia - ) - ); - } - - if (initialOperationInfo.location) { - return isLocationFinalResponse(response); - } - - if (initialOperationInfo.requestMethod === "PUT") { - return isBodyPollingFinalResponse(response); - } - - return true; - }; -} - -function isAsyncOperationFinalResponse( - response: FullOperationResponse, - initialOperationInfo: LROResponseInfo, - finalStateVia?: string -): boolean { - const status: string = response.parsedBody?.status || "Succeeded"; - if (!terminalStates.includes(status.toLowerCase())) { - return false; - } - - if (initialOperationInfo.requestMethod === "DELETE") { - return true; - } - - if ( - initialOperationInfo.requestMethod === "PUT" && - finalStateVia && - finalStateVia.toLowerCase() === "azure-asyncoperation" - ) { - return true; - } - - if ( - initialOperationInfo.requestMethod !== "PUT" && - !initialOperationInfo.location - ) { - return true; - } - - return false; -} - -function isLocationFinalResponse(response: FullOperationResponse): boolean { - return response.status !== 202; -} - -function isBodyPollingFinalResponse(response: FullOperationResponse): boolean { - const provisioningState: string = - response.parsedBody?.properties?.provisioningState || "Succeeded"; - - if (terminalStates.includes(provisioningState.toLowerCase())) { - return true; - } - - return false; -} - -interface LROResponseInfo { - requestMethod: string; - azureAsyncOperation?: string; - operationLocation?: string; - location?: string; -} - -function getLROData(result: FullOperationResponse): LROResponseInfo { - return { - azureAsyncOperation: result.headers.get("azure-asyncoperation"), - operationLocation: result.headers.get("operation-location"), - location: result.headers.get("location"), - requestMethod: result.request.method - }; -} - -/** - * Detects where the continuation token is and returns it. Notice that azure-asyncoperation - * must be checked first before the other location headers because there are scenarios - * where both azure-asyncoperation and location could be present in the same response but - * azure-asyncoperation should be the one to use for polling. - */ -export function getPollingURL( - rawResponse: FullOperationResponse, - defaultPath: string -): string { - return ( - getAzureAsyncoperation(rawResponse) ?? - getLocation(rawResponse) ?? - getOperationLocation(rawResponse) ?? - defaultPath - ); -} - -function getLocation(rawResponse: FullOperationResponse): string | undefined { - return rawResponse.headers?.get("location"); -} - -function getOperationLocation( - rawResponse: FullOperationResponse -): string | undefined { - return rawResponse.headers?.get("operation-location"); -} - -function getAzureAsyncoperation( - rawResponse: FullOperationResponse -): string | undefined { - return rawResponse.headers?.get("azure-asyncoperation"); -} - -export function inferLROMode( - spec: OperationSpec, - rawResponse: FullOperationResponse -): LROConfig { - const requestMethod = spec.httpMethod; - if (getAzureAsyncoperation(rawResponse) !== undefined) { - return { - mode: "AzureAsync", - resourceLocation: - requestMethod === "PUT" - ? spec.path - : requestMethod === "POST" - ? getLocation(rawResponse) - : undefined - }; - } else if ( - getLocation(rawResponse) !== undefined || - getOperationLocation(rawResponse) !== undefined - ) { - return { - mode: "Location" - }; - } else if (["PUT", "PATCH"].includes(requestMethod)) { - return { - mode: "Body" - }; - } - return {}; -} - -export function getSpecPath(spec: OperationSpec): string { - if (spec.path) { - return spec.path; - } else { - throw Error("Bad spec: request path is not found!"); - } -} diff --git a/sdk/maps/maps-search/src/lro/stateMachine.ts b/sdk/maps/maps-search/src/lro/stateMachine.ts deleted file mode 100644 index b2a69b554601..000000000000 --- a/sdk/maps/maps-search/src/lro/stateMachine.ts +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { - FullOperationResponse, - OperationArguments, - OperationSpec, - RawResponseCallback -} from "@azure/core-client"; -import { processAzureAsyncOperationResult } from "./azureAsyncPolling"; -import { - isBodyPollingDone, - processBodyPollingOperationResult -} from "./bodyPolling"; -import { processLocationPollingOperationResult } from "./locationPolling"; -import { - FinalStateVia, - LROConfig, - LROResult, - PollerConfig, - ResumablePollOperationState, - SendOperationFn -} from "./models"; -import { processPassthroughOperationResult } from "./passthrough"; -import { - createPollingMethod, - createRetrieveAzureAsyncResource -} from "./pollingMethod"; -import { getPollingURL, getSpecPath, inferLROMode } from "./requestUtils"; - -export const successStates = ["succeeded"]; -export const failureStates = ["failed", "canceled", "cancelled"]; -export const terminalStates = successStates.concat(failureStates); - -/** - * The type of a terminal state of an LRO. - */ -interface LROTerminalState extends LROResult { - /** - * Whether the operation has finished. - */ - done: true; -} - -/** - * The type of an in-progress state of an LRO. - */ -interface LROInProgressState extends LROResult { - /** - * Whether the operation has finished. - */ - done: false; - /** - * The request to be sent next if it is different from the standard polling one. - * Notice that it will disregard any polling URLs provided to it. - */ - next?: () => Promise>; -} - -/** - * The type of an LRO state which is a tagged union of terminal and in-progress states. - */ -export type LROState = LROTerminalState | LROInProgressState; - -/** - * creates a stepping function that maps an LRO state to another. - */ -function createTransition( - sendOperationFn: SendOperationFn, - args: OperationArguments, - spec: OperationSpec, - config: LROConfig, - finalStateVia?: FinalStateVia -): ( - rawResponse: FullOperationResponse, - flatResponse: TResult -) => LROState { - switch (config.mode) { - case "AzureAsync": { - return processAzureAsyncOperationResult( - createRetrieveAzureAsyncResource(sendOperationFn, args, spec), - config.resourceLocation, - finalStateVia - ); - } - case "Location": { - return processLocationPollingOperationResult; - } - case "Body": { - return processBodyPollingOperationResult; - } - default: { - return processPassthroughOperationResult; - } - } -} - -/** - * Creates a polling operation that returns a LRO state. - */ -export function createGetLROState( - sendOperationFn: SendOperationFn, - args: OperationArguments, - spec: OperationSpec, - config: LROConfig, - finalStateVia?: FinalStateVia -): ( - pollingURL: string, - pollerConfig: PollerConfig -) => Promise> { - const step = createTransition( - sendOperationFn, - args, - spec, - config, - finalStateVia - ); - const customerCallback = args?.options?.onResponse; - let response: LROState | undefined = undefined; - let retryAfter: string | undefined = undefined; - const poll = createPollingMethod( - sendOperationFn, - { - ...args, - options: { - ...args.options, - onResponse: ( - rawResponse: FullOperationResponse, - flatResponse: unknown - ): void => { - response = step(rawResponse, flatResponse as TResult); - retryAfter = rawResponse.headers.get("Retry-After"); - if (response.done) { - customerCallback?.(rawResponse, flatResponse); - } - } - } - }, - spec, - config.mode - ); - return async ( - path: string, - pollerConfig: PollerConfig - ): Promise> => { - await poll(path); - if (retryAfter !== undefined) { - const retryAfterInMs = parseInt(retryAfter); - pollerConfig.intervalInMs = isNaN(retryAfterInMs) - ? calculatePollingIntervalFromDate( - new Date(retryAfter), - pollerConfig.intervalInMs - ) - : retryAfterInMs; - } - return response!; - }; -} - -function calculatePollingIntervalFromDate( - retryAfterDate: Date, - defaultIntervalInMs: number -): number { - const timeNow = Math.floor(new Date().getTime()); - const retryAfterTime = retryAfterDate.getTime(); - if (timeNow < retryAfterTime) { - return retryAfterTime - timeNow; - } - return defaultIntervalInMs; -} - -/** - * Creates a callback to be used to initialize the polling operation state. - * @param state of the polling operation - * @param operationSpec of the LRO - * @param callback callback to be called when the operation is done - * @returns callback that initializes the state of the polling operation - */ -export function initializeState( - state: ResumablePollOperationState, - operationSpec: OperationSpec, - callback?: RawResponseCallback -): (rawResponse: FullOperationResponse, flatResponse: unknown) => void { - return (rawResponse: FullOperationResponse, flatResponse: unknown) => { - state.initialRawResponse = rawResponse; - state.isStarted = true; - state.pollingURL = getPollingURL( - state.initialRawResponse, - getSpecPath(operationSpec) - ); - state.config = inferLROMode(operationSpec, state.initialRawResponse); - /** short circuit polling if body polling is done in the initial request */ - if ( - state.config.mode === undefined || - (state.config.mode === "Body" && - isBodyPollingDone(state.initialRawResponse)) - ) { - state.result = flatResponse as TResult; - state.isCompleted = true; - /** - * We need to check if the LRO operation is finished inside the - * call back so that we can call the customer-provided callback - * on that result. - */ - callback?.(rawResponse, flatResponse); - } - }; -} diff --git a/sdk/maps/maps-search/src/models/index.ts b/sdk/maps/maps-search/src/models/index.ts deleted file mode 100644 index c3b67f11bdc4..000000000000 --- a/sdk/maps/maps-search/src/models/index.ts +++ /dev/null @@ -1,2088 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; - -export type GeoJsonObjectUnion = - | GeoJsonObject - | GeoJsonGeometryUnion - | GeoJsonFeature - | GeoJsonFeatureCollection; -export type GeoJsonGeometryUnion = - | GeoJsonGeometry - | GeoJsonLineString - | GeoJsonPoint - | GeoJsonMultiPoint - | GeoJsonMultiLineString - | GeoJsonPolygon - | GeoJsonMultiPolygon - | GeoJsonGeometryCollection; - -/** This object is returned from a successful Search Polygon call */ -export interface SearchPolygonResponse { - /** - * Results array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly additionalData?: SearchPolygonResult[]; -} - -export interface SearchPolygonResult { - /** - * ID of the returned entity - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly providerID?: string; - /** - * Reason for the failure to obtain data for this provider. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly error?: string; - /** Geometry data in GeoJSON format. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946) for details. Present only if "error" is not present. */ - geometryData?: GeoJsonObjectUnion; -} - -/** A valid `GeoJSON` object. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3) for details. */ -export interface GeoJsonObject { - /** Polymorphic discriminator, which specifies the different types this object can be */ - type: - | "GeoJsonGeometry" - | "LineString" - | "Point" - | "MultiPoint" - | "MultiLineString" - | "Polygon" - | "MultiPolygon" - | "GeometryCollection" - | "Feature" - | "FeatureCollection"; -} - -/** Common error response for all Azure Resource Manager APIs to return error details for failed operations. (This also follows the OData error response format.). */ -export interface ErrorResponse { - /** The error object. */ - error?: ErrorDetail; -} - -/** The error detail. */ -export interface ErrorDetail { - /** - * The error code. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly code?: string; - /** - * The error message. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly message?: string; - /** - * The error target. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly target?: string; - /** - * The error details. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly details?: ErrorDetail[]; - /** - * The error additional info. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly additionalInfo?: ErrorAdditionalInfo[]; -} - -/** The resource management error additional info. */ -export interface ErrorAdditionalInfo { - /** - * The additional info type. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly type?: string; - /** - * The additional info. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly info?: Record; -} - -/** This object is returned from a successful Search calls. */ -export interface SearchCommonResponse { - /** - * Summary object for a Search API response - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly summary?: SearchCommonSummary; - /** - * A list of Search API results. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly results?: SearchCommonResult[]; -} - -/** Summary object for a Search API response. */ -export interface SearchCommonSummary { - /** - * Query property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly query?: string; - /** - * QueryType property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly queryType?: string; - /** - * QueryTime property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly queryTime?: number; - /** - * NumResults property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly numResults?: number; - /** - * Maximum number of responses that will be returned - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly limit?: number; - /** - * Offset property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly offset?: number; - /** - * TotalResults property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly totalResults?: number; - /** - * FuzzyLevel property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly fuzzyLevel?: number; - /** - * Indication when the internal search engine has applied a geospatial bias to improve the ranking of results. In some methods, this can be affected by setting the lat and lon parameters where available. In other cases it is purely internal. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly geoBias?: SearchCommonSummaryGeoBias; -} - -/** A location represented as a latitude and longitude using short names 'lat' & 'lon'. */ -export interface CoordinatesPairAbbreviated { - /** Latitude property */ - lat?: number; - /** Longitude property */ - lon?: number; -} - -/** Result object for a Search API response. */ -export interface SearchCommonResult { - /** - * One of: - * * POI - * * Street - * * Geography - * * Point Address - * * Address Range - * * Cross Street - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly type?: string; - /** - * Id property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly id?: string; - /** - * The value within a result set to indicate the relative matching score between results. You can use this to determine that result x is twice as likely to be as relevant as result y if the value of x is 2x the value of y. The values vary between queries and is only meant as a relative value for one result set. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly score?: number; - /** - * Straight line distance between the result and geobias location in meters. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly dist?: number; - /** - * Info property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly info?: string; - /** Geography entity type. Present only when entityType was requested and is available. */ - entityType?: EntityType; - /** - * Details of the returned POI including information such as the name, phone, url address, and classifications. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly poi?: SearchResultPoi; - /** - * The address of the result - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly address?: SearchResultAddress; - /** A location represented as a latitude and longitude using short names 'lat' & 'lon'. */ - position?: CoordinatesPairAbbreviated; - /** - * The viewport that covers the result represented by the top-left and bottom-right coordinates of the viewport. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly viewport?: SearchResultViewport; - /** - * Entry Points array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly entryPoints?: SearchResultEntryPoint[]; - /** - * Describes the address range on both sides of the street for a search result. Coordinates for the start and end locations of the address range are included. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly addressRanges?: SearchResultAddressRanges; - /** - * Optional section. Reference ids for use with the [Get Search Polygon](https://docs.microsoft.com/rest/api/maps/search/getsearchpolygon) API. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly dataSources?: DataSources; - /** - * Information on the type of match. - * - * One of: - * * AddressPoint - * * HouseNumberRange - * * Street - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly matchType?: string; - /** - * Detour time in seconds - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly detourTime?: number; -} - -/** Details of the returned POI including information such as the name, phone, url address, and classifications. */ -export interface SearchResultPoi { - /** - * Name of the POI property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly name?: string; - /** - * Telephone number property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly phone?: string; - /** - * Website URL property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly url?: string; - /** - * The list of the most specific POI categories - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly categorySet?: SearchResultPoiCategorySet[]; - /** - * __[Deprecated]__ Use classifications instead. Categories array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly categories?: string[]; - /** - * Classification array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly classifications?: SearchResultPoiClassification[]; - /** - * Brands array. The name of the brand for the POI being returned. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly brands?: SearchResultPoiBrand[]; - /** Opening hours for a POI (Points of Interest). */ - openingHours?: SearchResultPoiOpeningHours; -} - -/** POI category */ -export interface SearchResultPoiCategorySet { - /** - * Category ID - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly id?: number; -} - -/** The classification for the POI being returned */ -export interface SearchResultPoiClassification { - /** - * Code property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly code?: string; - /** - * Names array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly names?: SearchResultPoiClassificationName[]; -} - -/** Name for the classification */ -export interface SearchResultPoiClassificationName { - /** - * Name Locale property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly nameLocale?: string; - /** - * Name property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly name?: string; -} - -/** The name of the brand for the POI being returned */ -export interface SearchResultPoiBrand { - /** - * Name of the brand - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly name?: string; -} - -/** Opening hours for a POI (Points of Interest). */ -export interface SearchResultPoiOpeningHours { - /** - * Value used in the Request - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly mode?: string; - /** - * List of time ranges for the next 7 days - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly timeRanges?: SearchResultPoiOpeningHoursTimeRange[]; -} - -/** Open time range for a day */ -export interface SearchResultPoiOpeningHoursTimeRange { - /** The point in the next 7 days range when a given POI is being opened, or the beginning of the range if it was opened before the range. */ - startTime?: SearchResultPoiOpeningHoursTimeRangeTime; - /** The point in the next 7 days range when a given POI is being closed, or the beginning of the range if it was closed before the range. */ - endTime?: SearchResultPoiOpeningHoursTimeRangeTime; -} - -/** Represents a date and time */ -export interface SearchResultPoiOpeningHoursTimeRangeTime { - /** - * Represents current day in calendar year in POI time zone. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly date?: string; - /** - * Hours are in the 24 hour format in the local time of a POI; possible values are 0 - 23. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly hour?: number; - /** - * Minutes are in the local time of a POI; possible values are 0 - 59. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly minute?: number; -} - -/** The address of the result */ -export interface SearchResultAddress { - /** - * Building Number property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly buildingNumber?: string; - /** - * Street property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly street?: string; - /** - * Cross Street property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly crossStreet?: string; - /** - * Street Number property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly streetNumber?: string; - /** - * number of routes - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly routeNumbers?: number[]; - /** - * Street Name property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly streetName?: string; - /** - * Street Name and Number property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly streetNameAndNumber?: string; - /** - * Municipality property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly municipality?: string; - /** - * Municipality Subdivision property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly municipalitySubdivision?: string; - /** - * Country Tertiary Subdivision property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly countryTertiarySubdivision?: string; - /** - * Country Secondary Subdivision property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly countrySecondarySubdivision?: string; - /** - * Country Subdivision property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly countrySubdivision?: string; - /** - * Postal Code property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly postalCode?: string; - /** - * Extended Postal Code property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly extendedPostalCode?: string; - /** - * Country Code property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly countryCode?: string; - /** - * Country property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly country?: string; - /** - * Country Code ISO3 property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly countryCodeISO3?: string; - /** - * Free form Address property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly freeformAddress?: string; - /** - * Country Subdivision Name property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly countrySubdivisionName?: string; - /** - * An address component which represents the name of a geographic area or locality that groups a number of addressable objects for addressing purposes, without being an administrative unit. This field is used to build the `freeformAddress` property. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly localName?: string; - /** - * Bounding box coordinates. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly boundingBox?: Record; -} - -/** The viewport that covers the result represented by the top-left and bottom-right coordinates of the viewport. */ -export interface SearchResultViewport { - /** A location represented as a latitude and longitude using short names 'lat' & 'lon'. */ - topLeftPoint?: CoordinatesPairAbbreviated; - /** A location represented as a latitude and longitude using short names 'lat' & 'lon'. */ - btmRightPoint?: CoordinatesPairAbbreviated; -} - -/** The entry point for the POI being returned. */ -export interface SearchResultEntryPoint { - /** - * The type of entry point. Value can be either _main_ or _minor_. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly type?: EntryPointType; - /** A location represented as a latitude and longitude using short names 'lat' & 'lon'. */ - position?: CoordinatesPairAbbreviated; -} - -/** Describes the address range on both sides of the street for a search result. Coordinates for the start and end locations of the address range are included. */ -export interface SearchResultAddressRanges { - /** Address range on the left side of the street. */ - rangeLeft?: string; - /** Address range on the right side of the street. */ - rangeRight?: string; - /** A location represented as a latitude and longitude using short names 'lat' & 'lon'. */ - from?: CoordinatesPairAbbreviated; - /** A location represented as a latitude and longitude using short names 'lat' & 'lon'. */ - to?: CoordinatesPairAbbreviated; -} - -/** Optional section. Reference ids for use with the [Get Search Polygon](https://docs.microsoft.com/rest/api/maps/search/getsearchpolygon) API. */ -export interface DataSources { - /** Information about the geometric shape of the result. Only present if type == Geography. */ - geometry?: DataSourcesGeometry; -} - -/** Information about the geometric shape of the result. Only present if type == Geography. */ -export interface DataSourcesGeometry { - /** - * Pass this as geometryId to the [Get Search Polygon](https://docs.microsoft.com/rest/api/maps/search/getsearchpolygon) API to fetch geometry information for this result. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly id?: string; -} - -/** This object is returned from a successful POI Category Tree call */ -export interface SearchPoiCategoryTreeResponse { - /** - * Categories array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly poiCategories?: PoiCategoryResult[]; -} - -/** POI category result */ -export interface PoiCategoryResult { - /** - * Unique ID for the category. ID can be used to restrict search results to specific categories through other Search Service APIs, like [Get Search POI](https://docs.microsoft.com/rest/api/maps/search/getsearchpoi). - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly id?: number; - /** - * Name of the category - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly name?: string; - /** - * Array of child category ids - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly childCategoryIds?: number[]; - /** - * Array of alternative names of the category - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly synonyms?: string[]; -} - -/** This object is returned from a successful Search Address Reverse call */ -export interface SearchAddressReverseResponse { - /** - * Summary object for a Search Address Reverse response - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly summary?: SearchCommonSummary; - /** - * Addresses array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly addresses?: SearchAddressReverseResult[]; -} - -/** Result object for a Search Address Reverse response */ -export interface SearchAddressReverseResult { - /** - * The address of the result - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly address?: SearchResultAddress; - /** - * Position property in the form of "{latitude},{longitude}" - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly position?: string; - /** - * Information on the type of match. - * - * One of: - * * AddressPoint - * * HouseNumberRange - * * Street - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly matchType?: string; -} - -/** This object is returned from a successful Search Address Reverse CrossStreet call */ -export interface SearchAddressReverseCrossStreetResponse { - /** - * Summary object for a Search Address Reverse Cross Street response - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly summary?: SearchCommonSummary; - /** - * Addresses array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly addresses?: SearchAddressReverseCrossStreetResult[]; -} - -/** Result object for a Search Address Reverse Cross Street response */ -export interface SearchAddressReverseCrossStreetResult { - /** - * The address of the result - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly address?: SearchResultAddress; - /** - * Position property in the form of "{latitude},{longitude}" - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly position?: string; -} - -/** This type represents the request body for the Search Inside Geometry service. */ -export interface SearchInsideGeometryRequestBody { - /** A valid `GeoJSON` object. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3) for details. */ - geometry?: Record; -} - -/** This type represents the request body for the Search Along Route service. */ -export interface SearchAlongRouteRequestBody { - /** A valid `GeoJSON LineString` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.4) for details. */ - route?: GeoJsonLineString; -} - -export interface GeoJsonLineStringData { - /** Coordinates for the `GeoJson LineString` geometry. */ - coordinates: number[][]; -} - -/** This type represents the request body for the Batch service. */ -export interface BatchRequestBody { - /** The list of queries to process. */ - batchItems?: BatchRequestBodyBatchItemsItem[]; -} - -/** Batch Query object */ -export interface BatchRequestBodyBatchItemsItem { - /** Partial query string. */ - query?: string; -} - -/** This object is returned from a successful Batch service call. Extend with 'batchItems' property. */ -export interface BatchResponse { - /** - * Summary for the batch request - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly summary?: BatchResponseSummary; -} - -/** Summary for the batch request */ -export interface BatchResponseSummary { - /** - * Number of successful requests in the batch - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly successfulRequests?: number; - /** - * Total number of requests in the batch - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly totalRequests?: number; -} - -/** An item returned from Batch API. Extend with 'response' property. */ -export interface BatchItem { - /** - * HTTP request status code. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly statusCode?: number; -} - -/** Indication when the internal search engine has applied a geospatial bias to improve the ranking of results. In some methods, this can be affected by setting the lat and lon parameters where available. In other cases it is purely internal. */ -export interface SearchSummaryGeoBias { - /** - * Latitude property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly lat?: number; - /** - * Longitude property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly lon?: number; -} - -/** Data contained by a `GeoJson Point`. */ -export interface GeoJsonPointData { - /** A `Position` is an array of numbers with two or more elements. The first two elements are _longitude_ and _latitude_, precisely in that order. _Altitude/Elevation_ is an optional third element. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.1) for details. */ - coordinates: number[]; -} - -/** Data contained by a `GeoJson MultiPoint`. */ -export interface GeoJsonMultiPointData { - /** Coordinates for the `GeoJson MultiPoint` geometry. */ - coordinates: number[][]; -} - -export interface GeoJsonMultiLineStringData { - /** Coordinates for the `GeoJson MultiLineString` geometry. */ - coordinates: number[][][]; -} - -export interface GeoJsonPolygonData { - /** Coordinates for the `GeoJson Polygon` geometry type. */ - coordinates: number[][][]; -} - -export interface GeoJsonMultiPolygonData { - /** Contains a list of valid `GeoJSON Polygon` objects. **Note** that coordinates in GeoJSON are in x, y order (longitude, latitude). */ - coordinates: number[][][][]; -} - -export interface GeoJsonGeometryCollectionData { - /** Contains a list of valid `GeoJSON` geometry objects. **Note** that coordinates in GeoJSON are in x, y order (longitude, latitude). */ - geometries: GeoJsonGeometryUnion[]; -} - -export interface GeoJsonFeatureData { - /** A valid `GeoJSON` geometry object. The type must be one of the seven valid GeoJSON geometry types - Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon and GeometryCollection. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1) for details. */ - geometry: GeoJsonGeometryUnion; - /** Properties can contain any additional metadata about the `Feature`. Value can be any JSON object or a JSON null value */ - properties?: Record; - /** Identifier for the feature. */ - id?: string; - /** The type of the feature. The value depends on the data model the current feature is part of. Some data models may have an empty value. */ - featureType?: string; -} - -export interface GeoJsonFeatureCollectionData { - /** Contains a list of valid `GeoJSON Feature` objects. */ - features: GeoJsonFeature[]; -} - -/** A valid `GeoJSON` geometry object. The type must be one of the seven valid GeoJSON geometry types - Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon and GeometryCollection. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1) for details. */ -export type GeoJsonGeometry = GeoJsonObject & { - /** Polymorphic discriminator, which specifies the different types this object can be */ - type: - | "GeoJsonGeometry" - | "LineString" - | "Point" - | "MultiPoint" - | "MultiLineString" - | "Polygon" - | "MultiPolygon" - | "GeometryCollection"; -}; - -/** A valid `GeoJSON Feature` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.2) for details. */ -export type GeoJsonFeature = GeoJsonObject & - GeoJsonFeatureData & { - /** Polymorphic discriminator, which specifies the different types this object can be */ - type: "Feature"; - }; - -/** A valid `GeoJSON FeatureCollection` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.3) for details. */ -export type GeoJsonFeatureCollection = GeoJsonObject & - GeoJsonFeatureCollectionData & { - /** Polymorphic discriminator, which specifies the different types this object can be */ - type: "FeatureCollection"; - }; - -/** The result of the query. SearchCommonResponse if the query completed successfully, ErrorResponse otherwise. */ -export type SearchFuzzyBatchItemResponse = SearchCommonResponse & - ErrorResponse & {}; - -/** The result of the query. SearchCommonResponse if the query completed successfully, ErrorResponse otherwise. */ -export type SearchAddressBatchItemResponse = SearchCommonResponse & - ErrorResponse & {}; - -/** The result of the query. SearchAddressReverseResponse if the query completed successfully, ErrorResponse otherwise. */ -export type SearchAddressReverseBatchItemResponse = SearchAddressReverseResponse & - ErrorResponse & {}; - -/** Indication when the internal search engine has applied a geospatial bias to improve the ranking of results. In some methods, this can be affected by setting the lat and lon parameters where available. In other cases it is purely internal. */ -export type SearchCommonSummaryGeoBias = CoordinatesPairAbbreviated & {}; - -/** A valid `GeoJSON LineString` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.4) for details. */ -export type GeoJsonLineString = GeoJsonGeometry & GeoJsonLineStringData & {}; - -/** This object is returned from a successful Search Fuzzy Batch service call. */ -export type SearchFuzzyBatchResponse = BatchResponse & { - /** - * Array containing the batch results. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly batchItems?: SearchFuzzyBatchItem[]; -}; - -/** This object is returned from a successful Search Address Batch service call. */ -export type SearchAddressBatchResponse = BatchResponse & { - /** - * Array containing the batch results. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly batchItems?: SearchAddressBatchItem[]; -}; - -/** This object is returned from a successful Search Address Reverse Batch service call. */ -export type SearchAddressReverseBatchResponse = BatchResponse & { - /** - * Array containing the batch results. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly batchItems?: SearchAddressReverseBatchItem[]; -}; - -/** An item returned from Search Fuzzy Batch service call. */ -export type SearchFuzzyBatchItem = BatchItem & { - /** - * The result of the query. SearchCommonResponse if the query completed successfully, ErrorResponse otherwise. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly response?: SearchFuzzyBatchItemResponse; -}; - -/** An item returned from Search Address Batch service call. */ -export type SearchAddressBatchItem = BatchItem & { - /** - * The result of the query. SearchCommonResponse if the query completed successfully, ErrorResponse otherwise. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly response?: SearchAddressBatchItemResponse; -}; - -/** An item returned from Search Address Reverse Batch service call. */ -export type SearchAddressReverseBatchItem = BatchItem & { - /** - * The result of the query. SearchAddressReverseResponse if the query completed successfully, ErrorResponse otherwise. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly response?: SearchAddressReverseBatchItemResponse; -}; - -/** A valid `GeoJSON Point` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.2) for details. */ -export type GeoJsonPoint = GeoJsonGeometry & GeoJsonPointData & {}; - -/** A valid `GeoJSON MultiPoint` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.3) for details. */ -export type GeoJsonMultiPoint = GeoJsonGeometry & GeoJsonMultiPointData & {}; - -/** A valid `GeoJSON MultiLineString` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.5) for details. */ -export type GeoJsonMultiLineString = GeoJsonGeometry & - GeoJsonMultiLineStringData & {}; - -/** A valid `GeoJSON Polygon` geometry type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.6) for details. */ -export type GeoJsonPolygon = GeoJsonGeometry & GeoJsonPolygonData & {}; - -/** A valid `GeoJSON MultiPolygon` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.7) for details. */ -export type GeoJsonMultiPolygon = GeoJsonGeometry & - GeoJsonMultiPolygonData & {}; - -/** A valid `GeoJSON GeometryCollection` object type. Please refer to [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.1.8) for details. */ -export type GeoJsonGeometryCollection = GeoJsonGeometry & - GeoJsonGeometryCollectionData & {}; - -/** Defines headers for Search_postSearchFuzzyBatch operation. */ -export interface SearchPostSearchFuzzyBatchHeaders { - /** New URL to check for the results of the long running process. */ - location?: string; -} - -/** Defines headers for Search_postSearchAddressBatch operation. */ -export interface SearchPostSearchAddressBatchHeaders { - /** New URL to check for the results of the long running process. */ - location?: string; -} - -/** Defines headers for Search_postSearchAddressReverseBatch operation. */ -export interface SearchPostSearchAddressReverseBatchHeaders { - /** New URL to check for the results of the long running process. */ - location?: string; -} - -/** Known values of {@link Geography} that the service accepts. */ -export const enum KnownGeography { - Us = "us", - Eu = "eu" -} - -/** - * Defines values for Geography. \ - * {@link KnownGeography} can be used interchangeably with Geography, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **us** \ - * **eu** - */ -export type Geography = string; - -/** Known values of {@link ResponseFormat} that the service accepts. */ -export const enum KnownResponseFormat { - /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ - Json = "json" -} - -/** - * Defines values for ResponseFormat. \ - * {@link KnownResponseFormat} can be used interchangeably with ResponseFormat, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) - */ -export type ResponseFormat = string; - -/** Known values of {@link GeoJsonObjectType} that the service accepts. */ -export const enum KnownGeoJsonObjectType { - /** `GeoJSON Point` geometry. */ - GeoJsonPoint = "Point", - /** `GeoJSON MultiPoint` geometry. */ - GeoJsonMultiPoint = "MultiPoint", - /** `GeoJSON LineString` geometry. */ - GeoJsonLineString = "LineString", - /** `GeoJSON MultiLineString` geometry. */ - GeoJsonMultiLineString = "MultiLineString", - /** `GeoJSON Polygon` geometry. */ - GeoJsonPolygon = "Polygon", - /** `GeoJSON MultiPolygon` geometry. */ - GeoJsonMultiPolygon = "MultiPolygon", - /** `GeoJSON GeometryCollection` geometry. */ - GeoJsonGeometryCollection = "GeometryCollection", - /** `GeoJSON Feature` object. */ - GeoJsonFeature = "Feature", - /** `GeoJSON FeatureCollection` object. */ - GeoJsonFeatureCollection = "FeatureCollection" -} - -/** - * Defines values for GeoJsonObjectType. \ - * {@link KnownGeoJsonObjectType} can be used interchangeably with GeoJsonObjectType, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **Point**: `GeoJSON Point` geometry. \ - * **MultiPoint**: `GeoJSON MultiPoint` geometry. \ - * **LineString**: `GeoJSON LineString` geometry. \ - * **MultiLineString**: `GeoJSON MultiLineString` geometry. \ - * **Polygon**: `GeoJSON Polygon` geometry. \ - * **MultiPolygon**: `GeoJSON MultiPolygon` geometry. \ - * **GeometryCollection**: `GeoJSON GeometryCollection` geometry. \ - * **Feature**: `GeoJSON Feature` object. \ - * **FeatureCollection**: `GeoJSON FeatureCollection` object. - */ -export type GeoJsonObjectType = string; - -/** Known values of {@link TextFormat} that the service accepts. */ -export const enum KnownTextFormat { - /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ - Json = "json", - /** [The Extensible Markup Language](https://www.w3.org/TR/xml/) */ - Xml = "xml" -} - -/** - * Defines values for TextFormat. \ - * {@link KnownTextFormat} can be used interchangeably with TextFormat, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) \ - * **xml**: [The Extensible Markup Language](https:\/\/www.w3.org\/TR\/xml\/) - */ -export type TextFormat = string; - -/** Known values of {@link SearchIndexSet} that the service accepts. */ -export const enum KnownSearchIndexSet { - /** Address range interpolation */ - Addr = "Addr", - /** Geographies */ - Geo = "Geo", - /** Point Addresses */ - PAD = "PAD", - /** Points of interest */ - POI = "POI", - /** Streets */ - Str = "Str", - /** Cross Streets (Intersections) */ - Xstr = "Xstr" -} - -/** - * Defines values for SearchIndexSet. \ - * {@link KnownSearchIndexSet} can be used interchangeably with SearchIndexSet, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **Addr**: Address range interpolation \ - * **Geo**: Geographies \ - * **PAD**: Point Addresses \ - * **POI**: Points of interest \ - * **Str**: Streets \ - * **Xstr**: Cross Streets (Intersections) - */ -export type SearchIndexSet = string; - -/** Known values of {@link ConnectorSet} that the service accepts. */ -export const enum KnownConnectorSet { - /** - * These are the standard household connectors for a certain region. They are all AC single phase and the standard Voltage and standard Amperage. - * - * See also: [Plug & socket types - World Standards](https://www.worldstandards.eu/electricity/plugs-and-sockets) - */ - StandardHouseholdCountrySpecific = "StandardHouseholdCountrySpecific", - /** Type 1 connector as defined in the IEC 62196-2 standard. Also called Yazaki after the original manufacturer or SAE J1772 after the standard that first published it. Mostly used in combination with 120V single phase or up to 240V single phase infrastructure. */ - IEC62196Type1 = "IEC62196Type1", - /** Type 1 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 1 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. */ - IEC62196Type1CCS = "IEC62196Type1CCS", - /** Type 2 connector as defined in the IEC 62196-2 standard. Provided as a cable and plug attached to the charging point */ - IEC62196Type2CableAttached = "IEC62196Type2CableAttached", - /** Type 2 connector as defined in the IEC 62196-2 standard. Provided as a socket set into the charging point. */ - IEC62196Type2Outlet = "IEC62196Type2Outlet", - /** Type 2 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 2 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. */ - IEC62196Type2CCS = "IEC62196Type2CCS", - /** Type 3 connector as defined in the IEC 62196-2 standard. Also called Scame after the original manufacturer. Mostly used in combination with up to 240V single phase or up to 420V three phase infrastructure. */ - IEC62196Type3 = "IEC62196Type3", - /** CHAdeMO connector named after an association formed by the Tokyo Electric Power Company and industrial partners. Because of this is is also known as the TEPCO's connector. It supports fast DC charging. */ - Chademo = "Chademo", - /** Industrial Blue connector is a connector defined in the IEC 60309 standard. It is sometime referred to as by some combination of the standard, the color and the fact that is a single phase connector. The connector usually has the "P+N+E, 6h" configuration. */ - IEC60309AC1PhaseBlue = "IEC60309AC1PhaseBlue", - /** Industrial White connector is a DC connector defined in the IEC 60309 standard. */ - IEC60309DCWhite = "IEC60309DCWhite", - /** The Tesla connector is the regionally specific Tesla Supercharger connector. I.e. it refers to either Tesla's proprietary connector, sometimes referred to as Tesla Port mostly limited to North America or the modified Type 2 (DC over Type 2) in Europe. */ - Tesla = "Tesla" -} - -/** - * Defines values for ConnectorSet. \ - * {@link KnownConnectorSet} can be used interchangeably with ConnectorSet, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **StandardHouseholdCountrySpecific**: These are the standard household connectors for a certain region. They are all AC single phase and the standard Voltage and standard Amperage. - * - * See also: [Plug & socket types - World Standards](https:\/\/www.worldstandards.eu\/electricity\/plugs-and-sockets) \ - * **IEC62196Type1**: Type 1 connector as defined in the IEC 62196-2 standard. Also called Yazaki after the original manufacturer or SAE J1772 after the standard that first published it. Mostly used in combination with 120V single phase or up to 240V single phase infrastructure. \ - * **IEC62196Type1CCS**: Type 1 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 1 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. \ - * **IEC62196Type2CableAttached**: Type 2 connector as defined in the IEC 62196-2 standard. Provided as a cable and plug attached to the charging point \ - * **IEC62196Type2Outlet**: Type 2 connector as defined in the IEC 62196-2 standard. Provided as a socket set into the charging point. \ - * **IEC62196Type2CCS**: Type 2 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 2 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. \ - * **IEC62196Type3**: Type 3 connector as defined in the IEC 62196-2 standard. Also called Scame after the original manufacturer. Mostly used in combination with up to 240V single phase or up to 420V three phase infrastructure. \ - * **Chademo**: CHAdeMO connector named after an association formed by the Tokyo Electric Power Company and industrial partners. Because of this is is also known as the TEPCO's connector. It supports fast DC charging. \ - * **IEC60309AC1PhaseBlue**: Industrial Blue connector is a connector defined in the IEC 60309 standard. It is sometime referred to as by some combination of the standard, the color and the fact that is a single phase connector. The connector usually has the "P+N+E, 6h" configuration. \ - * **IEC60309DCWhite**: Industrial White connector is a DC connector defined in the IEC 60309 standard. \ - * **Tesla**: The Tesla connector is the regionally specific Tesla Supercharger connector. I.e. it refers to either Tesla's proprietary connector, sometimes referred to as Tesla Port mostly limited to North America or the modified Type 2 (DC over Type 2) in Europe. - */ -export type ConnectorSet = string; - -/** Known values of {@link OpeningHours} that the service accepts. */ -export const enum KnownOpeningHours { - /** Shows the hours of operation for the next week, starting with the current day in the local time of the POI. */ - NextSevenDays = "nextSevenDays" -} - -/** - * Defines values for OpeningHours. \ - * {@link KnownOpeningHours} can be used interchangeably with OpeningHours, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **nextSevenDays**: Shows the hours of operation for the next week, starting with the current day in the local time of the POI. - */ -export type OpeningHours = string; - -/** Known values of {@link EntityType} that the service accepts. */ -export const enum KnownEntityType { - /** Country name */ - Country = "Country", - /** State or Province */ - CountrySubdivision = "CountrySubdivision", - /** County */ - CountrySecondarySubdivision = "CountrySecondarySubdivision", - /** Named Area */ - CountryTertiarySubdivision = "CountryTertiarySubdivision", - /** City / Town */ - Municipality = "Municipality", - /** Sub / Super City */ - MunicipalitySubdivision = "MunicipalitySubdivision", - /** Neighbourhood */ - Neighbourhood = "Neighbourhood", - /** Postal Code / Zip Code */ - PostalCodeArea = "PostalCodeArea" -} - -/** - * Defines values for EntityType. \ - * {@link KnownEntityType} can be used interchangeably with EntityType, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **Country**: Country name \ - * **CountrySubdivision**: State or Province \ - * **CountrySecondarySubdivision**: County \ - * **CountryTertiarySubdivision**: Named Area \ - * **Municipality**: City \/ Town \ - * **MunicipalitySubdivision**: Sub \/ Super City \ - * **Neighbourhood**: Neighbourhood \ - * **PostalCodeArea**: Postal Code \/ Zip Code - */ -export type EntityType = string; - -/** Known values of {@link EntryPointType} that the service accepts. */ -export const enum KnownEntryPointType { - Main = "main", - Minor = "minor" -} - -/** - * Defines values for EntryPointType. \ - * {@link KnownEntryPointType} can be used interchangeably with EntryPointType, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **main** \ - * **minor** - */ -export type EntryPointType = string; - -/** Known values of {@link GeographicResourceLocation} that the service accepts. */ -export const enum KnownGeographicResourceLocation { - /** Used to access an Azure Maps Creator resource in the United States */ - Us = "us", - /** Used to access an Azure Maps Creator resource in Europe */ - Eu = "eu" -} - -/** - * Defines values for GeographicResourceLocation. \ - * {@link KnownGeographicResourceLocation} can be used interchangeably with GeographicResourceLocation, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **us**: Used to access an Azure Maps Creator resource in the United States \ - * **eu**: Used to access an Azure Maps Creator resource in Europe - */ -export type GeographicResourceLocation = string; - -/** Optional parameters. */ -export interface SearchGetSearchPolygonOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getSearchPolygon operation. */ -export type SearchGetSearchPolygonResponse = SearchPolygonResponse; - -/** Optional parameters. */ -export interface SearchGetSearchFuzzyOptionalParams - extends coreClient.OperationOptions { - /** Boolean. If the typeahead flag is set, the query will be interpreted as a partial input and the search will enter predictive mode */ - typeahead?: boolean; - /** Maximum number of responses that will be returned. Default: 10, minimum: 1 and maximum: 100 */ - limit?: number; - /** Starting offset of the returned results within the full result set. Default: 0, minimum: 0 and maximum: 1900 */ - ofs?: number; - /** - * A comma-separated list of category set IDs which could be used to restrict the result to specific Points of Interest categories. ID order does not matter. When multiple category identifiers are provided, only POIs that belong to (at least) one of the categories from the provided list will be returned. The list of supported categories can be discovered using  [POI Categories API](https://aka.ms/AzureMapsPOICategoryTree). Usage examples: - * - * * **categorySet=7315** (Search Points of Interest from category Restaurant) - * - * * **categorySet=7315025,7315017** (Search Points of Interest of category either Italian or French Restaurant) - */ - categorySet?: number[]; - /** Comma separated string of country codes, e.g. FR,ES. This will limit the search to the specified countries */ - countrySet?: string[]; - /** Latitude where results should be biased. E.g. 37.337 */ - lat?: number; - /** Longitude where results should be biased. E.g. -121.89 */ - lon?: number; - /** The radius in meters to for the results to be constrained to the defined area */ - radius?: number; - /** Top left position of the bounding box. E.g. 37.553,-122.453 */ - topLeft?: string; - /** Bottom right position of the bounding box. E.g. 37.553,-122.453 */ - btmRight?: string; - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. - * - * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. - */ - language?: string; - /** - * Indexes for which extended postal codes should be included in the results. - * - * Available indexes are: - * - * **Addr** = Address ranges - * - * **Geo** = Geographies - * - * **PAD** = Point Addresses - * - * **POI** = Points of Interest - * - * **Str** = Streets - * - * **XStr** = Cross Streets (intersections) - * - * Value should be a comma separated list of index types (in any order) or **None** for no indexes. - * - * By default extended postal codes are included for all indexes except Geo. Extended postal code lists for geographies can be quite long so they have to be explicitly requested when needed. - * - * Usage examples: - * - * extendedPostalCodesFor=POI - * - * extendedPostalCodesFor=PAD,Addr,POI - * - * extendedPostalCodesFor=None - * - * Extended postal code is returned as an **extendedPostalCode** property of an address. Availability is region-dependent. - */ - extendedPostalCodesFor?: string; - /** - * Minimum fuzziness level to be used. Default: 1, minimum: 1 and maximum: 4 - * - * * Level 1 has no spell checking. - * - * * Level 2 uses normal n-gram spell checking. For example, query "restrant" can be matched to "restaurant." - * - * * Level 3 uses sound-like spell checking, and shingle spell checking. Sound-like spell checking is for "rstrnt" to "restaurant" matching. Shingle spell checking is for "mountainview" to "mountain view" matching. - * - * * Level 4 doesn’t add any more spell checking functions. - * - * - * - * The search engine will start looking for a match on the level defined by minFuzzyLevel, and will stop searching at the level specified by maxFuzzyLevel. - */ - minFuzzyLevel?: number; - /** - * Maximum fuzziness level to be used. Default: 2, minimum: 1 and maximum: 4 - * - * * Level 1 has no spell checking. - * - * * Level 2 uses normal n-gram spell checking. For example, query "restrant" can be matched to "restaurant." - * - * * Level 3 uses sound-like spell checking, and shingle spell checking. Sound-like spell checking is for "rstrnt" to "restaurant" matching. Shingle spell checking is for "mountainview" to "mountain view" matching. - * - * * Level 4 doesn’t add any more spell checking functions. - * - * - * - * The search engine will start looking for a match on the level defined by minFuzzyLevel, and will stop searching at the level specified by maxFuzzyLevel. - */ - maxFuzzyLevel?: number; - /** A comma separated list of indexes which should be utilized for the search. Item order does not matter. Available indexes are: Addr = Address range interpolation, Geo = Geographies, PAD = Point Addresses, POI = Points of interest, Str = Streets, Xstr = Cross Streets (intersections) */ - idxSet?: SearchIndexSet[]; - /** - * A comma-separated list of brand names which could be used to restrict the result to specific brands. Item order does not matter. When multiple brands are provided, only results that belong to (at least) one of the provided list will be returned. Brands that contain a "," in their name should be put into quotes. - * - * Usage examples: - * - * brandSet=Foo - * - * brandSet=Foo,Bar - * - * brandSet="A,B,C Comma",Bar - */ - brandSet?: string[]; - /** - * A comma-separated list of connector types which could be used to restrict the result to Electric Vehicle Station supporting specific connector types. Item order does not matter. When multiple connector types are provided, only results that belong to (at least) one of the provided list will be returned. - * - * Available connector types are: - * * `StandardHouseholdCountrySpecific` - These are the standard household connectors for a certain region. They are all AC single phase and the standard Voltage and standard Amperage. See also: [Plug & socket types - World Standards](https://www.worldstandards.eu/electricity/plugs-and-sockets). - * * `IEC62196Type1` - Type 1 connector as defined in the IEC 62196-2 standard. Also called Yazaki after the original manufacturer or SAE J1772 after the standard that first published it. Mostly used in combination with 120V single phase or up to 240V single phase infrastructure. - * * `IEC62196Type1CCS` - Type 1 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 1 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. - * * `IEC62196Type2CableAttached` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a cable and plug attached to the charging point. - * * `IEC62196Type2Outlet` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a socket set into the charging point. - * * `IEC62196Type2CCS` - Type 2 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 2 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. - * * `IEC62196Type3` - Type 3 connector as defined in the IEC 62196-2 standard. Also called Scame after the original manufacturer. Mostly used in combination with up to 240V single phase or up to 420V three phase infrastructure. - * * `Chademo` - CHAdeMO connector named after an association formed by the Tokyo Electric Power Company and industrial partners. Because of this is is also known as the TEPCO's connector. It supports fast DC charging. - * * `IEC60309AC1PhaseBlue` - Industrial Blue connector is a connector defined in the IEC 60309 standard. It is sometime referred to as by some combination of the standard, the color and the fact that is a single phase connector. The connector usually has the "P+N+E, 6h" configuration. - * * `IEC60309DCWhite` - Industrial White connector is a DC connector defined in the IEC 60309 standard. - * * `Tesla` - The Tesla connector is the regionally specific Tesla Supercharger connector. I.e. it refers to either Tesla's proprietary connector, sometimes referred to as Tesla Port mostly limited to North America or the modified Type 2 (DC over Type 2) in Europe. - * - * Usage examples: - * - * connectorSet=IEC62196Type2CableAttached - * connectorSet=IEC62196Type2Outlet,IEC62196Type2CableAttached - */ - connectorSet?: ConnectorSet[]; - /** - * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. - * - * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. - */ - view?: string; - /** - * Hours of operation for a POI (Points of Interest). The availability of hours of operation will vary based on the data available. - * Supported value: nextSevenDays - */ - openingHours?: OpeningHours; -} - -/** Contains response data for the getSearchFuzzy operation. */ -export type SearchGetSearchFuzzyResponse = SearchCommonResponse; - -/** Optional parameters. */ -export interface SearchGetSearchPOIOptionalParams - extends coreClient.OperationOptions { - /** Boolean. If the typeahead flag is set, the query will be interpreted as a partial input and the search will enter predictive mode */ - typeahead?: boolean; - /** Maximum number of responses that will be returned. Default: 10, minimum: 1 and maximum: 100 */ - limit?: number; - /** Starting offset of the returned results within the full result set. Default: 0, minimum: 0 and maximum: 1900 */ - ofs?: number; - /** - * A comma-separated list of category set IDs which could be used to restrict the result to specific Points of Interest categories. ID order does not matter. When multiple category identifiers are provided, only POIs that belong to (at least) one of the categories from the provided list will be returned. The list of supported categories can be discovered using  [POI Categories API](https://aka.ms/AzureMapsPOICategoryTree). Usage examples: - * - * * **categorySet=7315** (Search Points of Interest from category Restaurant) - * - * * **categorySet=7315025,7315017** (Search Points of Interest of category either Italian or French Restaurant) - */ - categorySet?: number[]; - /** Comma separated string of country codes, e.g. FR,ES. This will limit the search to the specified countries */ - countrySet?: string[]; - /** Latitude where results should be biased. E.g. 37.337 */ - lat?: number; - /** Longitude where results should be biased. E.g. -121.89 */ - lon?: number; - /** The radius in meters to for the results to be constrained to the defined area */ - radius?: number; - /** Top left position of the bounding box. E.g. 37.553,-122.453 */ - topLeft?: string; - /** Bottom right position of the bounding box. E.g. 37.553,-122.453 */ - btmRight?: string; - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. - * - * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. - */ - language?: string; - /** - * Indexes for which extended postal codes should be included in the results. - * - * Available indexes are: - * - * **POI** = Points of Interest - * - * Value should be **POI** or **None** to disable extended postal codes. - * - * By default extended postal codes are included. - * - * Usage examples: - * - * extendedPostalCodesFor=POI - * - * extendedPostalCodesFor=None - * - * Extended postal code is returned as an **extendedPostalCode** property of an address. Availability is region-dependent. - */ - extendedPostalCodesFor?: string; - /** - * A comma-separated list of brand names which could be used to restrict the result to specific brands. Item order does not matter. When multiple brands are provided, only results that belong to (at least) one of the provided list will be returned. Brands that contain a "," in their name should be put into quotes. - * - * Usage examples: - * - * brandSet=Foo - * - * brandSet=Foo,Bar - * - * brandSet="A,B,C Comma",Bar - */ - brandSet?: string[]; - /** - * A comma-separated list of connector types which could be used to restrict the result to Electric Vehicle Station supporting specific connector types. Item order does not matter. When multiple connector types are provided, only results that belong to (at least) one of the provided list will be returned. - * - * Available connector types are: - * * `StandardHouseholdCountrySpecific` - These are the standard household connectors for a certain region. They are all AC single phase and the standard Voltage and standard Amperage. See also: [Plug & socket types - World Standards](https://www.worldstandards.eu/electricity/plugs-and-sockets). - * * `IEC62196Type1` - Type 1 connector as defined in the IEC 62196-2 standard. Also called Yazaki after the original manufacturer or SAE J1772 after the standard that first published it. Mostly used in combination with 120V single phase or up to 240V single phase infrastructure. - * * `IEC62196Type1CCS` - Type 1 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 1 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. - * * `IEC62196Type2CableAttached` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a cable and plug attached to the charging point. - * * `IEC62196Type2Outlet` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a socket set into the charging point. - * * `IEC62196Type2CCS` - Type 2 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 2 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. - * * `IEC62196Type3` - Type 3 connector as defined in the IEC 62196-2 standard. Also called Scame after the original manufacturer. Mostly used in combination with up to 240V single phase or up to 420V three phase infrastructure. - * * `Chademo` - CHAdeMO connector named after an association formed by the Tokyo Electric Power Company and industrial partners. Because of this is is also known as the TEPCO's connector. It supports fast DC charging. - * * `IEC60309AC1PhaseBlue` - Industrial Blue connector is a connector defined in the IEC 60309 standard. It is sometime referred to as by some combination of the standard, the color and the fact that is a single phase connector. The connector usually has the "P+N+E, 6h" configuration. - * * `IEC60309DCWhite` - Industrial White connector is a DC connector defined in the IEC 60309 standard. - * * `Tesla` - The Tesla connector is the regionally specific Tesla Supercharger connector. I.e. it refers to either Tesla's proprietary connector, sometimes referred to as Tesla Port mostly limited to North America or the modified Type 2 (DC over Type 2) in Europe. - * - * Usage examples: - * - * connectorSet=IEC62196Type2CableAttached - * connectorSet=IEC62196Type2Outlet,IEC62196Type2CableAttached - */ - connectorSet?: ConnectorSet[]; - /** - * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. - * - * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. - */ - view?: string; - /** - * Hours of operation for a POI (Points of Interest). The availability of hours of operation will vary based on the data available. - * Supported value: nextSevenDays - */ - openingHours?: OpeningHours; -} - -/** Contains response data for the getSearchPOI operation. */ -export type SearchGetSearchPOIResponse = SearchCommonResponse; - -/** Optional parameters. */ -export interface SearchGetSearchNearbyOptionalParams - extends coreClient.OperationOptions { - /** Maximum number of responses that will be returned. Default: 10, minimum: 1 and maximum: 100 */ - limit?: number; - /** Starting offset of the returned results within the full result set. Default: 0, minimum: 0 and maximum: 1900 */ - ofs?: number; - /** - * A comma-separated list of category set IDs which could be used to restrict the result to specific Points of Interest categories. ID order does not matter. When multiple category identifiers are provided, only POIs that belong to (at least) one of the categories from the provided list will be returned. The list of supported categories can be discovered using  [POI Categories API](https://aka.ms/AzureMapsPOICategoryTree). Usage examples: - * - * * **categorySet=7315** (Search Points of Interest from category Restaurant) - * - * * **categorySet=7315025,7315017** (Search Points of Interest of category either Italian or French Restaurant) - */ - categorySet?: number[]; - /** Comma separated string of country codes, e.g. FR,ES. This will limit the search to the specified countries */ - countrySet?: string[]; - /** The radius in meters to for the results to be constrained to the defined area, Min value is 1, Max Value is 50000. */ - radius?: number; - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. - * - * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. - */ - language?: string; - /** - * Indexes for which extended postal codes should be included in the results. - * - * Available indexes are: - * - * **Addr** = Address ranges - * - * **Geo** = Geographies - * - * **PAD** = Point Addresses - * - * **POI** = Points of Interest - * - * **Str** = Streets - * - * **XStr** = Cross Streets (intersections) - * - * Value should be a comma separated list of index types (in any order) or **None** for no indexes. - * - * By default extended postal codes are included for all indexes except Geo. Extended postal code lists for geographies can be quite long so they have to be explicitly requested when needed. - * - * Usage examples: - * - * extendedPostalCodesFor=POI - * - * extendedPostalCodesFor=PAD,Addr,POI - * - * extendedPostalCodesFor=None - * - * Extended postal code is returned as an **extendedPostalCode** property of an address. Availability is region-dependent. - */ - extendedPostalCodesFor?: string; - /** - * A comma-separated list of brand names which could be used to restrict the result to specific brands. Item order does not matter. When multiple brands are provided, only results that belong to (at least) one of the provided list will be returned. Brands that contain a "," in their name should be put into quotes. - * - * Usage examples: - * - * brandSet=Foo - * - * brandSet=Foo,Bar - * - * brandSet="A,B,C Comma",Bar - */ - brandSet?: string[]; - /** - * A comma-separated list of connector types which could be used to restrict the result to Electric Vehicle Station supporting specific connector types. Item order does not matter. When multiple connector types are provided, only results that belong to (at least) one of the provided list will be returned. - * - * Available connector types are: - * * `StandardHouseholdCountrySpecific` - These are the standard household connectors for a certain region. They are all AC single phase and the standard Voltage and standard Amperage. See also: [Plug & socket types - World Standards](https://www.worldstandards.eu/electricity/plugs-and-sockets). - * * `IEC62196Type1` - Type 1 connector as defined in the IEC 62196-2 standard. Also called Yazaki after the original manufacturer or SAE J1772 after the standard that first published it. Mostly used in combination with 120V single phase or up to 240V single phase infrastructure. - * * `IEC62196Type1CCS` - Type 1 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 1 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. - * * `IEC62196Type2CableAttached` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a cable and plug attached to the charging point. - * * `IEC62196Type2Outlet` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a socket set into the charging point. - * * `IEC62196Type2CCS` - Type 2 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 2 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. - * * `IEC62196Type3` - Type 3 connector as defined in the IEC 62196-2 standard. Also called Scame after the original manufacturer. Mostly used in combination with up to 240V single phase or up to 420V three phase infrastructure. - * * `Chademo` - CHAdeMO connector named after an association formed by the Tokyo Electric Power Company and industrial partners. Because of this is is also known as the TEPCO's connector. It supports fast DC charging. - * * `IEC60309AC1PhaseBlue` - Industrial Blue connector is a connector defined in the IEC 60309 standard. It is sometime referred to as by some combination of the standard, the color and the fact that is a single phase connector. The connector usually has the "P+N+E, 6h" configuration. - * * `IEC60309DCWhite` - Industrial White connector is a DC connector defined in the IEC 60309 standard. - * * `Tesla` - The Tesla connector is the regionally specific Tesla Supercharger connector. I.e. it refers to either Tesla's proprietary connector, sometimes referred to as Tesla Port mostly limited to North America or the modified Type 2 (DC over Type 2) in Europe. - * - * Usage examples: - * - * connectorSet=IEC62196Type2CableAttached - * connectorSet=IEC62196Type2Outlet,IEC62196Type2CableAttached - */ - connectorSet?: ConnectorSet[]; - /** - * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. - * - * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. - */ - view?: string; -} - -/** Contains response data for the getSearchNearby operation. */ -export type SearchGetSearchNearbyResponse = SearchCommonResponse; - -/** Optional parameters. */ -export interface SearchGetSearchPOICategoryOptionalParams - extends coreClient.OperationOptions { - /** Boolean. If the typeahead flag is set, the query will be interpreted as a partial input and the search will enter predictive mode */ - typeahead?: boolean; - /** Maximum number of responses that will be returned. Default: 10, minimum: 1 and maximum: 100 */ - limit?: number; - /** Starting offset of the returned results within the full result set. Default: 0, minimum: 0 and maximum: 1900 */ - ofs?: number; - /** - * A comma-separated list of category set IDs which could be used to restrict the result to specific Points of Interest categories. ID order does not matter. When multiple category identifiers are provided, only POIs that belong to (at least) one of the categories from the provided list will be returned. The list of supported categories can be discovered using  [POI Categories API](https://aka.ms/AzureMapsPOICategoryTree). Usage examples: - * - * * **categorySet=7315** (Search Points of Interest from category Restaurant) - * - * * **categorySet=7315025,7315017** (Search Points of Interest of category either Italian or French Restaurant) - */ - categorySet?: number[]; - /** Comma separated string of country codes, e.g. FR,ES. This will limit the search to the specified countries */ - countrySet?: string[]; - /** Latitude where results should be biased. E.g. 37.337 */ - lat?: number; - /** Longitude where results should be biased. E.g. -121.89 */ - lon?: number; - /** The radius in meters to for the results to be constrained to the defined area */ - radius?: number; - /** Top left position of the bounding box. E.g. 37.553,-122.453 */ - topLeft?: string; - /** Bottom right position of the bounding box. E.g. 37.553,-122.453 */ - btmRight?: string; - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. - * - * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. - */ - language?: string; - /** - * Indexes for which extended postal codes should be included in the results. - * - * Available indexes are: - * - * **Addr** = Address ranges - * - * **Geo** = Geographies - * - * **PAD** = Point Addresses - * - * **POI** = Points of Interest - * - * **Str** = Streets - * - * **XStr** = Cross Streets (intersections) - * - * Value should be a comma separated list of index types (in any order) or **None** for no indexes. - * - * By default extended postal codes are included for all indexes except Geo. Extended postal code lists for geographies can be quite long so they have to be explicitly requested when needed. - * - * Usage examples: - * - * extendedPostalCodesFor=POI - * - * extendedPostalCodesFor=PAD,Addr,POI - * - * extendedPostalCodesFor=None - * - * Extended postal code is returned as an **extendedPostalCode** property of an address. Availability is region-dependent. - */ - extendedPostalCodesFor?: string; - /** - * A comma-separated list of brand names which could be used to restrict the result to specific brands. Item order does not matter. When multiple brands are provided, only results that belong to (at least) one of the provided list will be returned. Brands that contain a "," in their name should be put into quotes. - * - * Usage examples: - * - * brandSet=Foo - * - * brandSet=Foo,Bar - * - * brandSet="A,B,C Comma",Bar - */ - brandSet?: string[]; - /** - * A comma-separated list of connector types which could be used to restrict the result to Electric Vehicle Station supporting specific connector types. Item order does not matter. When multiple connector types are provided, only results that belong to (at least) one of the provided list will be returned. - * - * Available connector types are: - * * `StandardHouseholdCountrySpecific` - These are the standard household connectors for a certain region. They are all AC single phase and the standard Voltage and standard Amperage. See also: [Plug & socket types - World Standards](https://www.worldstandards.eu/electricity/plugs-and-sockets). - * * `IEC62196Type1` - Type 1 connector as defined in the IEC 62196-2 standard. Also called Yazaki after the original manufacturer or SAE J1772 after the standard that first published it. Mostly used in combination with 120V single phase or up to 240V single phase infrastructure. - * * `IEC62196Type1CCS` - Type 1 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 1 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. - * * `IEC62196Type2CableAttached` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a cable and plug attached to the charging point. - * * `IEC62196Type2Outlet` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a socket set into the charging point. - * * `IEC62196Type2CCS` - Type 2 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 2 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. - * * `IEC62196Type3` - Type 3 connector as defined in the IEC 62196-2 standard. Also called Scame after the original manufacturer. Mostly used in combination with up to 240V single phase or up to 420V three phase infrastructure. - * * `Chademo` - CHAdeMO connector named after an association formed by the Tokyo Electric Power Company and industrial partners. Because of this is is also known as the TEPCO's connector. It supports fast DC charging. - * * `IEC60309AC1PhaseBlue` - Industrial Blue connector is a connector defined in the IEC 60309 standard. It is sometime referred to as by some combination of the standard, the color and the fact that is a single phase connector. The connector usually has the "P+N+E, 6h" configuration. - * * `IEC60309DCWhite` - Industrial White connector is a DC connector defined in the IEC 60309 standard. - * * `Tesla` - The Tesla connector is the regionally specific Tesla Supercharger connector. I.e. it refers to either Tesla's proprietary connector, sometimes referred to as Tesla Port mostly limited to North America or the modified Type 2 (DC over Type 2) in Europe. - * - * Usage examples: - * - * connectorSet=IEC62196Type2CableAttached - * connectorSet=IEC62196Type2Outlet,IEC62196Type2CableAttached - */ - connectorSet?: ConnectorSet[]; - /** - * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. - * - * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. - */ - view?: string; - /** - * Hours of operation for a POI (Points of Interest). The availability of hours of operation will vary based on the data available. - * Supported value: nextSevenDays - */ - openingHours?: OpeningHours; -} - -/** Contains response data for the getSearchPOICategory operation. */ -export type SearchGetSearchPOICategoryResponse = SearchCommonResponse; - -/** Optional parameters. */ -export interface SearchGetSearchPOICategoryTreePreviewOptionalParams - extends coreClient.OperationOptions { - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, except NGT and NGT-Latn. Language tag is case insensitive. When data in specified language is not available for a specific field, default language is used (English). - * - * Please refer to [Supported Languages](https://docs.microsoft.com/azure/azure-maps/supported-languages) for details. - */ - language?: string; -} - -/** Contains response data for the getSearchPOICategoryTreePreview operation. */ -export type SearchGetSearchPOICategoryTreePreviewResponse = SearchPoiCategoryTreeResponse; - -/** Optional parameters. */ -export interface SearchGetSearchAddressOptionalParams - extends coreClient.OperationOptions { - /** Boolean. If the typeahead flag is set, the query will be interpreted as a partial input and the search will enter predictive mode */ - typeahead?: boolean; - /** Maximum number of responses that will be returned. Default: 10, minimum: 1 and maximum: 100 */ - limit?: number; - /** Starting offset of the returned results within the full result set. Default: 0, minimum: 0 and maximum: 1900 */ - ofs?: number; - /** Comma separated string of country codes, e.g. FR,ES. This will limit the search to the specified countries */ - countrySet?: string[]; - /** Latitude where results should be biased. E.g. 37.337 */ - lat?: number; - /** Longitude where results should be biased. E.g. -121.89 */ - lon?: number; - /** The radius in meters to for the results to be constrained to the defined area */ - radius?: number; - /** Top left position of the bounding box. E.g. 37.553,-122.453 */ - topLeft?: string; - /** Bottom right position of the bounding box. E.g. 37.553,-122.453 */ - btmRight?: string; - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. - * - * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. - */ - language?: string; - /** - * Indexes for which extended postal codes should be included in the results. - * - * Available indexes are: - * - * **Addr** = Address ranges - * - * **Geo** = Geographies - * - * **PAD** = Point Addresses - * - * **POI** = Points of Interest - * - * **Str** = Streets - * - * **XStr** = Cross Streets (intersections) - * - * Value should be a comma separated list of index types (in any order) or **None** for no indexes. - * - * By default extended postal codes are included for all indexes except Geo. Extended postal code lists for geographies can be quite long so they have to be explicitly requested when needed. - * - * Usage examples: - * - * extendedPostalCodesFor=POI - * - * extendedPostalCodesFor=PAD,Addr,POI - * - * extendedPostalCodesFor=None - * - * Extended postal code is returned as an **extendedPostalCode** property of an address. Availability is region-dependent. - */ - extendedPostalCodesFor?: string; - /** - * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. - * - * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. - */ - view?: string; -} - -/** Contains response data for the getSearchAddress operation. */ -export type SearchGetSearchAddressResponse = SearchCommonResponse; - -/** Optional parameters. */ -export interface SearchGetSearchAddressReverseOptionalParams - extends coreClient.OperationOptions { - /** The radius in meters to for the results to be constrained to the defined area */ - radius?: number; - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. - * - * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. - */ - language?: string; - /** - * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. - * - * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. - */ - view?: string; - /** Boolean. To enable return of the posted speed limit */ - returnSpeedLimit?: boolean; - /** The directional heading of the vehicle in degrees, for travel along a segment of roadway. 0 is North, 90 is East and so on, values range from -360 to 360. The precision can include upto one decimal place */ - heading?: number; - /** If a number is sent in along with the request, the response may include the side of the street (Left/Right) and also an offset position for that number */ - numberParam?: string; - /** Boolean. To enable return of the road use array for reverse geocodes at street level */ - returnRoadUse?: boolean; - /** To restrict reverse geocodes to a certain type of road use. The road use array for reverse geocodes can be one or more of LimitedAccess, Arterial, Terminal, Ramp, Rotary, LocalStreet */ - roadUse?: string; - /** - * Format of newlines in the formatted address. - * - * If true, the address will contain newlines. - * If false, newlines will be converted to commas. - */ - allowFreeformNewline?: boolean; - /** Include information on the type of match the geocoder achieved in the response. */ - returnMatchType?: boolean; - /** - * Specifies the level of filtering performed on geographies. Narrows the search for specified geography entity types, e.g. return only municipality. The resulting response will contain the geography ID as well as the entity type matched. If you provide more than one entity as a comma separated list, endpoint will return the 'smallest entity available'. Returned Geometry ID can be used to get the geometry of that geography via [Get Search Polygon](https://docs.microsoft.com/rest/api/maps/search/getsearchpolygon) API. The following parameters are ignored when entityType is set: - * - * * heading - * * number - * * returnRoadUse - * * returnSpeedLimit - * * roadUse - * * returnMatchType - */ - entityType?: EntityType; -} - -/** Contains response data for the getSearchAddressReverse operation. */ -export type SearchGetSearchAddressReverseResponse = SearchAddressReverseResponse; - -/** Optional parameters. */ -export interface SearchGetSearchAddressReverseCrossStreetOptionalParams - extends coreClient.OperationOptions { - /** Maximum number of responses that will be returned. Default: 10, minimum: 1 and maximum: 100 */ - limit?: number; - /** The radius in meters to for the results to be constrained to the defined area */ - radius?: number; - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. - * - * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. - */ - language?: string; - /** - * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. - * - * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. - */ - view?: string; - /** The directional heading of the vehicle in degrees, for travel along a segment of roadway. 0 is North, 90 is East and so on, values range from -360 to 360. The precision can include upto one decimal place */ - heading?: number; -} - -/** Contains response data for the getSearchAddressReverseCrossStreet operation. */ -export type SearchGetSearchAddressReverseCrossStreetResponse = SearchAddressReverseCrossStreetResponse; - -/** Optional parameters. */ -export interface SearchGetSearchAddressStructuredOptionalParams - extends coreClient.OperationOptions { - /** Maximum number of responses that will be returned. Default: 10, minimum: 1 and maximum: 100 */ - limit?: number; - /** Starting offset of the returned results within the full result set. Default: 0, minimum: 0 and maximum: 1900 */ - ofs?: number; - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. - * - * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. - */ - language?: string; - /** - * Indexes for which extended postal codes should be included in the results. - * - * Available indexes are: - * - * **Addr** = Address ranges - * - * **Geo** = Geographies - * - * **PAD** = Point Addresses - * - * **POI** = Points of Interest - * - * **Str** = Streets - * - * **XStr** = Cross Streets (intersections) - * - * Value should be a comma separated list of index types (in any order) or **None** for no indexes. - * - * By default extended postal codes are included for all indexes except Geo. Extended postal code lists for geographies can be quite long so they have to be explicitly requested when needed. - * - * Usage examples: - * - * extendedPostalCodesFor=POI - * - * extendedPostalCodesFor=PAD,Addr,POI - * - * extendedPostalCodesFor=None - * - * Extended postal code is returned as an **extendedPostalCode** property of an address. Availability is region-dependent. - */ - extendedPostalCodesFor?: string; - /** - * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. - * - * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. - */ - view?: string; - /** The 2 or 3 letter [ISO3166-1](https://www.iso.org/iso-3166-country-codes.html) country code portion of an address. E.g. US. */ - countryCode?: string; - /** The street number portion of an address */ - streetNumber?: string; - /** The street name portion of an address */ - streetName?: string; - /** The cross street name for the structured address */ - crossStreet?: string; - /** The municipality portion of an address */ - municipality?: string; - /** The municipality subdivision (sub/super city) for the structured address */ - municipalitySubdivision?: string; - /** The named area for the structured address */ - countryTertiarySubdivision?: string; - /** The county for the structured address */ - countrySecondarySubdivision?: string; - /** The country subdivision portion of an address */ - countrySubdivision?: string; - /** The postal code portion of an address */ - postalCode?: string; -} - -/** Contains response data for the getSearchAddressStructured operation. */ -export type SearchGetSearchAddressStructuredResponse = SearchCommonResponse; - -/** Optional parameters. */ -export interface SearchPostSearchInsideGeometryOptionalParams - extends coreClient.OperationOptions { - /** Maximum number of responses that will be returned. Default: 10, minimum: 1 and maximum: 100 */ - limit?: number; - /** - * A comma-separated list of category set IDs which could be used to restrict the result to specific Points of Interest categories. ID order does not matter. When multiple category identifiers are provided, only POIs that belong to (at least) one of the categories from the provided list will be returned. The list of supported categories can be discovered using  [POI Categories API](https://aka.ms/AzureMapsPOICategoryTree). Usage examples: - * - * * **categorySet=7315** (Search Points of Interest from category Restaurant) - * - * * **categorySet=7315025,7315017** (Search Points of Interest of category either Italian or French Restaurant) - */ - categorySet?: number[]; - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. - * - * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. - */ - language?: string; - /** - * Indexes for which extended postal codes should be included in the results. - * - * Available indexes are: - * - * **Addr** = Address ranges - * - * **Geo** = Geographies - * - * **PAD** = Point Addresses - * - * **POI** = Points of Interest - * - * **Str** = Streets - * - * **XStr** = Cross Streets (intersections) - * - * Value should be a comma separated list of index types (in any order) or **None** for no indexes. - * - * By default extended postal codes are included for all indexes except Geo. Extended postal code lists for geographies can be quite long so they have to be explicitly requested when needed. - * - * Usage examples: - * - * extendedPostalCodesFor=POI - * - * extendedPostalCodesFor=PAD,Addr,POI - * - * extendedPostalCodesFor=None - * - * Extended postal code is returned as an **extendedPostalCode** property of an address. Availability is region-dependent. - */ - extendedPostalCodesFor?: string; - /** A comma separated list of indexes which should be utilized for the search. Item order does not matter. Available indexes are: Addr = Address range interpolation, Geo = Geographies, PAD = Point Addresses, POI = Points of interest, Str = Streets, Xstr = Cross Streets (intersections) */ - idxSet?: SearchIndexSet[]; - /** - * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. - * - * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. - */ - view?: string; - /** - * Hours of operation for a POI (Points of Interest). The availability of hours of operation will vary based on the data available. - * Supported value: nextSevenDays - */ - openingHours?: OpeningHours; -} - -/** Contains response data for the postSearchInsideGeometry operation. */ -export type SearchPostSearchInsideGeometryResponse = SearchCommonResponse; - -/** Optional parameters. */ -export interface SearchPostSearchAlongRouteOptionalParams - extends coreClient.OperationOptions { - /** - * A comma-separated list of category set IDs which could be used to restrict the result to specific Points of Interest categories. ID order does not matter. When multiple category identifiers are provided, only POIs that belong to (at least) one of the categories from the provided list will be returned. The list of supported categories can be discovered using  [POI Categories API](https://aka.ms/AzureMapsPOICategoryTree). Usage examples: - * - * * **categorySet=7315** (Search Points of Interest from category Restaurant) - * - * * **categorySet=7315025,7315017** (Search Points of Interest of category either Italian or French Restaurant) - */ - categorySet?: number[]; - /** - * A comma-separated list of brand names which could be used to restrict the result to specific brands. Item order does not matter. When multiple brands are provided, only results that belong to (at least) one of the provided list will be returned. Brands that contain a "," in their name should be put into quotes. - * - * Usage examples: - * - * brandSet=Foo - * - * brandSet=Foo,Bar - * - * brandSet="A,B,C Comma",Bar - */ - brandSet?: string[]; - /** - * A comma-separated list of connector types which could be used to restrict the result to Electric Vehicle Station supporting specific connector types. Item order does not matter. When multiple connector types are provided, only results that belong to (at least) one of the provided list will be returned. - * - * Available connector types are: - * * `StandardHouseholdCountrySpecific` - These are the standard household connectors for a certain region. They are all AC single phase and the standard Voltage and standard Amperage. See also: [Plug & socket types - World Standards](https://www.worldstandards.eu/electricity/plugs-and-sockets). - * * `IEC62196Type1` - Type 1 connector as defined in the IEC 62196-2 standard. Also called Yazaki after the original manufacturer or SAE J1772 after the standard that first published it. Mostly used in combination with 120V single phase or up to 240V single phase infrastructure. - * * `IEC62196Type1CCS` - Type 1 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 1 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. - * * `IEC62196Type2CableAttached` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a cable and plug attached to the charging point. - * * `IEC62196Type2Outlet` - Type 2 connector as defined in the IEC 62196-2 standard. Provided as a socket set into the charging point. - * * `IEC62196Type2CCS` - Type 2 based combo connector as defined in the IEC 62196-3 standard. The connector is based on the Type 2 connector – as defined in the IEC 62196-2 standard – with two additional direct current (DC) contacts to allow DC fast charging. - * * `IEC62196Type3` - Type 3 connector as defined in the IEC 62196-2 standard. Also called Scame after the original manufacturer. Mostly used in combination with up to 240V single phase or up to 420V three phase infrastructure. - * * `Chademo` - CHAdeMO connector named after an association formed by the Tokyo Electric Power Company and industrial partners. Because of this is is also known as the TEPCO's connector. It supports fast DC charging. - * * `IEC60309AC1PhaseBlue` - Industrial Blue connector is a connector defined in the IEC 60309 standard. It is sometime referred to as by some combination of the standard, the color and the fact that is a single phase connector. The connector usually has the "P+N+E, 6h" configuration. - * * `IEC60309DCWhite` - Industrial White connector is a DC connector defined in the IEC 60309 standard. - * * `Tesla` - The Tesla connector is the regionally specific Tesla Supercharger connector. I.e. it refers to either Tesla's proprietary connector, sometimes referred to as Tesla Port mostly limited to North America or the modified Type 2 (DC over Type 2) in Europe. - * - * Usage examples: - * - * connectorSet=IEC62196Type2CableAttached - * connectorSet=IEC62196Type2Outlet,IEC62196Type2CableAttached - */ - connectorSet?: ConnectorSet[]; - /** - * The View parameter specifies which set of geopolitically disputed content is returned via Azure Maps services, including borders and labels displayed on the map. The View parameter (also referred to as “user region parameter”) will show the correct maps for that country/region. By default, the View parameter is set to “Unified” even if you haven’t defined it in the request. It is your responsibility to determine the location of your users, and then set the View parameter correctly for that location. Alternatively, you have the option to set ‘View=Auto’, which will return the map data based on the IP address of the request. The View parameter in Azure Maps must be used in compliance with applicable laws, including those regarding mapping, of the country where maps, images and other data and third party content that you are authorized to access via Azure Maps is made available. Example: view=IN. - * - * Please refer to [Supported Views](https://aka.ms/AzureMapsLocalizationViews) for details and to see the available Views. - */ - view?: string; - /** - * Hours of operation for a POI (Points of Interest). The availability of hours of operation will vary based on the data available. - * Supported value: nextSevenDays - */ - openingHours?: OpeningHours; - /** Maximum number of responses that will be returned. Default value is 10. Max value is 20 */ - limit?: number; -} - -/** Contains response data for the postSearchAlongRoute operation. */ -export type SearchPostSearchAlongRouteResponse = SearchCommonResponse; - -/** Optional parameters. */ -export interface SearchPostSearchFuzzyBatchSyncOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the postSearchFuzzyBatchSync operation. */ -export type SearchPostSearchFuzzyBatchSyncResponse = SearchFuzzyBatchResponse; - -/** Optional parameters. */ -export interface SearchPostSearchFuzzyBatchOptionalParams - extends coreClient.OperationOptions { - /** Delay to wait until next poll, in milliseconds. */ - updateIntervalInMs?: number; - /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ - resumeFrom?: string; -} - -/** Contains response data for the postSearchFuzzyBatch operation. */ -export type SearchPostSearchFuzzyBatchResponse = SearchFuzzyBatchResponse; - -/** Optional parameters. */ -export interface SearchPostSearchAddressBatchSyncOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the postSearchAddressBatchSync operation. */ -export type SearchPostSearchAddressBatchSyncResponse = SearchAddressBatchResponse; - -/** Optional parameters. */ -export interface SearchPostSearchAddressBatchOptionalParams - extends coreClient.OperationOptions { - /** Delay to wait until next poll, in milliseconds. */ - updateIntervalInMs?: number; - /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ - resumeFrom?: string; -} - -/** Contains response data for the postSearchAddressBatch operation. */ -export type SearchPostSearchAddressBatchResponse = SearchAddressBatchResponse; - -/** Optional parameters. */ -export interface SearchPostSearchAddressReverseBatchSyncOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the postSearchAddressReverseBatchSync operation. */ -export type SearchPostSearchAddressReverseBatchSyncResponse = SearchAddressReverseBatchResponse; - -/** Optional parameters. */ -export interface SearchPostSearchAddressReverseBatchOptionalParams - extends coreClient.OperationOptions { - /** Delay to wait until next poll, in milliseconds. */ - updateIntervalInMs?: number; - /** A serialized poller which can be used to resume an existing paused Long-Running-Operation. */ - resumeFrom?: string; -} - -/** Contains response data for the postSearchAddressReverseBatch operation. */ -export type SearchPostSearchAddressReverseBatchResponse = SearchAddressReverseBatchResponse; - -/** Optional parameters. */ -export interface SearchClientOptionalParams - extends coreClient.ServiceClientOptions { - /** This parameter specifies where the Azure Maps Creator resource is located. Valid values are us and eu. */ - geography?: Geography; - /** Specifies which account is intended for usage in conjunction with the Azure AD security model. It represents a unique ID for the Azure Maps account and can be retrieved from the Azure Maps management plane Account API. To use Azure AD security in Azure Maps see the following [articles](https://aka.ms/amauthdetails) for guidance. */ - xMsClientId?: string; - /** Api Version */ - apiVersion?: string; - /** Overrides client endpoint. */ - endpoint?: string; -} diff --git a/sdk/maps/maps-search/src/models/mappers.ts b/sdk/maps/maps-search/src/models/mappers.ts deleted file mode 100644 index f0620fd60902..000000000000 --- a/sdk/maps/maps-search/src/models/mappers.ts +++ /dev/null @@ -1,1893 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; - -export const SearchPolygonResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchPolygonResponse", - modelProperties: { - additionalData: { - serializedName: "additionalData", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "SearchPolygonResult" - } - } - } - } - } - } -}; - -export const SearchPolygonResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchPolygonResult", - modelProperties: { - providerID: { - serializedName: "providerID", - readOnly: true, - type: { - name: "String" - } - }, - error: { - serializedName: "error", - readOnly: true, - type: { - name: "String" - } - }, - geometryData: { - serializedName: "geometryData", - type: { - name: "Composite", - className: "GeoJsonObject" - } - } - } - } -}; - -export const GeoJsonObject: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonObject", - uberParent: "GeoJsonObject", - polymorphicDiscriminator: { - serializedName: "type", - clientName: "type" - }, - modelProperties: { - type: { - serializedName: "type", - required: true, - type: { - name: "String" - } - } - } - } -}; - -export const ErrorResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorResponse", - modelProperties: { - error: { - serializedName: "error", - type: { - name: "Composite", - className: "ErrorDetail" - } - } - } - } -}; - -export const ErrorDetail: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorDetail", - modelProperties: { - code: { - serializedName: "code", - readOnly: true, - type: { - name: "String" - } - }, - message: { - serializedName: "message", - readOnly: true, - type: { - name: "String" - } - }, - target: { - serializedName: "target", - readOnly: true, - type: { - name: "String" - } - }, - details: { - serializedName: "details", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ErrorDetail" - } - } - } - }, - additionalInfo: { - serializedName: "additionalInfo", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ErrorAdditionalInfo" - } - } - } - } - } - } -}; - -export const ErrorAdditionalInfo: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorAdditionalInfo", - modelProperties: { - type: { - serializedName: "type", - readOnly: true, - type: { - name: "String" - } - }, - info: { - serializedName: "info", - readOnly: true, - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - } - } - } -}; - -export const SearchCommonResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchCommonResponse", - modelProperties: { - summary: { - serializedName: "summary", - type: { - name: "Composite", - className: "SearchCommonSummary" - } - }, - results: { - serializedName: "results", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "SearchCommonResult" - } - } - } - } - } - } -}; - -export const SearchCommonSummary: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchCommonSummary", - modelProperties: { - query: { - serializedName: "query", - readOnly: true, - type: { - name: "String" - } - }, - queryType: { - serializedName: "queryType", - readOnly: true, - type: { - name: "String" - } - }, - queryTime: { - serializedName: "queryTime", - readOnly: true, - type: { - name: "Number" - } - }, - numResults: { - serializedName: "numResults", - readOnly: true, - type: { - name: "Number" - } - }, - limit: { - serializedName: "limit", - readOnly: true, - type: { - name: "Number" - } - }, - offset: { - serializedName: "offset", - readOnly: true, - type: { - name: "Number" - } - }, - totalResults: { - serializedName: "totalResults", - readOnly: true, - type: { - name: "Number" - } - }, - fuzzyLevel: { - serializedName: "fuzzyLevel", - readOnly: true, - type: { - name: "Number" - } - }, - geoBias: { - serializedName: "geoBias", - type: { - name: "Composite", - className: "SearchCommonSummaryGeoBias" - } - } - } - } -}; - -export const CoordinatesPairAbbreviated: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "CoordinatesPairAbbreviated", - modelProperties: { - lat: { - serializedName: "lat", - type: { - name: "Number" - } - }, - lon: { - serializedName: "lon", - type: { - name: "Number" - } - } - } - } -}; - -export const SearchCommonResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchCommonResult", - modelProperties: { - type: { - serializedName: "type", - readOnly: true, - type: { - name: "String" - } - }, - id: { - serializedName: "id", - readOnly: true, - type: { - name: "String" - } - }, - score: { - serializedName: "score", - readOnly: true, - type: { - name: "Number" - } - }, - dist: { - serializedName: "dist", - readOnly: true, - type: { - name: "Number" - } - }, - info: { - serializedName: "info", - readOnly: true, - type: { - name: "String" - } - }, - entityType: { - serializedName: "entityType", - type: { - name: "String" - } - }, - poi: { - serializedName: "poi", - type: { - name: "Composite", - className: "SearchResultPoi" - } - }, - address: { - serializedName: "address", - type: { - name: "Composite", - className: "SearchResultAddress" - } - }, - position: { - serializedName: "position", - type: { - name: "Composite", - className: "CoordinatesPairAbbreviated" - } - }, - viewport: { - serializedName: "viewport", - type: { - name: "Composite", - className: "SearchResultViewport" - } - }, - entryPoints: { - serializedName: "entryPoints", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "SearchResultEntryPoint" - } - } - } - }, - addressRanges: { - serializedName: "addressRanges", - type: { - name: "Composite", - className: "SearchResultAddressRanges" - } - }, - dataSources: { - serializedName: "dataSources", - type: { - name: "Composite", - className: "DataSources" - } - }, - matchType: { - serializedName: "matchType", - readOnly: true, - type: { - name: "String" - } - }, - detourTime: { - serializedName: "detourTime", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const SearchResultPoi: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchResultPoi", - modelProperties: { - name: { - serializedName: "name", - readOnly: true, - type: { - name: "String" - } - }, - phone: { - serializedName: "phone", - readOnly: true, - type: { - name: "String" - } - }, - url: { - serializedName: "url", - readOnly: true, - type: { - name: "String" - } - }, - categorySet: { - serializedName: "categorySet", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "SearchResultPoiCategorySet" - } - } - } - }, - categories: { - serializedName: "categories", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - classifications: { - serializedName: "classifications", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "SearchResultPoiClassification" - } - } - } - }, - brands: { - serializedName: "brands", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "SearchResultPoiBrand" - } - } - } - }, - openingHours: { - serializedName: "openingHours", - type: { - name: "Composite", - className: "SearchResultPoiOpeningHours" - } - } - } - } -}; - -export const SearchResultPoiCategorySet: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchResultPoiCategorySet", - modelProperties: { - id: { - serializedName: "id", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const SearchResultPoiClassification: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchResultPoiClassification", - modelProperties: { - code: { - serializedName: "code", - readOnly: true, - type: { - name: "String" - } - }, - names: { - serializedName: "names", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "SearchResultPoiClassificationName" - } - } - } - } - } - } -}; - -export const SearchResultPoiClassificationName: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchResultPoiClassificationName", - modelProperties: { - nameLocale: { - serializedName: "nameLocale", - readOnly: true, - type: { - name: "String" - } - }, - name: { - serializedName: "name", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const SearchResultPoiBrand: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchResultPoiBrand", - modelProperties: { - name: { - serializedName: "name", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const SearchResultPoiOpeningHours: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchResultPoiOpeningHours", - modelProperties: { - mode: { - serializedName: "mode", - readOnly: true, - type: { - name: "String" - } - }, - timeRanges: { - serializedName: "timeRanges", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "SearchResultPoiOpeningHoursTimeRange" - } - } - } - } - } - } -}; - -export const SearchResultPoiOpeningHoursTimeRange: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchResultPoiOpeningHoursTimeRange", - modelProperties: { - startTime: { - serializedName: "startTime", - type: { - name: "Composite", - className: "SearchResultPoiOpeningHoursTimeRangeTime" - } - }, - endTime: { - serializedName: "endTime", - type: { - name: "Composite", - className: "SearchResultPoiOpeningHoursTimeRangeTime" - } - } - } - } -}; - -export const SearchResultPoiOpeningHoursTimeRangeTime: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchResultPoiOpeningHoursTimeRangeTime", - modelProperties: { - date: { - serializedName: "date", - readOnly: true, - type: { - name: "String" - } - }, - hour: { - serializedName: "hour", - readOnly: true, - type: { - name: "Number" - } - }, - minute: { - serializedName: "minute", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const SearchResultAddress: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchResultAddress", - modelProperties: { - buildingNumber: { - serializedName: "buildingNumber", - readOnly: true, - type: { - name: "String" - } - }, - street: { - serializedName: "street", - readOnly: true, - type: { - name: "String" - } - }, - crossStreet: { - serializedName: "crossStreet", - readOnly: true, - type: { - name: "String" - } - }, - streetNumber: { - serializedName: "streetNumber", - readOnly: true, - type: { - name: "String" - } - }, - routeNumbers: { - serializedName: "routeNumbers", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - }, - streetName: { - serializedName: "streetName", - readOnly: true, - type: { - name: "String" - } - }, - streetNameAndNumber: { - serializedName: "streetNameAndNumber", - readOnly: true, - type: { - name: "String" - } - }, - municipality: { - serializedName: "municipality", - readOnly: true, - type: { - name: "String" - } - }, - municipalitySubdivision: { - serializedName: "municipalitySubdivision", - readOnly: true, - type: { - name: "String" - } - }, - countryTertiarySubdivision: { - serializedName: "countryTertiarySubdivision", - readOnly: true, - type: { - name: "String" - } - }, - countrySecondarySubdivision: { - serializedName: "countrySecondarySubdivision", - readOnly: true, - type: { - name: "String" - } - }, - countrySubdivision: { - serializedName: "countrySubdivision", - readOnly: true, - type: { - name: "String" - } - }, - postalCode: { - serializedName: "postalCode", - readOnly: true, - type: { - name: "String" - } - }, - extendedPostalCode: { - serializedName: "extendedPostalCode", - readOnly: true, - type: { - name: "String" - } - }, - countryCode: { - serializedName: "countryCode", - readOnly: true, - type: { - name: "String" - } - }, - country: { - serializedName: "country", - readOnly: true, - type: { - name: "String" - } - }, - countryCodeISO3: { - serializedName: "countryCodeISO3", - readOnly: true, - type: { - name: "String" - } - }, - freeformAddress: { - serializedName: "freeformAddress", - readOnly: true, - type: { - name: "String" - } - }, - countrySubdivisionName: { - serializedName: "countrySubdivisionName", - readOnly: true, - type: { - name: "String" - } - }, - localName: { - serializedName: "localName", - readOnly: true, - type: { - name: "String" - } - }, - boundingBox: { - serializedName: "boundingBox", - readOnly: true, - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - } - } - } -}; - -export const SearchResultViewport: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchResultViewport", - modelProperties: { - topLeftPoint: { - serializedName: "topLeftPoint", - type: { - name: "Composite", - className: "CoordinatesPairAbbreviated" - } - }, - btmRightPoint: { - serializedName: "btmRightPoint", - type: { - name: "Composite", - className: "CoordinatesPairAbbreviated" - } - } - } - } -}; - -export const SearchResultEntryPoint: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchResultEntryPoint", - modelProperties: { - type: { - serializedName: "type", - readOnly: true, - type: { - name: "String" - } - }, - position: { - serializedName: "position", - type: { - name: "Composite", - className: "CoordinatesPairAbbreviated" - } - } - } - } -}; - -export const SearchResultAddressRanges: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchResultAddressRanges", - modelProperties: { - rangeLeft: { - serializedName: "rangeLeft", - type: { - name: "String" - } - }, - rangeRight: { - serializedName: "rangeRight", - type: { - name: "String" - } - }, - from: { - serializedName: "from", - type: { - name: "Composite", - className: "CoordinatesPairAbbreviated" - } - }, - to: { - serializedName: "to", - type: { - name: "Composite", - className: "CoordinatesPairAbbreviated" - } - } - } - } -}; - -export const DataSources: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "DataSources", - modelProperties: { - geometry: { - serializedName: "geometry", - type: { - name: "Composite", - className: "DataSourcesGeometry" - } - } - } - } -}; - -export const DataSourcesGeometry: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "DataSourcesGeometry", - modelProperties: { - id: { - serializedName: "id", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const SearchPoiCategoryTreeResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchPoiCategoryTreeResponse", - modelProperties: { - poiCategories: { - serializedName: "poiCategories", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "PoiCategoryResult" - } - } - } - } - } - } -}; - -export const PoiCategoryResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "PoiCategoryResult", - modelProperties: { - id: { - serializedName: "id", - readOnly: true, - type: { - name: "Number" - } - }, - name: { - serializedName: "name", - readOnly: true, - type: { - name: "String" - } - }, - childCategoryIds: { - serializedName: "childCategoryIds", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - }, - synonyms: { - serializedName: "synonyms", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - } - } - } -}; - -export const SearchAddressReverseResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchAddressReverseResponse", - modelProperties: { - summary: { - serializedName: "summary", - type: { - name: "Composite", - className: "SearchCommonSummary" - } - }, - addresses: { - serializedName: "addresses", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "SearchAddressReverseResult" - } - } - } - } - } - } -}; - -export const SearchAddressReverseResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchAddressReverseResult", - modelProperties: { - address: { - serializedName: "address", - type: { - name: "Composite", - className: "SearchResultAddress" - } - }, - position: { - serializedName: "position", - readOnly: true, - type: { - name: "String" - } - }, - matchType: { - serializedName: "matchType", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const SearchAddressReverseCrossStreetResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchAddressReverseCrossStreetResponse", - modelProperties: { - summary: { - serializedName: "summary", - type: { - name: "Composite", - className: "SearchCommonSummary" - } - }, - addresses: { - serializedName: "addresses", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "SearchAddressReverseCrossStreetResult" - } - } - } - } - } - } -}; - -export const SearchAddressReverseCrossStreetResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchAddressReverseCrossStreetResult", - modelProperties: { - address: { - serializedName: "address", - type: { - name: "Composite", - className: "SearchResultAddress" - } - }, - position: { - serializedName: "position", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const SearchInsideGeometryRequestBody: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchInsideGeometryRequestBody", - modelProperties: { - geometry: { - serializedName: "geometry", - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - } - } - } -}; - -export const SearchAlongRouteRequestBody: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchAlongRouteRequestBody", - modelProperties: { - route: { - serializedName: "route", - type: { - name: "Composite", - className: "GeoJsonLineString" - } - } - } - } -}; - -export const GeoJsonLineStringData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonLineStringData", - modelProperties: { - coordinates: { - serializedName: "coordinates", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } - } - } -}; - -export const BatchRequestBody: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "BatchRequestBody", - modelProperties: { - batchItems: { - serializedName: "batchItems", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "BatchRequestBodyBatchItemsItem" - } - } - } - } - } - } -}; - -export const BatchRequestBodyBatchItemsItem: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "BatchRequestBodyBatchItemsItem", - modelProperties: { - query: { - serializedName: "query", - type: { - name: "String" - } - } - } - } -}; - -export const BatchResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "BatchResponse", - modelProperties: { - summary: { - serializedName: "summary", - type: { - name: "Composite", - className: "BatchResponseSummary" - } - } - } - } -}; - -export const BatchResponseSummary: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "BatchResponseSummary", - modelProperties: { - successfulRequests: { - serializedName: "successfulRequests", - readOnly: true, - type: { - name: "Number" - } - }, - totalRequests: { - serializedName: "totalRequests", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const BatchItem: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "BatchItem", - modelProperties: { - statusCode: { - serializedName: "statusCode", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const SearchSummaryGeoBias: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchSummaryGeoBias", - modelProperties: { - lat: { - serializedName: "lat", - readOnly: true, - type: { - name: "Number" - } - }, - lon: { - serializedName: "lon", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const GeoJsonPointData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonPointData", - modelProperties: { - coordinates: { - serializedName: "coordinates", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } -}; - -export const GeoJsonMultiPointData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonMultiPointData", - modelProperties: { - coordinates: { - serializedName: "coordinates", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } - } - } -}; - -export const GeoJsonMultiLineStringData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonMultiLineStringData", - modelProperties: { - coordinates: { - serializedName: "coordinates", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } - } - } - } - } -}; - -export const GeoJsonPolygonData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonPolygonData", - modelProperties: { - coordinates: { - serializedName: "coordinates", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } - } - } - } - } -}; - -export const GeoJsonMultiPolygonData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonMultiPolygonData", - modelProperties: { - coordinates: { - serializedName: "coordinates", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - } - } - } - } - } - } - } - } - } -}; - -export const GeoJsonGeometryCollectionData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonGeometryCollectionData", - modelProperties: { - geometries: { - serializedName: "geometries", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "GeoJsonGeometry" - } - } - } - } - } - } -}; - -export const GeoJsonFeatureData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonFeatureData", - modelProperties: { - geometry: { - serializedName: "geometry", - type: { - name: "Composite", - className: "GeoJsonGeometry" - } - }, - properties: { - serializedName: "properties", - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - }, - id: { - serializedName: "id", - type: { - name: "String" - } - }, - featureType: { - serializedName: "featureType", - type: { - name: "String" - } - } - } - } -}; - -export const GeoJsonFeatureCollectionData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "GeoJsonFeatureCollectionData", - modelProperties: { - features: { - serializedName: "features", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "GeoJsonFeature" - } - } - } - } - } - } -}; - -export const GeoJsonGeometry: coreClient.CompositeMapper = { - serializedName: "GeoJsonGeometry", - type: { - name: "Composite", - className: "GeoJsonGeometry", - uberParent: "GeoJsonObject", - polymorphicDiscriminator: { - serializedName: "type", - clientName: "type" - }, - modelProperties: { - ...GeoJsonObject.type.modelProperties - } - } -}; - -export const GeoJsonFeature: coreClient.CompositeMapper = { - serializedName: "Feature", - type: { - name: "Composite", - className: "GeoJsonFeature", - uberParent: "GeoJsonObject", - polymorphicDiscriminator: GeoJsonObject.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonObject.type.modelProperties, - ...GeoJsonFeatureData.type.modelProperties - } - } -}; - -export const GeoJsonFeatureCollection: coreClient.CompositeMapper = { - serializedName: "FeatureCollection", - type: { - name: "Composite", - className: "GeoJsonFeatureCollection", - uberParent: "GeoJsonObject", - polymorphicDiscriminator: GeoJsonObject.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonObject.type.modelProperties, - ...GeoJsonFeatureCollectionData.type.modelProperties - } - } -}; - -export const SearchFuzzyBatchItemResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchFuzzyBatchItemResponse", - modelProperties: { - ...SearchCommonResponse.type.modelProperties, - ...ErrorResponse.type.modelProperties - } - } -}; - -export const SearchAddressBatchItemResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchAddressBatchItemResponse", - modelProperties: { - ...SearchCommonResponse.type.modelProperties, - ...ErrorResponse.type.modelProperties - } - } -}; - -export const SearchAddressReverseBatchItemResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchAddressReverseBatchItemResponse", - modelProperties: { - ...SearchAddressReverseResponse.type.modelProperties, - ...ErrorResponse.type.modelProperties - } - } -}; - -export const SearchCommonSummaryGeoBias: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchCommonSummaryGeoBias", - modelProperties: { - ...CoordinatesPairAbbreviated.type.modelProperties - } - } -}; - -export const GeoJsonLineString: coreClient.CompositeMapper = { - serializedName: "LineString", - type: { - name: "Composite", - className: "GeoJsonLineString", - uberParent: "GeoJsonLineStringData", - polymorphicDiscriminator: - GeoJsonLineStringData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonLineStringData.type.modelProperties - } - } -}; - -export const SearchFuzzyBatchResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchFuzzyBatchResponse", - modelProperties: { - ...BatchResponse.type.modelProperties, - batchItems: { - serializedName: "batchItems", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "SearchFuzzyBatchItem" - } - } - } - } - } - } -}; - -export const SearchAddressBatchResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchAddressBatchResponse", - modelProperties: { - ...BatchResponse.type.modelProperties, - batchItems: { - serializedName: "batchItems", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "SearchAddressBatchItem" - } - } - } - } - } - } -}; - -export const SearchAddressReverseBatchResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchAddressReverseBatchResponse", - modelProperties: { - ...BatchResponse.type.modelProperties, - batchItems: { - serializedName: "batchItems", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "SearchAddressReverseBatchItem" - } - } - } - } - } - } -}; - -export const SearchFuzzyBatchItem: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchFuzzyBatchItem", - modelProperties: { - ...BatchItem.type.modelProperties, - response: { - serializedName: "response", - type: { - name: "Composite", - className: "SearchFuzzyBatchItemResponse" - } - } - } - } -}; - -export const SearchAddressBatchItem: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchAddressBatchItem", - modelProperties: { - ...BatchItem.type.modelProperties, - response: { - serializedName: "response", - type: { - name: "Composite", - className: "SearchAddressBatchItemResponse" - } - } - } - } -}; - -export const SearchAddressReverseBatchItem: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchAddressReverseBatchItem", - modelProperties: { - ...BatchItem.type.modelProperties, - response: { - serializedName: "response", - type: { - name: "Composite", - className: "SearchAddressReverseBatchItemResponse" - } - } - } - } -}; - -export const GeoJsonPoint: coreClient.CompositeMapper = { - serializedName: "Point", - type: { - name: "Composite", - className: "GeoJsonPoint", - uberParent: "GeoJsonPointData", - polymorphicDiscriminator: GeoJsonPointData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonPointData.type.modelProperties - } - } -}; - -export const GeoJsonMultiPoint: coreClient.CompositeMapper = { - serializedName: "MultiPoint", - type: { - name: "Composite", - className: "GeoJsonMultiPoint", - uberParent: "GeoJsonMultiPointData", - polymorphicDiscriminator: - GeoJsonMultiPointData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonMultiPointData.type.modelProperties - } - } -}; - -export const GeoJsonMultiLineString: coreClient.CompositeMapper = { - serializedName: "MultiLineString", - type: { - name: "Composite", - className: "GeoJsonMultiLineString", - uberParent: "GeoJsonMultiLineStringData", - polymorphicDiscriminator: - GeoJsonMultiLineStringData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonMultiLineStringData.type.modelProperties - } - } -}; - -export const GeoJsonPolygon: coreClient.CompositeMapper = { - serializedName: "Polygon", - type: { - name: "Composite", - className: "GeoJsonPolygon", - uberParent: "GeoJsonPolygonData", - polymorphicDiscriminator: GeoJsonPolygonData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonPolygonData.type.modelProperties - } - } -}; - -export const GeoJsonMultiPolygon: coreClient.CompositeMapper = { - serializedName: "MultiPolygon", - type: { - name: "Composite", - className: "GeoJsonMultiPolygon", - uberParent: "GeoJsonMultiPolygonData", - polymorphicDiscriminator: - GeoJsonMultiPolygonData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonMultiPolygonData.type.modelProperties - } - } -}; - -export const GeoJsonGeometryCollection: coreClient.CompositeMapper = { - serializedName: "GeometryCollection", - type: { - name: "Composite", - className: "GeoJsonGeometryCollection", - uberParent: "GeoJsonGeometryCollectionData", - polymorphicDiscriminator: - GeoJsonGeometryCollectionData.type.polymorphicDiscriminator, - modelProperties: { - ...GeoJsonGeometry.type.modelProperties, - ...GeoJsonGeometryCollectionData.type.modelProperties - } - } -}; - -export const SearchPostSearchFuzzyBatchHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchPostSearchFuzzyBatchHeaders", - modelProperties: { - location: { - serializedName: "location", - type: { - name: "String" - } - } - } - } -}; - -export const SearchPostSearchAddressBatchHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchPostSearchAddressBatchHeaders", - modelProperties: { - location: { - serializedName: "location", - type: { - name: "String" - } - } - } - } -}; - -export const SearchPostSearchAddressReverseBatchHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SearchPostSearchAddressReverseBatchHeaders", - modelProperties: { - location: { - serializedName: "location", - type: { - name: "String" - } - } - } - } -}; - -export let discriminators = { - GeoJsonObject: GeoJsonObject, - "GeoJsonObject.GeoJsonGeometry": GeoJsonGeometry, - "GeoJsonObject.Feature": GeoJsonFeature, - "GeoJsonObject.FeatureCollection": GeoJsonFeatureCollection, - "GeoJsonLineStringData.LineString": GeoJsonLineString, - "GeoJsonPointData.Point": GeoJsonPoint, - "GeoJsonMultiPointData.MultiPoint": GeoJsonMultiPoint, - "GeoJsonMultiLineStringData.MultiLineString": GeoJsonMultiLineString, - "GeoJsonPolygonData.Polygon": GeoJsonPolygon, - "GeoJsonMultiPolygonData.MultiPolygon": GeoJsonMultiPolygon, - "GeoJsonGeometryCollectionData.GeometryCollection": GeoJsonGeometryCollection -}; diff --git a/sdk/maps/maps-search/src/models/parameters.ts b/sdk/maps/maps-search/src/models/parameters.ts deleted file mode 100644 index 49166b71eea2..000000000000 --- a/sdk/maps/maps-search/src/models/parameters.ts +++ /dev/null @@ -1,620 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { - OperationParameter, - OperationURLParameter, - OperationQueryParameter -} from "@azure/core-client"; -import { - SearchInsideGeometryRequestBody as SearchInsideGeometryRequestBodyMapper, - SearchAlongRouteRequestBody as SearchAlongRouteRequestBodyMapper, - BatchRequestBody as BatchRequestBodyMapper -} from "../models/mappers"; - -export const accept: OperationParameter = { - parameterPath: "accept", - mapper: { - defaultValue: "application/json", - isConstant: true, - serializedName: "Accept", - type: { - name: "String" - } - } -}; - -export const geography: OperationURLParameter = { - parameterPath: "geography", - mapper: { - serializedName: "geography", - required: true, - type: { - name: "String" - } - } -}; - -export const xMsClientId: OperationParameter = { - parameterPath: "xMsClientId", - mapper: { - serializedName: "x-ms-client-id", - type: { - name: "String" - } - } -}; - -export const apiVersion: OperationQueryParameter = { - parameterPath: "apiVersion", - mapper: { - defaultValue: "1.0", - isConstant: true, - serializedName: "api-version", - type: { - name: "String" - } - } -}; - -export const format: OperationURLParameter = { - parameterPath: "format", - mapper: { - serializedName: "format", - required: true, - type: { - name: "String" - } - } -}; - -export const geometries: OperationQueryParameter = { - parameterPath: "geometries", - mapper: { - serializedName: "geometries", - required: true, - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - collectionFormat: "CSV" -}; - -export const format1: OperationURLParameter = { - parameterPath: "format", - mapper: { - serializedName: "format", - required: true, - type: { - name: "String" - } - } -}; - -export const query: OperationQueryParameter = { - parameterPath: "query", - mapper: { - serializedName: "query", - required: true, - type: { - name: "String" - } - } -}; - -export const typeahead: OperationQueryParameter = { - parameterPath: ["options", "typeahead"], - mapper: { - serializedName: "typeahead", - type: { - name: "Boolean" - } - } -}; - -export const limit: OperationQueryParameter = { - parameterPath: ["options", "limit"], - mapper: { - constraints: { - InclusiveMaximum: 100, - InclusiveMinimum: 1 - }, - serializedName: "limit", - type: { - name: "Number" - } - } -}; - -export const ofs: OperationQueryParameter = { - parameterPath: ["options", "ofs"], - mapper: { - constraints: { - InclusiveMaximum: 1900, - InclusiveMinimum: 0 - }, - serializedName: "ofs", - type: { - name: "Number" - } - } -}; - -export const categorySet: OperationQueryParameter = { - parameterPath: ["options", "categorySet"], - mapper: { - serializedName: "categorySet", - type: { - name: "Sequence", - element: { - type: { - name: "Number" - } - } - } - }, - collectionFormat: "CSV" -}; - -export const countrySet: OperationQueryParameter = { - parameterPath: ["options", "countrySet"], - mapper: { - serializedName: "countrySet", - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - collectionFormat: "CSV" -}; - -export const lat: OperationQueryParameter = { - parameterPath: ["options", "lat"], - mapper: { - serializedName: "lat", - type: { - name: "Number" - } - } -}; - -export const lon: OperationQueryParameter = { - parameterPath: ["options", "lon"], - mapper: { - serializedName: "lon", - type: { - name: "Number" - } - } -}; - -export const radius: OperationQueryParameter = { - parameterPath: ["options", "radius"], - mapper: { - serializedName: "radius", - type: { - name: "Number" - } - } -}; - -export const topLeft: OperationQueryParameter = { - parameterPath: ["options", "topLeft"], - mapper: { - serializedName: "topLeft", - type: { - name: "String" - } - } -}; - -export const btmRight: OperationQueryParameter = { - parameterPath: ["options", "btmRight"], - mapper: { - serializedName: "btmRight", - type: { - name: "String" - } - } -}; - -export const language: OperationQueryParameter = { - parameterPath: ["options", "language"], - mapper: { - serializedName: "language", - type: { - name: "String" - } - } -}; - -export const extendedPostalCodesFor: OperationQueryParameter = { - parameterPath: ["options", "extendedPostalCodesFor"], - mapper: { - serializedName: "extendedPostalCodesFor", - type: { - name: "String" - } - } -}; - -export const minFuzzyLevel: OperationQueryParameter = { - parameterPath: ["options", "minFuzzyLevel"], - mapper: { - constraints: { - InclusiveMaximum: 4, - InclusiveMinimum: 1 - }, - serializedName: "minFuzzyLevel", - type: { - name: "Number" - } - } -}; - -export const maxFuzzyLevel: OperationQueryParameter = { - parameterPath: ["options", "maxFuzzyLevel"], - mapper: { - constraints: { - InclusiveMaximum: 4, - InclusiveMinimum: 1 - }, - serializedName: "maxFuzzyLevel", - type: { - name: "Number" - } - } -}; - -export const idxSet: OperationQueryParameter = { - parameterPath: ["options", "idxSet"], - mapper: { - serializedName: "idxSet", - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - collectionFormat: "CSV" -}; - -export const brandSet: OperationQueryParameter = { - parameterPath: ["options", "brandSet"], - mapper: { - serializedName: "brandSet", - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - collectionFormat: "CSV" -}; - -export const connectorSet: OperationQueryParameter = { - parameterPath: ["options", "connectorSet"], - mapper: { - serializedName: "connectorSet", - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - collectionFormat: "CSV" -}; - -export const view: OperationQueryParameter = { - parameterPath: ["options", "view"], - mapper: { - serializedName: "view", - type: { - name: "String" - } - } -}; - -export const openingHours: OperationQueryParameter = { - parameterPath: ["options", "openingHours"], - mapper: { - serializedName: "openingHours", - type: { - name: "String" - } - } -}; - -export const lat1: OperationQueryParameter = { - parameterPath: "lat", - mapper: { - serializedName: "lat", - required: true, - type: { - name: "Number" - } - } -}; - -export const lon1: OperationQueryParameter = { - parameterPath: "lon", - mapper: { - serializedName: "lon", - required: true, - type: { - name: "Number" - } - } -}; - -export const returnSpeedLimit: OperationQueryParameter = { - parameterPath: ["options", "returnSpeedLimit"], - mapper: { - serializedName: "returnSpeedLimit", - type: { - name: "Boolean" - } - } -}; - -export const heading: OperationQueryParameter = { - parameterPath: ["options", "heading"], - mapper: { - constraints: { - InclusiveMaximum: 360, - InclusiveMinimum: -360 - }, - serializedName: "heading", - type: { - name: "Number" - } - } -}; - -export const numberParam: OperationQueryParameter = { - parameterPath: ["options", "numberParam"], - mapper: { - serializedName: "number", - type: { - name: "String" - } - } -}; - -export const returnRoadUse: OperationQueryParameter = { - parameterPath: ["options", "returnRoadUse"], - mapper: { - serializedName: "returnRoadUse", - type: { - name: "Boolean" - } - } -}; - -export const roadUse: OperationQueryParameter = { - parameterPath: ["options", "roadUse"], - mapper: { - serializedName: "roadUse", - type: { - name: "String" - } - } -}; - -export const allowFreeformNewline: OperationQueryParameter = { - parameterPath: ["options", "allowFreeformNewline"], - mapper: { - serializedName: "allowFreeformNewline", - type: { - name: "Boolean" - } - } -}; - -export const returnMatchType: OperationQueryParameter = { - parameterPath: ["options", "returnMatchType"], - mapper: { - serializedName: "returnMatchType", - type: { - name: "Boolean" - } - } -}; - -export const entityType: OperationQueryParameter = { - parameterPath: ["options", "entityType"], - mapper: { - serializedName: "entityType", - type: { - name: "String" - } - } -}; - -export const countryCode: OperationQueryParameter = { - parameterPath: ["options", "countryCode"], - mapper: { - defaultValue: "US", - serializedName: "countryCode", - type: { - name: "String" - } - } -}; - -export const streetNumber: OperationQueryParameter = { - parameterPath: ["options", "streetNumber"], - mapper: { - serializedName: "streetNumber", - type: { - name: "String" - } - } -}; - -export const streetName: OperationQueryParameter = { - parameterPath: ["options", "streetName"], - mapper: { - serializedName: "streetName", - type: { - name: "String" - } - } -}; - -export const crossStreet: OperationQueryParameter = { - parameterPath: ["options", "crossStreet"], - mapper: { - serializedName: "crossStreet", - type: { - name: "String" - } - } -}; - -export const municipality: OperationQueryParameter = { - parameterPath: ["options", "municipality"], - mapper: { - serializedName: "municipality", - type: { - name: "String" - } - } -}; - -export const municipalitySubdivision: OperationQueryParameter = { - parameterPath: ["options", "municipalitySubdivision"], - mapper: { - serializedName: "municipalitySubdivision", - type: { - name: "String" - } - } -}; - -export const countryTertiarySubdivision: OperationQueryParameter = { - parameterPath: ["options", "countryTertiarySubdivision"], - mapper: { - serializedName: "countryTertiarySubdivision", - type: { - name: "String" - } - } -}; - -export const countrySecondarySubdivision: OperationQueryParameter = { - parameterPath: ["options", "countrySecondarySubdivision"], - mapper: { - serializedName: "countrySecondarySubdivision", - type: { - name: "String" - } - } -}; - -export const countrySubdivision: OperationQueryParameter = { - parameterPath: ["options", "countrySubdivision"], - mapper: { - serializedName: "countrySubdivision", - type: { - name: "String" - } - } -}; - -export const postalCode: OperationQueryParameter = { - parameterPath: ["options", "postalCode"], - mapper: { - serializedName: "postalCode", - type: { - name: "String" - } - } -}; - -export const contentType: OperationParameter = { - parameterPath: ["options", "contentType"], - mapper: { - defaultValue: "application/json", - isConstant: true, - serializedName: "Content-Type", - type: { - name: "String" - } - } -}; - -export const searchInsideGeometryRequestBody: OperationParameter = { - parameterPath: "searchInsideGeometryRequestBody", - mapper: SearchInsideGeometryRequestBodyMapper -}; - -export const searchAlongRouteRequestBody: OperationParameter = { - parameterPath: "searchAlongRouteRequestBody", - mapper: SearchAlongRouteRequestBodyMapper -}; - -export const maxDetourTime: OperationQueryParameter = { - parameterPath: "maxDetourTime", - mapper: { - constraints: { - InclusiveMaximum: 3600 - }, - serializedName: "maxDetourTime", - required: true, - type: { - name: "Number" - } - } -}; - -export const limit1: OperationQueryParameter = { - parameterPath: ["options", "limit"], - mapper: { - constraints: { - InclusiveMaximum: 20 - }, - serializedName: "limit", - type: { - name: "Number" - } - } -}; - -export const searchFuzzyBatchRequestBody: OperationParameter = { - parameterPath: "searchFuzzyBatchRequestBody", - mapper: BatchRequestBodyMapper -}; - -export const searchAddressBatchRequestBody: OperationParameter = { - parameterPath: "searchAddressBatchRequestBody", - mapper: BatchRequestBodyMapper -}; - -export const searchAddressReverseBatchRequestBody: OperationParameter = { - parameterPath: "searchAddressReverseBatchRequestBody", - mapper: BatchRequestBodyMapper -}; diff --git a/sdk/maps/maps-search/src/operations/index.ts b/sdk/maps/maps-search/src/operations/index.ts deleted file mode 100644 index 3ff28b477242..000000000000 --- a/sdk/maps/maps-search/src/operations/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./search"; diff --git a/sdk/maps/maps-search/src/operations/search.ts b/sdk/maps/maps-search/src/operations/search.ts deleted file mode 100644 index 94a8bc0734ba..000000000000 --- a/sdk/maps/maps-search/src/operations/search.ts +++ /dev/null @@ -1,2899 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { Search } from "../operationsInterfaces"; -import * as coreClient from "@azure/core-client"; -import * as Mappers from "../models/mappers"; -import * as Parameters from "../models/parameters"; -import { SearchClientContext } from "../searchClientContext"; -import { LROPoller, shouldDeserializeLRO } from "../lro"; -import { PollerLike, PollOperationState } from "@azure/core-lro"; -import { - ResponseFormat, - SearchGetSearchPolygonOptionalParams, - SearchGetSearchPolygonResponse, - TextFormat, - SearchGetSearchFuzzyOptionalParams, - SearchGetSearchFuzzyResponse, - SearchGetSearchPOIOptionalParams, - SearchGetSearchPOIResponse, - SearchGetSearchNearbyOptionalParams, - SearchGetSearchNearbyResponse, - SearchGetSearchPOICategoryOptionalParams, - SearchGetSearchPOICategoryResponse, - SearchGetSearchPOICategoryTreePreviewOptionalParams, - SearchGetSearchPOICategoryTreePreviewResponse, - SearchGetSearchAddressOptionalParams, - SearchGetSearchAddressResponse, - SearchGetSearchAddressReverseOptionalParams, - SearchGetSearchAddressReverseResponse, - SearchGetSearchAddressReverseCrossStreetOptionalParams, - SearchGetSearchAddressReverseCrossStreetResponse, - SearchGetSearchAddressStructuredOptionalParams, - SearchGetSearchAddressStructuredResponse, - SearchInsideGeometryRequestBody, - SearchPostSearchInsideGeometryOptionalParams, - SearchPostSearchInsideGeometryResponse, - SearchAlongRouteRequestBody, - SearchPostSearchAlongRouteOptionalParams, - SearchPostSearchAlongRouteResponse, - BatchRequestBody, - SearchPostSearchFuzzyBatchSyncOptionalParams, - SearchPostSearchFuzzyBatchSyncResponse, - SearchPostSearchFuzzyBatchOptionalParams, - SearchPostSearchFuzzyBatchResponse, - SearchPostSearchAddressBatchSyncOptionalParams, - SearchPostSearchAddressBatchSyncResponse, - SearchPostSearchAddressBatchOptionalParams, - SearchPostSearchAddressBatchResponse, - SearchPostSearchAddressReverseBatchSyncOptionalParams, - SearchPostSearchAddressReverseBatchSyncResponse, - SearchPostSearchAddressReverseBatchOptionalParams, - SearchPostSearchAddressReverseBatchResponse -} from "../models"; - -/** Class representing a Search. */ -export class SearchImpl implements Search { - private readonly client: SearchClientContext; - - /** - * Initialize a new instance of the class Search class. - * @param client Reference to the service client - */ - constructor(client: SearchClientContext) { - this.client = client; - } - - /** - * **Get Polygon** - * - * - * **Applies to**: S1 pricing tier. - * - * - * The Get Polygon service allows you to request the geometry data such as a city or country outline - * for a set of entities, previously retrieved from an Online Search request in GeoJSON format. The - * geometry ID is returned in the dataSources object under "geometry" and "id" in either a Search - * Address or Search Fuzzy call. - * - * Please note that any geometry ID retrieved from an Online Search endpoint has a limited lifetime. - * The client should not store geometry IDs in persistent storage for later referral, as the stability - * of these identifiers is not guaranteed for a long period of time. It is expected that a request to - * the Polygon method is made within a few minutes of the request to the Online Search method that - * provided the ID. The service allows for batch requests up to 20 identifiers. - * @param format Desired format of the response. Only `json` format is supported. - * @param geometries Comma separated list of geometry UUIDs, previously retrieved from an Online Search - * request. - * @param options The options parameters. - */ - getSearchPolygon( - format: ResponseFormat, - geometries: string[], - options?: SearchGetSearchPolygonOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, geometries, options }, - getSearchPolygonOperationSpec - ); - } - - /** - * **Free Form Search** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * The basic default API is Free Form Search which handles the most fuzzy of inputs handling any - * combination of address or POI tokens. This search API is the canonical 'single line search'. The - * Free Form Search API is a seamless combination of POI search and geocoding. The API can also be - * weighted with a contextual position (lat./lon. pair), or fully constrained by a coordinate and - * radius, or it can be executed more generally without any geo biasing anchor point.

We - * strongly advise you to use the 'countrySet' parameter to specify only the countries for which your - * application needs coverage, as the default behavior will be to search the entire world, potentially - * returning unnecessary results.

E.g.: `countrySet`=US,FR

Please see [Search - * Coverage](https://docs.microsoft.com/azure/location-based-services/geocoding-coverage) for a - * complete list of all the supported countries.

Most Search queries default to - * `maxFuzzyLevel`=2 to gain performance and also reduce unusual results. This new default can be - * overridden as needed per request by passing in the query param `maxFuzzyLevel`=3 or 4. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The applicable query string (e.g., "seattle", "pizza"). Can _also_ be specified as a - * comma separated string composed by latitude followed by longitude (e.g., "47.641268, -122.125679"). - * Must be properly URL encoded. - * @param options The options parameters. - */ - getSearchFuzzy( - format: TextFormat, - query: string, - options?: SearchGetSearchFuzzyOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getSearchFuzzyOperationSpec - ); - } - - /** - * **Get POI by Name** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Points of Interest (POI) Search allows you to request POI results by name. Search supports - * additional query parameters such as language and filtering results by area of interest driven by - * country or bounding box. Endpoint will return only POI results matching the query string. Response - * includes POI details such as address, coordinate location and category. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The POI name to search for (e.g., "statue of liberty", "starbucks"), must be properly - * URL encoded. - * @param options The options parameters. - */ - getSearchPOI( - format: TextFormat, - query: string, - options?: SearchGetSearchPOIOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getSearchPOIOperationSpec - ); - } - - /** - * **Nearby Search** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * If you have a use case for only retrieving POI results around a specific location, the nearby search - * method may be the right choice. This endpoint will only return POI results, and does not take in a - * search query parameter. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param lat Latitude where results should be biased. E.g. 37.337. - * @param lon Longitude where results should be biased. E.g. -121.89. - * @param options The options parameters. - */ - getSearchNearby( - format: TextFormat, - lat: number, - lon: number, - options?: SearchGetSearchNearbyOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, lat, lon, options }, - getSearchNearbyOperationSpec - ); - } - - /** - * **Get POI by Category** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Points of Interest (POI) Category Search allows you to request POI results from given category. - * Search allows to query POIs from one category at a time. Endpoint will only return POI results - * which are categorized as specified. Response includes POI details such as address, coordinate - * location and classification. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The POI category to search for (e.g., "AIRPORT", "RESTAURANT"), must be properly URL - * encoded. Supported main categories can be requested by calling [Get Search POI Category Tree - * API](https://aka.ms/AzureMapsPOICategoryTree). List of available categories can also be found - * [here](https://docs.microsoft.com/azure/azure-maps/supported-search-categories). We recommend to use - * POI Search Category Tree API to request the supported categories. - * @param options The options parameters. - */ - getSearchPOICategory( - format: TextFormat, - query: string, - options?: SearchGetSearchPOICategoryOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getSearchPOICategoryOperationSpec - ); - } - - /** - * **Get POI Category Tree** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * POI Category API provides a full list of supported Points of Interest (POI) categories and - * subcategories together with their translations and synonyms. The returned content can be used to - * provide more meaningful results through other Search Service APIs, like [Get Search - * POI](https://docs.microsoft.com/rest/api/maps/search/getsearchpoi). - * @param format Desired format of the response. Only `json` format is supported. - * @param options The options parameters. - */ - getSearchPOICategoryTreePreview( - format: ResponseFormat, - options?: SearchGetSearchPOICategoryTreePreviewOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, options }, - getSearchPOICategoryTreePreviewOperationSpec - ); - } - - /** - * **Address Geocoding** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * In many cases, the complete search service might be too much, for instance if you are only - * interested in traditional geocoding. Search can also be accessed for address look up exclusively. - * The geocoding is performed by hitting the geocode endpoint with just the address or partial address - * in question. The geocoding search index will be queried for everything above the street level data. - * No POIs will be returned. Note that the geocoder is very tolerant of typos and incomplete addresses. - * It will also handle everything from exact street addresses or street or intersections as well as - * higher level geographies such as city centers, counties, states etc. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The address to search for (e.g., "1 Microsoft way, Redmond, WA"), must be properly URL - * encoded. - * @param options The options parameters. - */ - getSearchAddress( - format: TextFormat, - query: string, - options?: SearchGetSearchAddressOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getSearchAddressOperationSpec - ); - } - - /** - * **Reverse Geocode to an Address** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * There may be times when you need to translate a coordinate (example: 37.786505, -122.3862) into a - * human understandable street address. Most often this is needed in tracking applications where you - * receive a GPS feed from the device or asset and wish to know what address where the coordinate is - * located. This endpoint will return address information for a given coordinate. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The applicable query specified as a comma separated string composed by latitude - * followed by longitude e.g. "47.641268,-122.125679". - * @param options The options parameters. - */ - getSearchAddressReverse( - format: TextFormat, - query: string, - options?: SearchGetSearchAddressReverseOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getSearchAddressReverseOperationSpec - ); - } - - /** - * **Reverse Geocode to a Cross Street** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * There may be times when you need to translate a coordinate (example: 37.786505, -122.3862) into a - * human understandable cross street. Most often this is needed in tracking applications where you - * receive a GPS feed from the device or asset and wish to know what address where the coordinate is - * located. - * This endpoint will return cross street information for a given coordinate. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The applicable query specified as a comma separated string composed by latitude - * followed by longitude e.g. "47.641268,-122.125679". - * @param options The options parameters. - */ - getSearchAddressReverseCrossStreet( - format: TextFormat, - query: string, - options?: SearchGetSearchAddressReverseCrossStreetOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getSearchAddressReverseCrossStreetOperationSpec - ); - } - - /** - * **Structured Address Geocoding** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Azure Address Geocoding can also be accessed for structured address look up exclusively. The - * geocoding search index will be queried for everything above the street level data. No POIs will be - * returned. Note that the geocoder is very tolerant of typos and incomplete addresses. It will also - * handle everything from exact street addresses or street or intersections as well as higher level - * geographies such as city centers, counties, states etc. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param options The options parameters. - */ - getSearchAddressStructured( - format: TextFormat, - options?: SearchGetSearchAddressStructuredOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, options }, - getSearchAddressStructuredOperationSpec - ); - } - - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * The Search Geometry endpoint allows you to perform a free form search inside a single geometry or - * many of them. The search results that fall inside the geometry/geometries will be - * returned.

To send the geometry you will use a `POST` request where the request body will - * contain the `geometry` object represented as a `GeoJSON` type and the `Content-Type` header will be - * set to `application/json`. The geographical features to be searched can be modeled as Polygon and/or - * Circle geometries represented using any one of the following `GeoJSON` types:

.

- * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The POI name to search for (e.g., "statue of liberty", "starbucks", "pizza"). Must be - * properly URL encoded. - * @param searchInsideGeometryRequestBody This represents the geometry for one or more geographical - * features (parks, state boundary etc.) to search in and should be a GeoJSON compliant type. Please - * refer to [RFC 7946](https://tools.ietf.org/html/rfc7946) for details. - * @param options The options parameters. - */ - postSearchInsideGeometry( - format: TextFormat, - query: string, - searchInsideGeometryRequestBody: SearchInsideGeometryRequestBody, - options?: SearchPostSearchInsideGeometryOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, searchInsideGeometryRequestBody, options }, - postSearchInsideGeometryOperationSpec - ); - } - - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * The Search Along Route endpoint allows you to perform a fuzzy search for POIs along a specified - * route. This search is constrained by specifying the `maxDetourTime` limiting measure.

To send - * the route-points you will use a `POST` request where the request body will contain the `route` - * object represented as a `GeoJSON LineString` type and the `Content-Type` header will be set to - * `application/json`. Each route-point in `route` is represented as a `GeoJSON Position` type i.e. an - * array where the _longitude_ value is followed by the _latitude_ value and the _altitude_ value is - * ignored. The `route` should contain at least 2 route-points.

It is possible that original - * route will be altered, some of it's points may be skipped. If the route that passes through the - * found point is faster than the original one, the `detourTime` value in the response is negative. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The POI name to search for (e.g., "statue of liberty", "starbucks", "pizza"). Must be - * properly URL encoded. - * @param maxDetourTime Maximum detour time of the point of interest in seconds. Max value is 3600 - * seconds - * @param searchAlongRouteRequestBody This represents the route to search along and should be a valid - * `GeoJSON LineString` type. Please refer to [RFC - * 7946](https://tools.ietf.org/html/rfc7946#section-3.1.4) for details. - * @param options The options parameters. - */ - postSearchAlongRoute( - format: TextFormat, - query: string, - maxDetourTime: number, - searchAlongRouteRequestBody: SearchAlongRouteRequestBody, - options?: SearchPostSearchAlongRouteOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, maxDetourTime, searchAlongRouteRequestBody, options }, - postSearchAlongRouteOperationSpec - ); - } - - /** - * **Search Fuzzy Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Search Address Batch API sends batches of queries to [Search Fuzzy - * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy) using just a single API - * call. You can call Search Address Fuzzy Batch API to run either asynchronously (async) or - * synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API up - * to **100** queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/search/fuzzy/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **10,000** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Search Address Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` - * GET - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _search fuzzy_ queries you will use a `POST` request where the request body will contain - * the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 5 _search fuzzy_ queries: - * - * - * ```json - * { - * "batchItems": [ - * {"query": "?query=atm&lat=47.639769&lon=-122.128362&radius=5000&limit=5"}, - * {"query": "?query=Statue Of Liberty&limit=2"}, - * {"query": "?query=Starbucks&lat=47.639769&lon=-122.128362&radius=5000"}, - * {"query": "?query=Space Needle"}, - * {"query": "?query=pizza&limit=10"} - * ] - * } - * ``` - * - * A _search fuzzy_ query in a batch is just a partial URL _without_ the protocol, base URL, path, - * api-version and subscription-key. It can accept any of the supported _search fuzzy_ [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#uri-parameters). - * The string values in the _search fuzzy_ query must be properly escaped (e.g. " character should be - * escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, - * and the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#searchcommonresponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 2, - * "totalRequests": 3 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "atm" - * }, - * "results": [ - * { - * "type": "POI", - * "poi": { - * "name": "ATM at Wells Fargo" - * }, - * "address": { - * "country": "United States Of America", - * "freeformAddress": "3240 157th Ave NE, Redmond, WA 98052" - * } - * } - * ] - * } - * }, - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "statue of liberty" - * }, - * "results": [ - * { - * "type": "POI", - * "poi": { - * "name": "Statue of Liberty" - * }, - * "address": { - * "country": "United States Of America", - * "freeformAddress": "New York, NY 10004" - * } - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param searchFuzzyBatchRequestBody The list of search fuzzy queries/requests to process. The list - * can contain a max of 10,000 queries and must contain at least 1 query. - * @param options The options parameters. - */ - postSearchFuzzyBatchSync( - format: ResponseFormat, - searchFuzzyBatchRequestBody: BatchRequestBody, - options?: SearchPostSearchFuzzyBatchSyncOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, searchFuzzyBatchRequestBody, options }, - postSearchFuzzyBatchSyncOperationSpec - ); - } - - /** - * **Search Fuzzy Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Search Address Batch API sends batches of queries to [Search Fuzzy - * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy) using just a single API - * call. You can call Search Address Fuzzy Batch API to run either asynchronously (async) or - * synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API up - * to **100** queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/search/fuzzy/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **10,000** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Search Address Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` - * GET - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _search fuzzy_ queries you will use a `POST` request where the request body will contain - * the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 5 _search fuzzy_ queries: - * - * - * ```json - * { - * "batchItems": [ - * {"query": "?query=atm&lat=47.639769&lon=-122.128362&radius=5000&limit=5"}, - * {"query": "?query=Statue Of Liberty&limit=2"}, - * {"query": "?query=Starbucks&lat=47.639769&lon=-122.128362&radius=5000"}, - * {"query": "?query=Space Needle"}, - * {"query": "?query=pizza&limit=10"} - * ] - * } - * ``` - * - * A _search fuzzy_ query in a batch is just a partial URL _without_ the protocol, base URL, path, - * api-version and subscription-key. It can accept any of the supported _search fuzzy_ [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#uri-parameters). - * The string values in the _search fuzzy_ query must be properly escaped (e.g. " character should be - * escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, - * and the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#searchcommonresponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 2, - * "totalRequests": 3 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "atm" - * }, - * "results": [ - * { - * "type": "POI", - * "poi": { - * "name": "ATM at Wells Fargo" - * }, - * "address": { - * "country": "United States Of America", - * "freeformAddress": "3240 157th Ave NE, Redmond, WA 98052" - * } - * } - * ] - * } - * }, - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "statue of liberty" - * }, - * "results": [ - * { - * "type": "POI", - * "poi": { - * "name": "Statue of Liberty" - * }, - * "address": { - * "country": "United States Of America", - * "freeformAddress": "New York, NY 10004" - * } - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param searchFuzzyBatchRequestBody The list of search fuzzy queries/requests to process. The list - * can contain a max of 10,000 queries and must contain at least 1 query. - * @param options The options parameters. - */ - async beginPostSearchFuzzyBatch( - format: ResponseFormat, - searchFuzzyBatchRequestBody: BatchRequestBody, - options?: SearchPostSearchFuzzyBatchOptionalParams - ): Promise< - PollerLike< - PollOperationState, - SearchPostSearchFuzzyBatchResponse - > - > { - const directSendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ): Promise => { - return this.client.sendOperationRequest(args, spec); - }; - const sendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ) => { - let currentRawResponse: - | coreClient.FullOperationResponse - | undefined = undefined; - const providedCallback = args.options?.onResponse; - const callback: coreClient.RawResponseCallback = ( - rawResponse: coreClient.FullOperationResponse, - flatResponse: unknown - ) => { - currentRawResponse = rawResponse; - providedCallback?.(rawResponse, flatResponse); - }; - const updatedArgs = { - ...args, - options: { - ...args.options, - onResponse: callback - } - }; - const flatResponse = await directSendOperation(updatedArgs, spec); - return { flatResponse, rawResponse: currentRawResponse! }; - }; - - return new LROPoller( - { intervalInMs: options?.updateIntervalInMs }, - { format, searchFuzzyBatchRequestBody, options }, - postSearchFuzzyBatchOperationSpec, - sendOperation, - "location" - ); - } - - /** - * **Search Fuzzy Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Search Address Batch API sends batches of queries to [Search Fuzzy - * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy) using just a single API - * call. You can call Search Address Fuzzy Batch API to run either asynchronously (async) or - * synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API up - * to **100** queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/search/fuzzy/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **10,000** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Search Address Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` - * GET - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _search fuzzy_ queries you will use a `POST` request where the request body will contain - * the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 5 _search fuzzy_ queries: - * - * - * ```json - * { - * "batchItems": [ - * {"query": "?query=atm&lat=47.639769&lon=-122.128362&radius=5000&limit=5"}, - * {"query": "?query=Statue Of Liberty&limit=2"}, - * {"query": "?query=Starbucks&lat=47.639769&lon=-122.128362&radius=5000"}, - * {"query": "?query=Space Needle"}, - * {"query": "?query=pizza&limit=10"} - * ] - * } - * ``` - * - * A _search fuzzy_ query in a batch is just a partial URL _without_ the protocol, base URL, path, - * api-version and subscription-key. It can accept any of the supported _search fuzzy_ [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#uri-parameters). - * The string values in the _search fuzzy_ query must be properly escaped (e.g. " character should be - * escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, - * and the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#searchcommonresponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 2, - * "totalRequests": 3 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "atm" - * }, - * "results": [ - * { - * "type": "POI", - * "poi": { - * "name": "ATM at Wells Fargo" - * }, - * "address": { - * "country": "United States Of America", - * "freeformAddress": "3240 157th Ave NE, Redmond, WA 98052" - * } - * } - * ] - * } - * }, - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "statue of liberty" - * }, - * "results": [ - * { - * "type": "POI", - * "poi": { - * "name": "Statue of Liberty" - * }, - * "address": { - * "country": "United States Of America", - * "freeformAddress": "New York, NY 10004" - * } - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param searchFuzzyBatchRequestBody The list of search fuzzy queries/requests to process. The list - * can contain a max of 10,000 queries and must contain at least 1 query. - * @param options The options parameters. - */ - async beginPostSearchFuzzyBatchAndWait( - format: ResponseFormat, - searchFuzzyBatchRequestBody: BatchRequestBody, - options?: SearchPostSearchFuzzyBatchOptionalParams - ): Promise { - const poller = await this.beginPostSearchFuzzyBatch( - format, - searchFuzzyBatchRequestBody, - options - ); - return poller.pollUntilDone(); - } - - /** - * **Search Address Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Search Address Batch API sends batches of queries to [Search Address - * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress) using just a single API - * call. You can call Search Address Batch API to run either asynchronously (async) or synchronously - * (sync). The async API allows caller to batch up to **10,000** queries and sync API up to **100** - * queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/search/address/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **10,000** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Search Address Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` - * GET - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _search address_ queries you will use a `POST` request where the request body will - * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 5 _search address_ queries: - * - * - * ```json - * { - * "batchItems": [ - * {"query": "?query=400 Broad St, Seattle, WA 98109&limit=3"}, - * {"query": "?query=One, Microsoft Way, Redmond, WA 98052&limit=3"}, - * {"query": "?query=350 5th Ave, New York, NY 10118&limit=1"}, - * {"query": "?query=Pike Pl, Seattle, WA 98101&lat=47.610970&lon=-122.342469&radius=1000"}, - * {"query": "?query=Champ de Mars, 5 Avenue Anatole France, 75007 Paris, France&limit=1"} - * ] - * } - * ``` - * - * A _search address_ query in a batch is just a partial URL _without_ the protocol, base URL, path, - * api-version and subscription-key. It can accept any of the supported _search address_ [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#uri-parameters). - * The string values in the _search address_ query must be properly escaped (e.g. " character should be - * escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, - * and the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#SearchCommonResponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 2, - * "totalRequests": 3 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "one microsoft way redmond wa 98052" - * }, - * "results": [ - * { - * "position": { - * "lat": 47.63989, - * "lon": -122.12509 - * } - * } - * ] - * } - * }, - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "pike pl seattle wa 98101" - * }, - * "results": [ - * { - * "position": { - * "lat": 47.60963, - * "lon": -122.34215 - * } - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param searchAddressBatchRequestBody The list of address geocoding queries/requests to process. The - * list can contain a max of 10,000 queries and must contain at least 1 query. - * @param options The options parameters. - */ - postSearchAddressBatchSync( - format: ResponseFormat, - searchAddressBatchRequestBody: BatchRequestBody, - options?: SearchPostSearchAddressBatchSyncOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, searchAddressBatchRequestBody, options }, - postSearchAddressBatchSyncOperationSpec - ); - } - - /** - * **Search Address Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Search Address Batch API sends batches of queries to [Search Address - * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress) using just a single API - * call. You can call Search Address Batch API to run either asynchronously (async) or synchronously - * (sync). The async API allows caller to batch up to **10,000** queries and sync API up to **100** - * queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/search/address/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **10,000** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Search Address Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` - * GET - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _search address_ queries you will use a `POST` request where the request body will - * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 5 _search address_ queries: - * - * - * ```json - * { - * "batchItems": [ - * {"query": "?query=400 Broad St, Seattle, WA 98109&limit=3"}, - * {"query": "?query=One, Microsoft Way, Redmond, WA 98052&limit=3"}, - * {"query": "?query=350 5th Ave, New York, NY 10118&limit=1"}, - * {"query": "?query=Pike Pl, Seattle, WA 98101&lat=47.610970&lon=-122.342469&radius=1000"}, - * {"query": "?query=Champ de Mars, 5 Avenue Anatole France, 75007 Paris, France&limit=1"} - * ] - * } - * ``` - * - * A _search address_ query in a batch is just a partial URL _without_ the protocol, base URL, path, - * api-version and subscription-key. It can accept any of the supported _search address_ [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#uri-parameters). - * The string values in the _search address_ query must be properly escaped (e.g. " character should be - * escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, - * and the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#SearchCommonResponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 2, - * "totalRequests": 3 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "one microsoft way redmond wa 98052" - * }, - * "results": [ - * { - * "position": { - * "lat": 47.63989, - * "lon": -122.12509 - * } - * } - * ] - * } - * }, - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "pike pl seattle wa 98101" - * }, - * "results": [ - * { - * "position": { - * "lat": 47.60963, - * "lon": -122.34215 - * } - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param searchAddressBatchRequestBody The list of address geocoding queries/requests to process. The - * list can contain a max of 10,000 queries and must contain at least 1 query. - * @param options The options parameters. - */ - async beginPostSearchAddressBatch( - format: ResponseFormat, - searchAddressBatchRequestBody: BatchRequestBody, - options?: SearchPostSearchAddressBatchOptionalParams - ): Promise< - PollerLike< - PollOperationState, - SearchPostSearchAddressBatchResponse - > - > { - const directSendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ): Promise => { - return this.client.sendOperationRequest(args, spec); - }; - const sendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ) => { - let currentRawResponse: - | coreClient.FullOperationResponse - | undefined = undefined; - const providedCallback = args.options?.onResponse; - const callback: coreClient.RawResponseCallback = ( - rawResponse: coreClient.FullOperationResponse, - flatResponse: unknown - ) => { - currentRawResponse = rawResponse; - providedCallback?.(rawResponse, flatResponse); - }; - const updatedArgs = { - ...args, - options: { - ...args.options, - onResponse: callback - } - }; - const flatResponse = await directSendOperation(updatedArgs, spec); - return { flatResponse, rawResponse: currentRawResponse! }; - }; - - return new LROPoller( - { intervalInMs: options?.updateIntervalInMs }, - { format, searchAddressBatchRequestBody, options }, - postSearchAddressBatchOperationSpec, - sendOperation, - "location" - ); - } - - /** - * **Search Address Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Search Address Batch API sends batches of queries to [Search Address - * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress) using just a single API - * call. You can call Search Address Batch API to run either asynchronously (async) or synchronously - * (sync). The async API allows caller to batch up to **10,000** queries and sync API up to **100** - * queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/search/address/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **10,000** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Search Address Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` - * GET - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _search address_ queries you will use a `POST` request where the request body will - * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 5 _search address_ queries: - * - * - * ```json - * { - * "batchItems": [ - * {"query": "?query=400 Broad St, Seattle, WA 98109&limit=3"}, - * {"query": "?query=One, Microsoft Way, Redmond, WA 98052&limit=3"}, - * {"query": "?query=350 5th Ave, New York, NY 10118&limit=1"}, - * {"query": "?query=Pike Pl, Seattle, WA 98101&lat=47.610970&lon=-122.342469&radius=1000"}, - * {"query": "?query=Champ de Mars, 5 Avenue Anatole France, 75007 Paris, France&limit=1"} - * ] - * } - * ``` - * - * A _search address_ query in a batch is just a partial URL _without_ the protocol, base URL, path, - * api-version and subscription-key. It can accept any of the supported _search address_ [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#uri-parameters). - * The string values in the _search address_ query must be properly escaped (e.g. " character should be - * escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, - * and the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#SearchCommonResponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 2, - * "totalRequests": 3 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "one microsoft way redmond wa 98052" - * }, - * "results": [ - * { - * "position": { - * "lat": 47.63989, - * "lon": -122.12509 - * } - * } - * ] - * } - * }, - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "pike pl seattle wa 98101" - * }, - * "results": [ - * { - * "position": { - * "lat": 47.60963, - * "lon": -122.34215 - * } - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param searchAddressBatchRequestBody The list of address geocoding queries/requests to process. The - * list can contain a max of 10,000 queries and must contain at least 1 query. - * @param options The options parameters. - */ - async beginPostSearchAddressBatchAndWait( - format: ResponseFormat, - searchAddressBatchRequestBody: BatchRequestBody, - options?: SearchPostSearchAddressBatchOptionalParams - ): Promise { - const poller = await this.beginPostSearchAddressBatch( - format, - searchAddressBatchRequestBody, - options - ); - return poller.pollUntilDone(); - } - - /** - * **Search Address Reverse Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Search Address Batch API sends batches of queries to [Search Address Reverse - * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse) using just a - * single API call. You can call Search Address Reverse Batch API to run either asynchronously (async) - * or synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API - * up to **100** queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/search/address/reverse/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **10,000** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Search Address Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` - * GET - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _search address reverse_ queries you will use a `POST` request where the request body - * will contain the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 5 _search address reverse_ queries: - * - * - * ```json - * { - * "batchItems": [ - * {"query": "?query=48.858561,2.294911"}, - * {"query": "?query=47.639765,-122.127896&radius=5000&limit=2"}, - * {"query": "?query=47.621028,-122.348170"}, - * {"query": "?query=43.722990,10.396695"}, - * {"query": "?query=40.750958,-73.982336"} - * ] - * } - * ``` - * - * A _search address reverse_ query in a batch is just a partial URL _without_ the protocol, base URL, - * path, api-version and subscription-key. It can accept any of the supported _search address reverse_ - * [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#uri-parameters). - * The string values in the _search address reverse_ query must be properly escaped (e.g. " character - * should be escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, - * and the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`SearchAddressReverseResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#searchaddressreverseresponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 2, - * "totalRequests": 3 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "queryTime": 11 - * }, - * "addresses": [ - * { - * "address": { - * "country": "France", - * "freeformAddress": "Avenue Anatole France, 75007 Paris" - * }, - * "position": "48.858490,2.294820" - * } - * ] - * } - * }, - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "queryTime": 1 - * }, - * "addresses": [ - * { - * "address": { - * "country": "United States of America", - * "freeformAddress": "157th Pl NE, Redmond WA 98052" - * }, - * "position": "47.640470,-122.129430" - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param searchAddressReverseBatchRequestBody The list of reverse geocoding queries/requests to - * process. The list can contain a max of 10,000 queries and must contain at least 1 query. - * @param options The options parameters. - */ - postSearchAddressReverseBatchSync( - format: ResponseFormat, - searchAddressReverseBatchRequestBody: BatchRequestBody, - options?: SearchPostSearchAddressReverseBatchSyncOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, searchAddressReverseBatchRequestBody, options }, - postSearchAddressReverseBatchSyncOperationSpec - ); - } - - /** - * **Search Address Reverse Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Search Address Batch API sends batches of queries to [Search Address Reverse - * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse) using just a - * single API call. You can call Search Address Reverse Batch API to run either asynchronously (async) - * or synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API - * up to **100** queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/search/address/reverse/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **10,000** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Search Address Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` - * GET - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _search address reverse_ queries you will use a `POST` request where the request body - * will contain the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 5 _search address reverse_ queries: - * - * - * ```json - * { - * "batchItems": [ - * {"query": "?query=48.858561,2.294911"}, - * {"query": "?query=47.639765,-122.127896&radius=5000&limit=2"}, - * {"query": "?query=47.621028,-122.348170"}, - * {"query": "?query=43.722990,10.396695"}, - * {"query": "?query=40.750958,-73.982336"} - * ] - * } - * ``` - * - * A _search address reverse_ query in a batch is just a partial URL _without_ the protocol, base URL, - * path, api-version and subscription-key. It can accept any of the supported _search address reverse_ - * [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#uri-parameters). - * The string values in the _search address reverse_ query must be properly escaped (e.g. " character - * should be escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, - * and the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`SearchAddressReverseResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#searchaddressreverseresponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 2, - * "totalRequests": 3 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "queryTime": 11 - * }, - * "addresses": [ - * { - * "address": { - * "country": "France", - * "freeformAddress": "Avenue Anatole France, 75007 Paris" - * }, - * "position": "48.858490,2.294820" - * } - * ] - * } - * }, - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "queryTime": 1 - * }, - * "addresses": [ - * { - * "address": { - * "country": "United States of America", - * "freeformAddress": "157th Pl NE, Redmond WA 98052" - * }, - * "position": "47.640470,-122.129430" - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param searchAddressReverseBatchRequestBody The list of reverse geocoding queries/requests to - * process. The list can contain a max of 10,000 queries and must contain at least 1 query. - * @param options The options parameters. - */ - async beginPostSearchAddressReverseBatch( - format: ResponseFormat, - searchAddressReverseBatchRequestBody: BatchRequestBody, - options?: SearchPostSearchAddressReverseBatchOptionalParams - ): Promise< - PollerLike< - PollOperationState, - SearchPostSearchAddressReverseBatchResponse - > - > { - const directSendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ): Promise => { - return this.client.sendOperationRequest(args, spec); - }; - const sendOperation = async ( - args: coreClient.OperationArguments, - spec: coreClient.OperationSpec - ) => { - let currentRawResponse: - | coreClient.FullOperationResponse - | undefined = undefined; - const providedCallback = args.options?.onResponse; - const callback: coreClient.RawResponseCallback = ( - rawResponse: coreClient.FullOperationResponse, - flatResponse: unknown - ) => { - currentRawResponse = rawResponse; - providedCallback?.(rawResponse, flatResponse); - }; - const updatedArgs = { - ...args, - options: { - ...args.options, - onResponse: callback - } - }; - const flatResponse = await directSendOperation(updatedArgs, spec); - return { flatResponse, rawResponse: currentRawResponse! }; - }; - - return new LROPoller( - { intervalInMs: options?.updateIntervalInMs }, - { format, searchAddressReverseBatchRequestBody, options }, - postSearchAddressReverseBatchOperationSpec, - sendOperation, - "location" - ); - } - - /** - * **Search Address Reverse Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Search Address Batch API sends batches of queries to [Search Address Reverse - * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse) using just a - * single API call. You can call Search Address Reverse Batch API to run either asynchronously (async) - * or synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API - * up to **100** queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/search/address/reverse/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **10,000** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Search Address Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` - * GET - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _search address reverse_ queries you will use a `POST` request where the request body - * will contain the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 5 _search address reverse_ queries: - * - * - * ```json - * { - * "batchItems": [ - * {"query": "?query=48.858561,2.294911"}, - * {"query": "?query=47.639765,-122.127896&radius=5000&limit=2"}, - * {"query": "?query=47.621028,-122.348170"}, - * {"query": "?query=43.722990,10.396695"}, - * {"query": "?query=40.750958,-73.982336"} - * ] - * } - * ``` - * - * A _search address reverse_ query in a batch is just a partial URL _without_ the protocol, base URL, - * path, api-version and subscription-key. It can accept any of the supported _search address reverse_ - * [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#uri-parameters). - * The string values in the _search address reverse_ query must be properly escaped (e.g. " character - * should be escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, - * and the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`SearchAddressReverseResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#searchaddressreverseresponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 2, - * "totalRequests": 3 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "queryTime": 11 - * }, - * "addresses": [ - * { - * "address": { - * "country": "France", - * "freeformAddress": "Avenue Anatole France, 75007 Paris" - * }, - * "position": "48.858490,2.294820" - * } - * ] - * } - * }, - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "queryTime": 1 - * }, - * "addresses": [ - * { - * "address": { - * "country": "United States of America", - * "freeformAddress": "157th Pl NE, Redmond WA 98052" - * }, - * "position": "47.640470,-122.129430" - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param searchAddressReverseBatchRequestBody The list of reverse geocoding queries/requests to - * process. The list can contain a max of 10,000 queries and must contain at least 1 query. - * @param options The options parameters. - */ - async beginPostSearchAddressReverseBatchAndWait( - format: ResponseFormat, - searchAddressReverseBatchRequestBody: BatchRequestBody, - options?: SearchPostSearchAddressReverseBatchOptionalParams - ): Promise { - const poller = await this.beginPostSearchAddressReverseBatch( - format, - searchAddressReverseBatchRequestBody, - options - ); - return poller.pollUntilDone(); - } -} -// Operation Specifications -const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); - -const getSearchPolygonOperationSpec: coreClient.OperationSpec = { - path: "/search/polygon/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.SearchPolygonResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion, Parameters.geometries], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getSearchFuzzyOperationSpec: coreClient.OperationSpec = { - path: "/search/fuzzy/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.SearchCommonResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.query, - Parameters.typeahead, - Parameters.limit, - Parameters.ofs, - Parameters.categorySet, - Parameters.countrySet, - Parameters.lat, - Parameters.lon, - Parameters.radius, - Parameters.topLeft, - Parameters.btmRight, - Parameters.language, - Parameters.extendedPostalCodesFor, - Parameters.minFuzzyLevel, - Parameters.maxFuzzyLevel, - Parameters.idxSet, - Parameters.brandSet, - Parameters.connectorSet, - Parameters.view, - Parameters.openingHours - ], - urlParameters: [Parameters.geography, Parameters.format1], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getSearchPOIOperationSpec: coreClient.OperationSpec = { - path: "/search/poi/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.SearchCommonResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.query, - Parameters.typeahead, - Parameters.limit, - Parameters.ofs, - Parameters.categorySet, - Parameters.countrySet, - Parameters.lat, - Parameters.lon, - Parameters.radius, - Parameters.topLeft, - Parameters.btmRight, - Parameters.language, - Parameters.extendedPostalCodesFor, - Parameters.brandSet, - Parameters.connectorSet, - Parameters.view, - Parameters.openingHours - ], - urlParameters: [Parameters.geography, Parameters.format1], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getSearchNearbyOperationSpec: coreClient.OperationSpec = { - path: "/search/nearby/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.SearchCommonResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.limit, - Parameters.ofs, - Parameters.categorySet, - Parameters.countrySet, - Parameters.radius, - Parameters.language, - Parameters.extendedPostalCodesFor, - Parameters.brandSet, - Parameters.connectorSet, - Parameters.view, - Parameters.lat1, - Parameters.lon1 - ], - urlParameters: [Parameters.geography, Parameters.format1], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getSearchPOICategoryOperationSpec: coreClient.OperationSpec = { - path: "/search/poi/category/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.SearchCommonResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.query, - Parameters.typeahead, - Parameters.limit, - Parameters.ofs, - Parameters.categorySet, - Parameters.countrySet, - Parameters.lat, - Parameters.lon, - Parameters.radius, - Parameters.topLeft, - Parameters.btmRight, - Parameters.language, - Parameters.extendedPostalCodesFor, - Parameters.brandSet, - Parameters.connectorSet, - Parameters.view, - Parameters.openingHours - ], - urlParameters: [Parameters.geography, Parameters.format1], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getSearchPOICategoryTreePreviewOperationSpec: coreClient.OperationSpec = { - path: "/search/poi/category/tree/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.SearchPoiCategoryTreeResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion, Parameters.language], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getSearchAddressOperationSpec: coreClient.OperationSpec = { - path: "/search/address/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.SearchCommonResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.query, - Parameters.typeahead, - Parameters.limit, - Parameters.ofs, - Parameters.countrySet, - Parameters.lat, - Parameters.lon, - Parameters.radius, - Parameters.topLeft, - Parameters.btmRight, - Parameters.language, - Parameters.extendedPostalCodesFor, - Parameters.view - ], - urlParameters: [Parameters.geography, Parameters.format1], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getSearchAddressReverseOperationSpec: coreClient.OperationSpec = { - path: "/search/address/reverse/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.SearchAddressReverseResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.query, - Parameters.radius, - Parameters.language, - Parameters.view, - Parameters.returnSpeedLimit, - Parameters.heading, - Parameters.numberParam, - Parameters.returnRoadUse, - Parameters.roadUse, - Parameters.allowFreeformNewline, - Parameters.returnMatchType, - Parameters.entityType - ], - urlParameters: [Parameters.geography, Parameters.format1], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getSearchAddressReverseCrossStreetOperationSpec: coreClient.OperationSpec = { - path: "/search/address/reverse/crossStreet/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.SearchAddressReverseCrossStreetResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.query, - Parameters.limit, - Parameters.radius, - Parameters.language, - Parameters.view, - Parameters.heading - ], - urlParameters: [Parameters.geography, Parameters.format1], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getSearchAddressStructuredOperationSpec: coreClient.OperationSpec = { - path: "/search/address/structured/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.SearchCommonResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.limit, - Parameters.ofs, - Parameters.language, - Parameters.extendedPostalCodesFor, - Parameters.view, - Parameters.countryCode, - Parameters.streetNumber, - Parameters.streetName, - Parameters.crossStreet, - Parameters.municipality, - Parameters.municipalitySubdivision, - Parameters.countryTertiarySubdivision, - Parameters.countrySecondarySubdivision, - Parameters.countrySubdivision, - Parameters.postalCode - ], - urlParameters: [Parameters.geography, Parameters.format1], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const postSearchInsideGeometryOperationSpec: coreClient.OperationSpec = { - path: "/search/geometry/{format}", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.SearchCommonResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.searchInsideGeometryRequestBody, - queryParameters: [ - Parameters.apiVersion, - Parameters.query, - Parameters.limit, - Parameters.categorySet, - Parameters.language, - Parameters.extendedPostalCodesFor, - Parameters.idxSet, - Parameters.view, - Parameters.openingHours - ], - urlParameters: [Parameters.geography, Parameters.format1], - headerParameters: [ - Parameters.accept, - Parameters.xMsClientId, - Parameters.contentType - ], - mediaType: "json", - serializer -}; -const postSearchAlongRouteOperationSpec: coreClient.OperationSpec = { - path: "/search/alongRoute/{format}", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.SearchCommonResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.searchAlongRouteRequestBody, - queryParameters: [ - Parameters.apiVersion, - Parameters.query, - Parameters.categorySet, - Parameters.brandSet, - Parameters.connectorSet, - Parameters.view, - Parameters.openingHours, - Parameters.maxDetourTime, - Parameters.limit1 - ], - urlParameters: [Parameters.geography, Parameters.format1], - headerParameters: [ - Parameters.accept, - Parameters.xMsClientId, - Parameters.contentType - ], - mediaType: "json", - serializer -}; -const postSearchFuzzyBatchSyncOperationSpec: coreClient.OperationSpec = { - path: "/search/fuzzy/batch/sync/{format}", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.SearchFuzzyBatchResponse - }, - 408: { - bodyMapper: Mappers.ErrorResponse, - isError: true - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.searchFuzzyBatchRequestBody, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [ - Parameters.accept, - Parameters.xMsClientId, - Parameters.contentType - ], - mediaType: "json", - serializer -}; -const postSearchFuzzyBatchOperationSpec: coreClient.OperationSpec = { - path: "/search/fuzzy/batch/{format}", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.SearchFuzzyBatchResponse - }, - 201: { - bodyMapper: Mappers.SearchFuzzyBatchResponse - }, - 202: { - bodyMapper: Mappers.SearchFuzzyBatchResponse - }, - 204: { - bodyMapper: Mappers.SearchFuzzyBatchResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.searchFuzzyBatchRequestBody, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [ - Parameters.accept, - Parameters.xMsClientId, - Parameters.contentType - ], - mediaType: "json", - serializer -}; -const postSearchAddressBatchSyncOperationSpec: coreClient.OperationSpec = { - path: "/search/address/batch/sync/{format}", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.SearchAddressBatchResponse - }, - 408: { - bodyMapper: Mappers.ErrorResponse, - isError: true - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.searchAddressBatchRequestBody, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [ - Parameters.accept, - Parameters.xMsClientId, - Parameters.contentType - ], - mediaType: "json", - serializer -}; -const postSearchAddressBatchOperationSpec: coreClient.OperationSpec = { - path: "/search/address/batch/{format}", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.SearchAddressBatchResponse - }, - 201: { - bodyMapper: Mappers.SearchAddressBatchResponse - }, - 202: { - bodyMapper: Mappers.SearchAddressBatchResponse - }, - 204: { - bodyMapper: Mappers.SearchAddressBatchResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.searchAddressBatchRequestBody, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [ - Parameters.accept, - Parameters.xMsClientId, - Parameters.contentType - ], - mediaType: "json", - serializer -}; -const postSearchAddressReverseBatchSyncOperationSpec: coreClient.OperationSpec = { - path: "/search/address/reverse/batch/sync/{format}", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.SearchAddressReverseBatchResponse - }, - 408: { - bodyMapper: Mappers.ErrorResponse, - isError: true - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.searchAddressReverseBatchRequestBody, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [ - Parameters.accept, - Parameters.xMsClientId, - Parameters.contentType - ], - mediaType: "json", - serializer -}; -const postSearchAddressReverseBatchOperationSpec: coreClient.OperationSpec = { - path: "/search/address/reverse/batch/{format}", - httpMethod: "POST", - responses: { - 200: { - bodyMapper: Mappers.SearchAddressReverseBatchResponse - }, - 201: { - bodyMapper: Mappers.SearchAddressReverseBatchResponse - }, - 202: { - bodyMapper: Mappers.SearchAddressReverseBatchResponse - }, - 204: { - bodyMapper: Mappers.SearchAddressReverseBatchResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - requestBody: Parameters.searchAddressReverseBatchRequestBody, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [ - Parameters.accept, - Parameters.xMsClientId, - Parameters.contentType - ], - mediaType: "json", - serializer -}; diff --git a/sdk/maps/maps-search/src/operationsInterfaces/index.ts b/sdk/maps/maps-search/src/operationsInterfaces/index.ts deleted file mode 100644 index 3ff28b477242..000000000000 --- a/sdk/maps/maps-search/src/operationsInterfaces/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./search"; diff --git a/sdk/maps/maps-search/src/operationsInterfaces/search.ts b/sdk/maps/maps-search/src/operationsInterfaces/search.ts deleted file mode 100644 index 9555fa861263..000000000000 --- a/sdk/maps/maps-search/src/operationsInterfaces/search.ts +++ /dev/null @@ -1,2121 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { PollerLike, PollOperationState } from "@azure/core-lro"; -import { - ResponseFormat, - SearchGetSearchPolygonOptionalParams, - SearchGetSearchPolygonResponse, - TextFormat, - SearchGetSearchFuzzyOptionalParams, - SearchGetSearchFuzzyResponse, - SearchGetSearchPOIOptionalParams, - SearchGetSearchPOIResponse, - SearchGetSearchNearbyOptionalParams, - SearchGetSearchNearbyResponse, - SearchGetSearchPOICategoryOptionalParams, - SearchGetSearchPOICategoryResponse, - SearchGetSearchPOICategoryTreePreviewOptionalParams, - SearchGetSearchPOICategoryTreePreviewResponse, - SearchGetSearchAddressOptionalParams, - SearchGetSearchAddressResponse, - SearchGetSearchAddressReverseOptionalParams, - SearchGetSearchAddressReverseResponse, - SearchGetSearchAddressReverseCrossStreetOptionalParams, - SearchGetSearchAddressReverseCrossStreetResponse, - SearchGetSearchAddressStructuredOptionalParams, - SearchGetSearchAddressStructuredResponse, - SearchInsideGeometryRequestBody, - SearchPostSearchInsideGeometryOptionalParams, - SearchPostSearchInsideGeometryResponse, - SearchAlongRouteRequestBody, - SearchPostSearchAlongRouteOptionalParams, - SearchPostSearchAlongRouteResponse, - BatchRequestBody, - SearchPostSearchFuzzyBatchSyncOptionalParams, - SearchPostSearchFuzzyBatchSyncResponse, - SearchPostSearchFuzzyBatchOptionalParams, - SearchPostSearchFuzzyBatchResponse, - SearchPostSearchAddressBatchSyncOptionalParams, - SearchPostSearchAddressBatchSyncResponse, - SearchPostSearchAddressBatchOptionalParams, - SearchPostSearchAddressBatchResponse, - SearchPostSearchAddressReverseBatchSyncOptionalParams, - SearchPostSearchAddressReverseBatchSyncResponse, - SearchPostSearchAddressReverseBatchOptionalParams, - SearchPostSearchAddressReverseBatchResponse -} from "../models"; - -/** Interface representing a Search. */ -export interface Search { - /** - * **Get Polygon** - * - * - * **Applies to**: S1 pricing tier. - * - * - * The Get Polygon service allows you to request the geometry data such as a city or country outline - * for a set of entities, previously retrieved from an Online Search request in GeoJSON format. The - * geometry ID is returned in the dataSources object under "geometry" and "id" in either a Search - * Address or Search Fuzzy call. - * - * Please note that any geometry ID retrieved from an Online Search endpoint has a limited lifetime. - * The client should not store geometry IDs in persistent storage for later referral, as the stability - * of these identifiers is not guaranteed for a long period of time. It is expected that a request to - * the Polygon method is made within a few minutes of the request to the Online Search method that - * provided the ID. The service allows for batch requests up to 20 identifiers. - * @param format Desired format of the response. Only `json` format is supported. - * @param geometries Comma separated list of geometry UUIDs, previously retrieved from an Online Search - * request. - * @param options The options parameters. - */ - getSearchPolygon( - format: ResponseFormat, - geometries: string[], - options?: SearchGetSearchPolygonOptionalParams - ): Promise; - /** - * **Free Form Search** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * The basic default API is Free Form Search which handles the most fuzzy of inputs handling any - * combination of address or POI tokens. This search API is the canonical 'single line search'. The - * Free Form Search API is a seamless combination of POI search and geocoding. The API can also be - * weighted with a contextual position (lat./lon. pair), or fully constrained by a coordinate and - * radius, or it can be executed more generally without any geo biasing anchor point.

We - * strongly advise you to use the 'countrySet' parameter to specify only the countries for which your - * application needs coverage, as the default behavior will be to search the entire world, potentially - * returning unnecessary results.

E.g.: `countrySet`=US,FR

Please see [Search - * Coverage](https://docs.microsoft.com/azure/location-based-services/geocoding-coverage) for a - * complete list of all the supported countries.

Most Search queries default to - * `maxFuzzyLevel`=2 to gain performance and also reduce unusual results. This new default can be - * overridden as needed per request by passing in the query param `maxFuzzyLevel`=3 or 4. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The applicable query string (e.g., "seattle", "pizza"). Can _also_ be specified as a - * comma separated string composed by latitude followed by longitude (e.g., "47.641268, -122.125679"). - * Must be properly URL encoded. - * @param options The options parameters. - */ - getSearchFuzzy( - format: TextFormat, - query: string, - options?: SearchGetSearchFuzzyOptionalParams - ): Promise; - /** - * **Get POI by Name** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Points of Interest (POI) Search allows you to request POI results by name. Search supports - * additional query parameters such as language and filtering results by area of interest driven by - * country or bounding box. Endpoint will return only POI results matching the query string. Response - * includes POI details such as address, coordinate location and category. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The POI name to search for (e.g., "statue of liberty", "starbucks"), must be properly - * URL encoded. - * @param options The options parameters. - */ - getSearchPOI( - format: TextFormat, - query: string, - options?: SearchGetSearchPOIOptionalParams - ): Promise; - /** - * **Nearby Search** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * If you have a use case for only retrieving POI results around a specific location, the nearby search - * method may be the right choice. This endpoint will only return POI results, and does not take in a - * search query parameter. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param lat Latitude where results should be biased. E.g. 37.337. - * @param lon Longitude where results should be biased. E.g. -121.89. - * @param options The options parameters. - */ - getSearchNearby( - format: TextFormat, - lat: number, - lon: number, - options?: SearchGetSearchNearbyOptionalParams - ): Promise; - /** - * **Get POI by Category** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Points of Interest (POI) Category Search allows you to request POI results from given category. - * Search allows to query POIs from one category at a time. Endpoint will only return POI results - * which are categorized as specified. Response includes POI details such as address, coordinate - * location and classification. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The POI category to search for (e.g., "AIRPORT", "RESTAURANT"), must be properly URL - * encoded. Supported main categories can be requested by calling [Get Search POI Category Tree - * API](https://aka.ms/AzureMapsPOICategoryTree). List of available categories can also be found - * [here](https://docs.microsoft.com/azure/azure-maps/supported-search-categories). We recommend to use - * POI Search Category Tree API to request the supported categories. - * @param options The options parameters. - */ - getSearchPOICategory( - format: TextFormat, - query: string, - options?: SearchGetSearchPOICategoryOptionalParams - ): Promise; - /** - * **Get POI Category Tree** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * POI Category API provides a full list of supported Points of Interest (POI) categories and - * subcategories together with their translations and synonyms. The returned content can be used to - * provide more meaningful results through other Search Service APIs, like [Get Search - * POI](https://docs.microsoft.com/rest/api/maps/search/getsearchpoi). - * @param format Desired format of the response. Only `json` format is supported. - * @param options The options parameters. - */ - getSearchPOICategoryTreePreview( - format: ResponseFormat, - options?: SearchGetSearchPOICategoryTreePreviewOptionalParams - ): Promise; - /** - * **Address Geocoding** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * In many cases, the complete search service might be too much, for instance if you are only - * interested in traditional geocoding. Search can also be accessed for address look up exclusively. - * The geocoding is performed by hitting the geocode endpoint with just the address or partial address - * in question. The geocoding search index will be queried for everything above the street level data. - * No POIs will be returned. Note that the geocoder is very tolerant of typos and incomplete addresses. - * It will also handle everything from exact street addresses or street or intersections as well as - * higher level geographies such as city centers, counties, states etc. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The address to search for (e.g., "1 Microsoft way, Redmond, WA"), must be properly URL - * encoded. - * @param options The options parameters. - */ - getSearchAddress( - format: TextFormat, - query: string, - options?: SearchGetSearchAddressOptionalParams - ): Promise; - /** - * **Reverse Geocode to an Address** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * There may be times when you need to translate a coordinate (example: 37.786505, -122.3862) into a - * human understandable street address. Most often this is needed in tracking applications where you - * receive a GPS feed from the device or asset and wish to know what address where the coordinate is - * located. This endpoint will return address information for a given coordinate. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The applicable query specified as a comma separated string composed by latitude - * followed by longitude e.g. "47.641268,-122.125679". - * @param options The options parameters. - */ - getSearchAddressReverse( - format: TextFormat, - query: string, - options?: SearchGetSearchAddressReverseOptionalParams - ): Promise; - /** - * **Reverse Geocode to a Cross Street** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * There may be times when you need to translate a coordinate (example: 37.786505, -122.3862) into a - * human understandable cross street. Most often this is needed in tracking applications where you - * receive a GPS feed from the device or asset and wish to know what address where the coordinate is - * located. - * This endpoint will return cross street information for a given coordinate. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The applicable query specified as a comma separated string composed by latitude - * followed by longitude e.g. "47.641268,-122.125679". - * @param options The options parameters. - */ - getSearchAddressReverseCrossStreet( - format: TextFormat, - query: string, - options?: SearchGetSearchAddressReverseCrossStreetOptionalParams - ): Promise; - /** - * **Structured Address Geocoding** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Azure Address Geocoding can also be accessed for structured address look up exclusively. The - * geocoding search index will be queried for everything above the street level data. No POIs will be - * returned. Note that the geocoder is very tolerant of typos and incomplete addresses. It will also - * handle everything from exact street addresses or street or intersections as well as higher level - * geographies such as city centers, counties, states etc. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param options The options parameters. - */ - getSearchAddressStructured( - format: TextFormat, - options?: SearchGetSearchAddressStructuredOptionalParams - ): Promise; - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * The Search Geometry endpoint allows you to perform a free form search inside a single geometry or - * many of them. The search results that fall inside the geometry/geometries will be - * returned.

To send the geometry you will use a `POST` request where the request body will - * contain the `geometry` object represented as a `GeoJSON` type and the `Content-Type` header will be - * set to `application/json`. The geographical features to be searched can be modeled as Polygon and/or - * Circle geometries represented using any one of the following `GeoJSON` types:
  • **GeoJSON - * FeatureCollection**
    The `geometry` can be represented as a `GeoJSON FeatureCollection` object. - * This is the recommended option if the geometry contains both Polygons and Circles. The - * `FeatureCollection` can contain a max of 50 `GeoJSON Feature` objects. Each `Feature` object should - * represent either a Polygon or a Circle with the following conditions:
    • A `Feature` object for the Polygon geometry can have a max of 50 - * coordinates and it's properties must be empty.
    • A `Feature` object for the Circle geometry is - * composed of a _center_ represented using a `GeoJSON Point` type and a _radius_ value (in meters) - * which must be specified in the object's properties along with the _subType_ property whose value - * should be 'Circle'.

    Please see the Examples section below for a sample - * `FeatureCollection` representation.

  • **GeoJSON GeometryCollection**
    The `geometry` - * can be represented as a `GeoJSON GeometryCollection` object. This is the recommended option if the - * geometry contains a list of Polygons only. The `GeometryCollection` can contain a max of 50 `GeoJSON - * Polygon` objects. Each `Polygon` object can have a max of 50 coordinates. Please see the Examples - * section below for a sample `GeometryCollection` representation.

  • **GeoJSON - * Polygon**
    The `geometry` can be represented as a `GeoJSON Polygon` object. This is the - * recommended option if the geometry contains a single Polygon. The `Polygon` object can have a max of - * 50 coordinates. Please see the Examples section below for a sample `Polygon` - * representation.

.

- * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The POI name to search for (e.g., "statue of liberty", "starbucks", "pizza"). Must be - * properly URL encoded. - * @param searchInsideGeometryRequestBody This represents the geometry for one or more geographical - * features (parks, state boundary etc.) to search in and should be a GeoJSON compliant type. Please - * refer to [RFC 7946](https://tools.ietf.org/html/rfc7946) for details. - * @param options The options parameters. - */ - postSearchInsideGeometry( - format: TextFormat, - query: string, - searchInsideGeometryRequestBody: SearchInsideGeometryRequestBody, - options?: SearchPostSearchInsideGeometryOptionalParams - ): Promise; - /** - * **Applies to**: S0 and S1 pricing tiers. - * - * - * The Search Along Route endpoint allows you to perform a fuzzy search for POIs along a specified - * route. This search is constrained by specifying the `maxDetourTime` limiting measure.

To send - * the route-points you will use a `POST` request where the request body will contain the `route` - * object represented as a `GeoJSON LineString` type and the `Content-Type` header will be set to - * `application/json`. Each route-point in `route` is represented as a `GeoJSON Position` type i.e. an - * array where the _longitude_ value is followed by the _latitude_ value and the _altitude_ value is - * ignored. The `route` should contain at least 2 route-points.

It is possible that original - * route will be altered, some of it's points may be skipped. If the route that passes through the - * found point is faster than the original one, the `detourTime` value in the response is negative. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param query The POI name to search for (e.g., "statue of liberty", "starbucks", "pizza"). Must be - * properly URL encoded. - * @param maxDetourTime Maximum detour time of the point of interest in seconds. Max value is 3600 - * seconds - * @param searchAlongRouteRequestBody This represents the route to search along and should be a valid - * `GeoJSON LineString` type. Please refer to [RFC - * 7946](https://tools.ietf.org/html/rfc7946#section-3.1.4) for details. - * @param options The options parameters. - */ - postSearchAlongRoute( - format: TextFormat, - query: string, - maxDetourTime: number, - searchAlongRouteRequestBody: SearchAlongRouteRequestBody, - options?: SearchPostSearchAlongRouteOptionalParams - ): Promise; - /** - * **Search Fuzzy Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Search Address Batch API sends batches of queries to [Search Fuzzy - * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy) using just a single API - * call. You can call Search Address Fuzzy Batch API to run either asynchronously (async) or - * synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API up - * to **100** queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/search/fuzzy/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **10,000** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Search Address Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` - * GET - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _search fuzzy_ queries you will use a `POST` request where the request body will contain - * the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 5 _search fuzzy_ queries: - * - * - * ```json - * { - * "batchItems": [ - * {"query": "?query=atm&lat=47.639769&lon=-122.128362&radius=5000&limit=5"}, - * {"query": "?query=Statue Of Liberty&limit=2"}, - * {"query": "?query=Starbucks&lat=47.639769&lon=-122.128362&radius=5000"}, - * {"query": "?query=Space Needle"}, - * {"query": "?query=pizza&limit=10"} - * ] - * } - * ``` - * - * A _search fuzzy_ query in a batch is just a partial URL _without_ the protocol, base URL, path, - * api-version and subscription-key. It can accept any of the supported _search fuzzy_ [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#uri-parameters). - * The string values in the _search fuzzy_ query must be properly escaped (e.g. " character should be - * escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, - * and the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#searchcommonresponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 2, - * "totalRequests": 3 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "atm" - * }, - * "results": [ - * { - * "type": "POI", - * "poi": { - * "name": "ATM at Wells Fargo" - * }, - * "address": { - * "country": "United States Of America", - * "freeformAddress": "3240 157th Ave NE, Redmond, WA 98052" - * } - * } - * ] - * } - * }, - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "statue of liberty" - * }, - * "results": [ - * { - * "type": "POI", - * "poi": { - * "name": "Statue of Liberty" - * }, - * "address": { - * "country": "United States Of America", - * "freeformAddress": "New York, NY 10004" - * } - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param searchFuzzyBatchRequestBody The list of search fuzzy queries/requests to process. The list - * can contain a max of 10,000 queries and must contain at least 1 query. - * @param options The options parameters. - */ - postSearchFuzzyBatchSync( - format: ResponseFormat, - searchFuzzyBatchRequestBody: BatchRequestBody, - options?: SearchPostSearchFuzzyBatchSyncOptionalParams - ): Promise; - /** - * **Search Fuzzy Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Search Address Batch API sends batches of queries to [Search Fuzzy - * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy) using just a single API - * call. You can call Search Address Fuzzy Batch API to run either asynchronously (async) or - * synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API up - * to **100** queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/search/fuzzy/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **10,000** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Search Address Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` - * GET - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _search fuzzy_ queries you will use a `POST` request where the request body will contain - * the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 5 _search fuzzy_ queries: - * - * - * ```json - * { - * "batchItems": [ - * {"query": "?query=atm&lat=47.639769&lon=-122.128362&radius=5000&limit=5"}, - * {"query": "?query=Statue Of Liberty&limit=2"}, - * {"query": "?query=Starbucks&lat=47.639769&lon=-122.128362&radius=5000"}, - * {"query": "?query=Space Needle"}, - * {"query": "?query=pizza&limit=10"} - * ] - * } - * ``` - * - * A _search fuzzy_ query in a batch is just a partial URL _without_ the protocol, base URL, path, - * api-version and subscription-key. It can accept any of the supported _search fuzzy_ [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#uri-parameters). - * The string values in the _search fuzzy_ query must be properly escaped (e.g. " character should be - * escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, - * and the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#searchcommonresponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 2, - * "totalRequests": 3 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "atm" - * }, - * "results": [ - * { - * "type": "POI", - * "poi": { - * "name": "ATM at Wells Fargo" - * }, - * "address": { - * "country": "United States Of America", - * "freeformAddress": "3240 157th Ave NE, Redmond, WA 98052" - * } - * } - * ] - * } - * }, - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "statue of liberty" - * }, - * "results": [ - * { - * "type": "POI", - * "poi": { - * "name": "Statue of Liberty" - * }, - * "address": { - * "country": "United States Of America", - * "freeformAddress": "New York, NY 10004" - * } - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param searchFuzzyBatchRequestBody The list of search fuzzy queries/requests to process. The list - * can contain a max of 10,000 queries and must contain at least 1 query. - * @param options The options parameters. - */ - beginPostSearchFuzzyBatch( - format: ResponseFormat, - searchFuzzyBatchRequestBody: BatchRequestBody, - options?: SearchPostSearchFuzzyBatchOptionalParams - ): Promise< - PollerLike< - PollOperationState, - SearchPostSearchFuzzyBatchResponse - > - >; - /** - * **Search Fuzzy Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Search Address Batch API sends batches of queries to [Search Fuzzy - * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy) using just a single API - * call. You can call Search Address Fuzzy Batch API to run either asynchronously (async) or - * synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API up - * to **100** queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/search/fuzzy/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **10,000** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Search Address Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` - * GET - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _search fuzzy_ queries you will use a `POST` request where the request body will contain - * the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 5 _search fuzzy_ queries: - * - * - * ```json - * { - * "batchItems": [ - * {"query": "?query=atm&lat=47.639769&lon=-122.128362&radius=5000&limit=5"}, - * {"query": "?query=Statue Of Liberty&limit=2"}, - * {"query": "?query=Starbucks&lat=47.639769&lon=-122.128362&radius=5000"}, - * {"query": "?query=Space Needle"}, - * {"query": "?query=pizza&limit=10"} - * ] - * } - * ``` - * - * A _search fuzzy_ query in a batch is just a partial URL _without_ the protocol, base URL, path, - * api-version and subscription-key. It can accept any of the supported _search fuzzy_ [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#uri-parameters). - * The string values in the _search fuzzy_ query must be properly escaped (e.g. " character should be - * escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, - * and the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchfuzzy#searchcommonresponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 2, - * "totalRequests": 3 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "atm" - * }, - * "results": [ - * { - * "type": "POI", - * "poi": { - * "name": "ATM at Wells Fargo" - * }, - * "address": { - * "country": "United States Of America", - * "freeformAddress": "3240 157th Ave NE, Redmond, WA 98052" - * } - * } - * ] - * } - * }, - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "statue of liberty" - * }, - * "results": [ - * { - * "type": "POI", - * "poi": { - * "name": "Statue of Liberty" - * }, - * "address": { - * "country": "United States Of America", - * "freeformAddress": "New York, NY 10004" - * } - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param searchFuzzyBatchRequestBody The list of search fuzzy queries/requests to process. The list - * can contain a max of 10,000 queries and must contain at least 1 query. - * @param options The options parameters. - */ - beginPostSearchFuzzyBatchAndWait( - format: ResponseFormat, - searchFuzzyBatchRequestBody: BatchRequestBody, - options?: SearchPostSearchFuzzyBatchOptionalParams - ): Promise; - /** - * **Search Address Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Search Address Batch API sends batches of queries to [Search Address - * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress) using just a single API - * call. You can call Search Address Batch API to run either asynchronously (async) or synchronously - * (sync). The async API allows caller to batch up to **10,000** queries and sync API up to **100** - * queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/search/address/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **10,000** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Search Address Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` - * GET - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _search address_ queries you will use a `POST` request where the request body will - * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 5 _search address_ queries: - * - * - * ```json - * { - * "batchItems": [ - * {"query": "?query=400 Broad St, Seattle, WA 98109&limit=3"}, - * {"query": "?query=One, Microsoft Way, Redmond, WA 98052&limit=3"}, - * {"query": "?query=350 5th Ave, New York, NY 10118&limit=1"}, - * {"query": "?query=Pike Pl, Seattle, WA 98101&lat=47.610970&lon=-122.342469&radius=1000"}, - * {"query": "?query=Champ de Mars, 5 Avenue Anatole France, 75007 Paris, France&limit=1"} - * ] - * } - * ``` - * - * A _search address_ query in a batch is just a partial URL _without_ the protocol, base URL, path, - * api-version and subscription-key. It can accept any of the supported _search address_ [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#uri-parameters). - * The string values in the _search address_ query must be properly escaped (e.g. " character should be - * escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, - * and the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#SearchCommonResponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 2, - * "totalRequests": 3 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "one microsoft way redmond wa 98052" - * }, - * "results": [ - * { - * "position": { - * "lat": 47.63989, - * "lon": -122.12509 - * } - * } - * ] - * } - * }, - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "pike pl seattle wa 98101" - * }, - * "results": [ - * { - * "position": { - * "lat": 47.60963, - * "lon": -122.34215 - * } - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param searchAddressBatchRequestBody The list of address geocoding queries/requests to process. The - * list can contain a max of 10,000 queries and must contain at least 1 query. - * @param options The options parameters. - */ - postSearchAddressBatchSync( - format: ResponseFormat, - searchAddressBatchRequestBody: BatchRequestBody, - options?: SearchPostSearchAddressBatchSyncOptionalParams - ): Promise; - /** - * **Search Address Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Search Address Batch API sends batches of queries to [Search Address - * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress) using just a single API - * call. You can call Search Address Batch API to run either asynchronously (async) or synchronously - * (sync). The async API allows caller to batch up to **10,000** queries and sync API up to **100** - * queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/search/address/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **10,000** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Search Address Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` - * GET - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _search address_ queries you will use a `POST` request where the request body will - * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 5 _search address_ queries: - * - * - * ```json - * { - * "batchItems": [ - * {"query": "?query=400 Broad St, Seattle, WA 98109&limit=3"}, - * {"query": "?query=One, Microsoft Way, Redmond, WA 98052&limit=3"}, - * {"query": "?query=350 5th Ave, New York, NY 10118&limit=1"}, - * {"query": "?query=Pike Pl, Seattle, WA 98101&lat=47.610970&lon=-122.342469&radius=1000"}, - * {"query": "?query=Champ de Mars, 5 Avenue Anatole France, 75007 Paris, France&limit=1"} - * ] - * } - * ``` - * - * A _search address_ query in a batch is just a partial URL _without_ the protocol, base URL, path, - * api-version and subscription-key. It can accept any of the supported _search address_ [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#uri-parameters). - * The string values in the _search address_ query must be properly escaped (e.g. " character should be - * escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, - * and the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#SearchCommonResponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 2, - * "totalRequests": 3 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "one microsoft way redmond wa 98052" - * }, - * "results": [ - * { - * "position": { - * "lat": 47.63989, - * "lon": -122.12509 - * } - * } - * ] - * } - * }, - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "pike pl seattle wa 98101" - * }, - * "results": [ - * { - * "position": { - * "lat": 47.60963, - * "lon": -122.34215 - * } - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param searchAddressBatchRequestBody The list of address geocoding queries/requests to process. The - * list can contain a max of 10,000 queries and must contain at least 1 query. - * @param options The options parameters. - */ - beginPostSearchAddressBatch( - format: ResponseFormat, - searchAddressBatchRequestBody: BatchRequestBody, - options?: SearchPostSearchAddressBatchOptionalParams - ): Promise< - PollerLike< - PollOperationState, - SearchPostSearchAddressBatchResponse - > - >; - /** - * **Search Address Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Search Address Batch API sends batches of queries to [Search Address - * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress) using just a single API - * call. You can call Search Address Batch API to run either asynchronously (async) or synchronously - * (sync). The async API allows caller to batch up to **10,000** queries and sync API up to **100** - * queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/search/address/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **10,000** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Search Address Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` - * GET - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _search address_ queries you will use a `POST` request where the request body will - * contain the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 5 _search address_ queries: - * - * - * ```json - * { - * "batchItems": [ - * {"query": "?query=400 Broad St, Seattle, WA 98109&limit=3"}, - * {"query": "?query=One, Microsoft Way, Redmond, WA 98052&limit=3"}, - * {"query": "?query=350 5th Ave, New York, NY 10118&limit=1"}, - * {"query": "?query=Pike Pl, Seattle, WA 98101&lat=47.610970&lon=-122.342469&radius=1000"}, - * {"query": "?query=Champ de Mars, 5 Avenue Anatole France, 75007 Paris, France&limit=1"} - * ] - * } - * ``` - * - * A _search address_ query in a batch is just a partial URL _without_ the protocol, base URL, path, - * api-version and subscription-key. It can accept any of the supported _search address_ [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#uri-parameters). - * The string values in the _search address_ query must be properly escaped (e.g. " character should be - * escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, - * and the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`SearchCommonResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddress#SearchCommonResponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 2, - * "totalRequests": 3 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "one microsoft way redmond wa 98052" - * }, - * "results": [ - * { - * "position": { - * "lat": 47.63989, - * "lon": -122.12509 - * } - * } - * ] - * } - * }, - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "query": "pike pl seattle wa 98101" - * }, - * "results": [ - * { - * "position": { - * "lat": 47.60963, - * "lon": -122.34215 - * } - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param searchAddressBatchRequestBody The list of address geocoding queries/requests to process. The - * list can contain a max of 10,000 queries and must contain at least 1 query. - * @param options The options parameters. - */ - beginPostSearchAddressBatchAndWait( - format: ResponseFormat, - searchAddressBatchRequestBody: BatchRequestBody, - options?: SearchPostSearchAddressBatchOptionalParams - ): Promise; - /** - * **Search Address Reverse Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Search Address Batch API sends batches of queries to [Search Address Reverse - * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse) using just a - * single API call. You can call Search Address Reverse Batch API to run either asynchronously (async) - * or synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API - * up to **100** queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/search/address/reverse/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **10,000** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Search Address Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` - * GET - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _search address reverse_ queries you will use a `POST` request where the request body - * will contain the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 5 _search address reverse_ queries: - * - * - * ```json - * { - * "batchItems": [ - * {"query": "?query=48.858561,2.294911"}, - * {"query": "?query=47.639765,-122.127896&radius=5000&limit=2"}, - * {"query": "?query=47.621028,-122.348170"}, - * {"query": "?query=43.722990,10.396695"}, - * {"query": "?query=40.750958,-73.982336"} - * ] - * } - * ``` - * - * A _search address reverse_ query in a batch is just a partial URL _without_ the protocol, base URL, - * path, api-version and subscription-key. It can accept any of the supported _search address reverse_ - * [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#uri-parameters). - * The string values in the _search address reverse_ query must be properly escaped (e.g. " character - * should be escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, - * and the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`SearchAddressReverseResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#searchaddressreverseresponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 2, - * "totalRequests": 3 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "queryTime": 11 - * }, - * "addresses": [ - * { - * "address": { - * "country": "France", - * "freeformAddress": "Avenue Anatole France, 75007 Paris" - * }, - * "position": "48.858490,2.294820" - * } - * ] - * } - * }, - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "queryTime": 1 - * }, - * "addresses": [ - * { - * "address": { - * "country": "United States of America", - * "freeformAddress": "157th Pl NE, Redmond WA 98052" - * }, - * "position": "47.640470,-122.129430" - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param searchAddressReverseBatchRequestBody The list of reverse geocoding queries/requests to - * process. The list can contain a max of 10,000 queries and must contain at least 1 query. - * @param options The options parameters. - */ - postSearchAddressReverseBatchSync( - format: ResponseFormat, - searchAddressReverseBatchRequestBody: BatchRequestBody, - options?: SearchPostSearchAddressReverseBatchSyncOptionalParams - ): Promise; - /** - * **Search Address Reverse Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Search Address Batch API sends batches of queries to [Search Address Reverse - * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse) using just a - * single API call. You can call Search Address Reverse Batch API to run either asynchronously (async) - * or synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API - * up to **100** queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/search/address/reverse/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **10,000** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Search Address Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` - * GET - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _search address reverse_ queries you will use a `POST` request where the request body - * will contain the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 5 _search address reverse_ queries: - * - * - * ```json - * { - * "batchItems": [ - * {"query": "?query=48.858561,2.294911"}, - * {"query": "?query=47.639765,-122.127896&radius=5000&limit=2"}, - * {"query": "?query=47.621028,-122.348170"}, - * {"query": "?query=43.722990,10.396695"}, - * {"query": "?query=40.750958,-73.982336"} - * ] - * } - * ``` - * - * A _search address reverse_ query in a batch is just a partial URL _without_ the protocol, base URL, - * path, api-version and subscription-key. It can accept any of the supported _search address reverse_ - * [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#uri-parameters). - * The string values in the _search address reverse_ query must be properly escaped (e.g. " character - * should be escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, - * and the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`SearchAddressReverseResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#searchaddressreverseresponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 2, - * "totalRequests": 3 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "queryTime": 11 - * }, - * "addresses": [ - * { - * "address": { - * "country": "France", - * "freeformAddress": "Avenue Anatole France, 75007 Paris" - * }, - * "position": "48.858490,2.294820" - * } - * ] - * } - * }, - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "queryTime": 1 - * }, - * "addresses": [ - * { - * "address": { - * "country": "United States of America", - * "freeformAddress": "157th Pl NE, Redmond WA 98052" - * }, - * "position": "47.640470,-122.129430" - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param searchAddressReverseBatchRequestBody The list of reverse geocoding queries/requests to - * process. The list can contain a max of 10,000 queries and must contain at least 1 query. - * @param options The options parameters. - */ - beginPostSearchAddressReverseBatch( - format: ResponseFormat, - searchAddressReverseBatchRequestBody: BatchRequestBody, - options?: SearchPostSearchAddressReverseBatchOptionalParams - ): Promise< - PollerLike< - PollOperationState, - SearchPostSearchAddressReverseBatchResponse - > - >; - /** - * **Search Address Reverse Batch API** - * - * - * **Applies to**: S1 pricing tier. - * - * - * - * The Search Address Batch API sends batches of queries to [Search Address Reverse - * API](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse) using just a - * single API call. You can call Search Address Reverse Batch API to run either asynchronously (async) - * or synchronously (sync). The async API allows caller to batch up to **10,000** queries and sync API - * up to **100** queries. - * ### Submit Synchronous Batch Request - * The Synchronous API is recommended for lightweight batch requests. When the service receives a - * request, it will respond as soon as the batch items are calculated and there will be no possibility - * to retrieve the results later. The Synchronous API will return a timeout error (a 408 response) if - * the request takes longer than 60 seconds. The number of batch items is limited to **100** for this - * API. - * ``` - * POST - * https://atlas.microsoft.com/search/address/reverse/batch/sync/json?api-version=1.0&subscription-key={subscription-key} - * ``` - * ### Submit Asynchronous Batch Request - * The Asynchronous API is appropriate for processing big volumes of relatively complex search requests - * - It allows the retrieval of results in a separate call (multiple downloads are possible). - * - The asynchronous API is optimized for reliability and is not expected to run into a timeout. - * - The number of batch items is limited to **10,000** for this API. - * - * When you make a request by using async request, by default the service returns a 202 response code - * along a redirect URL in the Location field of the response header. This URL should be checked - * periodically until the response data or error information is available. - * The asynchronous responses are stored for **14** days. The redirect URL returns a 404 response if - * used after the expiration period. - * - * Please note that asynchronous batch request is a long-running request. Here's a typical sequence of - * operations: - * 1. Client sends a Search Address Batch `POST` request to Azure Maps - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request has been accepted. - * - * > HTTP `Error` - There was an error processing your Batch request. This could either be a `400 - * Bad Request` or any other `Error` status code. - * - * 3. If the batch request was accepted successfully, the `Location` header in the response contains - * the URL to download the results of the batch request. - * This status URI looks like following: - * - * ``` - * GET - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * 4. Client issues a `GET` request on the _download URL_ obtained in Step 3 to download the batch - * results. - * - * ### POST Body for Batch Request - * To send the _search address reverse_ queries you will use a `POST` request where the request body - * will contain the `batchItems` array in `json` format and the `Content-Type` header will be set to - * `application/json`. Here's a sample request body containing 5 _search address reverse_ queries: - * - * - * ```json - * { - * "batchItems": [ - * {"query": "?query=48.858561,2.294911"}, - * {"query": "?query=47.639765,-122.127896&radius=5000&limit=2"}, - * {"query": "?query=47.621028,-122.348170"}, - * {"query": "?query=43.722990,10.396695"}, - * {"query": "?query=40.750958,-73.982336"} - * ] - * } - * ``` - * - * A _search address reverse_ query in a batch is just a partial URL _without_ the protocol, base URL, - * path, api-version and subscription-key. It can accept any of the supported _search address reverse_ - * [URI - * parameters](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#uri-parameters). - * The string values in the _search address reverse_ query must be properly escaped (e.g. " character - * should be escaped with \\ ) and it should also be properly URL-encoded. - * - * - * The async API allows caller to batch up to **10,000** queries and sync API up to **100** queries, - * and the batch should contain at least **1** query. - * - * - * ### Download Asynchronous Batch Results - * To download the async batch results you will issue a `GET` request to the batch download endpoint. - * This _download URL_ can be obtained from the `Location` header of a successful `POST` batch request - * and looks like the following: - * - * ``` - * https://atlas.microsoft.com/batch/{batch-id}?api-version=1.0&subscription-key={subscription-key} - * ``` - * Here's the typical sequence of operations for downloading the batch results: - * 1. Client sends a `GET` request using the _download URL_. - * 2. The server will respond with one of the following: - * - * > HTTP `202 Accepted` - Batch request was accepted but is still being processed. Please try - * again in some time. - * - * > HTTP `200 OK` - Batch request successfully processed. The response body contains all the batch - * results. - * - * - * - * ### Batch Response Model - * The returned data content is similar for async and sync requests. When downloading the results of an - * async batch request, if the batch has finished processing, the response body contains the batch - * response. This batch response contains a `summary` component that indicates the `totalRequests` that - * were part of the original batch request and `successfulRequests`i.e. queries which were executed - * successfully. The batch response also includes a `batchItems` array which contains a response for - * each and every query in the batch request. The `batchItems` will contain the results in the exact - * same order the original queries were sent in the batch request. Each item in `batchItems` contains - * `statusCode` and `response` fields. Each `response` in `batchItems` is of one of the following - * types: - * - * - - * [`SearchAddressReverseResponse`](https://docs.microsoft.com/en-us/rest/api/maps/search/getsearchaddressreverse#searchaddressreverseresponse) - * - If the query completed successfully. - * - * - `Error` - If the query failed. The response will contain a `code` and a `message` in this case. - * - * - * Here's a sample Batch Response with 2 _successful_ and 1 _failed_ result: - * - * - * ```json - * { - * "summary": { - * "successfulRequests": 2, - * "totalRequests": 3 - * }, - * "batchItems": [ - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "queryTime": 11 - * }, - * "addresses": [ - * { - * "address": { - * "country": "France", - * "freeformAddress": "Avenue Anatole France, 75007 Paris" - * }, - * "position": "48.858490,2.294820" - * } - * ] - * } - * }, - * { - * "statusCode": 200, - * "response": - * { - * "summary": { - * "queryTime": 1 - * }, - * "addresses": [ - * { - * "address": { - * "country": "United States of America", - * "freeformAddress": "157th Pl NE, Redmond WA 98052" - * }, - * "position": "47.640470,-122.129430" - * } - * ] - * } - * }, - * { - * "statusCode": 400, - * "response": - * { - * "error": - * { - * "code": "400 BadRequest", - * "message": "Bad request: one or more parameters were incorrectly specified or - * are mutually exclusive." - * } - * } - * } - * ] - * } - * ``` - * @param format Desired format of the response. Only `json` format is supported. - * @param searchAddressReverseBatchRequestBody The list of reverse geocoding queries/requests to - * process. The list can contain a max of 10,000 queries and must contain at least 1 query. - * @param options The options parameters. - */ - beginPostSearchAddressReverseBatchAndWait( - format: ResponseFormat, - searchAddressReverseBatchRequestBody: BatchRequestBody, - options?: SearchPostSearchAddressReverseBatchOptionalParams - ): Promise; -} diff --git a/sdk/maps/maps-search/src/searchClient.ts b/sdk/maps/maps-search/src/searchClient.ts deleted file mode 100644 index adcc32caecd7..000000000000 --- a/sdk/maps/maps-search/src/searchClient.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreAuth from "@azure/core-auth"; -import { SearchImpl } from "./operations"; -import { Search } from "./operationsInterfaces"; -import { SearchClientContext } from "./searchClientContext"; -import { SearchClientOptionalParams } from "./models"; - -export class SearchClient extends SearchClientContext { - /** - * Initializes a new instance of the SearchClient class. - * @param credentials Subscription credentials which uniquely identify client subscription. - * @param options The parameter options - */ - constructor( - credentials: coreAuth.TokenCredential, - options?: SearchClientOptionalParams - ) { - super(credentials, options); - this.search = new SearchImpl(this); - } - - search: Search; -} diff --git a/sdk/maps/maps-search/src/searchClientContext.ts b/sdk/maps/maps-search/src/searchClientContext.ts deleted file mode 100644 index 7dcd6c113706..000000000000 --- a/sdk/maps/maps-search/src/searchClientContext.ts +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; -import * as coreAuth from "@azure/core-auth"; -import { Geography, SearchClientOptionalParams } from "./models"; - -export class SearchClientContext extends coreClient.ServiceClient { - geography: Geography; - xMsClientId?: string; - apiVersion: string; - - /** - * Initializes a new instance of the SearchClientContext class. - * @param credentials Subscription credentials which uniquely identify client subscription. - * @param options The parameter options - */ - constructor( - credentials: coreAuth.TokenCredential, - options?: SearchClientOptionalParams - ) { - if (credentials === undefined) { - throw new Error("'credentials' cannot be null"); - } - - // Initializing default values for options - if (!options) { - options = {}; - } - const defaults: SearchClientOptionalParams = { - requestContentType: "application/json; charset=utf-8", - credential: credentials - }; - - const packageDetails = `azsdk-js-maps-search/1.0.0-beta.1`; - const userAgentPrefix = - options.userAgentOptions && options.userAgentOptions.userAgentPrefix - ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` - : `${packageDetails}`; - - if (!options.credentialScopes) { - options.credentialScopes = ["https://atlas.microsoft.com/.default"]; - } - const optionsWithDefaults = { - ...defaults, - ...options, - userAgentOptions: { - userAgentPrefix - }, - baseUri: options.endpoint || "https://{geography}.atlas.microsoft.com" - }; - super(optionsWithDefaults); - - // Assigning values to Constant parameters - this.geography = options.geography || "us"; - this.apiVersion = options.apiVersion || "1.0"; - } -} diff --git a/sdk/maps/maps-search/tsconfig.json b/sdk/maps/maps-search/tsconfig.json deleted file mode 100644 index 0ec8659c8e83..000000000000 --- a/sdk/maps/maps-search/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "module": "es6", - "moduleResolution": "node", - "strict": true, - "target": "es6", - "sourceMap": true, - "declarationMap": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "preserveConstEnums": true, - "lib": ["es6", "dom"], - "declaration": true, - "outDir": "./esm", - "importHelpers": true - }, - "include": ["./src/**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/sdk/maps/maps-timezone/LICENSE.txt b/sdk/maps/maps-timezone/LICENSE.txt deleted file mode 100644 index ccb63b166732..000000000000 --- a/sdk/maps/maps-timezone/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2021 Microsoft - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/sdk/maps/maps-timezone/README.md b/sdk/maps/maps-timezone/README.md deleted file mode 100644 index 35166535fdda..000000000000 --- a/sdk/maps/maps-timezone/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# Azure Timezone client library for JavaScript - -This package contains an isomorphic SDK (runs both in Node.js and in browsers) for Azure Timezone client. - -Azure Maps Time Zone REST APIs - -[Source code](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-timezone) | -[Package (NPM)](https://www.npmjs.com/package/@azure/maps-timezone) | -[API reference documentation](https://docs.microsoft.com/javascript/api/@azure/maps-timezone) | -[Samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-timezone/samples) - -## Getting started - -### Currently supported environments - -- [LTS versions of Node.js](https://nodejs.org/about/releases/) -- Latest versions of Safari, Chrome, Edge and Firefox. - -### Prerequisites - -- An [Azure subscription][azure_sub]. - -### Install the `@azure/maps-timezone` package - -Install the Azure Timezone client library for JavaScript with `npm`: - -```bash -npm install @azure/maps-timezone -``` - -### Create and authenticate a `TimezoneClient` - -To create a client object to access the Azure Timezone API, you will need the `endpoint` of your Azure Timezone resource and a `credential`. The Azure Timezone client can use Azure Active Directory credentials to authenticate. -You can find the endpoint for your Azure Timezone resource in the [Azure Portal][azure_portal]. - -#### Using an Azure Active Directory Credential - -You can authenticate with Azure Active Directory using the [Azure Identity library][azure_identity]. To use the [DefaultAzureCredential][defaultazurecredential] provider shown below, or other credential providers provided with the Azure SDK, please install the `@azure/identity` package: - -```bash -npm install @azure/identity -``` - -You will also need to register a new AAD application and grant access to Azure Timezone by assigning the suitable role to your service principal (note: roles such as `"Owner"` will not grant the necessary permissions). -Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`. - -```javascript -const { TimezoneClient } = require("@azure/maps-timezone"); -const { DefaultAzureCredential } = require("@azure/identity"); -const client = new TimezoneClient("", new DefaultAzureCredential()); -``` - -## Key concepts - -### TimezoneClient - -`TimezoneClient` is the primary interface for developers using the Azure Timezone client library. Explore the methods on this client object to understand the different features of the Azure Timezone service that you can access. - -## Troubleshooting - -### Logging - -Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: - -```javascript -import { setLogLevel } from "@azure/logger"; -setLogLevel("info"); -``` - -For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger). - -## Next steps - -Please take a look at the [samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-timezone/samples) directory for detailed examples on how to use this library. - -## Contributing - -If you'd like to contribute to this library, please read the [contributing guide](https://github.com/Azure/azure-sdk-for-js/blob/master/CONTRIBUTING.md) to learn more about how to build and test the code. - -## Related projects - -- [Microsoft Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) - -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fmaps%2Fmaps-timezone%2FREADME.png) - -[azure_cli]: https://docs.microsoft.com/cli/azure -[azure_sub]: https://azure.microsoft.com/free/ -[azure_sub]: https://azure.microsoft.com/free/ -[azure_portal]: https://portal.azure.com -[azure_identity]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity -[defaultazurecredential]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity#defaultazurecredential diff --git a/sdk/maps/maps-timezone/api-extractor.json b/sdk/maps/maps-timezone/api-extractor.json deleted file mode 100644 index 5fb5b21b56f2..000000000000 --- a/sdk/maps/maps-timezone/api-extractor.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", - "mainEntryPointFilePath": "./esm/index.d.ts", - "docModel": { "enabled": true }, - "apiReport": { "enabled": true, "reportFolder": "./review" }, - "dtsRollup": { - "enabled": true, - "untrimmedFilePath": "", - "publicTrimmedFilePath": "./esm/index.d.ts" - }, - "messages": { - "tsdocMessageReporting": { "default": { "logLevel": "none" } }, - "extractorMessageReporting": { - "ae-missing-release-tag": { "logLevel": "none" }, - "ae-unresolved-link": { "logLevel": "none" } - } - } -} diff --git a/sdk/maps/maps-timezone/package.json b/sdk/maps/maps-timezone/package.json deleted file mode 100644 index 47338aefc6b7..000000000000 --- a/sdk/maps/maps-timezone/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "@azure/maps-timezone", - "sdk-type": "client", - "author": "Microsoft Corporation", - "description": "A generated SDK for TimezoneClient.", - "version": "1.0.0-beta.1", - "engines": { "node": ">=12.0.0" }, - "dependencies": { - "@azure/core-client": "^1.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-rest-pipeline": "^1.1.0", - "tslib": "^2.2.0" - }, - "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], - "license": "MIT", - "main": "./dist/index.js", - "module": "./esm/index.js", - "types": "./esm/index.d.ts", - "devDependencies": { - "@microsoft/api-extractor": "7.7.11", - "@rollup/plugin-commonjs": "11.0.2", - "@rollup/plugin-json": "^4.0.0", - "@rollup/plugin-multi-entry": "^3.0.0", - "@rollup/plugin-node-resolve": "^8.0.0", - "mkdirp": "^1.0.4", - "rollup": "^1.16.3", - "rollup-plugin-sourcemaps": "^0.4.2", - "rollup-plugin-node-resolve": "^3.4.0", - "typescript": "~4.2.0", - "uglify-js": "^3.4.9" - }, - "homepage": "https://github.com/Azure/azure-sdk-for-js", - "repository": { - "type": "git", - "url": "https://github.com/Azure/azure-sdk-for-js.git" - }, - "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, - "files": [ - "dist/**/*.js", - "dist/**/*.js.map", - "dist/**/*.d.ts", - "dist/**/*.d.ts.map", - "esm/**/*.js", - "esm/**/*.js.map", - "esm/**/*.d.ts", - "esm/**/*.d.ts.map", - "src/**/*.ts", - "README.md", - "rollup.config.js", - "tsconfig.json", - "review/*", - "CHANGELOG.md" - ], - "scripts": { - "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", - "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js", - "prepack": "npm install && npm run build", - "pack": "npm pack 2>&1", - "extract-api": "mkdirp ./review && api-extractor run --local", - "lint": "echo skipped", - "audit": "echo skipped", - "clean": "echo skipped", - "build:node": "echo skipped", - "build:browser": "echo skipped", - "build:test": "echo skipped", - "build:samples": "echo skipped.", - "check-format": "echo skipped", - "execute:samples": "echo skipped", - "format": "echo skipped", - "test": "echo skipped", - "prebuild": "echo skipped", - "test:node": "echo skipped", - "test:browser": "echo skipped", - "unit-test": "echo skipped", - "unit-test:node": "echo skipped", - "unit-test:browser": "echo skipped", - "integration-test:browser": "echo skipped", - "integration-test:node": "echo skipped", - "integration-test": "echo skipped", - "docs": "echo skipped" - }, - "sideEffects": false, - "autoPublish": true -} diff --git a/sdk/maps/maps-timezone/review/maps-timezone.api.md b/sdk/maps/maps-timezone/review/maps-timezone.api.md deleted file mode 100644 index 97521ba09fb4..000000000000 --- a/sdk/maps/maps-timezone/review/maps-timezone.api.md +++ /dev/null @@ -1,268 +0,0 @@ -## API Report File for "@azure/maps-timezone" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -import * as coreAuth from '@azure/core-auth'; -import * as coreClient from '@azure/core-client'; - -// @public -export interface CountryRecord { - readonly code?: string; - readonly name?: string; -} - -// @public -export interface ErrorAdditionalInfo { - readonly info?: Record; - readonly type?: string; -} - -// @public -export interface ErrorDetail { - readonly additionalInfo?: ErrorAdditionalInfo[]; - readonly code?: string; - readonly details?: ErrorDetail[]; - readonly message?: string; - readonly target?: string; -} - -// @public -export interface ErrorResponse { - error?: ErrorDetail; -} - -// @public -export type GeographicResourceLocation = string; - -// @public -export type Geography = string; - -// @public (undocumented) -export interface IanaId { - readonly aliasOf?: string; - readonly hasZone1970Location?: boolean; - readonly id?: string; - readonly isAlias?: boolean; -} - -// @public -export const enum KnownGeographicResourceLocation { - Eu = "eu", - Us = "us" -} - -// @public -export const enum KnownGeography { - // (undocumented) - Eu = "eu", - // (undocumented) - Us = "us" -} - -// @public -export const enum KnownResponseFormat { - Json = "json" -} - -// @public -export const enum KnownTimezoneOptions { - All = "all", - None = "none", - Transitions = "transitions", - ZoneInfo = "zoneInfo" -} - -// @public -export interface ReferenceTimeByCoordinates { - readonly daylightSavings?: string; - readonly posixTz?: string; - readonly posixTzValidYear?: number; - readonly standardOffset?: string; - readonly sunrise?: string; - readonly sunset?: string; - readonly tag?: string; - readonly wallTime?: string; -} - -// @public -export interface ReferenceTimeById { - readonly daylightSavings?: string; - readonly posixTz?: string; - readonly posixTzValidYear?: number; - readonly standardOffset?: string; - readonly tag?: string; - readonly wallTime?: string; -} - -// @public -export interface RepresentativePoint { - readonly latitude?: number; - readonly longitude?: number; -} - -// @public -export type ResponseFormat = string; - -// @public (undocumented) -export interface TimeTransition { - readonly daylightSavings?: string; - readonly standardOffset?: string; - readonly tag?: string; - readonly utcEnd?: Date; - readonly utcStart?: Date; -} - -// @public -export interface Timezone { - getTimezoneByCoordinates(format: ResponseFormat, query: string, options?: TimezoneGetTimezoneByCoordinatesOptionalParams): Promise; - getTimezoneByID(format: ResponseFormat, query: string, options?: TimezoneGetTimezoneByIDOptionalParams): Promise; - getTimezoneEnumIana(format: ResponseFormat, options?: TimezoneGetTimezoneEnumIanaOptionalParams): Promise; - getTimezoneEnumWindows(format: ResponseFormat, options?: TimezoneGetTimezoneEnumWindowsOptionalParams): Promise; - getTimezoneIanaVersion(format: ResponseFormat, options?: TimezoneGetTimezoneIanaVersionOptionalParams): Promise; - getTimezoneWindowsToIana(format: ResponseFormat, query: string, options?: TimezoneGetTimezoneWindowsToIanaOptionalParams): Promise; -} - -// @public (undocumented) -export interface TimeZoneByCoordinates { - readonly aliases?: string[]; - readonly countries?: CountryRecord[]; - readonly id?: string; - names?: TimezoneNames; - readonly referenceTime?: ReferenceTimeByCoordinates; - readonly representativePoint?: RepresentativePoint; - readonly timeTransitions?: TimeTransition[]; -} - -// @public -export interface TimezoneByCoordinatesResult { - readonly referenceUtcTimestamp?: Date; - readonly timeZones?: TimeZoneByCoordinates[]; - readonly version?: string; -} - -// @public (undocumented) -export interface TimezoneById { - readonly aliases?: string[]; - readonly countries?: CountryRecord[]; - readonly id?: string; - names?: TimezoneNames; - readonly referenceTime?: ReferenceTimeById; - readonly representativePoint?: RepresentativePoint; - readonly timeTransitions?: TimeTransition[]; -} - -// @public -export interface TimezoneByIdResult { - readonly referenceUtcTimestamp?: Date; - readonly timeZones?: TimezoneById[]; - readonly version?: string; -} - -// @public (undocumented) -export class TimezoneClient extends TimezoneClientContext { - constructor(credentials: coreAuth.TokenCredential, options?: TimezoneClientOptionalParams); - // (undocumented) - timezone: Timezone; -} - -// @public (undocumented) -export class TimezoneClientContext extends coreClient.ServiceClient { - constructor(credentials: coreAuth.TokenCredential, options?: TimezoneClientOptionalParams); - // (undocumented) - apiVersion: string; - // (undocumented) - geography: Geography; - // (undocumented) - xMsClientId?: string; -} - -// @public -export interface TimezoneClientOptionalParams extends coreClient.ServiceClientOptions { - apiVersion?: string; - endpoint?: string; - geography?: Geography; - xMsClientId?: string; -} - -// @public (undocumented) -export interface TimezoneEnumWindow { - ianaIds?: string[]; - readonly territory?: string; - readonly windowsId?: string; -} - -// @public -export interface TimezoneGetTimezoneByCoordinatesOptionalParams extends coreClient.OperationOptions { - acceptLanguage?: string; - options?: TimezoneOptions; - timeStamp?: Date; - transitionsFrom?: Date; - transitionsYears?: number; -} - -// @public -export type TimezoneGetTimezoneByCoordinatesResponse = TimezoneByCoordinatesResult; - -// @public -export interface TimezoneGetTimezoneByIDOptionalParams extends coreClient.OperationOptions { - acceptLanguage?: string; - options?: TimezoneOptions; - timeStamp?: Date; - transitionsFrom?: Date; - transitionsYears?: number; -} - -// @public -export type TimezoneGetTimezoneByIDResponse = TimezoneByIdResult; - -// @public -export interface TimezoneGetTimezoneEnumIanaOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type TimezoneGetTimezoneEnumIanaResponse = IanaId[]; - -// @public -export interface TimezoneGetTimezoneEnumWindowsOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type TimezoneGetTimezoneEnumWindowsResponse = TimezoneEnumWindow[]; - -// @public -export interface TimezoneGetTimezoneIanaVersionOptionalParams extends coreClient.OperationOptions { -} - -// @public -export type TimezoneGetTimezoneIanaVersionResponse = TimezoneIanaVersionResult; - -// @public -export interface TimezoneGetTimezoneWindowsToIanaOptionalParams extends coreClient.OperationOptions { - territory?: string; -} - -// @public -export type TimezoneGetTimezoneWindowsToIanaResponse = IanaId[]; - -// @public -export interface TimezoneIanaVersionResult { - readonly version?: string; -} - -// @public -export interface TimezoneNames { - readonly daylight?: string; - readonly generic?: string; - readonly iSO6391LanguageCode?: string; - readonly standard?: string; -} - -// @public -export type TimezoneOptions = string; - - -// (No @packageDocumentation comment for this package) - -``` diff --git a/sdk/maps/maps-timezone/rollup.config.js b/sdk/maps/maps-timezone/rollup.config.js deleted file mode 100644 index 9be1955eb7f1..000000000000 --- a/sdk/maps/maps-timezone/rollup.config.js +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import nodeResolve from "@rollup/plugin-node-resolve"; -import cjs from "@rollup/plugin-commonjs"; -import sourcemaps from "rollup-plugin-sourcemaps"; -import multiEntry from "@rollup/plugin-multi-entry"; -import json from "@rollup/plugin-json"; - -import nodeBuiltins from "builtin-modules"; - -/** - * Gets the proper configuration needed for rollup's commonJS plugin for @opentelemetry/api. - * - * NOTE: this manual configuration is only needed because OpenTelemetry uses an - * __exportStar downleveled helper function to declare its exports which confuses - * rollup's automatic discovery mechanism. - * - * @returns an object reference that can be `...`'d into your cjs() configuration. - */ -export function openTelemetryCommonJs() { - const namedExports = {}; - - for (const key of [ - "@opentelemetry/api", - "@azure/core-tracing/node_modules/@opentelemetry/api" - ]) { - namedExports[key] = [ - "SpanKind", - "TraceFlags", - "getSpan", - "setSpan", - "SpanStatusCode", - "getSpanContext", - "setSpanContext" - ]; - } - - const releasedOpenTelemetryVersions = ["0.10.2", "1.0.0-rc.0"]; - - for (const version of releasedOpenTelemetryVersions) { - namedExports[ - // working around a limitation in the rollup common.js plugin - it's not able to resolve these modules so the named exports listed above will not get applied. We have to drill down to the actual path. - `../../../common/temp/node_modules/.pnpm/@opentelemetry/api@${version}/node_modules/@opentelemetry/api/build/src/index.js` - ] = [ - "SpanKind", - "TraceFlags", - "getSpan", - "setSpan", - "StatusCode", - "CanonicalCode", - "getSpanContext", - "setSpanContext" - ]; - } - - return namedExports; -} - -// #region Warning Handler - -/** - * A function that can determine whether a rollupwarning should be ignored. If - * the function returns `true`, then the warning will not be displayed. - */ - -function ignoreNiseSinonEvalWarnings(warning) { - return ( - warning.code === "EVAL" && - warning.id && - (warning.id.includes("node_modules/nise") || - warning.id.includes("node_modules/sinon")) === true - ); -} - -function ignoreChaiCircularDependencyWarnings(warning) { - return ( - warning.code === "CIRCULAR_DEPENDENCY" && - warning.importer && warning.importer.includes("node_modules/chai") === true - ); -} - -const warningInhibitors = [ - ignoreChaiCircularDependencyWarnings, - ignoreNiseSinonEvalWarnings -]; - -/** - * Construct a warning handler for the shared rollup configuration - * that ignores certain warnings that are not relevant to testing. - */ -function makeOnWarnForTesting() { - return (warning, warn) => { - // If every inhibitor returns false (i.e. no inhibitors), then show the warning - if (warningInhibitors.every((inhib) => !inhib(warning))) { - warn(warning); - } - }; -} - -// #endregion - -function makeBrowserTestConfig() { - const config = { - input: { - include: ["dist-esm/test/**/*.spec.js"], - exclude: ["dist-esm/test/**/node/**"] - }, - output: { - file: `dist-test/index.browser.js`, - format: "umd", - sourcemap: true - }, - preserveSymlinks: false, - plugins: [ - multiEntry({ exports: false }), - nodeResolve({ - mainFields: ["module", "browser"] - }), - cjs({ - namedExports: { - // Chai's strange internal architecture makes it impossible to statically - // analyze its exports. - chai: [ - "version", - "use", - "util", - "config", - "expect", - "should", - "assert" - ], - ...openTelemetryCommonJs() - } - }), - json(), - sourcemaps() - //viz({ filename: "dist-test/browser-stats.html", sourcemap: true }) - ], - onwarn: makeOnWarnForTesting(), - // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, - // rollup started respecting the "sideEffects" field in package.json. Since - // our package.json sets "sideEffects=false", this also applies to test - // code, which causes all tests to be removed by tree-shaking. - treeshake: false - }; - - return config; -} - -const defaultConfigurationOptions = { - disableBrowserBundle: false -}; - -export function makeConfig(pkg, options) { - options = { - ...defaultConfigurationOptions, - ...(options || {}) - }; - - const baseConfig = { - // Use the package's module field if it has one - input: pkg["module"] || "dist-esm/src/index.js", - external: [ - ...nodeBuiltins, - ...Object.keys(pkg.dependencies), - ...Object.keys(pkg.devDependencies) - ], - output: { file: "dist/index.js", format: "cjs", sourcemap: true }, - preserveSymlinks: false, - plugins: [sourcemaps(), nodeResolve(), cjs()] - }; - - const config = [baseConfig]; - - if (!options.disableBrowserBundle) { - config.push(makeBrowserTestConfig()); - } - - return config; -} - -export default makeConfig(require("./package.json")); diff --git a/sdk/maps/maps-timezone/src/index.ts b/sdk/maps/maps-timezone/src/index.ts deleted file mode 100644 index ddeef0536f5e..000000000000 --- a/sdk/maps/maps-timezone/src/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./models"; -export { TimezoneClient } from "./timezoneClient"; -export { TimezoneClientContext } from "./timezoneClientContext"; -export * from "./operationsInterfaces"; diff --git a/sdk/maps/maps-timezone/src/models/index.ts b/sdk/maps/maps-timezone/src/models/index.ts deleted file mode 100644 index 17ac6ad3a986..000000000000 --- a/sdk/maps/maps-timezone/src/models/index.ts +++ /dev/null @@ -1,528 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; - -/** This object is returned from a successful Timezone By ID call */ -export interface TimezoneByIdResult { - /** - * Version property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly version?: string; - /** - * Reference Utc Timestamp property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly referenceUtcTimestamp?: Date; - /** - * TimeZoneById array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly timeZones?: TimezoneById[]; -} - -export interface TimezoneById { - /** - * Id property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly id?: string; - /** - * An array of time zone ID aliases.  Only returned when [options]=*zoneinfo* or *all*. - * - * Note: may be null. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly aliases?: string[]; - /** - * An array of country records. Only returned when [options]=*zoneinfo* or *all*. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly countries?: CountryRecord[]; - /** Timezone names object. */ - names?: TimezoneNames; - /** - * Details in effect at the local time. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly referenceTime?: ReferenceTimeById; - /** - * Representative point property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly representativePoint?: RepresentativePoint; - /** - * Time zone DST transitions from [transitionsFrom] until timestamp + 1 year. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly timeTransitions?: TimeTransition[]; -} - -/** A country record. */ -export interface CountryRecord { - /** - * Country Name - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly name?: string; - /** - * ISO-3166 2-letter country code for the country. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly code?: string; -} - -/** Timezone names object. */ -export interface TimezoneNames { - /** - * The ISO 639-1 language code of the Names - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly iSO6391LanguageCode?: string; - /** - * Generic Name - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly generic?: string; - /** - * Standard Name - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly standard?: string; - /** - * Daylight Name - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly daylight?: string; -} - -/** Details in effect at the local time. */ -export interface ReferenceTimeById { - /** - * Time zone name in effect at the reference timestamp (i.e. PST or PDT depending whether Daylight Savings Time is in effect). - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly tag?: string; - /** - * UTC offset in effect at the `ReferenceUTCTimestamp`. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly standardOffset?: string; - /** - * Time saving in minutes in effect at the `ReferenceUTCTimestamp`. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly daylightSavings?: string; - /** - * Current wall time at the given time zone as shown in the `Tag` property. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly wallTime?: string; - /** - * The year this POSIX string is valid for. Note: A POSIX string will only be valid in the given year. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly posixTzValidYear?: number; - /** - * POSIX string used to set the time zone environment variable. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly posixTz?: string; -} - -/** Representative point property */ -export interface RepresentativePoint { - /** - * Latitude property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly latitude?: number; - /** - * Longitude property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly longitude?: number; -} - -export interface TimeTransition { - /** - * Tag property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly tag?: string; - /** - * StandardOffset property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly standardOffset?: string; - /** - * DaylightSavings property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly daylightSavings?: string; - /** - * Start date, start time for this transition period - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly utcStart?: Date; - /** - * End date, end time for this transition period - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly utcEnd?: Date; -} - -/** Common error response for all Azure Resource Manager APIs to return error details for failed operations. (This also follows the OData error response format.). */ -export interface ErrorResponse { - /** The error object. */ - error?: ErrorDetail; -} - -/** The error detail. */ -export interface ErrorDetail { - /** - * The error code. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly code?: string; - /** - * The error message. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly message?: string; - /** - * The error target. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly target?: string; - /** - * The error details. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly details?: ErrorDetail[]; - /** - * The error additional info. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly additionalInfo?: ErrorAdditionalInfo[]; -} - -/** The resource management error additional info. */ -export interface ErrorAdditionalInfo { - /** - * The additional info type. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly type?: string; - /** - * The additional info. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly info?: Record; -} - -/** This object is returned from a successful Timezone By Coordinates call */ -export interface TimezoneByCoordinatesResult { - /** - * Version property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly version?: string; - /** - * Reference Utc Timestamp property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly referenceUtcTimestamp?: Date; - /** - * TimeZoneByCoordinates array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly timeZones?: TimeZoneByCoordinates[]; -} - -export interface TimeZoneByCoordinates { - /** - * Id property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly id?: string; - /** - * An array of time zone ID aliases.  Only returned when [options]=*zoneinfo* or *all*. - * - * Note: may be null. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly aliases?: string[]; - /** - * An array of country records. Only returned when [options]=*zoneinfo* or *all*. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly countries?: CountryRecord[]; - /** Timezone names object. */ - names?: TimezoneNames; - /** - * Details in effect at the local time. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly referenceTime?: ReferenceTimeByCoordinates; - /** - * Representative point property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly representativePoint?: RepresentativePoint; - /** - * Time zone DST transitions from [transitionsFrom] until timestamp + 1 year. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly timeTransitions?: TimeTransition[]; -} - -/** Details in effect at the local time. */ -export interface ReferenceTimeByCoordinates { - /** - * Time zone name in effect at the reference timestamp (i.e. PST or PDT depending whether Daylight Savings Time is in effect). - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly tag?: string; - /** - * UTC offset in effect at the `ReferenceUTCTimestamp`. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly standardOffset?: string; - /** - * Time saving in minutes in effect at the `ReferenceUTCTimestamp`. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly daylightSavings?: string; - /** - * Current wall time at the given time zone as shown in the `Tag` property. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly wallTime?: string; - /** - * The year this POSIX string is valid for. Note: A POSIX string will only be valid in the given year. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly posixTzValidYear?: number; - /** - * POSIX string used to set the time zone environment variable. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly posixTz?: string; - /** - * Sunrise at the given time zone as shown in the `Tag` property. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly sunrise?: string; - /** - * Sunset at the given time zone as shown in the `Tag` property. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly sunset?: string; -} - -export interface TimezoneEnumWindow { - /** - * Windows Id property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly windowsId?: string; - /** - * Territory property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly territory?: string; - /** IanaIds array */ - ianaIds?: string[]; -} - -export interface IanaId { - /** - * Id property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly id?: string; - /** - * IsAlias property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly isAlias?: boolean; - /** - * AliasOf property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly aliasOf?: string; - /** - * HasZone1970Location property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly hasZone1970Location?: boolean; -} - -/** This object is returned from a successful Timezone IANA Version call */ -export interface TimezoneIanaVersionResult { - /** - * Version property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly version?: string; -} - -/** Known values of {@link Geography} that the service accepts. */ -export const enum KnownGeography { - Us = "us", - Eu = "eu" -} - -/** - * Defines values for Geography. \ - * {@link KnownGeography} can be used interchangeably with Geography, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **us** \ - * **eu** - */ -export type Geography = string; - -/** Known values of {@link TimezoneOptions} that the service accepts. */ -export const enum KnownTimezoneOptions { - /** Do not include zoneinfo or transitions in the result. */ - None = "none", - /** Include additional time zone info in the result. */ - ZoneInfo = "zoneInfo", - /** Include transition information in the result (The number of transitions is currently capped at 250). */ - Transitions = "transitions", - /** Include both zoneinfo and transitions in the result. */ - All = "all" -} - -/** - * Defines values for TimezoneOptions. \ - * {@link KnownTimezoneOptions} can be used interchangeably with TimezoneOptions, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **none**: Do not include zoneinfo or transitions in the result. \ - * **zoneInfo**: Include additional time zone info in the result. \ - * **transitions**: Include transition information in the result (The number of transitions is currently capped at 250). \ - * **all**: Include both zoneinfo and transitions in the result. - */ -export type TimezoneOptions = string; - -/** Known values of {@link ResponseFormat} that the service accepts. */ -export const enum KnownResponseFormat { - /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ - Json = "json" -} - -/** - * Defines values for ResponseFormat. \ - * {@link KnownResponseFormat} can be used interchangeably with ResponseFormat, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) - */ -export type ResponseFormat = string; - -/** Known values of {@link GeographicResourceLocation} that the service accepts. */ -export const enum KnownGeographicResourceLocation { - /** Used to access an Azure Maps Creator resource in the United States */ - Us = "us", - /** Used to access an Azure Maps Creator resource in Europe */ - Eu = "eu" -} - -/** - * Defines values for GeographicResourceLocation. \ - * {@link KnownGeographicResourceLocation} can be used interchangeably with GeographicResourceLocation, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **us**: Used to access an Azure Maps Creator resource in the United States \ - * **eu**: Used to access an Azure Maps Creator resource in Europe - */ -export type GeographicResourceLocation = string; - -/** Optional parameters. */ -export interface TimezoneGetTimezoneByIDOptionalParams - extends coreClient.OperationOptions { - /** Specifies the language code in which the timezone names should be returned. If no language code is provided, the response will be in "EN". Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. */ - acceptLanguage?: string; - /** Alternatively, use alias "o". Options available for types of information returned in the result. */ - options?: TimezoneOptions; - /** Alternatively, use alias "stamp", or "s". Reference time, if omitted, the API will use the machine time serving the request. */ - timeStamp?: Date; - /** Alternatively, use alias "tf". The start date from which daylight savings time (DST) transitions are requested, only applies when "options" = all or "options" = transitions. */ - transitionsFrom?: Date; - /** Alternatively, use alias "ty". The number of years from "transitionsFrom" for which DST transitions are requested, only applies when "options" = all or "options" = transitions. */ - transitionsYears?: number; -} - -/** Contains response data for the getTimezoneByID operation. */ -export type TimezoneGetTimezoneByIDResponse = TimezoneByIdResult; - -/** Optional parameters. */ -export interface TimezoneGetTimezoneByCoordinatesOptionalParams - extends coreClient.OperationOptions { - /** Specifies the language code in which the timezone names should be returned. If no language code is provided, the response will be in "EN". Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. */ - acceptLanguage?: string; - /** Alternatively, use alias "o". Options available for types of information returned in the result. */ - options?: TimezoneOptions; - /** Alternatively, use alias "stamp", or "s". Reference time, if omitted, the API will use the machine time serving the request. */ - timeStamp?: Date; - /** Alternatively, use alias "tf". The start date from which daylight savings time (DST) transitions are requested, only applies when "options" = all or "options" = transitions. */ - transitionsFrom?: Date; - /** Alternatively, use alias "ty". The number of years from "transitionsFrom" for which DST transitions are requested, only applies when "options" = all or "options" = transitions. */ - transitionsYears?: number; -} - -/** Contains response data for the getTimezoneByCoordinates operation. */ -export type TimezoneGetTimezoneByCoordinatesResponse = TimezoneByCoordinatesResult; - -/** Optional parameters. */ -export interface TimezoneGetTimezoneEnumWindowsOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getTimezoneEnumWindows operation. */ -export type TimezoneGetTimezoneEnumWindowsResponse = TimezoneEnumWindow[]; - -/** Optional parameters. */ -export interface TimezoneGetTimezoneEnumIanaOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getTimezoneEnumIana operation. */ -export type TimezoneGetTimezoneEnumIanaResponse = IanaId[]; - -/** Optional parameters. */ -export interface TimezoneGetTimezoneIanaVersionOptionalParams - extends coreClient.OperationOptions {} - -/** Contains response data for the getTimezoneIanaVersion operation. */ -export type TimezoneGetTimezoneIanaVersionResponse = TimezoneIanaVersionResult; - -/** Optional parameters. */ -export interface TimezoneGetTimezoneWindowsToIanaOptionalParams - extends coreClient.OperationOptions { - /** Windows Time Zone territory code. */ - territory?: string; -} - -/** Contains response data for the getTimezoneWindowsToIana operation. */ -export type TimezoneGetTimezoneWindowsToIanaResponse = IanaId[]; - -/** Optional parameters. */ -export interface TimezoneClientOptionalParams - extends coreClient.ServiceClientOptions { - /** This parameter specifies where the Azure Maps Creator resource is located. Valid values are us and eu. */ - geography?: Geography; - /** Specifies which account is intended for usage in conjunction with the Azure AD security model. It represents a unique ID for the Azure Maps account and can be retrieved from the Azure Maps management plane Account API. To use Azure AD security in Azure Maps see the following [articles](https://aka.ms/amauthdetails) for guidance. */ - xMsClientId?: string; - /** Api Version */ - apiVersion?: string; - /** Overrides client endpoint. */ - endpoint?: string; -} diff --git a/sdk/maps/maps-timezone/src/models/mappers.ts b/sdk/maps/maps-timezone/src/models/mappers.ts deleted file mode 100644 index 8eacffc0c433..000000000000 --- a/sdk/maps/maps-timezone/src/models/mappers.ts +++ /dev/null @@ -1,657 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; - -export const TimezoneByIdResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TimezoneByIdResult", - modelProperties: { - version: { - serializedName: "Version", - readOnly: true, - type: { - name: "String" - } - }, - referenceUtcTimestamp: { - serializedName: "ReferenceUtcTimestamp", - readOnly: true, - type: { - name: "DateTime" - } - }, - timeZones: { - serializedName: "TimeZones", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "TimezoneById" - } - } - } - } - } - } -}; - -export const TimezoneById: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TimezoneById", - modelProperties: { - id: { - serializedName: "Id", - readOnly: true, - type: { - name: "String" - } - }, - aliases: { - serializedName: "Aliases", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - countries: { - serializedName: "Countries", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "CountryRecord" - } - } - } - }, - names: { - serializedName: "Names", - type: { - name: "Composite", - className: "TimezoneNames" - } - }, - referenceTime: { - serializedName: "ReferenceTime", - type: { - name: "Composite", - className: "ReferenceTimeById" - } - }, - representativePoint: { - serializedName: "RepresentativePoint", - type: { - name: "Composite", - className: "RepresentativePoint" - } - }, - timeTransitions: { - serializedName: "TimeTransitions", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "TimeTransition" - } - } - } - } - } - } -}; - -export const CountryRecord: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "CountryRecord", - modelProperties: { - name: { - serializedName: "Name", - readOnly: true, - type: { - name: "String" - } - }, - code: { - serializedName: "Code", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const TimezoneNames: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TimezoneNames", - modelProperties: { - iSO6391LanguageCode: { - serializedName: "ISO6391LanguageCode", - readOnly: true, - type: { - name: "String" - } - }, - generic: { - serializedName: "Generic", - readOnly: true, - type: { - name: "String" - } - }, - standard: { - serializedName: "Standard", - readOnly: true, - type: { - name: "String" - } - }, - daylight: { - serializedName: "Daylight", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const ReferenceTimeById: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ReferenceTimeById", - modelProperties: { - tag: { - serializedName: "Tag", - readOnly: true, - type: { - name: "String" - } - }, - standardOffset: { - serializedName: "StandardOffset", - readOnly: true, - type: { - name: "String" - } - }, - daylightSavings: { - serializedName: "DaylightSavings", - readOnly: true, - type: { - name: "String" - } - }, - wallTime: { - serializedName: "WallTime", - readOnly: true, - type: { - name: "String" - } - }, - posixTzValidYear: { - serializedName: "PosixTzValidYear", - readOnly: true, - type: { - name: "Number" - } - }, - posixTz: { - serializedName: "PosixTz", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const RepresentativePoint: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "RepresentativePoint", - modelProperties: { - latitude: { - serializedName: "Latitude", - readOnly: true, - type: { - name: "Number" - } - }, - longitude: { - serializedName: "Longitude", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const TimeTransition: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TimeTransition", - modelProperties: { - tag: { - serializedName: "Tag", - readOnly: true, - type: { - name: "String" - } - }, - standardOffset: { - serializedName: "StandardOffset", - readOnly: true, - type: { - name: "String" - } - }, - daylightSavings: { - serializedName: "DaylightSavings", - readOnly: true, - type: { - name: "String" - } - }, - utcStart: { - serializedName: "UtcStart", - readOnly: true, - type: { - name: "DateTime" - } - }, - utcEnd: { - serializedName: "UtcEnd", - readOnly: true, - type: { - name: "DateTime" - } - } - } - } -}; - -export const ErrorResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorResponse", - modelProperties: { - error: { - serializedName: "error", - type: { - name: "Composite", - className: "ErrorDetail" - } - } - } - } -}; - -export const ErrorDetail: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorDetail", - modelProperties: { - code: { - serializedName: "code", - readOnly: true, - type: { - name: "String" - } - }, - message: { - serializedName: "message", - readOnly: true, - type: { - name: "String" - } - }, - target: { - serializedName: "target", - readOnly: true, - type: { - name: "String" - } - }, - details: { - serializedName: "details", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ErrorDetail" - } - } - } - }, - additionalInfo: { - serializedName: "additionalInfo", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ErrorAdditionalInfo" - } - } - } - } - } - } -}; - -export const ErrorAdditionalInfo: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorAdditionalInfo", - modelProperties: { - type: { - serializedName: "type", - readOnly: true, - type: { - name: "String" - } - }, - info: { - serializedName: "info", - readOnly: true, - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - } - } - } -}; - -export const TimezoneByCoordinatesResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TimezoneByCoordinatesResult", - modelProperties: { - version: { - serializedName: "Version", - readOnly: true, - type: { - name: "String" - } - }, - referenceUtcTimestamp: { - serializedName: "ReferenceUtcTimestamp", - readOnly: true, - type: { - name: "DateTime" - } - }, - timeZones: { - serializedName: "TimeZones", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "TimeZoneByCoordinates" - } - } - } - } - } - } -}; - -export const TimeZoneByCoordinates: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TimeZoneByCoordinates", - modelProperties: { - id: { - serializedName: "Id", - readOnly: true, - type: { - name: "String" - } - }, - aliases: { - serializedName: "Aliases", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - }, - countries: { - serializedName: "Countries", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "CountryRecord" - } - } - } - }, - names: { - serializedName: "Names", - type: { - name: "Composite", - className: "TimezoneNames" - } - }, - referenceTime: { - serializedName: "ReferenceTime", - type: { - name: "Composite", - className: "ReferenceTimeByCoordinates" - } - }, - representativePoint: { - serializedName: "RepresentativePoint", - type: { - name: "Composite", - className: "RepresentativePoint" - } - }, - timeTransitions: { - serializedName: "TimeTransitions", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "TimeTransition" - } - } - } - } - } - } -}; - -export const ReferenceTimeByCoordinates: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ReferenceTimeByCoordinates", - modelProperties: { - tag: { - serializedName: "Tag", - readOnly: true, - type: { - name: "String" - } - }, - standardOffset: { - serializedName: "StandardOffset", - readOnly: true, - type: { - name: "String" - } - }, - daylightSavings: { - serializedName: "DaylightSavings", - readOnly: true, - type: { - name: "String" - } - }, - wallTime: { - serializedName: "WallTime", - readOnly: true, - type: { - name: "String" - } - }, - posixTzValidYear: { - serializedName: "PosixTzValidYear", - readOnly: true, - type: { - name: "Number" - } - }, - posixTz: { - serializedName: "PosixTz", - readOnly: true, - type: { - name: "String" - } - }, - sunrise: { - serializedName: "Sunrise", - readOnly: true, - type: { - name: "String" - } - }, - sunset: { - serializedName: "Sunset", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const TimezoneEnumWindow: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TimezoneEnumWindow", - modelProperties: { - windowsId: { - serializedName: "WindowsId", - readOnly: true, - type: { - name: "String" - } - }, - territory: { - serializedName: "Territory", - readOnly: true, - type: { - name: "String" - } - }, - ianaIds: { - serializedName: "IanaIds", - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - } - } - } -}; - -export const IanaId: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "IanaId", - modelProperties: { - id: { - serializedName: "id", - readOnly: true, - type: { - name: "String" - } - }, - isAlias: { - serializedName: "isAlias", - readOnly: true, - type: { - name: "Boolean" - } - }, - aliasOf: { - serializedName: "aliasOf", - readOnly: true, - type: { - name: "String" - } - }, - hasZone1970Location: { - serializedName: "hasZone1970Location", - readOnly: true, - type: { - name: "Boolean" - } - } - } - } -}; - -export const TimezoneIanaVersionResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TimezoneIanaVersionResult", - modelProperties: { - version: { - serializedName: "version", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; diff --git a/sdk/maps/maps-timezone/src/models/parameters.ts b/sdk/maps/maps-timezone/src/models/parameters.ts deleted file mode 100644 index 4e2e56f05b38..000000000000 --- a/sdk/maps/maps-timezone/src/models/parameters.ts +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { - OperationParameter, - OperationURLParameter, - OperationQueryParameter -} from "@azure/core-client"; - -export const accept: OperationParameter = { - parameterPath: "accept", - mapper: { - defaultValue: "application/json", - isConstant: true, - serializedName: "Accept", - type: { - name: "String" - } - } -}; - -export const geography: OperationURLParameter = { - parameterPath: "geography", - mapper: { - serializedName: "geography", - required: true, - type: { - name: "String" - } - } -}; - -export const xMsClientId: OperationParameter = { - parameterPath: "xMsClientId", - mapper: { - serializedName: "x-ms-client-id", - type: { - name: "String" - } - } -}; - -export const apiVersion: OperationQueryParameter = { - parameterPath: "apiVersion", - mapper: { - defaultValue: "1.0", - isConstant: true, - serializedName: "api-version", - type: { - name: "String" - } - } -}; - -export const acceptLanguage: OperationParameter = { - parameterPath: ["options", "acceptLanguage"], - mapper: { - serializedName: "Accept-Language", - type: { - name: "String" - } - } -}; - -export const options: OperationQueryParameter = { - parameterPath: ["options", "options"], - mapper: { - serializedName: "options", - type: { - name: "String" - } - } -}; - -export const timeStamp: OperationQueryParameter = { - parameterPath: ["options", "timeStamp"], - mapper: { - serializedName: "timeStamp", - type: { - name: "DateTime" - } - } -}; - -export const transitionsFrom: OperationQueryParameter = { - parameterPath: ["options", "transitionsFrom"], - mapper: { - serializedName: "transitionsFrom", - type: { - name: "DateTime" - } - } -}; - -export const transitionsYears: OperationQueryParameter = { - parameterPath: ["options", "transitionsYears"], - mapper: { - serializedName: "transitionsYears", - type: { - name: "Number" - } - } -}; - -export const format: OperationURLParameter = { - parameterPath: "format", - mapper: { - serializedName: "format", - required: true, - type: { - name: "String" - } - } -}; - -export const query: OperationQueryParameter = { - parameterPath: "query", - mapper: { - serializedName: "query", - required: true, - type: { - name: "String" - } - } -}; - -export const territory: OperationQueryParameter = { - parameterPath: ["options", "territory"], - mapper: { - serializedName: "territory", - type: { - name: "String" - } - } -}; diff --git a/sdk/maps/maps-timezone/src/operations/index.ts b/sdk/maps/maps-timezone/src/operations/index.ts deleted file mode 100644 index 8593a64717da..000000000000 --- a/sdk/maps/maps-timezone/src/operations/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./timezone"; diff --git a/sdk/maps/maps-timezone/src/operations/timezone.ts b/sdk/maps/maps-timezone/src/operations/timezone.ts deleted file mode 100644 index 2ced2c2cbb43..000000000000 --- a/sdk/maps/maps-timezone/src/operations/timezone.ts +++ /dev/null @@ -1,321 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { Timezone } from "../operationsInterfaces"; -import * as coreClient from "@azure/core-client"; -import * as Mappers from "../models/mappers"; -import * as Parameters from "../models/parameters"; -import { TimezoneClientContext } from "../timezoneClientContext"; -import { - ResponseFormat, - TimezoneGetTimezoneByIDOptionalParams, - TimezoneGetTimezoneByIDResponse, - TimezoneGetTimezoneByCoordinatesOptionalParams, - TimezoneGetTimezoneByCoordinatesResponse, - TimezoneGetTimezoneEnumWindowsOptionalParams, - TimezoneGetTimezoneEnumWindowsResponse, - TimezoneGetTimezoneEnumIanaOptionalParams, - TimezoneGetTimezoneEnumIanaResponse, - TimezoneGetTimezoneIanaVersionOptionalParams, - TimezoneGetTimezoneIanaVersionResponse, - TimezoneGetTimezoneWindowsToIanaOptionalParams, - TimezoneGetTimezoneWindowsToIanaResponse -} from "../models"; - -/** Class representing a Timezone. */ -export class TimezoneImpl implements Timezone { - private readonly client: TimezoneClientContext; - - /** - * Initialize a new instance of the class Timezone class. - * @param client Reference to the service client - */ - constructor(client: TimezoneClientContext) { - this.client = client; - } - - /** - * __Time Zone by Id__ - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * This API returns current, historical, and future time zone information for the specified IANA time - * zone ID. - * @param format Desired format of the response. Only `json` format is supported. - * @param query The IANA time zone ID. - * @param options The options parameters. - */ - getTimezoneByID( - format: ResponseFormat, - query: string, - options?: TimezoneGetTimezoneByIDOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getTimezoneByIDOperationSpec - ); - } - - /** - * __Time Zone by Coordinates__ - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * This API returns current, historical, and future time zone information for a specified - * latitude-longitude pair. In addition, the API provides sunset and sunrise times for a given - * location. - * @param format Desired format of the response. Only `json` format is supported. - * @param query Coordinates of the point for which time zone information is requested. The applicable - * query is specified as a comma separated string composed by latitude followed by longitude e.g. - * "47.641268,-122.125679". - * @param options The options parameters. - */ - getTimezoneByCoordinates( - format: ResponseFormat, - query: string, - options?: TimezoneGetTimezoneByCoordinatesOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getTimezoneByCoordinatesOperationSpec - ); - } - - /** - * __Enumerate Windows Time Zones__ - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * This API returns a full list of Windows Time Zone IDs. - * @param format Desired format of the response. Only `json` format is supported. - * @param options The options parameters. - */ - getTimezoneEnumWindows( - format: ResponseFormat, - options?: TimezoneGetTimezoneEnumWindowsOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, options }, - getTimezoneEnumWindowsOperationSpec - ); - } - - /** - * __Enumerate IANA Time Zones__ - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * This API returns a full list of IANA time zone IDs. Updates to the IANA service will be reflected in - * the system within one day. - * @param format Desired format of the response. Only `json` format is supported. - * @param options The options parameters. - */ - getTimezoneEnumIana( - format: ResponseFormat, - options?: TimezoneGetTimezoneEnumIanaOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, options }, - getTimezoneEnumIanaOperationSpec - ); - } - - /** - * __Time Zone IANA Version__ - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * This API returns the current IANA version number. - * @param format Desired format of the response. Only `json` format is supported. - * @param options The options parameters. - */ - getTimezoneIanaVersion( - format: ResponseFormat, - options?: TimezoneGetTimezoneIanaVersionOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, options }, - getTimezoneIanaVersionOperationSpec - ); - } - - /** - * __Windows to IANA Time Zone__ - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * This API returns a corresponding IANA ID, given a valid Windows Time Zone ID. Multiple IANA IDs may - * be returned for a single Windows ID. It is possible to narrow these results by adding an optional - * territory parameter. - * @param format Desired format of the response. Only `json` format is supported. - * @param query The Windows time zone ID. - * @param options The options parameters. - */ - getTimezoneWindowsToIana( - format: ResponseFormat, - query: string, - options?: TimezoneGetTimezoneWindowsToIanaOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getTimezoneWindowsToIanaOperationSpec - ); - } -} -// Operation Specifications -const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); - -const getTimezoneByIDOperationSpec: coreClient.OperationSpec = { - path: "/timezone/byId/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.TimezoneByIdResult - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.options, - Parameters.timeStamp, - Parameters.transitionsFrom, - Parameters.transitionsYears, - Parameters.query - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [ - Parameters.accept, - Parameters.xMsClientId, - Parameters.acceptLanguage - ], - serializer -}; -const getTimezoneByCoordinatesOperationSpec: coreClient.OperationSpec = { - path: "/timezone/byCoordinates/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.TimezoneByCoordinatesResult - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.options, - Parameters.timeStamp, - Parameters.transitionsFrom, - Parameters.transitionsYears, - Parameters.query - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [ - Parameters.accept, - Parameters.xMsClientId, - Parameters.acceptLanguage - ], - serializer -}; -const getTimezoneEnumWindowsOperationSpec: coreClient.OperationSpec = { - path: "/timezone/enumWindows/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: { - type: { - name: "Sequence", - element: { - type: { name: "Composite", className: "TimezoneEnumWindow" } - } - } - } - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getTimezoneEnumIanaOperationSpec: coreClient.OperationSpec = { - path: "/timezone/enumIana/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: { - type: { - name: "Sequence", - element: { type: { name: "Composite", className: "IanaId" } } - } - } - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getTimezoneIanaVersionOperationSpec: coreClient.OperationSpec = { - path: "/timezone/ianaVersion/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.TimezoneIanaVersionResult - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [Parameters.apiVersion], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getTimezoneWindowsToIanaOperationSpec: coreClient.OperationSpec = { - path: "/timezone/windowsToIana/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: { - type: { - name: "Sequence", - element: { type: { name: "Composite", className: "IanaId" } } - } - } - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.query, - Parameters.territory - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; diff --git a/sdk/maps/maps-timezone/src/operationsInterfaces/index.ts b/sdk/maps/maps-timezone/src/operationsInterfaces/index.ts deleted file mode 100644 index 8593a64717da..000000000000 --- a/sdk/maps/maps-timezone/src/operationsInterfaces/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./timezone"; diff --git a/sdk/maps/maps-timezone/src/operationsInterfaces/timezone.ts b/sdk/maps/maps-timezone/src/operationsInterfaces/timezone.ts deleted file mode 100644 index 4fd8a623debd..000000000000 --- a/sdk/maps/maps-timezone/src/operationsInterfaces/timezone.ts +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { - ResponseFormat, - TimezoneGetTimezoneByIDOptionalParams, - TimezoneGetTimezoneByIDResponse, - TimezoneGetTimezoneByCoordinatesOptionalParams, - TimezoneGetTimezoneByCoordinatesResponse, - TimezoneGetTimezoneEnumWindowsOptionalParams, - TimezoneGetTimezoneEnumWindowsResponse, - TimezoneGetTimezoneEnumIanaOptionalParams, - TimezoneGetTimezoneEnumIanaResponse, - TimezoneGetTimezoneIanaVersionOptionalParams, - TimezoneGetTimezoneIanaVersionResponse, - TimezoneGetTimezoneWindowsToIanaOptionalParams, - TimezoneGetTimezoneWindowsToIanaResponse -} from "../models"; - -/** Interface representing a Timezone. */ -export interface Timezone { - /** - * __Time Zone by Id__ - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * This API returns current, historical, and future time zone information for the specified IANA time - * zone ID. - * @param format Desired format of the response. Only `json` format is supported. - * @param query The IANA time zone ID. - * @param options The options parameters. - */ - getTimezoneByID( - format: ResponseFormat, - query: string, - options?: TimezoneGetTimezoneByIDOptionalParams - ): Promise; - /** - * __Time Zone by Coordinates__ - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * This API returns current, historical, and future time zone information for a specified - * latitude-longitude pair. In addition, the API provides sunset and sunrise times for a given - * location. - * @param format Desired format of the response. Only `json` format is supported. - * @param query Coordinates of the point for which time zone information is requested. The applicable - * query is specified as a comma separated string composed by latitude followed by longitude e.g. - * "47.641268,-122.125679". - * @param options The options parameters. - */ - getTimezoneByCoordinates( - format: ResponseFormat, - query: string, - options?: TimezoneGetTimezoneByCoordinatesOptionalParams - ): Promise; - /** - * __Enumerate Windows Time Zones__ - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * This API returns a full list of Windows Time Zone IDs. - * @param format Desired format of the response. Only `json` format is supported. - * @param options The options parameters. - */ - getTimezoneEnumWindows( - format: ResponseFormat, - options?: TimezoneGetTimezoneEnumWindowsOptionalParams - ): Promise; - /** - * __Enumerate IANA Time Zones__ - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * This API returns a full list of IANA time zone IDs. Updates to the IANA service will be reflected in - * the system within one day. - * @param format Desired format of the response. Only `json` format is supported. - * @param options The options parameters. - */ - getTimezoneEnumIana( - format: ResponseFormat, - options?: TimezoneGetTimezoneEnumIanaOptionalParams - ): Promise; - /** - * __Time Zone IANA Version__ - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * This API returns the current IANA version number. - * @param format Desired format of the response. Only `json` format is supported. - * @param options The options parameters. - */ - getTimezoneIanaVersion( - format: ResponseFormat, - options?: TimezoneGetTimezoneIanaVersionOptionalParams - ): Promise; - /** - * __Windows to IANA Time Zone__ - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * This API returns a corresponding IANA ID, given a valid Windows Time Zone ID. Multiple IANA IDs may - * be returned for a single Windows ID. It is possible to narrow these results by adding an optional - * territory parameter. - * @param format Desired format of the response. Only `json` format is supported. - * @param query The Windows time zone ID. - * @param options The options parameters. - */ - getTimezoneWindowsToIana( - format: ResponseFormat, - query: string, - options?: TimezoneGetTimezoneWindowsToIanaOptionalParams - ): Promise; -} diff --git a/sdk/maps/maps-timezone/src/timezoneClient.ts b/sdk/maps/maps-timezone/src/timezoneClient.ts deleted file mode 100644 index 34222e8bf958..000000000000 --- a/sdk/maps/maps-timezone/src/timezoneClient.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreAuth from "@azure/core-auth"; -import { TimezoneImpl } from "./operations"; -import { Timezone } from "./operationsInterfaces"; -import { TimezoneClientContext } from "./timezoneClientContext"; -import { TimezoneClientOptionalParams } from "./models"; - -export class TimezoneClient extends TimezoneClientContext { - /** - * Initializes a new instance of the TimezoneClient class. - * @param credentials Subscription credentials which uniquely identify client subscription. - * @param options The parameter options - */ - constructor( - credentials: coreAuth.TokenCredential, - options?: TimezoneClientOptionalParams - ) { - super(credentials, options); - this.timezone = new TimezoneImpl(this); - } - - timezone: Timezone; -} diff --git a/sdk/maps/maps-timezone/src/timezoneClientContext.ts b/sdk/maps/maps-timezone/src/timezoneClientContext.ts deleted file mode 100644 index 524821c2ba20..000000000000 --- a/sdk/maps/maps-timezone/src/timezoneClientContext.ts +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; -import * as coreAuth from "@azure/core-auth"; -import { Geography, TimezoneClientOptionalParams } from "./models"; - -export class TimezoneClientContext extends coreClient.ServiceClient { - geography: Geography; - xMsClientId?: string; - apiVersion: string; - - /** - * Initializes a new instance of the TimezoneClientContext class. - * @param credentials Subscription credentials which uniquely identify client subscription. - * @param options The parameter options - */ - constructor( - credentials: coreAuth.TokenCredential, - options?: TimezoneClientOptionalParams - ) { - if (credentials === undefined) { - throw new Error("'credentials' cannot be null"); - } - - // Initializing default values for options - if (!options) { - options = {}; - } - const defaults: TimezoneClientOptionalParams = { - requestContentType: "application/json; charset=utf-8", - credential: credentials - }; - - const packageDetails = `azsdk-js-maps-timezone/1.0.0-beta.1`; - const userAgentPrefix = - options.userAgentOptions && options.userAgentOptions.userAgentPrefix - ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` - : `${packageDetails}`; - - if (!options.credentialScopes) { - options.credentialScopes = ["https://atlas.microsoft.com/.default"]; - } - const optionsWithDefaults = { - ...defaults, - ...options, - userAgentOptions: { - userAgentPrefix - }, - baseUri: options.endpoint || "https://{geography}.atlas.microsoft.com" - }; - super(optionsWithDefaults); - - // Assigning values to Constant parameters - this.geography = options.geography || "us"; - this.apiVersion = options.apiVersion || "1.0"; - } -} diff --git a/sdk/maps/maps-timezone/tsconfig.json b/sdk/maps/maps-timezone/tsconfig.json deleted file mode 100644 index 0ec8659c8e83..000000000000 --- a/sdk/maps/maps-timezone/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "module": "es6", - "moduleResolution": "node", - "strict": true, - "target": "es6", - "sourceMap": true, - "declarationMap": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "preserveConstEnums": true, - "lib": ["es6", "dom"], - "declaration": true, - "outDir": "./esm", - "importHelpers": true - }, - "include": ["./src/**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/sdk/maps/maps-traffic/LICENSE.txt b/sdk/maps/maps-traffic/LICENSE.txt deleted file mode 100644 index ccb63b166732..000000000000 --- a/sdk/maps/maps-traffic/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2021 Microsoft - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/sdk/maps/maps-traffic/README.md b/sdk/maps/maps-traffic/README.md deleted file mode 100644 index a040e8d19bf5..000000000000 --- a/sdk/maps/maps-traffic/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# Azure Traffic client library for JavaScript - -This package contains an isomorphic SDK (runs both in Node.js and in browsers) for Azure Traffic client. - -Azure Maps Traffic REST APIs - -[Source code](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-traffic) | -[Package (NPM)](https://www.npmjs.com/package/@azure/maps-traffic) | -[API reference documentation](https://docs.microsoft.com/javascript/api/@azure/maps-traffic) | -[Samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-traffic/samples) - -## Getting started - -### Currently supported environments - -- [LTS versions of Node.js](https://nodejs.org/about/releases/) -- Latest versions of Safari, Chrome, Edge and Firefox. - -### Prerequisites - -- An [Azure subscription][azure_sub]. - -### Install the `@azure/maps-traffic` package - -Install the Azure Traffic client library for JavaScript with `npm`: - -```bash -npm install @azure/maps-traffic -``` - -### Create and authenticate a `TrafficClient` - -To create a client object to access the Azure Traffic API, you will need the `endpoint` of your Azure Traffic resource and a `credential`. The Azure Traffic client can use Azure Active Directory credentials to authenticate. -You can find the endpoint for your Azure Traffic resource in the [Azure Portal][azure_portal]. - -#### Using an Azure Active Directory Credential - -You can authenticate with Azure Active Directory using the [Azure Identity library][azure_identity]. To use the [DefaultAzureCredential][defaultazurecredential] provider shown below, or other credential providers provided with the Azure SDK, please install the `@azure/identity` package: - -```bash -npm install @azure/identity -``` - -You will also need to register a new AAD application and grant access to Azure Traffic by assigning the suitable role to your service principal (note: roles such as `"Owner"` will not grant the necessary permissions). -Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`. - -```javascript -const { TrafficClient } = require("@azure/maps-traffic"); -const { DefaultAzureCredential } = require("@azure/identity"); -const client = new TrafficClient("", new DefaultAzureCredential()); -``` - -## Key concepts - -### TrafficClient - -`TrafficClient` is the primary interface for developers using the Azure Traffic client library. Explore the methods on this client object to understand the different features of the Azure Traffic service that you can access. - -## Troubleshooting - -### Logging - -Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: - -```javascript -import { setLogLevel } from "@azure/logger"; -setLogLevel("info"); -``` - -For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger). - -## Next steps - -Please take a look at the [samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-traffic/samples) directory for detailed examples on how to use this library. - -## Contributing - -If you'd like to contribute to this library, please read the [contributing guide](https://github.com/Azure/azure-sdk-for-js/blob/master/CONTRIBUTING.md) to learn more about how to build and test the code. - -## Related projects - -- [Microsoft Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) - -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fmaps%2Fmaps-traffic%2FREADME.png) - -[azure_cli]: https://docs.microsoft.com/cli/azure -[azure_sub]: https://azure.microsoft.com/free/ -[azure_sub]: https://azure.microsoft.com/free/ -[azure_portal]: https://portal.azure.com -[azure_identity]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity -[defaultazurecredential]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity#defaultazurecredential diff --git a/sdk/maps/maps-traffic/api-extractor.json b/sdk/maps/maps-traffic/api-extractor.json deleted file mode 100644 index 5fb5b21b56f2..000000000000 --- a/sdk/maps/maps-traffic/api-extractor.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", - "mainEntryPointFilePath": "./esm/index.d.ts", - "docModel": { "enabled": true }, - "apiReport": { "enabled": true, "reportFolder": "./review" }, - "dtsRollup": { - "enabled": true, - "untrimmedFilePath": "", - "publicTrimmedFilePath": "./esm/index.d.ts" - }, - "messages": { - "tsdocMessageReporting": { "default": { "logLevel": "none" } }, - "extractorMessageReporting": { - "ae-missing-release-tag": { "logLevel": "none" }, - "ae-unresolved-link": { "logLevel": "none" } - } - } -} diff --git a/sdk/maps/maps-traffic/package.json b/sdk/maps/maps-traffic/package.json deleted file mode 100644 index 1f1517c221d5..000000000000 --- a/sdk/maps/maps-traffic/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "@azure/maps-traffic", - "sdk-type": "client", - "author": "Microsoft Corporation", - "description": "A generated SDK for TrafficClient.", - "version": "1.0.0-beta.1", - "engines": { "node": ">=12.0.0" }, - "dependencies": { - "@azure/core-client": "^1.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-rest-pipeline": "^1.1.0", - "tslib": "^2.2.0" - }, - "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], - "license": "MIT", - "main": "./dist/index.js", - "module": "./esm/index.js", - "types": "./esm/index.d.ts", - "devDependencies": { - "@microsoft/api-extractor": "7.7.11", - "@rollup/plugin-commonjs": "11.0.2", - "@rollup/plugin-json": "^4.0.0", - "@rollup/plugin-multi-entry": "^3.0.0", - "@rollup/plugin-node-resolve": "^8.0.0", - "mkdirp": "^1.0.4", - "rollup": "^1.16.3", - "rollup-plugin-sourcemaps": "^0.4.2", - "rollup-plugin-node-resolve": "^3.4.0", - "typescript": "~4.2.0", - "uglify-js": "^3.4.9" - }, - "homepage": "https://github.com/Azure/azure-sdk-for-js", - "repository": { - "type": "git", - "url": "https://github.com/Azure/azure-sdk-for-js.git" - }, - "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, - "files": [ - "dist/**/*.js", - "dist/**/*.js.map", - "dist/**/*.d.ts", - "dist/**/*.d.ts.map", - "esm/**/*.js", - "esm/**/*.js.map", - "esm/**/*.d.ts", - "esm/**/*.d.ts.map", - "src/**/*.ts", - "README.md", - "rollup.config.js", - "tsconfig.json", - "review/*", - "CHANGELOG.md" - ], - "scripts": { - "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", - "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js", - "prepack": "npm install && npm run build", - "pack": "npm pack 2>&1", - "extract-api": "mkdirp ./review && api-extractor run --local", - "lint": "echo skipped", - "audit": "echo skipped", - "clean": "echo skipped", - "build:node": "echo skipped", - "build:browser": "echo skipped", - "build:test": "echo skipped", - "build:samples": "echo skipped.", - "check-format": "echo skipped", - "execute:samples": "echo skipped", - "format": "echo skipped", - "test": "echo skipped", - "prebuild": "echo skipped", - "test:node": "echo skipped", - "test:browser": "echo skipped", - "unit-test": "echo skipped", - "unit-test:node": "echo skipped", - "unit-test:browser": "echo skipped", - "integration-test:browser": "echo skipped", - "integration-test:node": "echo skipped", - "integration-test": "echo skipped", - "docs": "echo skipped" - }, - "sideEffects": false, - "autoPublish": true -} diff --git a/sdk/maps/maps-traffic/review/maps-traffic.api.md b/sdk/maps/maps-traffic/review/maps-traffic.api.md deleted file mode 100644 index b4620fe47902..000000000000 --- a/sdk/maps/maps-traffic/review/maps-traffic.api.md +++ /dev/null @@ -1,336 +0,0 @@ -## API Report File for "@azure/maps-traffic" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -import * as coreAuth from '@azure/core-auth'; -import * as coreClient from '@azure/core-client'; - -// @public -export interface CoordinatesPair { - latitude?: number; - longitude?: number; -} - -// @public -export interface ErrorAdditionalInfo { - readonly info?: Record; - readonly type?: string; -} - -// @public -export interface ErrorDetail { - readonly additionalInfo?: ErrorAdditionalInfo[]; - readonly code?: string; - readonly details?: ErrorDetail[]; - readonly message?: string; - readonly target?: string; -} - -// @public -export interface ErrorResponse { - error?: ErrorDetail; -} - -// @public -export type GeographicResourceLocation = string; - -// @public -export type Geography = string; - -// @public -export type IncidentGeometryType = string; - -// @public -export const enum KnownGeographicResourceLocation { - Eu = "eu", - Us = "us" -} - -// @public -export const enum KnownGeography { - // (undocumented) - Eu = "eu", - // (undocumented) - Us = "us" -} - -// @public -export const enum KnownIncidentGeometryType { - Original = "original", - Shifted = "shifted" -} - -// @public -export const enum KnownProjectionStandard { - Epsg4326 = "EPSG4326", - Epsg900913 = "EPSG900913" -} - -// @public -export const enum KnownSpeedUnit { - Kmph = "KMPH", - MPH = "MPH" -} - -// @public -export const enum KnownTextFormat { - Json = "json", - Xml = "xml" -} - -// @public -export const enum KnownTileFormat { - Pbf = "pbf", - Png = "png" -} - -// @public -export const enum KnownTrafficFlowSegmentStyle { - // (undocumented) - Absolute = "absolute", - // (undocumented) - Relative = "relative", - // (undocumented) - RelativeDelay = "relative-delay" -} - -// @public -export const enum KnownTrafficFlowTileStyle { - Absolute = "absolute", - ReducedSensitivity = "reduced-sensitivity", - Relative = "relative", - RelativeDelay = "relative-delay" -} - -// @public -export const enum KnownTrafficIncidentDetailStyle { - Night = "night", - S1 = "s1", - S2 = "s2", - S3 = "s3" -} - -// @public -export const enum KnownTrafficIncidentTileStyle { - Night = "night", - S1 = "s1", - S2 = "s2", - S3 = "s3" -} - -// @public -export type ProjectionStandard = string; - -// @public -export type SpeedUnit = string; - -// @public -export type TextFormat = string; - -// @public -export type TileFormat = string; - -// @public -export interface Traffic { - getTrafficFlowSegment(format: TextFormat, style: TrafficFlowSegmentStyle, zoom: number, query: string, options?: TrafficGetTrafficFlowSegmentOptionalParams): Promise; - getTrafficFlowTile(format: TileFormat, style: TrafficFlowTileStyle, zoom: number, xTileIndex: number, yTileIndex: number, options?: TrafficGetTrafficFlowTileOptionalParams): Promise; - getTrafficIncidentDetail(format: TextFormat, style: TrafficIncidentDetailStyle, boundingbox: string, boundingZoom: number, trafficmodelid: string, options?: TrafficGetTrafficIncidentDetailOptionalParams): Promise; - getTrafficIncidentTile(format: TileFormat, style: TrafficIncidentTileStyle, zoom: number, xTileIndex: number, yTileIndex: number, options?: TrafficGetTrafficIncidentTileOptionalParams): Promise; - getTrafficIncidentViewport(format: TextFormat, boundingbox: string, boundingzoom: number, overviewbox: string, overviewzoom: number, options?: TrafficGetTrafficIncidentViewportOptionalParams): Promise; -} - -// @public (undocumented) -export class TrafficClient extends TrafficClientContext { - constructor(credentials: coreAuth.TokenCredential, options?: TrafficClientOptionalParams); - // (undocumented) - traffic: Traffic; -} - -// @public (undocumented) -export class TrafficClientContext extends coreClient.ServiceClient { - constructor(credentials: coreAuth.TokenCredential, options?: TrafficClientOptionalParams); - // (undocumented) - apiVersion: string; - // (undocumented) - geography: Geography; - // (undocumented) - xMsClientId?: string; -} - -// @public -export interface TrafficClientOptionalParams extends coreClient.ServiceClientOptions { - apiVersion?: string; - endpoint?: string; - geography?: Geography; - xMsClientId?: string; -} - -// @public -export interface TrafficFlowSegmentResult { - readonly flowSegmentData?: TrafficFlowSegmentResultFlowSegmentData; -} - -// @public -export interface TrafficFlowSegmentResultFlowSegmentData { - readonly confidence?: number; - coordinates?: TrafficFlowSegmentResultFlowSegmentDataCoordinates; - readonly currentSpeed?: number; - readonly currentTravelTime?: number; - readonly frc?: string; - readonly freeFlowSpeed?: number; - readonly freeFlowTravelTime?: number; - readonly openlr?: number; - readonly version?: string; -} - -// @public -export interface TrafficFlowSegmentResultFlowSegmentDataCoordinates { - readonly coordinate?: CoordinatesPair[]; -} - -// @public -export type TrafficFlowSegmentStyle = string; - -// @public -export type TrafficFlowTileStyle = string; - -// @public -export interface TrafficGetTrafficFlowSegmentOptionalParams extends coreClient.OperationOptions { - openLr?: boolean; - thickness?: number; - unit?: SpeedUnit; -} - -// @public -export type TrafficGetTrafficFlowSegmentResponse = TrafficFlowSegmentResult; - -// @public -export interface TrafficGetTrafficFlowTileHeaders { - contentType?: string; -} - -// @public -export interface TrafficGetTrafficFlowTileOptionalParams extends coreClient.OperationOptions { - thickness?: number; -} - -// @public -export type TrafficGetTrafficFlowTileResponse = TrafficGetTrafficFlowTileHeaders & { - blobBody?: Promise; - readableStreamBody?: NodeJS.ReadableStream; -}; - -// @public -export interface TrafficGetTrafficIncidentDetailOptionalParams extends coreClient.OperationOptions { - expandCluster?: boolean; - geometries?: IncidentGeometryType; - language?: string; - originalPosition?: boolean; - projection?: ProjectionStandard; -} - -// @public -export type TrafficGetTrafficIncidentDetailResponse = TrafficIncidentDetailResult; - -// @public -export interface TrafficGetTrafficIncidentTileHeaders { - contentType?: string; -} - -// @public -export interface TrafficGetTrafficIncidentTileOptionalParams extends coreClient.OperationOptions { - trafficState?: string; -} - -// @public -export type TrafficGetTrafficIncidentTileResponse = TrafficGetTrafficIncidentTileHeaders & { - blobBody?: Promise; - readableStreamBody?: NodeJS.ReadableStream; -}; - -// @public -export interface TrafficGetTrafficIncidentViewportOptionalParams extends coreClient.OperationOptions { - copyright?: boolean; -} - -// @public -export type TrafficGetTrafficIncidentViewportResponse = TrafficIncidentViewportResult; - -// @public -export interface TrafficIncidentDetailResult { - readonly tm?: TrafficIncidentDetailResultTm; -} - -// @public -export interface TrafficIncidentDetailResultTm { - readonly id?: string; - readonly poi?: TrafficIncidentPoi[]; -} - -// @public -export type TrafficIncidentDetailStyle = string; - -// @public (undocumented) -export interface TrafficIncidentPoi { - readonly c?: string; - readonly cbl?: TrafficIncidentPoiCbl; - readonly cs?: number; - readonly ctr?: TrafficIncidentPoiCtr; - readonly d?: string; - readonly dl?: number; - readonly f?: string; - readonly ic?: number; - readonly id?: string; - readonly l?: number; - readonly p?: TrafficIncidentPoiP; - readonly r?: string; - readonly t?: string; - readonly ty?: number; -} - -// @public -export interface TrafficIncidentPoiCbl { - readonly x?: number; - readonly y?: number; -} - -// @public -export interface TrafficIncidentPoiCtr { - readonly x?: number; - readonly y?: number; -} - -// @public -export interface TrafficIncidentPoiP { - readonly x?: number; - readonly y?: number; -} - -// @public -export type TrafficIncidentTileStyle = string; - -// @public -export interface TrafficIncidentViewportResult { - readonly viewpResp?: TrafficIncidentViewportResultViewpResp; -} - -// @public -export interface TrafficIncidentViewportResultViewpResp { - readonly copyrightIds?: string; - readonly maps?: string; - readonly trafficState?: TrafficIncidentViewportResultViewpRespTrafficState; - readonly version?: string; -} - -// @public -export interface TrafficIncidentViewportResultViewpRespTrafficState { - readonly trafficAge?: number; - readonly trafficModelId?: string; -} - - -// (No @packageDocumentation comment for this package) - -``` diff --git a/sdk/maps/maps-traffic/rollup.config.js b/sdk/maps/maps-traffic/rollup.config.js deleted file mode 100644 index 9be1955eb7f1..000000000000 --- a/sdk/maps/maps-traffic/rollup.config.js +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import nodeResolve from "@rollup/plugin-node-resolve"; -import cjs from "@rollup/plugin-commonjs"; -import sourcemaps from "rollup-plugin-sourcemaps"; -import multiEntry from "@rollup/plugin-multi-entry"; -import json from "@rollup/plugin-json"; - -import nodeBuiltins from "builtin-modules"; - -/** - * Gets the proper configuration needed for rollup's commonJS plugin for @opentelemetry/api. - * - * NOTE: this manual configuration is only needed because OpenTelemetry uses an - * __exportStar downleveled helper function to declare its exports which confuses - * rollup's automatic discovery mechanism. - * - * @returns an object reference that can be `...`'d into your cjs() configuration. - */ -export function openTelemetryCommonJs() { - const namedExports = {}; - - for (const key of [ - "@opentelemetry/api", - "@azure/core-tracing/node_modules/@opentelemetry/api" - ]) { - namedExports[key] = [ - "SpanKind", - "TraceFlags", - "getSpan", - "setSpan", - "SpanStatusCode", - "getSpanContext", - "setSpanContext" - ]; - } - - const releasedOpenTelemetryVersions = ["0.10.2", "1.0.0-rc.0"]; - - for (const version of releasedOpenTelemetryVersions) { - namedExports[ - // working around a limitation in the rollup common.js plugin - it's not able to resolve these modules so the named exports listed above will not get applied. We have to drill down to the actual path. - `../../../common/temp/node_modules/.pnpm/@opentelemetry/api@${version}/node_modules/@opentelemetry/api/build/src/index.js` - ] = [ - "SpanKind", - "TraceFlags", - "getSpan", - "setSpan", - "StatusCode", - "CanonicalCode", - "getSpanContext", - "setSpanContext" - ]; - } - - return namedExports; -} - -// #region Warning Handler - -/** - * A function that can determine whether a rollupwarning should be ignored. If - * the function returns `true`, then the warning will not be displayed. - */ - -function ignoreNiseSinonEvalWarnings(warning) { - return ( - warning.code === "EVAL" && - warning.id && - (warning.id.includes("node_modules/nise") || - warning.id.includes("node_modules/sinon")) === true - ); -} - -function ignoreChaiCircularDependencyWarnings(warning) { - return ( - warning.code === "CIRCULAR_DEPENDENCY" && - warning.importer && warning.importer.includes("node_modules/chai") === true - ); -} - -const warningInhibitors = [ - ignoreChaiCircularDependencyWarnings, - ignoreNiseSinonEvalWarnings -]; - -/** - * Construct a warning handler for the shared rollup configuration - * that ignores certain warnings that are not relevant to testing. - */ -function makeOnWarnForTesting() { - return (warning, warn) => { - // If every inhibitor returns false (i.e. no inhibitors), then show the warning - if (warningInhibitors.every((inhib) => !inhib(warning))) { - warn(warning); - } - }; -} - -// #endregion - -function makeBrowserTestConfig() { - const config = { - input: { - include: ["dist-esm/test/**/*.spec.js"], - exclude: ["dist-esm/test/**/node/**"] - }, - output: { - file: `dist-test/index.browser.js`, - format: "umd", - sourcemap: true - }, - preserveSymlinks: false, - plugins: [ - multiEntry({ exports: false }), - nodeResolve({ - mainFields: ["module", "browser"] - }), - cjs({ - namedExports: { - // Chai's strange internal architecture makes it impossible to statically - // analyze its exports. - chai: [ - "version", - "use", - "util", - "config", - "expect", - "should", - "assert" - ], - ...openTelemetryCommonJs() - } - }), - json(), - sourcemaps() - //viz({ filename: "dist-test/browser-stats.html", sourcemap: true }) - ], - onwarn: makeOnWarnForTesting(), - // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, - // rollup started respecting the "sideEffects" field in package.json. Since - // our package.json sets "sideEffects=false", this also applies to test - // code, which causes all tests to be removed by tree-shaking. - treeshake: false - }; - - return config; -} - -const defaultConfigurationOptions = { - disableBrowserBundle: false -}; - -export function makeConfig(pkg, options) { - options = { - ...defaultConfigurationOptions, - ...(options || {}) - }; - - const baseConfig = { - // Use the package's module field if it has one - input: pkg["module"] || "dist-esm/src/index.js", - external: [ - ...nodeBuiltins, - ...Object.keys(pkg.dependencies), - ...Object.keys(pkg.devDependencies) - ], - output: { file: "dist/index.js", format: "cjs", sourcemap: true }, - preserveSymlinks: false, - plugins: [sourcemaps(), nodeResolve(), cjs()] - }; - - const config = [baseConfig]; - - if (!options.disableBrowserBundle) { - config.push(makeBrowserTestConfig()); - } - - return config; -} - -export default makeConfig(require("./package.json")); diff --git a/sdk/maps/maps-traffic/src/index.ts b/sdk/maps/maps-traffic/src/index.ts deleted file mode 100644 index 19da68364a99..000000000000 --- a/sdk/maps/maps-traffic/src/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./models"; -export { TrafficClient } from "./trafficClient"; -export { TrafficClientContext } from "./trafficClientContext"; -export * from "./operationsInterfaces"; diff --git a/sdk/maps/maps-traffic/src/models/index.ts b/sdk/maps/maps-traffic/src/models/index.ts deleted file mode 100644 index 78cfd2cf6c77..000000000000 --- a/sdk/maps/maps-traffic/src/models/index.ts +++ /dev/null @@ -1,657 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; - -/** Common error response for all Azure Resource Manager APIs to return error details for failed operations. (This also follows the OData error response format.). */ -export interface ErrorResponse { - /** The error object. */ - error?: ErrorDetail; -} - -/** The error detail. */ -export interface ErrorDetail { - /** - * The error code. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly code?: string; - /** - * The error message. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly message?: string; - /** - * The error target. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly target?: string; - /** - * The error details. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly details?: ErrorDetail[]; - /** - * The error additional info. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly additionalInfo?: ErrorAdditionalInfo[]; -} - -/** The resource management error additional info. */ -export interface ErrorAdditionalInfo { - /** - * The additional info type. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly type?: string; - /** - * The additional info. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly info?: Record; -} - -/** This object is returned from a successful Traffic Flow Segment call */ -export interface TrafficFlowSegmentResult { - /** - * Flow Segment Data property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly flowSegmentData?: TrafficFlowSegmentResultFlowSegmentData; -} - -/** Flow Segment Data property */ -export interface TrafficFlowSegmentResultFlowSegmentData { - /** - * Functional Road Class. This indicates the road type: - * 0: Motorway, freeway or other major road. - * 1: Major road, less important than a motorway. - * 2: Other major road. - * 3: Secondary road. - * 4: Local connecting road. - * 5: Local road of high importance. - * 6: Local road. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly frc?: string; - /** - * The current average speed at the selected point, in the units requested. This is calculated from the currentTravelTime and the length of the selected segment. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly currentSpeed?: number; - /** - * The free flow speed expected under ideal conditions, expressed in the units requested. This is related to the freeFlowTravelTime. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly freeFlowSpeed?: number; - /** - * Current travel time in seconds based on fused real-time measurements between the defined locations in the specified direction. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly currentTravelTime?: number; - /** - * The travel time in seconds which would be expected under ideal free flow conditions. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly freeFlowTravelTime?: number; - /** - * The confidence is a measure of the quality of the provided travel time and speed. A value of 1 means full confidence, that the response contains the highest quality data. Lower values indicate the degree that the response may vary from the actual conditions on the road. Any value greater than 0.6 means the information was based on real-time probe input. A value of 0.5 means the reported speed is based on historical info. A value between 0.5 and 0.6 has a calculated weighted average between historical and live speeds. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly confidence?: number; - /** Includes the coordinates describing the shape of the segment. Coordinates are shifted from the road depending on the zoom level to support high quality visualization in every scale. */ - coordinates?: TrafficFlowSegmentResultFlowSegmentDataCoordinates; - /** - * This indicates the software version that generated the response. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly version?: string; - /** - * OpenLR code for segment - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly openlr?: number; -} - -/** Includes the coordinates describing the shape of the segment. Coordinates are shifted from the road depending on the zoom level to support high quality visualization in every scale. */ -export interface TrafficFlowSegmentResultFlowSegmentDataCoordinates { - /** - * Coordinate array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly coordinate?: CoordinatesPair[]; -} - -/** A location represented as a latitude and longitude. */ -export interface CoordinatesPair { - /** Latitude property */ - latitude?: number; - /** Longitude property */ - longitude?: number; -} - -/** This object is returned from a successful Traffic incident Detail call */ -export interface TrafficIncidentDetailResult { - /** - * Main response element - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly tm?: TrafficIncidentDetailResultTm; -} - -/** Main response element */ -export interface TrafficIncidentDetailResultTm { - /** - * ID of the traffic incident - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly id?: string; - /** - * A single traffic incident, or a cluster of traffic incidents - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly poi?: TrafficIncidentPoi[]; -} - -export interface TrafficIncidentPoi { - /** - * ID of the traffic incident - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly id?: string; - /** - * The point where an icon of the cluster or raw incident should be drawn, expressed in the requested projection. This is affected by traffic style, zoom level and road type - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly p?: TrafficIncidentPoiP; - /** - * The icon category associated with this incident. Values are numbers in the range 0-13, with the following meanings -- 0: Unknown, 1: Accident, 2: Fog, 3: Dangerous Conditions, 4: Rain, 5: Ice, 6: Jam, 7: Lane Closed, 8: Road Closed, 9: Road Works, 10: Wind, 11: Flooding, 12: Detour, 13: Cluster - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly ic?: number; - /** - * The magnitude of delay associated with incident. These values correspond to incident colors in the traffic tiles - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly ty?: number; - /** - * Bottom left coordinate of the cluster in the projection of the request - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly cbl?: TrafficIncidentPoiCbl; - /** - * Top right coordinate of the cluster in the projection of the request - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly ctr?: TrafficIncidentPoiCtr; - /** - * Cluster size: the number of incidents in the cluster - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly cs?: number; - /** - * Length of the incident in meters - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly l?: number; - /** - * The road number(s) affected by the incident. Multiple road numbers will delimited by slashes - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly r?: string; - /** - * Delay caused by the incident in seconds (except in road closures) - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly dl?: number; - /** - * To: the name of the intersection or location where the traffic due to the incident ends - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly t?: string; - /** - * From: the name of the intersection or location where the traffic due to the incident starts - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly f?: string; - /** - * Description of the incident in the language requested - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly d?: string; - /** - * Cause of the incident, where available, in the language requested - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly c?: string; -} - -/** The point where an icon of the cluster or raw incident should be drawn, expressed in the requested projection. This is affected by traffic style, zoom level and road type */ -export interface TrafficIncidentPoiP { - /** - * x coordinate - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly x?: number; - /** - * y coordinate - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly y?: number; -} - -/** Bottom left coordinate of the cluster in the projection of the request */ -export interface TrafficIncidentPoiCbl { - /** - * x coordinate - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly x?: number; - /** - * y coordinate - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly y?: number; -} - -/** Top right coordinate of the cluster in the projection of the request */ -export interface TrafficIncidentPoiCtr { - /** - * x coordinate - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly x?: number; - /** - * y coordinate - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly y?: number; -} - -/** This object is returned from a successful Traffic Incident Viewport call */ -export interface TrafficIncidentViewportResult { - /** - * Viewport Response object - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly viewpResp?: TrafficIncidentViewportResultViewpResp; -} - -/** Viewport Response object */ -export interface TrafficIncidentViewportResultViewpResp { - /** - * Traffic State array - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly trafficState?: TrafficIncidentViewportResultViewpRespTrafficState; - /** - * Copyright Ids property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly copyrightIds?: string; - /** - * @Version property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly version?: string; - /** - * @maps property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly maps?: string; -} - -/** Traffic State array */ -export interface TrafficIncidentViewportResultViewpRespTrafficState { - /** - * @Traffic Age property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly trafficAge?: number; - /** - * @Traffic Model Id property - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly trafficModelId?: string; -} - -/** Defines headers for Traffic_getTrafficFlowTile operation. */ -export interface TrafficGetTrafficFlowTileHeaders { - /** The content-type for the response. */ - contentType?: string; -} - -/** Defines headers for Traffic_getTrafficIncidentTile operation. */ -export interface TrafficGetTrafficIncidentTileHeaders { - /** The content-type for the response. */ - contentType?: string; -} - -/** Known values of {@link Geography} that the service accepts. */ -export const enum KnownGeography { - Us = "us", - Eu = "eu" -} - -/** - * Defines values for Geography. \ - * {@link KnownGeography} can be used interchangeably with Geography, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **us** \ - * **eu** - */ -export type Geography = string; - -/** Known values of {@link TileFormat} that the service accepts. */ -export const enum KnownTileFormat { - /** An image in the png format. Supports zoom levels 0 through 18. */ - Png = "png", - /** Vector graphic in the pbf format. Supports zoom levels 0 through 22. */ - Pbf = "pbf" -} - -/** - * Defines values for TileFormat. \ - * {@link KnownTileFormat} can be used interchangeably with TileFormat, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **png**: An image in the png format. Supports zoom levels 0 through 18. \ - * **pbf**: Vector graphic in the pbf format. Supports zoom levels 0 through 22. - */ -export type TileFormat = string; - -/** Known values of {@link TrafficFlowTileStyle} that the service accepts. */ -export const enum KnownTrafficFlowTileStyle { - /** Colors will reflect the absolute speed measured. Absolute speed is the capability to access the full speed. */ - Absolute = "absolute", - /** This is the speed relative to free-flow, highlighting areas of congestion visualizing the traffic flow. Free-flow refers to conditions where there is no congestion and traffic can follow the speed limits. The most used option to visualize traffic flow on a map. */ - Relative = "relative", - /** Displays relative colors only where they are different from the free-flow speeds. This option will only highlights areas of congestion. */ - RelativeDelay = "relative-delay", - /** Displays relative colors but a larger difference from freeflow is required for segments to change the color. This mode only valid when format is png. */ - ReducedSensitivity = "reduced-sensitivity" -} - -/** - * Defines values for TrafficFlowTileStyle. \ - * {@link KnownTrafficFlowTileStyle} can be used interchangeably with TrafficFlowTileStyle, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **absolute**: Colors will reflect the absolute speed measured. Absolute speed is the capability to access the full speed. \ - * **relative**: This is the speed relative to free-flow, highlighting areas of congestion visualizing the traffic flow. Free-flow refers to conditions where there is no congestion and traffic can follow the speed limits. The most used option to visualize traffic flow on a map. \ - * **relative-delay**: Displays relative colors only where they are different from the free-flow speeds. This option will only highlights areas of congestion. \ - * **reduced-sensitivity**: Displays relative colors but a larger difference from freeflow is required for segments to change the color. This mode only valid when format is png. - */ -export type TrafficFlowTileStyle = string; - -/** Known values of {@link TextFormat} that the service accepts. */ -export const enum KnownTextFormat { - /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ - Json = "json", - /** [The Extensible Markup Language](https://www.w3.org/TR/xml/) */ - Xml = "xml" -} - -/** - * Defines values for TextFormat. \ - * {@link KnownTextFormat} can be used interchangeably with TextFormat, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) \ - * **xml**: [The Extensible Markup Language](https:\/\/www.w3.org\/TR\/xml\/) - */ -export type TextFormat = string; - -/** Known values of {@link TrafficFlowSegmentStyle} that the service accepts. */ -export const enum KnownTrafficFlowSegmentStyle { - Absolute = "absolute", - Relative = "relative", - RelativeDelay = "relative-delay" -} - -/** - * Defines values for TrafficFlowSegmentStyle. \ - * {@link KnownTrafficFlowSegmentStyle} can be used interchangeably with TrafficFlowSegmentStyle, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **absolute** \ - * **relative** \ - * **relative-delay** - */ -export type TrafficFlowSegmentStyle = string; - -/** Known values of {@link SpeedUnit} that the service accepts. */ -export const enum KnownSpeedUnit { - /** Kilometers Per Hour */ - Kmph = "KMPH", - /** Miles Per Hour */ - MPH = "MPH" -} - -/** - * Defines values for SpeedUnit. \ - * {@link KnownSpeedUnit} can be used interchangeably with SpeedUnit, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **KMPH**: Kilometers Per Hour \ - * **MPH**: Miles Per Hour - */ -export type SpeedUnit = string; - -/** Known values of {@link TrafficIncidentTileStyle} that the service accepts. */ -export const enum KnownTrafficIncidentTileStyle { - /** Creates traffic lines with colored chevrons indicating severity. */ - S1 = "s1", - /** Creates plain lines with certain degree of glow. */ - S2 = "s2", - /** Creates plain lines with certain degree of glow. */ - S3 = "s3", - /** Night style. */ - Night = "night" -} - -/** - * Defines values for TrafficIncidentTileStyle. \ - * {@link KnownTrafficIncidentTileStyle} can be used interchangeably with TrafficIncidentTileStyle, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **s1**: Creates traffic lines with colored chevrons indicating severity. \ - * **s2**: Creates plain lines with certain degree of glow. \ - * **s3**: Creates plain lines with certain degree of glow. \ - * **night**: Night style. - */ -export type TrafficIncidentTileStyle = string; - -/** Known values of {@link TrafficIncidentDetailStyle} that the service accepts. */ -export const enum KnownTrafficIncidentDetailStyle { - /** Creates traffic lines with colored chevrons indicating severity. */ - S1 = "s1", - /** Creates plain lines with certain degree of glow. */ - S2 = "s2", - /** Creates plain lines with certain degree of glow. */ - S3 = "s3", - /** Night style. */ - Night = "night" -} - -/** - * Defines values for TrafficIncidentDetailStyle. \ - * {@link KnownTrafficIncidentDetailStyle} can be used interchangeably with TrafficIncidentDetailStyle, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **s1**: Creates traffic lines with colored chevrons indicating severity. \ - * **s2**: Creates plain lines with certain degree of glow. \ - * **s3**: Creates plain lines with certain degree of glow. \ - * **night**: Night style. - */ -export type TrafficIncidentDetailStyle = string; - -/** Known values of {@link ProjectionStandard} that the service accepts. */ -export const enum KnownProjectionStandard { - /** [EPSG900913](http://docs.openlayers.org/library/spherical_mercator.html) */ - Epsg900913 = "EPSG900913", - /** [EPSG4326](http://spatialreference.org/ref/epsg/4326/) */ - Epsg4326 = "EPSG4326" -} - -/** - * Defines values for ProjectionStandard. \ - * {@link KnownProjectionStandard} can be used interchangeably with ProjectionStandard, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **EPSG900913**: [EPSG900913](http:\/\/docs.openlayers.org\/library\/spherical_mercator.html) \ - * **EPSG4326**: [EPSG4326](http:\/\/spatialreference.org\/ref\/epsg\/4326\/) - */ -export type ProjectionStandard = string; - -/** Known values of {@link IncidentGeometryType} that the service accepts. */ -export const enum KnownIncidentGeometryType { - /** Places incidents precisely on the road. */ - Original = "original", - /** Moves the incident slightly (depending on zoom level) to indicate specific road lanes. */ - Shifted = "shifted" -} - -/** - * Defines values for IncidentGeometryType. \ - * {@link KnownIncidentGeometryType} can be used interchangeably with IncidentGeometryType, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **original**: Places incidents precisely on the road. \ - * **shifted**: Moves the incident slightly (depending on zoom level) to indicate specific road lanes. - */ -export type IncidentGeometryType = string; - -/** Known values of {@link GeographicResourceLocation} that the service accepts. */ -export const enum KnownGeographicResourceLocation { - /** Used to access an Azure Maps Creator resource in the United States */ - Us = "us", - /** Used to access an Azure Maps Creator resource in Europe */ - Eu = "eu" -} - -/** - * Defines values for GeographicResourceLocation. \ - * {@link KnownGeographicResourceLocation} can be used interchangeably with GeographicResourceLocation, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **us**: Used to access an Azure Maps Creator resource in the United States \ - * **eu**: Used to access an Azure Maps Creator resource in Europe - */ -export type GeographicResourceLocation = string; - -/** Optional parameters. */ -export interface TrafficGetTrafficFlowTileOptionalParams - extends coreClient.OperationOptions { - /** The value of the width of the line representing traffic. This value is a multiplier and the accepted values range from 1 - 20. The default value is 10. This parameter is not valid when format is pbf. */ - thickness?: number; -} - -/** Contains response data for the getTrafficFlowTile operation. */ -export type TrafficGetTrafficFlowTileResponse = TrafficGetTrafficFlowTileHeaders & { - /** - * BROWSER ONLY - * - * The response body as a browser Blob. - * Always `undefined` in node.js. - */ - blobBody?: Promise; - /** - * NODEJS ONLY - * - * The response body as a node.js Readable stream. - * Always `undefined` in the browser. - */ - readableStreamBody?: NodeJS.ReadableStream; -}; - -/** Optional parameters. */ -export interface TrafficGetTrafficFlowSegmentOptionalParams - extends coreClient.OperationOptions { - /** The value of the width of the line representing traffic. This value is a multiplier and the accepted values range from 1 - 20. The default value is 10. */ - thickness?: number; - /** Unit of speed in KMPH or MPH */ - unit?: SpeedUnit; - /** Boolean on whether the response should include OpenLR code */ - openLr?: boolean; -} - -/** Contains response data for the getTrafficFlowSegment operation. */ -export type TrafficGetTrafficFlowSegmentResponse = TrafficFlowSegmentResult; - -/** Optional parameters. */ -export interface TrafficGetTrafficIncidentTileOptionalParams - extends coreClient.OperationOptions { - /** Reference value for the state of traffic at a particular time, obtained from the Viewport API call, trafficModelId attribute in trafficState field. It is updated every minute, and is valid for two minutes before it times out. Use -1 to get the most recent traffic information. Default: most recent traffic information. */ - trafficState?: string; -} - -/** Contains response data for the getTrafficIncidentTile operation. */ -export type TrafficGetTrafficIncidentTileResponse = TrafficGetTrafficIncidentTileHeaders & { - /** - * BROWSER ONLY - * - * The response body as a browser Blob. - * Always `undefined` in node.js. - */ - blobBody?: Promise; - /** - * NODEJS ONLY - * - * The response body as a node.js Readable stream. - * Always `undefined` in the browser. - */ - readableStreamBody?: NodeJS.ReadableStream; -}; - -/** Optional parameters. */ -export interface TrafficGetTrafficIncidentDetailOptionalParams - extends coreClient.OperationOptions { - /** - * [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) for the output language. Supported languages are ar, ca, cs, da, de, el, en, en-GB, en-US, es, et, fi, fr, he, hu, id, in*, it, lt, lv, nb, nl, no, pl, pt, ro, ru, sk, sv, th, tr, zh. - * - * Please refer to [Supported Languages](https://docs.microsoft.com/en-us/azure/azure-maps/supported-languages) for details. When invalid language code is provided response is returned in English. When incident cause or description does not have translation, English description is returned. - */ - language?: string; - /** The projection used to specify the coordinates in the request and response. [EPSG900913](http://docs.openlayers.org/library/spherical_mercator.html) (default) or [EPSG4326](http://spatialreference.org/ref/epsg/4326/) */ - projection?: ProjectionStandard; - /** The type of vector geometry added to incidents (returned in the element of the response). */ - geometries?: IncidentGeometryType; - /** Boolean to indicate whether to list all traffic incidents in a cluster separately */ - expandCluster?: boolean; - /** Boolean on whether to return the original position of the incident () as well as the one shifted to the beginning of the traffic tube () */ - originalPosition?: boolean; -} - -/** Contains response data for the getTrafficIncidentDetail operation. */ -export type TrafficGetTrafficIncidentDetailResponse = TrafficIncidentDetailResult; - -/** Optional parameters. */ -export interface TrafficGetTrafficIncidentViewportOptionalParams - extends coreClient.OperationOptions { - /** Determines what copyright information to return. When true the copyright text is returned; when false only the copyright index is returned. */ - copyright?: boolean; -} - -/** Contains response data for the getTrafficIncidentViewport operation. */ -export type TrafficGetTrafficIncidentViewportResponse = TrafficIncidentViewportResult; - -/** Optional parameters. */ -export interface TrafficClientOptionalParams - extends coreClient.ServiceClientOptions { - /** This parameter specifies where the Azure Maps Creator resource is located. Valid values are us and eu. */ - geography?: Geography; - /** Specifies which account is intended for usage in conjunction with the Azure AD security model. It represents a unique ID for the Azure Maps account and can be retrieved from the Azure Maps management plane Account API. To use Azure AD security in Azure Maps see the following [articles](https://aka.ms/amauthdetails) for guidance. */ - xMsClientId?: string; - /** Api Version */ - apiVersion?: string; - /** Overrides client endpoint. */ - endpoint?: string; -} diff --git a/sdk/maps/maps-traffic/src/models/mappers.ts b/sdk/maps/maps-traffic/src/models/mappers.ts deleted file mode 100644 index 716a86811ab2..000000000000 --- a/sdk/maps/maps-traffic/src/models/mappers.ts +++ /dev/null @@ -1,563 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; - -export const ErrorResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorResponse", - modelProperties: { - error: { - serializedName: "error", - type: { - name: "Composite", - className: "ErrorDetail" - } - } - } - } -}; - -export const ErrorDetail: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorDetail", - modelProperties: { - code: { - serializedName: "code", - readOnly: true, - type: { - name: "String" - } - }, - message: { - serializedName: "message", - readOnly: true, - type: { - name: "String" - } - }, - target: { - serializedName: "target", - readOnly: true, - type: { - name: "String" - } - }, - details: { - serializedName: "details", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ErrorDetail" - } - } - } - }, - additionalInfo: { - serializedName: "additionalInfo", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ErrorAdditionalInfo" - } - } - } - } - } - } -}; - -export const ErrorAdditionalInfo: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorAdditionalInfo", - modelProperties: { - type: { - serializedName: "type", - readOnly: true, - type: { - name: "String" - } - }, - info: { - serializedName: "info", - readOnly: true, - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - } - } - } -}; - -export const TrafficFlowSegmentResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TrafficFlowSegmentResult", - modelProperties: { - flowSegmentData: { - serializedName: "flowSegmentData", - type: { - name: "Composite", - className: "TrafficFlowSegmentResultFlowSegmentData" - } - } - } - } -}; - -export const TrafficFlowSegmentResultFlowSegmentData: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TrafficFlowSegmentResultFlowSegmentData", - modelProperties: { - frc: { - serializedName: "frc", - readOnly: true, - type: { - name: "String" - } - }, - currentSpeed: { - serializedName: "currentSpeed", - readOnly: true, - type: { - name: "Number" - } - }, - freeFlowSpeed: { - serializedName: "freeFlowSpeed", - readOnly: true, - type: { - name: "Number" - } - }, - currentTravelTime: { - serializedName: "currentTravelTime", - readOnly: true, - type: { - name: "Number" - } - }, - freeFlowTravelTime: { - serializedName: "freeFlowTravelTime", - readOnly: true, - type: { - name: "Number" - } - }, - confidence: { - serializedName: "confidence", - readOnly: true, - type: { - name: "Number" - } - }, - coordinates: { - serializedName: "coordinates", - type: { - name: "Composite", - className: "TrafficFlowSegmentResultFlowSegmentDataCoordinates" - } - }, - version: { - serializedName: "@version", - readOnly: true, - type: { - name: "String" - } - }, - openlr: { - serializedName: "openlr", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const TrafficFlowSegmentResultFlowSegmentDataCoordinates: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TrafficFlowSegmentResultFlowSegmentDataCoordinates", - modelProperties: { - coordinate: { - serializedName: "coordinate", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "CoordinatesPair" - } - } - } - } - } - } -}; - -export const CoordinatesPair: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "CoordinatesPair", - modelProperties: { - latitude: { - serializedName: "latitude", - type: { - name: "Number" - } - }, - longitude: { - serializedName: "longitude", - type: { - name: "Number" - } - } - } - } -}; - -export const TrafficIncidentDetailResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TrafficIncidentDetailResult", - modelProperties: { - tm: { - serializedName: "tm", - type: { - name: "Composite", - className: "TrafficIncidentDetailResultTm" - } - } - } - } -}; - -export const TrafficIncidentDetailResultTm: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TrafficIncidentDetailResultTm", - modelProperties: { - id: { - serializedName: "@id", - readOnly: true, - type: { - name: "String" - } - }, - poi: { - serializedName: "poi", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "TrafficIncidentPoi" - } - } - } - } - } - } -}; - -export const TrafficIncidentPoi: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TrafficIncidentPoi", - modelProperties: { - id: { - serializedName: "id", - readOnly: true, - type: { - name: "String" - } - }, - p: { - serializedName: "p", - type: { - name: "Composite", - className: "TrafficIncidentPoiP" - } - }, - ic: { - serializedName: "ic", - readOnly: true, - type: { - name: "Number" - } - }, - ty: { - serializedName: "ty", - readOnly: true, - type: { - name: "Number" - } - }, - cbl: { - serializedName: "cbl", - type: { - name: "Composite", - className: "TrafficIncidentPoiCbl" - } - }, - ctr: { - serializedName: "ctr", - type: { - name: "Composite", - className: "TrafficIncidentPoiCtr" - } - }, - cs: { - serializedName: "cs", - readOnly: true, - type: { - name: "Number" - } - }, - l: { - serializedName: "l", - readOnly: true, - type: { - name: "Number" - } - }, - r: { - serializedName: "r", - readOnly: true, - type: { - name: "String" - } - }, - dl: { - serializedName: "dl", - readOnly: true, - type: { - name: "Number" - } - }, - t: { - serializedName: "t", - readOnly: true, - type: { - name: "String" - } - }, - f: { - serializedName: "f", - readOnly: true, - type: { - name: "String" - } - }, - d: { - serializedName: "d", - readOnly: true, - type: { - name: "String" - } - }, - c: { - serializedName: "c", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const TrafficIncidentPoiP: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TrafficIncidentPoiP", - modelProperties: { - x: { - serializedName: "x", - readOnly: true, - type: { - name: "Number" - } - }, - y: { - serializedName: "y", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const TrafficIncidentPoiCbl: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TrafficIncidentPoiCbl", - modelProperties: { - x: { - serializedName: "x", - readOnly: true, - type: { - name: "Number" - } - }, - y: { - serializedName: "y", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const TrafficIncidentPoiCtr: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TrafficIncidentPoiCtr", - modelProperties: { - x: { - serializedName: "x", - readOnly: true, - type: { - name: "Number" - } - }, - y: { - serializedName: "y", - readOnly: true, - type: { - name: "Number" - } - } - } - } -}; - -export const TrafficIncidentViewportResult: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TrafficIncidentViewportResult", - modelProperties: { - viewpResp: { - serializedName: "viewpResp", - type: { - name: "Composite", - className: "TrafficIncidentViewportResultViewpResp" - } - } - } - } -}; - -export const TrafficIncidentViewportResultViewpResp: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TrafficIncidentViewportResultViewpResp", - modelProperties: { - trafficState: { - serializedName: "trafficState", - type: { - name: "Composite", - className: "TrafficIncidentViewportResultViewpRespTrafficState" - } - }, - copyrightIds: { - serializedName: "copyrightIds", - readOnly: true, - type: { - name: "String" - } - }, - version: { - serializedName: "@version", - readOnly: true, - type: { - name: "String" - } - }, - maps: { - serializedName: "@maps", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const TrafficIncidentViewportResultViewpRespTrafficState: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TrafficIncidentViewportResultViewpRespTrafficState", - modelProperties: { - trafficAge: { - serializedName: "@trafficAge", - readOnly: true, - type: { - name: "Number" - } - }, - trafficModelId: { - serializedName: "@trafficModelId", - readOnly: true, - type: { - name: "String" - } - } - } - } -}; - -export const TrafficGetTrafficFlowTileHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TrafficGetTrafficFlowTileHeaders", - modelProperties: { - contentType: { - serializedName: "content-type", - type: { - name: "String" - } - } - } - } -}; - -export const TrafficGetTrafficIncidentTileHeaders: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TrafficGetTrafficIncidentTileHeaders", - modelProperties: { - contentType: { - serializedName: "content-type", - type: { - name: "String" - } - } - } - } -}; diff --git a/sdk/maps/maps-traffic/src/models/parameters.ts b/sdk/maps/maps-traffic/src/models/parameters.ts deleted file mode 100644 index 3bb6749cb5ec..000000000000 --- a/sdk/maps/maps-traffic/src/models/parameters.ts +++ /dev/null @@ -1,364 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { - OperationParameter, - OperationURLParameter, - OperationQueryParameter -} from "@azure/core-client"; - -export const accept: OperationParameter = { - parameterPath: "accept", - mapper: { - defaultValue: - "application/json, image/jpeg, image/png, image/pbf, application/vnd.mapbox-vector-tile", - isConstant: true, - serializedName: "Accept", - type: { - name: "String" - } - } -}; - -export const geography: OperationURLParameter = { - parameterPath: "geography", - mapper: { - serializedName: "geography", - required: true, - type: { - name: "String" - } - } -}; - -export const xMsClientId: OperationParameter = { - parameterPath: "xMsClientId", - mapper: { - serializedName: "x-ms-client-id", - type: { - name: "String" - } - } -}; - -export const apiVersion: OperationQueryParameter = { - parameterPath: "apiVersion", - mapper: { - defaultValue: "1.0", - isConstant: true, - serializedName: "api-version", - type: { - name: "String" - } - } -}; - -export const format: OperationURLParameter = { - parameterPath: "format", - mapper: { - serializedName: "format", - required: true, - type: { - name: "String" - } - } -}; - -export const style: OperationQueryParameter = { - parameterPath: "style", - mapper: { - serializedName: "style", - required: true, - type: { - name: "String" - } - } -}; - -export const zoom: OperationQueryParameter = { - parameterPath: "zoom", - mapper: { - serializedName: "zoom", - required: true, - type: { - name: "Number" - } - } -}; - -export const xTileIndex: OperationQueryParameter = { - parameterPath: "xTileIndex", - mapper: { - serializedName: "x", - required: true, - type: { - name: "Number" - } - } -}; - -export const yTileIndex: OperationQueryParameter = { - parameterPath: "yTileIndex", - mapper: { - serializedName: "y", - required: true, - type: { - name: "Number" - } - } -}; - -export const thickness: OperationQueryParameter = { - parameterPath: ["options", "thickness"], - mapper: { - constraints: { - InclusiveMaximum: 20, - InclusiveMinimum: 1 - }, - serializedName: "thickness", - type: { - name: "Number" - } - } -}; - -export const accept1: OperationParameter = { - parameterPath: "accept", - mapper: { - defaultValue: "application/json", - isConstant: true, - serializedName: "Accept", - type: { - name: "String" - } - } -}; - -export const format1: OperationURLParameter = { - parameterPath: "format", - mapper: { - serializedName: "format", - required: true, - type: { - name: "String" - } - } -}; - -export const style1: OperationQueryParameter = { - parameterPath: "style", - mapper: { - serializedName: "style", - required: true, - type: { - name: "String" - } - } -}; - -export const query: OperationQueryParameter = { - parameterPath: "query", - mapper: { - serializedName: "query", - required: true, - type: { - name: "String" - } - } -}; - -export const unit: OperationQueryParameter = { - parameterPath: ["options", "unit"], - mapper: { - serializedName: "unit", - type: { - name: "String" - } - } -}; - -export const openLr: OperationQueryParameter = { - parameterPath: ["options", "openLr"], - mapper: { - serializedName: "openLr", - type: { - name: "Boolean" - } - } -}; - -export const style2: OperationQueryParameter = { - parameterPath: "style", - mapper: { - serializedName: "style", - required: true, - type: { - name: "String" - } - } -}; - -export const trafficState: OperationQueryParameter = { - parameterPath: ["options", "trafficState"], - mapper: { - serializedName: "t", - type: { - name: "String" - } - } -}; - -export const style3: OperationQueryParameter = { - parameterPath: "style", - mapper: { - serializedName: "style", - required: true, - type: { - name: "String" - } - } -}; - -export const boundingbox: OperationQueryParameter = { - parameterPath: "boundingbox", - mapper: { - serializedName: "boundingbox", - required: true, - type: { - name: "String" - } - } -}; - -export const boundingZoom: OperationQueryParameter = { - parameterPath: "boundingZoom", - mapper: { - constraints: { - InclusiveMaximum: 22, - InclusiveMinimum: 0 - }, - serializedName: "boundingZoom", - required: true, - type: { - name: "Number" - } - } -}; - -export const trafficmodelid: OperationQueryParameter = { - parameterPath: "trafficmodelid", - mapper: { - serializedName: "trafficmodelid", - required: true, - type: { - name: "String" - } - } -}; - -export const language: OperationQueryParameter = { - parameterPath: ["options", "language"], - mapper: { - serializedName: "language", - type: { - name: "String" - } - } -}; - -export const projection: OperationQueryParameter = { - parameterPath: ["options", "projection"], - mapper: { - serializedName: "projection", - type: { - name: "String" - } - } -}; - -export const geometries: OperationQueryParameter = { - parameterPath: ["options", "geometries"], - mapper: { - serializedName: "geometries", - type: { - name: "String" - } - } -}; - -export const expandCluster: OperationQueryParameter = { - parameterPath: ["options", "expandCluster"], - mapper: { - serializedName: "expandCluster", - type: { - name: "Boolean" - } - } -}; - -export const originalPosition: OperationQueryParameter = { - parameterPath: ["options", "originalPosition"], - mapper: { - serializedName: "originalPosition", - type: { - name: "Boolean" - } - } -}; - -export const boundingzoom: OperationQueryParameter = { - parameterPath: "boundingzoom", - mapper: { - constraints: { - InclusiveMaximum: 22, - InclusiveMinimum: 0 - }, - serializedName: "boundingzoom", - required: true, - type: { - name: "Number" - } - } -}; - -export const overviewbox: OperationQueryParameter = { - parameterPath: "overviewbox", - mapper: { - serializedName: "overviewbox", - required: true, - type: { - name: "String" - } - } -}; - -export const overviewzoom: OperationQueryParameter = { - parameterPath: "overviewzoom", - mapper: { - constraints: { - InclusiveMaximum: 22, - InclusiveMinimum: 0 - }, - serializedName: "overviewzoom", - required: true, - type: { - name: "Number" - } - } -}; - -export const copyright: OperationQueryParameter = { - parameterPath: ["options", "copyright"], - mapper: { - defaultValue: true, - serializedName: "copyright", - type: { - name: "Boolean" - } - } -}; diff --git a/sdk/maps/maps-traffic/src/operations/index.ts b/sdk/maps/maps-traffic/src/operations/index.ts deleted file mode 100644 index 0d19681b070d..000000000000 --- a/sdk/maps/maps-traffic/src/operations/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./traffic"; diff --git a/sdk/maps/maps-traffic/src/operations/traffic.ts b/sdk/maps/maps-traffic/src/operations/traffic.ts deleted file mode 100644 index e86b9ec18b7a..000000000000 --- a/sdk/maps/maps-traffic/src/operations/traffic.ts +++ /dev/null @@ -1,397 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { Traffic } from "../operationsInterfaces"; -import * as coreClient from "@azure/core-client"; -import * as Mappers from "../models/mappers"; -import * as Parameters from "../models/parameters"; -import { TrafficClientContext } from "../trafficClientContext"; -import { - TileFormat, - TrafficFlowTileStyle, - TrafficGetTrafficFlowTileOptionalParams, - TrafficGetTrafficFlowTileResponse, - TextFormat, - TrafficFlowSegmentStyle, - TrafficGetTrafficFlowSegmentOptionalParams, - TrafficGetTrafficFlowSegmentResponse, - TrafficIncidentTileStyle, - TrafficGetTrafficIncidentTileOptionalParams, - TrafficGetTrafficIncidentTileResponse, - TrafficIncidentDetailStyle, - TrafficGetTrafficIncidentDetailOptionalParams, - TrafficGetTrafficIncidentDetailResponse, - TrafficGetTrafficIncidentViewportOptionalParams, - TrafficGetTrafficIncidentViewportResponse -} from "../models"; - -/** Class representing a Traffic. */ -export class TrafficImpl implements Traffic { - private readonly client: TrafficClientContext; - - /** - * Initialize a new instance of the class Traffic class. - * @param client Reference to the service client - */ - constructor(client: TrafficClientContext) { - this.client = client; - } - - /** - * __Traffic Flow Tile__ - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * The Azure Flow Tile API serves 256 x 256 pixel tiles showing traffic flow. All tiles use the same - * grid system. Because the traffic tiles use transparent images, they can be layered on top of map - * tiles to create a compound display. The Flow tiles use colors to indicate either the speed of - * traffic on different road segments, or the difference between that speed and the free-flow speed on - * the road segment in question. - * @param format Desired format of the response. Possible values are png & pbf. - * @param style

The style to be used to render the tile.

- * @param zoom Zoom level for the desired tile. For _raster_ tiles, value must be in the range: 0-22 - * (inclusive). For _vector_ tiles, value must be in the range: 0-22 (inclusive). - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param options The options parameters. - */ - getTrafficFlowTile( - format: TileFormat, - style: TrafficFlowTileStyle, - zoom: number, - xTileIndex: number, - yTileIndex: number, - options?: TrafficGetTrafficFlowTileOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, style, zoom, xTileIndex, yTileIndex, options }, - getTrafficFlowTileOperationSpec - ); - } - - /** - * __Traffic Flow Segment__ - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * This service provides information about the speeds and travel times of the road fragment closest to - * the given coordinates. It is designed to work alongside the Flow layer of the Render Service to - * support clickable flow data visualizations. With this API, the client side can connect any place in - * the map with flow data on the closest road and present it to the user. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param style The style to be used to render the tile. Valid values are absolute which returns colors - * reflecting the absolute speed measured, relative which returns the speed relative to free-flow, - * Relative-delay which displays relative speeds only where they are different from the freeflow speeds - * @param zoom Zoom level for the desired tile. Zoom value must be in the range: 0-22 (inclusive). - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param query Coordinates of the point close to the road segment. They have to be comma-separated and - * calculated using EPSG4326 projection. - * @param options The options parameters. - */ - getTrafficFlowSegment( - format: TextFormat, - style: TrafficFlowSegmentStyle, - zoom: number, - query: string, - options?: TrafficGetTrafficFlowSegmentOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, style, zoom, query, options }, - getTrafficFlowSegmentOperationSpec - ); - } - - /** - * __Traffic Incident Tile__ - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * This service serves 256 x 256 pixel tiles showing traffic incidents. All tiles use the same grid - * system. Because the traffic tiles use transparent images, they can be layered on top of map tiles to - * create a compound display. Traffic tiles render graphics to indicate traffic on the roads in the - * specified area. - * @param format Desired format of the response. Possible values are png & pbf. - * @param style The style to be used to render the tile. This parameter is not valid when format is - * pbf. - * @param zoom Zoom level for the desired tile. For _raster_ tiles, value must be in the range: 0-22 - * (inclusive). For _vector_ tiles, value must be in the range: 0-22 (inclusive). - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param options The options parameters. - */ - getTrafficIncidentTile( - format: TileFormat, - style: TrafficIncidentTileStyle, - zoom: number, - xTileIndex: number, - yTileIndex: number, - options?: TrafficGetTrafficIncidentTileOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, style, zoom, xTileIndex, yTileIndex, options }, - getTrafficIncidentTileOperationSpec - ); - } - - /** - * __Traffic Incident Detail__ - * - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * This API provides information on traffic incidents inside a given bounding box, based on the current - * Traffic Model ID. The Traffic Model ID is available to grant synchronization of data between calls - * and API's. The Traffic Model ID is a key value for determining the currency of traffic incidents. - * It is updated every minute, and is valid for two minutes before it times out. It is used in - * rendering [incident - * tiles](https://docs.microsoft.com/en-us/rest/api/maps/traffic/gettrafficincidenttile). It can be - * obtained from the [Viewport - * API](https://docs.microsoft.com/en-us/rest/api/maps/traffic/gettrafficincidentviewport). - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param style The style that will be used to render the tile in Traffic [Incident Tile - * API](https://docs.microsoft.com/en-us/rest/api/maps/traffic/gettrafficincidenttile). This will have - * an effect on the coordinates of traffic incidents in the reply. - * @param boundingbox The `boundingbox` is represented by two value pairs describing it's corners - * (first pair for lower left corner and second for upper right). The pairs can either be specified - * using any of the `projection`'s specified below (e.g., _minY,minX,maxY,maxX_) or by two - * latitude-longitude pairs (e.g., _minLat,minLon,maxLat,maxLon_).

NOTE: If latitude/longitude - * pairs are used, then the `projection` parameter must be set to "EPSG4326". - * @param boundingZoom Zoom level for desired tile. 0 to 22 for raster tiles, 0 through 22 for vector - * tiles - * @param trafficmodelid Number referencing traffic model. This can be obtained from the [Viewport - * API](https://docs.microsoft.com/en-us/rest/api/maps/traffic/gettrafficincidentviewport). It is - * updated every minute, and is valid for two minutes before it times out. If the wrong Traffic Model - * ID is specified, the correct one will be returned by the interface. A value of -1 will always invoke - * the most recent traffic model - * @param options The options parameters. - */ - getTrafficIncidentDetail( - format: TextFormat, - style: TrafficIncidentDetailStyle, - boundingbox: string, - boundingZoom: number, - trafficmodelid: string, - options?: TrafficGetTrafficIncidentDetailOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, style, boundingbox, boundingZoom, trafficmodelid, options }, - getTrafficIncidentDetailOperationSpec - ); - } - - /** - * __Traffic Incident Viewport__ - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * This API returns legal and technical information for the viewport described in the request. It - * should be called by client applications whenever the viewport changes (for instance, through - * zooming, panning, going to a location, or displaying a route). The request should contain the - * bounding box and zoom level of the viewport whose information is needed. The return will contain - * map version information, as well as the current Traffic Model ID and copyright IDs. The Traffic - * Model ID returned by the Viewport Description is used by other APIs to retrieve last traffic - * information for further processing. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param boundingbox Bounding box of the map viewport in - * [EPSG900913](http://docs.openlayers.org/library/spherical_mercator.html) projection. The - * `boundingbox` is represented by two value pairs describing it's corners (first pair for lower left - * corner and second for upper right). All values should be separated by commas (e.g., - * _minY,minX,maxY,maxX_). The maximum size of the bounding box that can be passed is dependent on the - * requested zoom level. The width and height cannot exceed 4092 pixels when rendered on the given zoom - * level.

NOTE: Bounding boxes that cross the 180° meridian require special treatment. For such - * boxes, the eastern _maxX_ value will be negative, and thus less than the _minX_ value west of the - * 180° meridian. To address that, the value 40075016.6855874 should be added to the true _maxX_ value - * before it is passed in the request. - * @param boundingzoom Zoom level of the map viewport. Used to determine whether the view can be zoomed - * in. - * @param overviewbox Bounding box of the overview map in - * [EPSG900913](http://docs.openlayers.org/library/spherical_mercator.html) projection.

Used in - * case the overview box/mini map has different copyright data than the main map. If there is no mini - * map, the same coordinates as `boundingBox` is used. - * @param overviewzoom Zoom level of the overview map. If there is no mini map, use the same zoom level - * as boundingZoom. - * @param options The options parameters. - */ - getTrafficIncidentViewport( - format: TextFormat, - boundingbox: string, - boundingzoom: number, - overviewbox: string, - overviewzoom: number, - options?: TrafficGetTrafficIncidentViewportOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, boundingbox, boundingzoom, overviewbox, overviewzoom, options }, - getTrafficIncidentViewportOperationSpec - ); - } -} -// Operation Specifications -const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); - -const getTrafficFlowTileOperationSpec: coreClient.OperationSpec = { - path: "/traffic/flow/tile/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: { - type: { name: "Stream" }, - serializedName: "parsedResponse" - }, - headersMapper: Mappers.TrafficGetTrafficFlowTileHeaders - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.style, - Parameters.zoom, - Parameters.xTileIndex, - Parameters.yTileIndex, - Parameters.thickness - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getTrafficFlowSegmentOperationSpec: coreClient.OperationSpec = { - path: "/traffic/flow/segment/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.TrafficFlowSegmentResult - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.zoom, - Parameters.thickness, - Parameters.style1, - Parameters.query, - Parameters.unit, - Parameters.openLr - ], - urlParameters: [Parameters.geography, Parameters.format1], - headerParameters: [Parameters.xMsClientId, Parameters.accept1], - serializer -}; -const getTrafficIncidentTileOperationSpec: coreClient.OperationSpec = { - path: "/traffic/incident/tile/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: { - type: { name: "Stream" }, - serializedName: "parsedResponse" - }, - headersMapper: Mappers.TrafficGetTrafficIncidentTileHeaders - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.zoom, - Parameters.xTileIndex, - Parameters.yTileIndex, - Parameters.style2, - Parameters.trafficState - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getTrafficIncidentDetailOperationSpec: coreClient.OperationSpec = { - path: "/traffic/incident/detail/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.TrafficIncidentDetailResult - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.style3, - Parameters.boundingbox, - Parameters.boundingZoom, - Parameters.trafficmodelid, - Parameters.language, - Parameters.projection, - Parameters.geometries, - Parameters.expandCluster, - Parameters.originalPosition - ], - urlParameters: [Parameters.geography, Parameters.format1], - headerParameters: [Parameters.xMsClientId, Parameters.accept1], - serializer -}; -const getTrafficIncidentViewportOperationSpec: coreClient.OperationSpec = { - path: "/traffic/incident/viewport/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.TrafficIncidentViewportResult - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.boundingbox, - Parameters.boundingzoom, - Parameters.overviewbox, - Parameters.overviewzoom, - Parameters.copyright - ], - urlParameters: [Parameters.geography, Parameters.format1], - headerParameters: [Parameters.xMsClientId, Parameters.accept1], - serializer -}; diff --git a/sdk/maps/maps-traffic/src/operationsInterfaces/index.ts b/sdk/maps/maps-traffic/src/operationsInterfaces/index.ts deleted file mode 100644 index 0d19681b070d..000000000000 --- a/sdk/maps/maps-traffic/src/operationsInterfaces/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./traffic"; diff --git a/sdk/maps/maps-traffic/src/operationsInterfaces/traffic.ts b/sdk/maps/maps-traffic/src/operationsInterfaces/traffic.ts deleted file mode 100644 index f2937c123f82..000000000000 --- a/sdk/maps/maps-traffic/src/operationsInterfaces/traffic.ts +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { - TileFormat, - TrafficFlowTileStyle, - TrafficGetTrafficFlowTileOptionalParams, - TrafficGetTrafficFlowTileResponse, - TextFormat, - TrafficFlowSegmentStyle, - TrafficGetTrafficFlowSegmentOptionalParams, - TrafficGetTrafficFlowSegmentResponse, - TrafficIncidentTileStyle, - TrafficGetTrafficIncidentTileOptionalParams, - TrafficGetTrafficIncidentTileResponse, - TrafficIncidentDetailStyle, - TrafficGetTrafficIncidentDetailOptionalParams, - TrafficGetTrafficIncidentDetailResponse, - TrafficGetTrafficIncidentViewportOptionalParams, - TrafficGetTrafficIncidentViewportResponse -} from "../models"; - -/** Interface representing a Traffic. */ -export interface Traffic { - /** - * __Traffic Flow Tile__ - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * The Azure Flow Tile API serves 256 x 256 pixel tiles showing traffic flow. All tiles use the same - * grid system. Because the traffic tiles use transparent images, they can be layered on top of map - * tiles to create a compound display. The Flow tiles use colors to indicate either the speed of - * traffic on different road segments, or the difference between that speed and the free-flow speed on - * the road segment in question. - * @param format Desired format of the response. Possible values are png & pbf. - * @param style

The style to be used to render the tile.

- * @param zoom Zoom level for the desired tile. For _raster_ tiles, value must be in the range: 0-22 - * (inclusive). For _vector_ tiles, value must be in the range: 0-22 (inclusive). - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param options The options parameters. - */ - getTrafficFlowTile( - format: TileFormat, - style: TrafficFlowTileStyle, - zoom: number, - xTileIndex: number, - yTileIndex: number, - options?: TrafficGetTrafficFlowTileOptionalParams - ): Promise; - /** - * __Traffic Flow Segment__ - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * This service provides information about the speeds and travel times of the road fragment closest to - * the given coordinates. It is designed to work alongside the Flow layer of the Render Service to - * support clickable flow data visualizations. With this API, the client side can connect any place in - * the map with flow data on the closest road and present it to the user. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param style The style to be used to render the tile. Valid values are absolute which returns colors - * reflecting the absolute speed measured, relative which returns the speed relative to free-flow, - * Relative-delay which displays relative speeds only where they are different from the freeflow speeds - * @param zoom Zoom level for the desired tile. Zoom value must be in the range: 0-22 (inclusive). - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param query Coordinates of the point close to the road segment. They have to be comma-separated and - * calculated using EPSG4326 projection. - * @param options The options parameters. - */ - getTrafficFlowSegment( - format: TextFormat, - style: TrafficFlowSegmentStyle, - zoom: number, - query: string, - options?: TrafficGetTrafficFlowSegmentOptionalParams - ): Promise; - /** - * __Traffic Incident Tile__ - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * This service serves 256 x 256 pixel tiles showing traffic incidents. All tiles use the same grid - * system. Because the traffic tiles use transparent images, they can be layered on top of map tiles to - * create a compound display. Traffic tiles render graphics to indicate traffic on the roads in the - * specified area. - * @param format Desired format of the response. Possible values are png & pbf. - * @param style The style to be used to render the tile. This parameter is not valid when format is - * pbf. - * @param zoom Zoom level for the desired tile. For _raster_ tiles, value must be in the range: 0-22 - * (inclusive). For _vector_ tiles, value must be in the range: 0-22 (inclusive). - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param xTileIndex X coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param yTileIndex Y coordinate of the tile on zoom grid. Value must be in the range [0, - * 2`zoom` -1]. - * - * Please see [Zoom Levels and Tile - * Grid](https://docs.microsoft.com/en-us/azure/location-based-services/zoom-levels-and-tile-grid) for - * details. - * @param options The options parameters. - */ - getTrafficIncidentTile( - format: TileFormat, - style: TrafficIncidentTileStyle, - zoom: number, - xTileIndex: number, - yTileIndex: number, - options?: TrafficGetTrafficIncidentTileOptionalParams - ): Promise; - /** - * __Traffic Incident Detail__ - * - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * This API provides information on traffic incidents inside a given bounding box, based on the current - * Traffic Model ID. The Traffic Model ID is available to grant synchronization of data between calls - * and API's. The Traffic Model ID is a key value for determining the currency of traffic incidents. - * It is updated every minute, and is valid for two minutes before it times out. It is used in - * rendering [incident - * tiles](https://docs.microsoft.com/en-us/rest/api/maps/traffic/gettrafficincidenttile). It can be - * obtained from the [Viewport - * API](https://docs.microsoft.com/en-us/rest/api/maps/traffic/gettrafficincidentviewport). - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param style The style that will be used to render the tile in Traffic [Incident Tile - * API](https://docs.microsoft.com/en-us/rest/api/maps/traffic/gettrafficincidenttile). This will have - * an effect on the coordinates of traffic incidents in the reply. - * @param boundingbox The `boundingbox` is represented by two value pairs describing it's corners - * (first pair for lower left corner and second for upper right). The pairs can either be specified - * using any of the `projection`'s specified below (e.g., _minY,minX,maxY,maxX_) or by two - * latitude-longitude pairs (e.g., _minLat,minLon,maxLat,maxLon_).

NOTE: If latitude/longitude - * pairs are used, then the `projection` parameter must be set to "EPSG4326". - * @param boundingZoom Zoom level for desired tile. 0 to 22 for raster tiles, 0 through 22 for vector - * tiles - * @param trafficmodelid Number referencing traffic model. This can be obtained from the [Viewport - * API](https://docs.microsoft.com/en-us/rest/api/maps/traffic/gettrafficincidentviewport). It is - * updated every minute, and is valid for two minutes before it times out. If the wrong Traffic Model - * ID is specified, the correct one will be returned by the interface. A value of -1 will always invoke - * the most recent traffic model - * @param options The options parameters. - */ - getTrafficIncidentDetail( - format: TextFormat, - style: TrafficIncidentDetailStyle, - boundingbox: string, - boundingZoom: number, - trafficmodelid: string, - options?: TrafficGetTrafficIncidentDetailOptionalParams - ): Promise; - /** - * __Traffic Incident Viewport__ - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * This API returns legal and technical information for the viewport described in the request. It - * should be called by client applications whenever the viewport changes (for instance, through - * zooming, panning, going to a location, or displaying a route). The request should contain the - * bounding box and zoom level of the viewport whose information is needed. The return will contain - * map version information, as well as the current Traffic Model ID and copyright IDs. The Traffic - * Model ID returned by the Viewport Description is used by other APIs to retrieve last traffic - * information for further processing. - * @param format Desired format of the response. Value can be either _json_ or _xml_. - * @param boundingbox Bounding box of the map viewport in - * [EPSG900913](http://docs.openlayers.org/library/spherical_mercator.html) projection. The - * `boundingbox` is represented by two value pairs describing it's corners (first pair for lower left - * corner and second for upper right). All values should be separated by commas (e.g., - * _minY,minX,maxY,maxX_). The maximum size of the bounding box that can be passed is dependent on the - * requested zoom level. The width and height cannot exceed 4092 pixels when rendered on the given zoom - * level.

NOTE: Bounding boxes that cross the 180° meridian require special treatment. For such - * boxes, the eastern _maxX_ value will be negative, and thus less than the _minX_ value west of the - * 180° meridian. To address that, the value 40075016.6855874 should be added to the true _maxX_ value - * before it is passed in the request. - * @param boundingzoom Zoom level of the map viewport. Used to determine whether the view can be zoomed - * in. - * @param overviewbox Bounding box of the overview map in - * [EPSG900913](http://docs.openlayers.org/library/spherical_mercator.html) projection.

Used in - * case the overview box/mini map has different copyright data than the main map. If there is no mini - * map, the same coordinates as `boundingBox` is used. - * @param overviewzoom Zoom level of the overview map. If there is no mini map, use the same zoom level - * as boundingZoom. - * @param options The options parameters. - */ - getTrafficIncidentViewport( - format: TextFormat, - boundingbox: string, - boundingzoom: number, - overviewbox: string, - overviewzoom: number, - options?: TrafficGetTrafficIncidentViewportOptionalParams - ): Promise; -} diff --git a/sdk/maps/maps-traffic/src/trafficClient.ts b/sdk/maps/maps-traffic/src/trafficClient.ts deleted file mode 100644 index 60ce72068097..000000000000 --- a/sdk/maps/maps-traffic/src/trafficClient.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreAuth from "@azure/core-auth"; -import { TrafficImpl } from "./operations"; -import { Traffic } from "./operationsInterfaces"; -import { TrafficClientContext } from "./trafficClientContext"; -import { TrafficClientOptionalParams } from "./models"; - -export class TrafficClient extends TrafficClientContext { - /** - * Initializes a new instance of the TrafficClient class. - * @param credentials Subscription credentials which uniquely identify client subscription. - * @param options The parameter options - */ - constructor( - credentials: coreAuth.TokenCredential, - options?: TrafficClientOptionalParams - ) { - super(credentials, options); - this.traffic = new TrafficImpl(this); - } - - traffic: Traffic; -} diff --git a/sdk/maps/maps-traffic/src/trafficClientContext.ts b/sdk/maps/maps-traffic/src/trafficClientContext.ts deleted file mode 100644 index 4219d2e95cad..000000000000 --- a/sdk/maps/maps-traffic/src/trafficClientContext.ts +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; -import * as coreAuth from "@azure/core-auth"; -import { Geography, TrafficClientOptionalParams } from "./models"; - -export class TrafficClientContext extends coreClient.ServiceClient { - geography: Geography; - xMsClientId?: string; - apiVersion: string; - - /** - * Initializes a new instance of the TrafficClientContext class. - * @param credentials Subscription credentials which uniquely identify client subscription. - * @param options The parameter options - */ - constructor( - credentials: coreAuth.TokenCredential, - options?: TrafficClientOptionalParams - ) { - if (credentials === undefined) { - throw new Error("'credentials' cannot be null"); - } - - // Initializing default values for options - if (!options) { - options = {}; - } - const defaults: TrafficClientOptionalParams = { - requestContentType: "application/json; charset=utf-8", - credential: credentials - }; - - const packageDetails = `azsdk-js-maps-traffic/1.0.0-beta.1`; - const userAgentPrefix = - options.userAgentOptions && options.userAgentOptions.userAgentPrefix - ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` - : `${packageDetails}`; - - if (!options.credentialScopes) { - options.credentialScopes = ["https://atlas.microsoft.com/.default"]; - } - const optionsWithDefaults = { - ...defaults, - ...options, - userAgentOptions: { - userAgentPrefix - }, - baseUri: options.endpoint || "https://{geography}.atlas.microsoft.com" - }; - super(optionsWithDefaults); - - // Assigning values to Constant parameters - this.geography = options.geography || "us"; - this.apiVersion = options.apiVersion || "1.0"; - } -} diff --git a/sdk/maps/maps-traffic/tsconfig.json b/sdk/maps/maps-traffic/tsconfig.json deleted file mode 100644 index 0ec8659c8e83..000000000000 --- a/sdk/maps/maps-traffic/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "module": "es6", - "moduleResolution": "node", - "strict": true, - "target": "es6", - "sourceMap": true, - "declarationMap": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "preserveConstEnums": true, - "lib": ["es6", "dom"], - "declaration": true, - "outDir": "./esm", - "importHelpers": true - }, - "include": ["./src/**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/sdk/maps/maps-weather/LICENSE.txt b/sdk/maps/maps-weather/LICENSE.txt deleted file mode 100644 index ccb63b166732..000000000000 --- a/sdk/maps/maps-weather/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2021 Microsoft - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/sdk/maps/maps-weather/README.md b/sdk/maps/maps-weather/README.md deleted file mode 100644 index d321da18f5cf..000000000000 --- a/sdk/maps/maps-weather/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# Azure Weather client library for JavaScript - -This package contains an isomorphic SDK (runs both in Node.js and in browsers) for Azure Weather client. - - - -[Source code](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-weather) | -[Package (NPM)](https://www.npmjs.com/package/@azure/maps-weather) | -[API reference documentation](https://docs.microsoft.com/javascript/api/@azure/maps-weather) | -[Samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-weather/samples) - -## Getting started - -### Currently supported environments - -- [LTS versions of Node.js](https://nodejs.org/about/releases/) -- Latest versions of Safari, Chrome, Edge and Firefox. - -### Prerequisites - -- An [Azure subscription][azure_sub]. - -### Install the `@azure/maps-weather` package - -Install the Azure Weather client library for JavaScript with `npm`: - -```bash -npm install @azure/maps-weather -``` - -### Create and authenticate a `WeatherClient` - -To create a client object to access the Azure Weather API, you will need the `endpoint` of your Azure Weather resource and a `credential`. The Azure Weather client can use Azure Active Directory credentials to authenticate. -You can find the endpoint for your Azure Weather resource in the [Azure Portal][azure_portal]. - -#### Using an Azure Active Directory Credential - -You can authenticate with Azure Active Directory using the [Azure Identity library][azure_identity]. To use the [DefaultAzureCredential][defaultazurecredential] provider shown below, or other credential providers provided with the Azure SDK, please install the `@azure/identity` package: - -```bash -npm install @azure/identity -``` - -You will also need to register a new AAD application and grant access to Azure Weather by assigning the suitable role to your service principal (note: roles such as `"Owner"` will not grant the necessary permissions). -Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`. - -```javascript -const { WeatherClient } = require("@azure/maps-weather"); -const { DefaultAzureCredential } = require("@azure/identity"); -const client = new WeatherClient("", new DefaultAzureCredential()); -``` - -## Key concepts - -### WeatherClient - -`WeatherClient` is the primary interface for developers using the Azure Weather client library. Explore the methods on this client object to understand the different features of the Azure Weather service that you can access. - -## Troubleshooting - -### Logging - -Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: - -```javascript -import { setLogLevel } from "@azure/logger"; -setLogLevel("info"); -``` - -For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/core/logger). - -## Next steps - -Please take a look at the [samples](https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/maps/maps-weather/samples) directory for detailed examples on how to use this library. - -## Contributing - -If you'd like to contribute to this library, please read the [contributing guide](https://github.com/Azure/azure-sdk-for-js/blob/master/CONTRIBUTING.md) to learn more about how to build and test the code. - -## Related projects - -- [Microsoft Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) - -![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-js%2Fsdk%2Fmaps%2Fmaps-weather%2FREADME.png) - -[azure_cli]: https://docs.microsoft.com/cli/azure -[azure_sub]: https://azure.microsoft.com/free/ -[azure_sub]: https://azure.microsoft.com/free/ -[azure_portal]: https://portal.azure.com -[azure_identity]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity -[defaultazurecredential]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/identity/identity#defaultazurecredential diff --git a/sdk/maps/maps-weather/api-extractor.json b/sdk/maps/maps-weather/api-extractor.json deleted file mode 100644 index 5fb5b21b56f2..000000000000 --- a/sdk/maps/maps-weather/api-extractor.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", - "mainEntryPointFilePath": "./esm/index.d.ts", - "docModel": { "enabled": true }, - "apiReport": { "enabled": true, "reportFolder": "./review" }, - "dtsRollup": { - "enabled": true, - "untrimmedFilePath": "", - "publicTrimmedFilePath": "./esm/index.d.ts" - }, - "messages": { - "tsdocMessageReporting": { "default": { "logLevel": "none" } }, - "extractorMessageReporting": { - "ae-missing-release-tag": { "logLevel": "none" }, - "ae-unresolved-link": { "logLevel": "none" } - } - } -} diff --git a/sdk/maps/maps-weather/package.json b/sdk/maps/maps-weather/package.json deleted file mode 100644 index ededa4824217..000000000000 --- a/sdk/maps/maps-weather/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "@azure/maps-weather", - "sdk-type": "client", - "author": "Microsoft Corporation", - "description": "A generated SDK for WeatherClient.", - "version": "1.0.0-beta.1", - "engines": { "node": ">=12.0.0" }, - "dependencies": { - "@azure/core-client": "^1.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-rest-pipeline": "^1.1.0", - "tslib": "^2.2.0" - }, - "keywords": ["node", "azure", "typescript", "browser", "isomorphic"], - "license": "MIT", - "main": "./dist/index.js", - "module": "./esm/index.js", - "types": "./esm/index.d.ts", - "devDependencies": { - "@microsoft/api-extractor": "7.7.11", - "@rollup/plugin-commonjs": "11.0.2", - "@rollup/plugin-json": "^4.0.0", - "@rollup/plugin-multi-entry": "^3.0.0", - "@rollup/plugin-node-resolve": "^8.0.0", - "mkdirp": "^1.0.4", - "rollup": "^1.16.3", - "rollup-plugin-sourcemaps": "^0.4.2", - "rollup-plugin-node-resolve": "^3.4.0", - "typescript": "~4.2.0", - "uglify-js": "^3.4.9" - }, - "homepage": "https://github.com/Azure/azure-sdk-for-js", - "repository": { - "type": "git", - "url": "https://github.com/Azure/azure-sdk-for-js.git" - }, - "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, - "files": [ - "dist/**/*.js", - "dist/**/*.js.map", - "dist/**/*.d.ts", - "dist/**/*.d.ts.map", - "esm/**/*.js", - "esm/**/*.js.map", - "esm/**/*.d.ts", - "esm/**/*.d.ts.map", - "src/**/*.ts", - "README.md", - "rollup.config.js", - "tsconfig.json", - "review/*", - "CHANGELOG.md" - ], - "scripts": { - "build": "tsc && rollup -c rollup.config.js && npm run minify && mkdirp ./review && npm run extract-api", - "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js", - "prepack": "npm install && npm run build", - "pack": "npm pack 2>&1", - "extract-api": "mkdirp ./review && api-extractor run --local", - "lint": "echo skipped", - "audit": "echo skipped", - "clean": "echo skipped", - "build:node": "echo skipped", - "build:browser": "echo skipped", - "build:test": "echo skipped", - "build:samples": "echo skipped.", - "check-format": "echo skipped", - "execute:samples": "echo skipped", - "format": "echo skipped", - "test": "echo skipped", - "prebuild": "echo skipped", - "test:node": "echo skipped", - "test:browser": "echo skipped", - "unit-test": "echo skipped", - "unit-test:node": "echo skipped", - "unit-test:browser": "echo skipped", - "integration-test:browser": "echo skipped", - "integration-test:node": "echo skipped", - "integration-test": "echo skipped", - "docs": "echo skipped" - }, - "sideEffects": false, - "autoPublish": true -} diff --git a/sdk/maps/maps-weather/review/maps-weather.api.md b/sdk/maps/maps-weather/review/maps-weather.api.md deleted file mode 100644 index 8c52516febdc..000000000000 --- a/sdk/maps/maps-weather/review/maps-weather.api.md +++ /dev/null @@ -1,636 +0,0 @@ -## API Report File for "@azure/maps-weather" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -import * as coreAuth from '@azure/core-auth'; -import * as coreClient from '@azure/core-client'; - -// @public (undocumented) -export interface AirAndPollen { - category?: string; - categoryValue?: number; - name?: string; - type?: string; - value?: number; -} - -// @public -export interface AlertArea { - alertDetails?: string; - alertDetailsLanguageCode?: string; - endTime?: string; - latestStatus?: LatestStatus; - name?: string; - startTime?: string; - summary?: string; -} - -// @public (undocumented) -export interface ColorValue { - blue?: number; - green?: number; - hex?: string; - red?: number; -} - -// @public (undocumented) -export interface CurrentConditions { - apparentTemperature?: WeatherUnit; - ceiling?: WeatherUnit; - cloudCover?: number; - dateTime?: string; - dewPoint?: WeatherUnit; - hasPrecipitation?: boolean; - iconCode?: number; - isDayTime?: boolean; - obstructionsToVisibility?: string; - past24HourTemperatureDeparture?: WeatherUnit; - phrase?: string; - precipitationSummary?: PrecipitationSummary; - pressure?: WeatherUnit; - pressureTendency?: PressureTendency; - realFeelTemperature?: WeatherUnit; - realFeelTemperatureShade?: WeatherUnit; - relativeHumidity?: number; - temperature?: WeatherUnit; - temperatureSummary?: TemperatureSummary; - uvIndex?: number; - uvIndexPhrase?: string; - visibility?: WeatherUnit; - wetBulbTemperature?: WeatherUnit; - wind?: WindDetails; - windChillTemperature?: WeatherUnit; - windGust?: WindDetails; -} - -// @public (undocumented) -export interface CurrentConditionsResponse { - results?: CurrentConditions[]; -} - -// @public (undocumented) -export interface DailyForecast { - airAndPollen?: AirAndPollen[]; - date?: string; - day?: DayOrNight; - degreeDaySummary?: DegreeDaySummary; - hoursOfSun?: number; - night?: DayOrNight; - realFeelTemperature?: WeatherUnitRange; - realFeelTemperatureShade?: WeatherUnitRange; - sources?: string[]; - temperature?: WeatherUnitRange; -} - -// @public (undocumented) -export interface DailyForecastResponse { - forecasts?: DailyForecast[]; - summary?: DailyForecastSummary; -} - -// @public -export interface DailyForecastSummary { - category?: string; - endDate?: string; - phrase?: string; - severity?: number; - startDate?: string; -} - -// @public -export interface DailyIndex { - ascending?: boolean; - category?: string; - categoryValue?: number; - dateTime?: string; - description?: string; - indexId?: number; - indexName?: string; - value?: number; -} - -// @public -export interface DailyIndicesResponse { - results?: DailyIndex[]; -} - -// @public (undocumented) -export interface DayOrNight { - cloudCover?: number; - hasPrecipitation?: boolean; - hoursOfIce?: number; - hoursOfPrecipitation?: number; - hoursOfRain?: number; - hoursOfSnow?: number; - ice?: WeatherUnit; - iceProbability?: number; - iconCode?: number; - iconPhrase?: string; - localSource?: LocalSource; - longPhrase?: string; - precipitationIntensity?: string; - precipitationProbability?: number; - precipitationType?: string; - rain?: WeatherUnit; - rainProbability?: number; - shortPhrase?: string; - snow?: WeatherUnit; - snowProbability?: number; - thunderstormProbability?: number; - totalLiquid?: WeatherUnit; - wind?: WindDetails; - windGust?: WindDetails; -} - -// @public -export type DayQuarter = number; - -// @public (undocumented) -export interface DegreeDaySummary { - cooling?: WeatherUnit; - heating?: WeatherUnit; -} - -// @public -export interface ErrorAdditionalInfo { - readonly info?: Record; - readonly type?: string; -} - -// @public -export interface ErrorDetail { - readonly additionalInfo?: ErrorAdditionalInfo[]; - readonly code?: string; - readonly details?: ErrorDetail[]; - readonly message?: string; - readonly target?: string; -} - -// @public -export interface ErrorResponse { - error?: ErrorDetail; -} - -// @public (undocumented) -export interface ForecastInterval { - cloudCover?: number; - color?: ColorValue; - dbz?: number; - iconCode?: number; - minute?: number; - precipitationType?: string; - shortPhrase?: string; - simplifiedColor?: ColorValue; - startTime?: string; - threshold?: string; -} - -// @public -export type GeographicResourceLocation = string; - -// @public -export type Geography = string; - -// @public (undocumented) -export interface HazardDetail { - hazardCode?: string; - hazardIndex?: number; - shortPhrase?: string; -} - -// @public (undocumented) -export interface HourlyForecast { - ceiling?: WeatherUnit; - cloudCover?: number; - date?: string; - dewPoint?: WeatherUnit; - hasPrecipitation?: boolean; - ice?: WeatherUnit; - iceProbability?: number; - iconCode?: number; - iconPhrase?: string; - isDaylight?: boolean; - precipitationProbability?: number; - rain?: WeatherUnit; - rainProbability?: number; - realFeelTemperature?: WeatherUnit; - relativeHumidity?: number; - snow?: WeatherUnit; - snowProbability?: number; - temperature?: WeatherUnit; - totalLiquid?: WeatherUnit; - uvIndex?: number; - uvIndexPhrase?: string; - visibility?: WeatherUnit; - wetBulbTemperature?: WeatherUnit; - wind?: WindDetails; - windGust?: WindDetails; -} - -// @public (undocumented) -export interface HourlyForecastResponse { - forecasts?: HourlyForecast[]; -} - -// @public (undocumented) -export interface IntervalSummary { - briefPhrase?: string; - endMinute?: number; - iconCode?: number; - longPhrase?: string; - shortPhrase?: string; - startMinute?: number; - totalMinutes?: number; -} - -// @public -export const enum KnownDayQuarter { - One = 1, - Three = 3, - Two = 2, - Zero = 0 -} - -// @public -export const enum KnownGeographicResourceLocation { - Eu = "eu", - Us = "us" -} - -// @public -export const enum KnownGeography { - // (undocumented) - Eu = "eu", - // (undocumented) - Us = "us" -} - -// @public -export const enum KnownLatestStatusKeyword { - Cancel = "Cancel", - Continue = "Continue", - Correct = "Correct", - Expire = "Expire", - Extend = "Extend", - New = "New", - Update = "Update", - Upgrade = "Upgrade" -} - -// @public -export const enum KnownResponseFormat { - Json = "json" -} - -// @public -export const enum KnownWeatherDataUnit { - Imperial = "imperial", - Metric = "metric" -} - -// @public -export interface LatestStatus { - english?: LatestStatusKeyword; - localized?: string; -} - -// @public -export type LatestStatusKeyword = string; - -// @public -export interface LocalSource { - id?: number; - name?: string; - weatherCode?: string; -} - -// @public (undocumented) -export interface MinuteForecastResponse { - intervals?: ForecastInterval[]; - intervalSummaries?: IntervalSummary[]; - summary?: MinuteForecastSummary; -} - -// @public -export interface MinuteForecastSummary { - briefPhrase?: string; - briefPhrase60?: string; - iconCode?: number; - longPhrase?: string; - shortPhrase?: string; -} - -// @public (undocumented) -export interface PrecipitationSummary { - past12Hours?: WeatherUnit; - past18Hours?: WeatherUnit; - past24Hours?: WeatherUnit; - past3Hours?: WeatherUnit; - past6Hours?: WeatherUnit; - past9Hours?: WeatherUnit; - pastHour?: WeatherUnit; -} - -// @public (undocumented) -export interface PressureTendency { - code?: string; - localizedDescription?: string; -} - -// @public (undocumented) -export interface QuarterDayForecast { - cloudCover?: number; - date?: string; - dewPoint?: WeatherUnit; - effectiveDate?: string; - hasPrecipitation?: boolean; - ice?: WeatherUnit; - iconCode?: number; - iconPhrase?: string; - phrase?: string; - precipitationIntensity?: string; - precipitationProbability?: number; - precipitationType?: string; - quarter?: DayQuarter; - rain?: WeatherUnit; - realFeelTemperature?: WeatherUnitRange; - relativeHumidity?: number; - snow?: WeatherUnit; - temperature?: WeatherUnitRange; - thunderstormProbability?: number; - totalLiquid?: WeatherUnit; - visibility?: WeatherUnit; - wind?: WindDetails; - windGust?: WindDetails; -} - -// @public (undocumented) -export interface QuarterDayForecastResponse { - forecasts?: QuarterDayForecast[]; -} - -// @public -export type ResponseFormat = string; - -// @public -export interface SevereWeatherAlert { - alertAreas?: AlertArea[]; - alertId?: number; - category?: string; - class?: string; - countryCode?: string; - description?: SevereWeatherAlertDescription; - disclaimer?: string; - level?: string; - priority?: number; - source?: string; - sourceId?: number; -} - -// @public -export interface SevereWeatherAlertDescription { - english?: string; - localized?: string; -} - -// @public -export interface SevereWeatherAlertsResponse { - results?: SevereWeatherAlert[]; -} - -// @public -export interface SunGlare { - calculatedVehicleHeading?: number; - glareIndex?: number; -} - -// @public (undocumented) -export interface TemperatureSummary { - past12Hours?: TemperatureSummaryPast12Hours; - past24Hours?: TemperatureSummaryPast24Hours; - past6Hours?: TemperatureSummaryPast6Hours; -} - -// @public -export interface TemperatureSummaryPast12Hours { - maximum?: WeatherUnit; - minimum?: WeatherUnit; -} - -// @public -export interface TemperatureSummaryPast24Hours { - maximum?: WeatherUnit; - minimum?: WeatherUnit; -} - -// @public -export interface TemperatureSummaryPast6Hours { - maximum?: WeatherUnit; - minimum?: WeatherUnit; -} - -// @public -export interface Weather { - getCurrentConditions(format: ResponseFormat, query: string, options?: WeatherGetCurrentConditionsOptionalParams): Promise; - getDailyForecast(format: ResponseFormat, query: string, options?: WeatherGetDailyForecastOptionalParams): Promise; - getDailyIndices(format: ResponseFormat, query: string, options?: WeatherGetDailyIndicesOptionalParams): Promise; - getHourlyForecast(format: ResponseFormat, query: string, options?: WeatherGetHourlyForecastOptionalParams): Promise; - getMinuteForecast(format: ResponseFormat, query: string, options?: WeatherGetMinuteForecastOptionalParams): Promise; - getQuarterDayForecast(format: ResponseFormat, query: string, options?: WeatherGetQuarterDayForecastOptionalParams): Promise; - getSevereWeatherAlerts(format: ResponseFormat, query: string, options?: WeatherGetSevereWeatherAlertsOptionalParams): Promise; - getWeatherAlongRoute(format: ResponseFormat, query: string, options?: WeatherGetWeatherAlongRouteOptionalParams): Promise; -} - -// @public -export interface WeatherAlongRoutePrecipitation { - dbz?: number; - type?: string; -} - -// @public -export interface WeatherAlongRouteResponse { - summary?: WeatherAlongRouteSummary; - waypoints?: WeatherWaypoint[]; -} - -// @public -export interface WeatherAlongRouteSummary { - hazards?: WeatherHazards; - iconCode?: number; -} - -// @public (undocumented) -export class WeatherClient extends WeatherClientContext { - constructor(credentials: coreAuth.TokenCredential, options?: WeatherClientOptionalParams); - // (undocumented) - weather: Weather; -} - -// @public (undocumented) -export class WeatherClientContext extends coreClient.ServiceClient { - constructor(credentials: coreAuth.TokenCredential, options?: WeatherClientOptionalParams); - // (undocumented) - apiVersion: string; - // (undocumented) - geography: Geography; - // (undocumented) - xMsClientId?: string; -} - -// @public -export interface WeatherClientOptionalParams extends coreClient.ServiceClientOptions { - apiVersion?: string; - endpoint?: string; - geography?: Geography; - xMsClientId?: string; -} - -// @public -export type WeatherDataUnit = string; - -// @public -export interface WeatherGetCurrentConditionsOptionalParams extends coreClient.OperationOptions { - details?: string; - duration?: number; - language?: string; - unit?: WeatherDataUnit; -} - -// @public -export type WeatherGetCurrentConditionsResponse = CurrentConditionsResponse; - -// @public -export interface WeatherGetDailyForecastOptionalParams extends coreClient.OperationOptions { - duration?: number; - language?: string; - unit?: WeatherDataUnit; -} - -// @public -export type WeatherGetDailyForecastResponse = DailyForecastResponse; - -// @public -export interface WeatherGetDailyIndicesOptionalParams extends coreClient.OperationOptions { - duration?: number; - indexGroupId?: number; - indexId?: number; - language?: string; -} - -// @public -export type WeatherGetDailyIndicesResponse = DailyIndicesResponse; - -// @public -export interface WeatherGetHourlyForecastOptionalParams extends coreClient.OperationOptions { - duration?: number; - language?: string; - unit?: WeatherDataUnit; -} - -// @public -export type WeatherGetHourlyForecastResponse = HourlyForecastResponse; - -// @public -export interface WeatherGetMinuteForecastOptionalParams extends coreClient.OperationOptions { - interval?: number; - language?: string; -} - -// @public -export type WeatherGetMinuteForecastResponse = MinuteForecastResponse; - -// @public -export interface WeatherGetQuarterDayForecastOptionalParams extends coreClient.OperationOptions { - duration?: number; - language?: string; - unit?: WeatherDataUnit; -} - -// @public -export type WeatherGetQuarterDayForecastResponse = QuarterDayForecastResponse; - -// @public -export interface WeatherGetSevereWeatherAlertsOptionalParams extends coreClient.OperationOptions { - details?: string; - language?: string; -} - -// @public -export type WeatherGetSevereWeatherAlertsResponse = SevereWeatherAlertsResponse; - -// @public -export interface WeatherGetWeatherAlongRouteOptionalParams extends coreClient.OperationOptions { - language?: string; -} - -// @public -export type WeatherGetWeatherAlongRouteResponse = WeatherAlongRouteResponse; - -// @public -export interface WeatherHazards { - hazardDetails?: HazardDetail[]; - maxHazardIndex?: number; -} - -// @public (undocumented) -export interface WeatherNotification { - hazardCode?: string; - hazardIndex?: number; - shortPhrase?: string; - type?: string; -} - -// @public -export interface WeatherUnit { - unit?: string; - unitType?: number; - value?: number; -} - -// @public -export interface WeatherUnitRange { - maximum?: WeatherUnit; - minimum?: WeatherUnit; -} - -// @public (undocumented) -export interface WeatherWaypoint { - cloudCover?: number; - hazards?: WeatherHazards; - iconCode?: number; - isDayTime?: boolean; - lightningCount?: number; - notifications?: WeatherNotification[]; - precipitation?: WeatherAlongRoutePrecipitation; - shortPhrase?: string; - sunGlare?: SunGlare; - temperature?: WeatherUnit; - wind?: WindDetails; - windGust?: WindDetails; -} - -// @public -export interface WindDetails { - direction?: WindDirection; - speed?: WindSpeed; -} - -// @public -export interface WindDirection { - degrees?: number; - localizedDescription?: string; -} - -// @public -export interface WindSpeed { - unit?: string; - unitType?: number; - value?: number; -} - - -// (No @packageDocumentation comment for this package) - -``` diff --git a/sdk/maps/maps-weather/rollup.config.js b/sdk/maps/maps-weather/rollup.config.js deleted file mode 100644 index 9be1955eb7f1..000000000000 --- a/sdk/maps/maps-weather/rollup.config.js +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import nodeResolve from "@rollup/plugin-node-resolve"; -import cjs from "@rollup/plugin-commonjs"; -import sourcemaps from "rollup-plugin-sourcemaps"; -import multiEntry from "@rollup/plugin-multi-entry"; -import json from "@rollup/plugin-json"; - -import nodeBuiltins from "builtin-modules"; - -/** - * Gets the proper configuration needed for rollup's commonJS plugin for @opentelemetry/api. - * - * NOTE: this manual configuration is only needed because OpenTelemetry uses an - * __exportStar downleveled helper function to declare its exports which confuses - * rollup's automatic discovery mechanism. - * - * @returns an object reference that can be `...`'d into your cjs() configuration. - */ -export function openTelemetryCommonJs() { - const namedExports = {}; - - for (const key of [ - "@opentelemetry/api", - "@azure/core-tracing/node_modules/@opentelemetry/api" - ]) { - namedExports[key] = [ - "SpanKind", - "TraceFlags", - "getSpan", - "setSpan", - "SpanStatusCode", - "getSpanContext", - "setSpanContext" - ]; - } - - const releasedOpenTelemetryVersions = ["0.10.2", "1.0.0-rc.0"]; - - for (const version of releasedOpenTelemetryVersions) { - namedExports[ - // working around a limitation in the rollup common.js plugin - it's not able to resolve these modules so the named exports listed above will not get applied. We have to drill down to the actual path. - `../../../common/temp/node_modules/.pnpm/@opentelemetry/api@${version}/node_modules/@opentelemetry/api/build/src/index.js` - ] = [ - "SpanKind", - "TraceFlags", - "getSpan", - "setSpan", - "StatusCode", - "CanonicalCode", - "getSpanContext", - "setSpanContext" - ]; - } - - return namedExports; -} - -// #region Warning Handler - -/** - * A function that can determine whether a rollupwarning should be ignored. If - * the function returns `true`, then the warning will not be displayed. - */ - -function ignoreNiseSinonEvalWarnings(warning) { - return ( - warning.code === "EVAL" && - warning.id && - (warning.id.includes("node_modules/nise") || - warning.id.includes("node_modules/sinon")) === true - ); -} - -function ignoreChaiCircularDependencyWarnings(warning) { - return ( - warning.code === "CIRCULAR_DEPENDENCY" && - warning.importer && warning.importer.includes("node_modules/chai") === true - ); -} - -const warningInhibitors = [ - ignoreChaiCircularDependencyWarnings, - ignoreNiseSinonEvalWarnings -]; - -/** - * Construct a warning handler for the shared rollup configuration - * that ignores certain warnings that are not relevant to testing. - */ -function makeOnWarnForTesting() { - return (warning, warn) => { - // If every inhibitor returns false (i.e. no inhibitors), then show the warning - if (warningInhibitors.every((inhib) => !inhib(warning))) { - warn(warning); - } - }; -} - -// #endregion - -function makeBrowserTestConfig() { - const config = { - input: { - include: ["dist-esm/test/**/*.spec.js"], - exclude: ["dist-esm/test/**/node/**"] - }, - output: { - file: `dist-test/index.browser.js`, - format: "umd", - sourcemap: true - }, - preserveSymlinks: false, - plugins: [ - multiEntry({ exports: false }), - nodeResolve({ - mainFields: ["module", "browser"] - }), - cjs({ - namedExports: { - // Chai's strange internal architecture makes it impossible to statically - // analyze its exports. - chai: [ - "version", - "use", - "util", - "config", - "expect", - "should", - "assert" - ], - ...openTelemetryCommonJs() - } - }), - json(), - sourcemaps() - //viz({ filename: "dist-test/browser-stats.html", sourcemap: true }) - ], - onwarn: makeOnWarnForTesting(), - // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, - // rollup started respecting the "sideEffects" field in package.json. Since - // our package.json sets "sideEffects=false", this also applies to test - // code, which causes all tests to be removed by tree-shaking. - treeshake: false - }; - - return config; -} - -const defaultConfigurationOptions = { - disableBrowserBundle: false -}; - -export function makeConfig(pkg, options) { - options = { - ...defaultConfigurationOptions, - ...(options || {}) - }; - - const baseConfig = { - // Use the package's module field if it has one - input: pkg["module"] || "dist-esm/src/index.js", - external: [ - ...nodeBuiltins, - ...Object.keys(pkg.dependencies), - ...Object.keys(pkg.devDependencies) - ], - output: { file: "dist/index.js", format: "cjs", sourcemap: true }, - preserveSymlinks: false, - plugins: [sourcemaps(), nodeResolve(), cjs()] - }; - - const config = [baseConfig]; - - if (!options.disableBrowserBundle) { - config.push(makeBrowserTestConfig()); - } - - return config; -} - -export default makeConfig(require("./package.json")); diff --git a/sdk/maps/maps-weather/src/index.ts b/sdk/maps/maps-weather/src/index.ts deleted file mode 100644 index 87609e29745a..000000000000 --- a/sdk/maps/maps-weather/src/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./models"; -export { WeatherClient } from "./weatherClient"; -export { WeatherClientContext } from "./weatherClientContext"; -export * from "./operationsInterfaces"; diff --git a/sdk/maps/maps-weather/src/models/index.ts b/sdk/maps/maps-weather/src/models/index.ts deleted file mode 100644 index 19d527255c60..000000000000 --- a/sdk/maps/maps-weather/src/models/index.ts +++ /dev/null @@ -1,1069 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; - -export interface HourlyForecastResponse { - /** Forecast data for each returned hour. */ - forecasts?: HourlyForecast[]; -} - -export interface HourlyForecast { - /** Date and time of the forecast in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. */ - date?: string; - /** Numeric value representing an image that displays the `iconPhrase`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ - iconCode?: number; - /** Phrase description of the weather icon. */ - iconPhrase?: string; - /** Indicates the presence or absence of precipitation. True indicates the presence of precipitation, false indicates the absence of precipitation. */ - hasPrecipitation?: boolean; - /** Specifies whether or not it is daylight. True indicates day light. */ - isDaylight?: boolean; - /** Temperature being returned. */ - temperature?: WeatherUnit; - /** RealFeel™ Temperature being returned. Describes what the temperature really feels like in the shade. */ - realFeelTemperature?: WeatherUnit; - /** The temperature to which air may be cooled by evaporating water into it at constant pressure until it reaches saturation. */ - wetBulbTemperature?: WeatherUnit; - /** The dewpoint temperature in specified unit. The dewpoint temperature is the temperature that the air must be cooled to in order to reach saturation. */ - dewPoint?: WeatherUnit; - /** Wind details being returned including speed and direction. */ - wind?: WindDetails; - /** Wind gust. Wind gust is a sudden, brief increase in speed of the wind. */ - windGust?: WindDetails; - /** Relative humidity is the amount of water vapor present in air expressed as a percentage of the amount needed for saturation at the same temperature. */ - relativeHumidity?: number; - /** Visibility in specified unit. A measure of the distance at which an object or light can be clearly discerned. */ - visibility?: WeatherUnit; - /** Cloud ceiling in specified unit. The ceiling is a measurement of the height of the base of the lowest clouds. */ - ceiling?: WeatherUnit; - /** - * Measure of the strength of the ultraviolet radiation from the sun. Supported values are: - * * `0-2` - Low danger from the sun's UV rays or the average person. - * * `3-5` - Moderate risk of harm from unprotected sun exposure. - * * `6-7` - High risk of harm from unprotected sun exposure. - * * `8-10` - Very high risk of harm from unprotected sun exposure. - * * `11+` - Extreme risk of harm from unprotected sun exposure. - */ - uvIndex?: number; - /** Phrase associated with the `uvIndex`. */ - uvIndexPhrase?: string; - /** Percent representing the probability of precipitation. For example, '20'. */ - precipitationProbability?: number; - /** Percent representing the probability of rain. For example, '50'. */ - rainProbability?: number; - /** Percent representing the probability of snow. For example, '50'. */ - snowProbability?: number; - /** Percent representing the probability of snow. For example, '5'. */ - iceProbability?: number; - /** Total liquid equivalent of precipitation during the forecast period. */ - totalLiquid?: WeatherUnit; - /** Rain */ - rain?: WeatherUnit; - /** Snow */ - snow?: WeatherUnit; - /** Ice */ - ice?: WeatherUnit; - /** Percent representing cloud cover. */ - cloudCover?: number; -} - -/** Specific value of a given unit related to weather. */ -export interface WeatherUnit { - /** Rounded value. */ - value?: number; - /** Type of unit for the returned value. */ - unit?: string; - /** Numeric ID value associated with the type of unit being displayed. Can be used for unit translation. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ - unitType?: number; -} - -/** Wind details being returned including speed and direction. */ -export interface WindDetails { - /** Wind direction */ - direction?: WindDirection; - /** Speed of the wind in specified unit. */ - speed?: WindSpeed; -} - -/** Wind direction */ -export interface WindDirection { - /** Wind direction in Azimuth degrees, starting at true North and continuing in clockwise direction. North is 0 degrees, east is 90 degrees, south is 180 degrees, west is 270 degrees. Possible values 0-359. */ - degrees?: number; - /** Direction abbreviation in the specified language. */ - localizedDescription?: string; -} - -/** Speed of wind in specified unit. */ -export interface WindSpeed { - /** Rounded value of the speed. */ - value?: number; - /** Type of unit for the speed value. */ - unit?: string; - /** Numeric ID value associated with the type of unit being displayed. Can be used for unit translation. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ - unitType?: number; -} - -/** Common error response for all Azure Resource Manager APIs to return error details for failed operations. (This also follows the OData error response format.). */ -export interface ErrorResponse { - /** The error object. */ - error?: ErrorDetail; -} - -/** The error detail. */ -export interface ErrorDetail { - /** - * The error code. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly code?: string; - /** - * The error message. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly message?: string; - /** - * The error target. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly target?: string; - /** - * The error details. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly details?: ErrorDetail[]; - /** - * The error additional info. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly additionalInfo?: ErrorAdditionalInfo[]; -} - -/** The resource management error additional info. */ -export interface ErrorAdditionalInfo { - /** - * The additional info type. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly type?: string; - /** - * The additional info. - * NOTE: This property will not be serialized. It can only be populated by the server. - */ - readonly info?: Record; -} - -export interface MinuteForecastResponse { - /** Phrase summaries for the entire forecast period. */ - summary?: MinuteForecastSummary; - /** Summary information for each interval in the forecast. The Summaries breaks down each potential interval where precipitation starts and stops. */ - intervalSummaries?: IntervalSummary[]; - /** Forecast data for each interval in the forecast. */ - intervals?: ForecastInterval[]; -} - -/** Phrase summaries for the entire forecast period. */ -export interface MinuteForecastSummary { - /** Summary phrase for the next 60 minutes. Phrase length is approximately 60 characters. */ - briefPhrase60?: string; - /** Short summary phrase for the next 120 minutes. Phrase length is approximately 25 characters. */ - shortPhrase?: string; - /** Summary phrase for the next 120 minutes. Phrase length is approximately 60 characters. */ - briefPhrase?: string; - /** Long summary phrase for the next 120 minutes. Phrase length is 60+ characters. */ - longPhrase?: string; - /** Numeric value representing an image that displays the `iconPhrase`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ - iconCode?: number; -} - -export interface IntervalSummary { - /** The first minute to which the summary applies. */ - startMinute?: number; - /** The last minute to which the summary applies. */ - endMinute?: number; - /** The number of minutes for which the summary applies. */ - totalMinutes?: number; - /** Short summary phrase. Phrase length is approximately 25 characters. */ - shortPhrase?: string; - /** Brief summary phrase. Phrase length is approximately 60 characters. */ - briefPhrase?: string; - /** Long summary phrase. Phrase length is 60+ characters. */ - longPhrase?: string; - /** Numeric value representing an image that displays the `iconPhrase`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ - iconCode?: number; -} - -export interface ForecastInterval { - /** The date and time for the start of the interval in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. */ - startTime?: string; - /** The first minute for the interval. */ - minute?: number; - /** A unit that represents forecasted precipitation intensity. */ - dbz?: number; - /** A short phrase describing precipitation condition for the interval. */ - shortPhrase?: string; - /** Key that specifies the threshold value. Along with precipitationType, can be used to determine the simplifiedColor. If dbz is zero, not present in the response. */ - threshold?: string; - /** The full spectrum color that maps to the dBZ (decibel relative to Z). If dbz is zero, color is not present in the response. */ - color?: ColorValue; - /** The band color that maps to the precipitation type and threshold. If dbz is zero, not present in the response. */ - simplifiedColor?: ColorValue; - /** Specifies the type of precipitation ("rain" "snow" "ice" or "mix"). If dbz is zero, precipitationType is not present in the response. */ - precipitationType?: string; - /** Numeric value representing an image that displays the `iconPhrase`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ - iconCode?: number; - /** Percent representing cloud cover. */ - cloudCover?: number; -} - -export interface ColorValue { - /** Red component of the RGB value. */ - red?: number; - /** Green component of the RGB value. */ - green?: number; - /** Blue component of the RGB value */ - blue?: number; - /** Hexadecimal color value. */ - hex?: string; -} - -export interface QuarterDayForecastResponse { - /** Forecast data for each quarter in the response. */ - forecasts?: QuarterDayForecast[]; -} - -export interface QuarterDayForecast { - /** Date and time of the forecast in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. */ - date?: string; - /** Date and time of the beginning of the forecast quarter displayed in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. */ - effectiveDate?: string; - /** Quarter of the day. */ - quarter?: DayQuarter; - /** Numeric value representing an image that displays the `iconPhrase`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ - iconCode?: number; - /** Phrase description of the icon. Displayed in specified language. For example, 'Sunny'. */ - iconPhrase?: string; - /** Short summary phrase summary for quarter. */ - phrase?: string; - /** Temperature values for the quarter. */ - temperature?: WeatherUnitRange; - /** RealFeel™ Temperature values for the quarter. */ - realFeelTemperature?: WeatherUnitRange; - /** The dewpoint temperature in specified unit. The dewpoint temperature is the temperature that the air must be cooled to in order to reach saturation. */ - dewPoint?: WeatherUnit; - /** Relative humidity is the amount of water vapor present in air expressed as a percentage of the amount needed for saturation at the same temperature. */ - relativeHumidity?: number; - /** Wind details being returned including speed and direction. */ - wind?: WindDetails; - /** Wind gust. Wind gust is a sudden, brief increase in speed of the wind. */ - windGust?: WindDetails; - /** Visibility in specified unit. A measure of the distance at which an object or light can be clearly discerned. */ - visibility?: WeatherUnit; - /** Percent representing cloud cover. */ - cloudCover?: number; - /** Indicates the presence or absence of precipitation. True indicates the presence of precipitation, false indicates the absence of precipitation. */ - hasPrecipitation?: boolean; - /** Specifies the type of precipitation ("rain" "snow" "ice" or "mix"). If dbz = zero, precipitationType is not present in the response. */ - precipitationType?: string; - /** Description of the intensity. */ - precipitationIntensity?: string; - /** Percent representing the probability of precipitation. For example, '20'. */ - precipitationProbability?: number; - /** Percent representing the probability of a thunderstorm. For example, '10'. */ - thunderstormProbability?: number; - /** Total liquid equivalent of precipitation during the forecast period. */ - totalLiquid?: WeatherUnit; - /** Rain */ - rain?: WeatherUnit; - /** Snow */ - snow?: WeatherUnit; - /** Ice */ - ice?: WeatherUnit; -} - -/** Returned temperature values. */ -export interface WeatherUnitRange { - /** Minimum temperature for the time period. */ - minimum?: WeatherUnit; - /** Maximum temperature for the time period */ - maximum?: WeatherUnit; -} - -export interface CurrentConditionsResponse { - /** Detailed current weather conditions. */ - results?: CurrentConditions[]; -} - -export interface CurrentConditions { - /** Date and time of the current observation displayed in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. */ - dateTime?: string; - /** Phrase description of the current weather condition. Displayed in specified language. */ - phrase?: string; - /** Numeric value representing an image that displays the `iconPhrase`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ - iconCode?: number; - /** Indicates the presence or absence of precipitation. True indicates the presence of precipitation, false indicates the absence of precipitation. */ - hasPrecipitation?: boolean; - /** Indicates the time of the day. True indicates 'day',', false indicates 'night. */ - isDayTime?: boolean; - /** Temperature being returned. */ - temperature?: WeatherUnit; - /** RealFeel™ Temperature being returned. */ - realFeelTemperature?: WeatherUnit; - /** RealFeel™ Temperature being returned. Describes what the temperature really feels like in the shade. */ - realFeelTemperatureShade?: WeatherUnit; - /** Relative humidity is the amount of water vapor present in air expressed as a percentage of the amount needed for saturation at the same temperature. */ - relativeHumidity?: number; - /** The dewpoint temperature in specified unit. The dewpoint temperature is the temperature that the air must be cooled to in order to reach saturation. */ - dewPoint?: WeatherUnit; - /** Wind details being returned including speed and direction. */ - wind?: WindDetails; - /** Wind gust. Wind gust is a sudden, brief increase in speed of the wind. */ - windGust?: WindDetails; - /** - * Measure of the strength of the ultraviolet radiation from the sun. Supported values are: - * * `0-2` - Low danger from the sun's UV rays or the average person. - * * `3-5` - Moderate risk of harm from unprotected sun exposure. - * * `6-7` - High risk of harm from unprotected sun exposure. - * * `8-10` - Very high risk of harm from unprotected sun exposure. - * * `11+` - Extreme risk of harm from unprotected sun exposure. - */ - uvIndex?: number; - /** Phrase associated with the `uvIndex`. */ - uvIndexPhrase?: string; - /** Visibility in specified unit. A measure of the distance at which an object or light can be clearly discerned. */ - visibility?: WeatherUnit; - /** Cause of limited visibility. */ - obstructionsToVisibility?: string; - /** Percent representing cloud cover. */ - cloudCover?: number; - /** Cloud ceiling in specified unit. The ceiling is a measurement of the height of the base of the lowest clouds. */ - ceiling?: WeatherUnit; - /** Atmospheric pressure in specified unit. */ - pressure?: WeatherUnit; - /** Atmospheric pressure change. */ - pressureTendency?: PressureTendency; - /** Departure from the temperature observed 24 hours ago in specified unit. */ - past24HourTemperatureDeparture?: WeatherUnit; - /** Perceived outdoor temperature caused by the combination of air temperature, relative humidity, and wind speed in specified unit. */ - apparentTemperature?: WeatherUnit; - /** Perceived air temperature on exposed skin due to wind. */ - windChillTemperature?: WeatherUnit; - /** The temperature to which air may be cooled by evaporating water into it at constant pressure until it reaches saturation. */ - wetBulbTemperature?: WeatherUnit; - /** Summary of precipitation amounts over the past 24 hours. */ - precipitationSummary?: PrecipitationSummary; - /** Summary of temperature fluctuations over the past 6, 12, and 24 hours. */ - temperatureSummary?: TemperatureSummary; -} - -export interface PressureTendency { - /** Description of the pressure tendency in specified language */ - localizedDescription?: string; - /** Pressure tendency code regardless of language. One of F=Falling, S=Steady, R=Rising. */ - code?: string; -} - -export interface PrecipitationSummary { - /** The amount of precipitation (liquid equivalent) that has fallen in the past hour. */ - pastHour?: WeatherUnit; - /** The amount of precipitation (liquid equivalent) that has fallen in the past three hours. */ - past3Hours?: WeatherUnit; - /** The amount of precipitation (liquid equivalent) that has fallen in the past six hours. Contains Metric and Imperial Values. */ - past6Hours?: WeatherUnit; - /** The amount of precipitation (liquid equivalent) that has fallen in the past nine hours. */ - past9Hours?: WeatherUnit; - /** The amount of precipitation (liquid equivalent) that has fallen in the past 12 hours. */ - past12Hours?: WeatherUnit; - /** The amount of precipitation (liquid equivalent) that has fallen in the past 18 hours. */ - past18Hours?: WeatherUnit; - /** The amount of precipitation (liquid equivalent) that has fallen in the past 24 hours. */ - past24Hours?: WeatherUnit; -} - -export interface TemperatureSummary { - /** Summary of temperature fluctuations over the past 6 hours. */ - past6Hours?: TemperatureSummaryPast6Hours; - /** Summary of temperature fluctuations over the past 12 hours. */ - past12Hours?: TemperatureSummaryPast12Hours; - /** Summary of temperature fluctuations over the past 24 hours. */ - past24Hours?: TemperatureSummaryPast24Hours; -} - -/** Summary of temperature fluctuations over the past 6 hours. */ -export interface TemperatureSummaryPast6Hours { - /** minimum */ - minimum?: WeatherUnit; - /** maximum */ - maximum?: WeatherUnit; -} - -/** Summary of temperature fluctuations over the past 12 hours. */ -export interface TemperatureSummaryPast12Hours { - /** minimum */ - minimum?: WeatherUnit; - /** maximum */ - maximum?: WeatherUnit; -} - -/** Summary of temperature fluctuations over the past 24 hours. */ -export interface TemperatureSummaryPast24Hours { - /** minimum */ - minimum?: WeatherUnit; - /** maximum */ - maximum?: WeatherUnit; -} - -export interface DailyForecastResponse { - /** Summary for the main conditions for the requested time period. Notice that summary can cover only part of the time period. */ - summary?: DailyForecastSummary; - /** Forecast data for each requested day. */ - forecasts?: DailyForecast[]; -} - -/** Summary for the main conditions for the requested time period. Notice that summary can cover only part of the time period. */ -export interface DailyForecastSummary { - /** Date and time that the summary is in effect, displayed in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. */ - startDate?: string; - /** Date and time that the summary period ends, displayed in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. */ - endDate?: string; - /** severity */ - severity?: number; - /** Summary phrase of the daily forecast. Displayed in specified language. */ - phrase?: string; - /** one or 2 word(s) to summarize the phrase. */ - category?: string; -} - -export interface DailyForecast { - /** Date and time of the current observation displayed in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. */ - date?: string; - /** Temperature values for the day. */ - temperature?: WeatherUnitRange; - /** RealFeel™ Temperature being returned. */ - realFeelTemperature?: WeatherUnitRange; - /** RealFeel™ Temperature being returned. Describes what the temperature really feels like in the shade. */ - realFeelTemperatureShade?: WeatherUnitRange; - /** Hours of sun. */ - hoursOfSun?: number; - /** Summary of Heating Degree Day or Cooling Degree Day information */ - degreeDaySummary?: DegreeDaySummary; - /** airAndPollen */ - airAndPollen?: AirAndPollen[]; - /** Day */ - day?: DayOrNight; - /** Night */ - night?: DayOrNight; - /** Source(s) of the forecast data. */ - sources?: string[]; -} - -export interface DegreeDaySummary { - /** Number of degrees that the mean temperature is below 65 degrees F/ 18 degree C. */ - heating?: WeatherUnit; - /** Number of degrees that the mean temperature is above 65 degrees F/ 18 degree C. */ - cooling?: WeatherUnit; -} - -export interface AirAndPollen { - /** Name of the pollen or pollutant. For example, grass, mold, weed, air quality, tree and UV index. */ - name?: string; - /** Value of the given type above. Values associated with mold, grass, weed and tree are in units of parts per cubic meter. Both air quality and UV are indices, so they are unitless. */ - value?: number; - /** Category of the air quality or pollution type. For example, low, high, good, moderate, unhealthy, hazardous. */ - category?: string; - /** Value associated with the air quality or pollution category. These values range from 1 to 6. 1 implying good conditions, 6 implying hazardous conditions. */ - categoryValue?: number; - /** Only exists for air quality. Examples include ozone and particle pollution. */ - type?: string; -} - -export interface DayOrNight { - /** Numeric value representing an image that displays the `iconPhrase`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ - iconCode?: number; - /** Phrase description of the icon. Displayed in specified language. For example, 'Sunny'. */ - iconPhrase?: string; - /** Local weather data provider information. */ - localSource?: LocalSource; - /** Indicates the presence or absence of precipitation. True indicates the presence of precipitation, false indicates the absence of precipitation. */ - hasPrecipitation?: boolean; - /** Specifies the type of precipitation ("rain" "snow" "ice" or "mix"). If dbz = zero, precipitationType is not present in the response. */ - precipitationType?: string; - /** Description of the intensity. */ - precipitationIntensity?: string; - /** Phrase description of the forecast in specified language. Azure Maps attempts to keep this phrase under 30 characters in length, but some languages/weather events may result in a longer phrase length, exceeding 30 characters. */ - shortPhrase?: string; - /** Phrase description of the forecast in specified language. Azure Maps attempts to keep this phrase under 100 characters in length, but some languages/weather events may result in a longer phrase length, exceeding 100 characters. */ - longPhrase?: string; - /** Percent representing the probability of precipitation. For example, '20'. */ - precipitationProbability?: number; - /** Percent representing the probability of a thunderstorm. For example, '80'. */ - thunderstormProbability?: number; - /** Percent representing the probability of rain. For example, '40'. */ - rainProbability?: number; - /** Percent representing the probability of snow. For example, '30'. */ - snowProbability?: number; - /** Percent representing the probability of ice. For example, '30'. */ - iceProbability?: number; - /** Wind details being returned including speed and direction. */ - wind?: WindDetails; - /** Wind gust. Wind gust is a sudden, brief increase in speed of the wind. */ - windGust?: WindDetails; - /** Total liquid equivalent of precipitation during the forecast period. */ - totalLiquid?: WeatherUnit; - /** Rain */ - rain?: WeatherUnit; - /** Snow */ - snow?: WeatherUnit; - /** Ice */ - ice?: WeatherUnit; - /** Hours of precipitation */ - hoursOfPrecipitation?: number; - /** Hours of rain. */ - hoursOfRain?: number; - /** Hours of snow. */ - hoursOfSnow?: number; - /** Hours of ice. */ - hoursOfIce?: number; - /** Percent representing cloud cover. */ - cloudCover?: number; -} - -/** Local weather data provider information. */ -export interface LocalSource { - /** Numeric identifier, unique to the local data provider. */ - id?: number; - /** Name of the local data provider. Name is displayed in the language specified by language code in URL, if available. Otherwise, Name is displayed in English or the language in which the name was provided. */ - name?: string; - /** Weather code provided by the local data provider. This weather code allows the forecast to be matched to icons provided by the local data provider instead of Azure Maps icons. */ - weatherCode?: string; -} - -/** This object is returned from a successful Weather Along Route. */ -export interface WeatherAlongRouteResponse { - /** Short summary of the weather along the route. */ - summary?: WeatherAlongRouteSummary; - /** Data for each waypoint returned in the same order as specified in the request. */ - waypoints?: WeatherWaypoint[]; -} - -/** Short summary of the weather along the route. */ -export interface WeatherAlongRouteSummary { - /** Numeric value representing an image that displays the `iconPhrase`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ - iconCode?: number; - /** Description of the weather hazard affecting the trip. */ - hazards?: WeatherHazards; -} - -/** Description of the weather hazard affecting the trip. */ -export interface WeatherHazards { - /** - * A severity/hazard index. - * * `0` - No hazard. - * * `1` - Be informed, be aware. - * * `2` - Pay attention, be prepared. - * * `3` - Take action. - * * `4` - Life threatening, emergency. - */ - maxHazardIndex?: number; - /** Details of the weather hazards affecting the trip. */ - hazardDetails?: HazardDetail[]; -} - -export interface HazardDetail { - /** - * A severity/hazard index. - * * `0` - No hazard. - * * `1` - Be informed, be aware. - * * `2` - Pay attention, be prepared. - * * `3` - Take action. - * * `4` - Life threatening, emergency. - */ - hazardIndex?: number; - /** A unique identifier (non-displayable) for each type of hazard: LightRain, ModerateRain, HeavyRain, LightMix, ModerateMix, HeavyMix, LightSnow, ModerateSnow, HeavySnow, LightIce, ModerateIce, HeavyIce, Hail, LargeHail, SunGlare, SunGlareHigh, Lightning, SevereLightning, WindModerate, WindHigh, WindExtreme, FloodWarning, FlashFloodWarning, TornadoWarning, TsunamiWarning, SevereThunderstormWarning. */ - hazardCode?: string; - /** A displayable short phrase describing the forecasted conditions and precipitation intensity/type. */ - shortPhrase?: string; -} - -export interface WeatherWaypoint { - /** Numeric value representing an image that displays the `iconPhrase`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details. */ - iconCode?: number; - /** A displayable short phrase describing the forecasted conditions and precipitation intensity/type. */ - shortPhrase?: string; - /** Indicates the time of the day. True indicates 'day',', false indicates 'night. */ - isDayTime?: boolean; - /** Percent representing cloud cover. */ - cloudCover?: number; - /** Specific value of a given unit related to weather. */ - temperature?: WeatherUnit; - /** Wind details being returned including speed and direction. */ - wind?: WindDetails; - /** Wind details being returned including speed and direction. */ - windGust?: WindDetails; - /** Precipitation forecast of the weather along the route. */ - precipitation?: WeatherAlongRoutePrecipitation; - /** Estimation of thunderstorm intensity on an open scale. A value of 0 means there is no thunderstorm; values of 1 and higher mean there is a thunderstorm in increasing intensity. */ - lightningCount?: number; - /** A rating that indicates how blinding the sun is for the driver. */ - sunGlare?: SunGlare; - /** Description of the weather hazard affecting the trip. */ - hazards?: WeatherHazards; - /** List of weather hazard notifications. */ - notifications?: WeatherNotification[]; -} - -/** Precipitation forecast of the weather along the route. */ -export interface WeatherAlongRoutePrecipitation { - /** The forecasted precipitation intensity in dBZ (decibels relative to Z) from 0.0 to 100.0. */ - dbz?: number; - /** Precipitation type. If precipitation should occur, the type that it will be: "RAIN," "HAIL," "SNOW," "ICE," or "MIX." */ - type?: string; -} - -/** A rating that indicates how blinding the sun is for the driver. */ -export interface SunGlare { - /** If the vehicle heading value is not provided for a waypoint, then the service will calculate a heading based upon the location of neighboring waypoints if provided. */ - calculatedVehicleHeading?: number; - /** An index from 0 to 100 indicating sun glare intensity for a driver. A value of 50 and above can be considered a hazard for some drivers and a value of 100 signifies the driver is driving straight into the sun and atmospheric conditions are clear allowing for the full intensity of the sun to blind the driver. */ - glareIndex?: number; -} - -export interface WeatherNotification { - /** A type of notification generated to warn drivers of the onset of a hazard, or increase in intensity of a hazard. */ - type?: string; - /** - * A severity/hazard index. - * * `0` - No hazard. - * * `1` - Be informed, be aware. - * * `2` - Pay attention, be prepared. - * * `3` - Take action. - * * `4` - Life threatening, emergency. - */ - hazardIndex?: number; - /** A unique identifier (non-displayable) for each type of hazard: LightRain, ModerateRain, HeavyRain, LightMix, ModerateMix, HeavyMix, LightSnow, ModerateSnow, HeavySnow, LightIce, ModerateIce, HeavyIce, Hail, LargeHail, SunGlare, SunGlareHigh, Lightning, SevereLightning, WindModerate, WindHigh, WindExtreme, FloodWarning, FlashFloodWarning, TornadoWarning, TsunamiWarning, SevereThunderstormWarning. */ - hazardCode?: string; - /** A displayable short phrase describing the forecasted conditions and precipitation intensity/type. */ - shortPhrase?: string; -} - -/** This object is returned from a successful Get Severe Weather Alerts call. */ -export interface SevereWeatherAlertsResponse { - /** A list of all severe weather alerts for the queried location. */ - results?: SevereWeatherAlert[]; -} - -/** Information about a severe weather alert. */ -export interface SevereWeatherAlert { - /** 2-character ISO 3166-1 Alpha-2 country code, for example, "US". */ - countryCode?: string; - /** A unique numerical identifier for a weather alert. */ - alertId?: number; - /** Description of the alert. */ - description?: SevereWeatherAlertDescription; - /** Category of the alert. */ - category?: string; - /** Number signifying the importance or ranking order of the given alert within the country/region it has originated. A lower number signifies a higher priority. For example, 1 is the highest priority. The number varies by country/region and can change over time as each country/region evolves their alert systems. */ - priority?: number; - /** Classification of the alert. This field is not available for all countries and therefore not always returned. */ - class?: string; - /** Severity level of the alert. This field is not available for all countries and therefore not always returned. */ - level?: string; - /** The provider of the alert information. By default the source is returned in English (en-US). The alerts are from official Government Meteorological Agencies and leading global weather alert providers. */ - source?: string; - /** A numerical identifier associated with the source provider name of the alert data. */ - sourceId?: number; - /** A disclaimer regarding the source of the alert information. This field is not always available. For example, disclaimer may include details about the delays or potential issues related to the alarm. */ - disclaimer?: string; - /** Information about the alert specific to the affected area(s). */ - alertAreas?: AlertArea[]; -} - -/** Description of a severe weather alert. */ -export interface SevereWeatherAlertDescription { - /** Description of the alert in the specified language. By default English (en-US) is returned if the language parameter is not specified in the request. */ - localized?: string; - /** Description of the alert in English (en-US). */ - english?: string; -} - -/** Information about a severe weather alert issued within an affected area(s). If multiple alerts are active for the same location, the alerts will be returned in order of `priority` within the API response, with the highest priority alert being returned at the top of the response. */ -export interface AlertArea { - /** The name of an area which is affected by the alert. The location that was requested falls under the alert area. */ - name?: string; - /** Text summarizing the alert in the returned area. */ - summary?: string; - /** The start date and time of the alert in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. If the alert crosses multiple time zones the returned time in the response is the local time to the requested coordinate location. */ - startTime?: string; - /** The end date and time of the alert in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. If the alert crosses multiple time zones the returned time in the response is the local time to the requested coordinate location. */ - endTime?: string; - /** The latest status of the alert in the current area. */ - latestStatus?: LatestStatus; - /** Full details associated with the alert. Returned if `details`=True. This field is always returned in the language(s) of choice by the issuing provider and Azure Maps only returns what is created by the provider. Please note, some countries/regions may offer their native language and English. Language parameter won’t apply to this field. */ - alertDetails?: string; - /** Language of the `alertDetails`. This field helps to point out that the language of the `alertDetails` may differ from the requested language parameter. Returned if `details`=True. Language code has been derived from the ISO 639-1 Alpha-2 codes. */ - alertDetailsLanguageCode?: string; -} - -/** The latest status on the alert in the current area. */ -export interface LatestStatus { - /** The latest status keyword for the alert, in the specified language. By default, returned in English (en-US). */ - localized?: string; - /** Latest status keyword for the alert, in English (en-US). */ - english?: LatestStatusKeyword; -} - -/** This object is returned from a successful Get Daily Indices call. */ -export interface DailyIndicesResponse { - /** A list of all daily indices for the queried location. */ - results?: DailyIndex[]; -} - -/** Information about a daily index. */ -export interface DailyIndex { - /** Name of the index, for example, "Construction", "Outdoor Activity", "Flight Delays". */ - indexName?: string; - /** Numeric ID used to identify the specific index. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details and to see the supported index IDs. For example, the index ID can support UI visualization scenarios. */ - indexId?: number; - /** Date and time of the current observation displayed in ISO 8601 format, for example, 2019-10-27T19:39:57-08:00. */ - dateTime?: string; - /** Index value. Ranges from 0.0 to 10.0. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details and to see the supported ranges. */ - value?: number; - /** Textual description for `categoryValue` corresponding to the level that the index value falls under, for example "Very Good". */ - category?: string; - /** Level that the index value falls under, represented by an integer. This value can be 1 through 5 and should be used in combination with the `ascending` flag because it can differ among indices. For example, the following values apply for Mosquito Activity: Low=1, Moderate=2, High=3, Very High=4, and Extreme=5. */ - categoryValue?: number; - /** Describes the direction of the `value` and `categoryValue`. For example, when `ascending`=True, the poorest index value is 0 and the best index value is 10. When `ascending`=True, the poorest index value is 10 and the best index value is 0. */ - ascending?: boolean; - /** A textual explanation that can be used for display purposes to summarize the index value and category. For example, when the index value for Flight Delays is very good, the description will be "Conditions are excellent for flying!". */ - description?: string; -} - -/** Known values of {@link Geography} that the service accepts. */ -export const enum KnownGeography { - Us = "us", - Eu = "eu" -} - -/** - * Defines values for Geography. \ - * {@link KnownGeography} can be used interchangeably with Geography, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **us** \ - * **eu** - */ -export type Geography = string; - -/** Known values of {@link ResponseFormat} that the service accepts. */ -export const enum KnownResponseFormat { - /** [The JavaScript Object Notation Data Interchange Format](https://tools.ietf.org/html/rfc8259) */ - Json = "json" -} - -/** - * Defines values for ResponseFormat. \ - * {@link KnownResponseFormat} can be used interchangeably with ResponseFormat, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **json**: [The JavaScript Object Notation Data Interchange Format](https:\/\/tools.ietf.org\/html\/rfc8259) - */ -export type ResponseFormat = string; - -/** Known values of {@link WeatherDataUnit} that the service accepts. */ -export const enum KnownWeatherDataUnit { - /** Return data in metric units. Some example units of metric system are Celsius and kilometer. */ - Metric = "metric", - /** Return data in imperial units. Some example units of imperial system are Fahrenheit and mile. */ - Imperial = "imperial" -} - -/** - * Defines values for WeatherDataUnit. \ - * {@link KnownWeatherDataUnit} can be used interchangeably with WeatherDataUnit, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **metric**: Return data in metric units. Some example units of metric system are Celsius and kilometer. \ - * **imperial**: Return data in imperial units. Some example units of imperial system are Fahrenheit and mile. - */ -export type WeatherDataUnit = string; - -/** Known values of {@link DayQuarter} that the service accepts. */ -export const enum KnownDayQuarter { - /** 7:00 am - 1:00 pm / 7:00- 13:00 */ - Zero = 0, - /** 1:00 pm - 7:00 pm/ 13:00- 19:00 */ - One = 1, - /** 7:00 pm - 1:00 am/ 19:00 - 01:00 */ - Two = 2, - /** 1:00 am - 7:00 am/ 01:00 - 07:00 */ - Three = 3 -} - -/** - * Defines values for DayQuarter. \ - * {@link KnownDayQuarter} can be used interchangeably with DayQuarter, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **0**: 7:00 am - 1:00 pm \/ 7:00- 13:00 \ - * **1**: 1:00 pm - 7:00 pm\/ 13:00- 19:00 \ - * **2**: 7:00 pm - 1:00 am\/ 19:00 - 01:00 \ - * **3**: 1:00 am - 7:00 am\/ 01:00 - 07:00 - */ -export type DayQuarter = number; - -/** Known values of {@link LatestStatusKeyword} that the service accepts. */ -export const enum KnownLatestStatusKeyword { - /** "New" - the status of an alert upon initial issuance. */ - New = "New", - /** "Extend" - the alert has been extended in time, in area, or both since its initial issuance. */ - Extend = "Extend", - /** "Cancel" - the alert has been canceled prior to its original expiration time. */ - Cancel = "Cancel", - /** "Correct" - the alert has been modified to correct a previous error. */ - Correct = "Correct", - /** "Expire" - the alert has expired and is no longer active. */ - Expire = "Expire", - /** "Upgrade" - the alert has been upgraded to a higher class or category since its initial issuance. */ - Upgrade = "Upgrade", - /** "Continue" - the alert has been updated since its initial issuance, but no changes were made to `alertAreas`, `startTime`, `endTime`, or `class`. */ - Continue = "Continue", - /** "Update" - the alert has been updated since its initial issuance. */ - Update = "Update" -} - -/** - * Defines values for LatestStatusKeyword. \ - * {@link KnownLatestStatusKeyword} can be used interchangeably with LatestStatusKeyword, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **New**: "New" - the status of an alert upon initial issuance. \ - * **Extend**: "Extend" - the alert has been extended in time, in area, or both since its initial issuance. \ - * **Cancel**: "Cancel" - the alert has been canceled prior to its original expiration time. \ - * **Correct**: "Correct" - the alert has been modified to correct a previous error. \ - * **Expire**: "Expire" - the alert has expired and is no longer active. \ - * **Upgrade**: "Upgrade" - the alert has been upgraded to a higher class or category since its initial issuance. \ - * **Continue**: "Continue" - the alert has been updated since its initial issuance, but no changes were made to `alertAreas`, `startTime`, `endTime`, or `class`. \ - * **Update**: "Update" - the alert has been updated since its initial issuance. - */ -export type LatestStatusKeyword = string; - -/** Known values of {@link GeographicResourceLocation} that the service accepts. */ -export const enum KnownGeographicResourceLocation { - /** Used to access an Azure Maps Creator resource in the United States */ - Us = "us", - /** Used to access an Azure Maps Creator resource in Europe */ - Eu = "eu" -} - -/** - * Defines values for GeographicResourceLocation. \ - * {@link KnownGeographicResourceLocation} can be used interchangeably with GeographicResourceLocation, - * this enum contains the known values that the service supports. - * ### Known values supported by the service - * **us**: Used to access an Azure Maps Creator resource in the United States \ - * **eu**: Used to access an Azure Maps Creator resource in Europe - */ -export type GeographicResourceLocation = string; - -/** Optional parameters. */ -export interface WeatherGetHourlyForecastOptionalParams - extends coreClient.OperationOptions { - /** Specifies to return the data in either metric units or imperial units. Default value is metric. */ - unit?: WeatherDataUnit; - /** - * Time frame of the returned weather forecast. By default, the forecast data for next hour will be returned. Available values are - * * `1` - Return forecast data for the next hour. Default value. - * * `12` - Return hourly forecast for next 12 hours. - * * `24` - Return hourly forecast for next 24 hours. - * * `72` - Return hourly forecast for next 72 hours (3 days). - * * `120` - Return hourly forecast for next 120 hours (5 days). Only available in S1 SKU. - * * `240` - Return hourly forecast for next 240 hours (10 days). Only available in S1 SKU. - */ - duration?: number; - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. Default value is en-us. - * - * Please refer to [Supported languages](https://docs.microsoft.com/azure/azure-maps/supported-languages) for details. - */ - language?: string; -} - -/** Contains response data for the getHourlyForecast operation. */ -export type WeatherGetHourlyForecastResponse = HourlyForecastResponse; - -/** Optional parameters. */ -export interface WeatherGetMinuteForecastOptionalParams - extends coreClient.OperationOptions { - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. Default value is en-us. - * - * Please refer to [Supported languages](https://docs.microsoft.com/azure/azure-maps/supported-languages) for details. - */ - language?: string; - /** - * Specifies time interval in minutes for the returned weather forecast. Supported values are - * * `1` - Retrieve forecast for 1-minute intervals. Returned by default. - * * `5` - Retrieve forecasts for 5-minute intervals. - * * `15` - Retrieve forecasts for 15-minute intervals. - */ - interval?: number; -} - -/** Contains response data for the getMinuteForecast operation. */ -export type WeatherGetMinuteForecastResponse = MinuteForecastResponse; - -/** Optional parameters. */ -export interface WeatherGetQuarterDayForecastOptionalParams - extends coreClient.OperationOptions { - /** Specifies to return the data in either metric units or imperial units. Default value is metric. */ - unit?: WeatherDataUnit; - /** - * Specifies for how many days the quester-day forecast responses are returned. Supported values are: - * * `1` - Return forecast data for the next day. Returned by default. - * * `5` - Return forecast data for the next 5 days. - * * `10` - Return forecast data for next 10 days. - * * `15` - Return forecast data for the next 15 days. - */ - duration?: number; - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. Default value is en-us. - * - * Please refer to [Supported languages](https://docs.microsoft.com/azure/azure-maps/supported-languages) for details. - */ - language?: string; -} - -/** Contains response data for the getQuarterDayForecast operation. */ -export type WeatherGetQuarterDayForecastResponse = QuarterDayForecastResponse; - -/** Optional parameters. */ -export interface WeatherGetCurrentConditionsOptionalParams - extends coreClient.OperationOptions { - /** Specifies to return the data in either metric units or imperial units. Default value is metric. */ - unit?: WeatherDataUnit; - /** - * Time frame of the returned weather conditions. By default, the most current weather conditions will be returned. Default value is 0. Supported values are: - * * `0` - Return the most current weather conditions. - * * `6` - Return weather conditions from past 6 hours. - * * `24` - Return weather conditions from past 24 hours. - */ - duration?: number; - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. Default value is en-us. - * - * Please refer to [Supported languages](https://docs.microsoft.com/azure/azure-maps/supported-languages) for details. - */ - language?: string; - /** - * Return full details for the current conditions. Available values are - * * `true` - Returns full details. By default all details are returned. - * * `false` - Returns a truncated version of the current condition data, which includes observation date time, weather phrase, icon code, precipitation indicator flag, and temperature. - */ - details?: string; -} - -/** Contains response data for the getCurrentConditions operation. */ -export type WeatherGetCurrentConditionsResponse = CurrentConditionsResponse; - -/** Optional parameters. */ -export interface WeatherGetDailyForecastOptionalParams - extends coreClient.OperationOptions { - /** Specifies to return the data in either metric units or imperial units. Default value is metric. */ - unit?: WeatherDataUnit; - /** - * Specifies for how many days the daily forecast responses are returned. Available values are - * * `1` - Return forecast data for the next day. Returned by default. - * * `5` - Return forecast data for the next 5 days. - * * `10` - Return forecast data for the next 10 days. - * * `25` - Return forecast data for the next 25 days. Only available in S1 SKU. - * * `45` - Return forecast data for the next 45 days. Only available in S1 SKU. - */ - duration?: number; - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. Default value is en-us. - * - * Please refer to [Supported languages](https://docs.microsoft.com/azure/azure-maps/supported-languages) for details. - */ - language?: string; -} - -/** Contains response data for the getDailyForecast operation. */ -export type WeatherGetDailyForecastResponse = DailyForecastResponse; - -/** Optional parameters. */ -export interface WeatherGetWeatherAlongRouteOptionalParams - extends coreClient.OperationOptions { - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. Default value is en-us. - * - * Please refer to [Supported languages](https://docs.microsoft.com/azure/azure-maps/supported-languages) for details. - */ - language?: string; -} - -/** Contains response data for the getWeatherAlongRoute operation. */ -export type WeatherGetWeatherAlongRouteResponse = WeatherAlongRouteResponse; - -/** Optional parameters. */ -export interface WeatherGetSevereWeatherAlertsOptionalParams - extends coreClient.OperationOptions { - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. Default value is en-us. - * - * Please refer to [Supported languages](https://docs.microsoft.com/azure/azure-maps/supported-languages) for details. - */ - language?: string; - /** - * Return full details for the severe weather alerts. Available values are - * * `true` - Returns full details. By default all details are returned. - * * `false` - Returns a truncated version of the alerts data, which excludes the area-specific full description of alert details (`alertDetails`). - */ - details?: string; -} - -/** Contains response data for the getSevereWeatherAlerts operation. */ -export type WeatherGetSevereWeatherAlertsResponse = SevereWeatherAlertsResponse; - -/** Optional parameters. */ -export interface WeatherGetDailyIndicesOptionalParams - extends coreClient.OperationOptions { - /** - * Specifies for how many days the daily indices are returned. By default, the indices data for the current day will be returned. When requesting future indices data, the current day is included in the response as day 1. Available values are - * * `1` - Return daily index data for the current day. Default value. - * * `5` - Return 5 days of daily index data starting from the current day. - * * `10` - Return 10 days of daily index data starting from the current day. - * * `15` - Return 15 days of daily index data starting from the current day. - */ - duration?: number; - /** - * Language in which search results should be returned. Should be one of supported IETF language tags, case insensitive. When data in specified language is not available for a specific field, default language is used. Default value is en-us. - * - * Please refer to [Supported languages](https://docs.microsoft.com/azure/azure-maps/supported-languages) for details. - */ - language?: string; - /** Numeric index identifier that can be used for restricting returned results to the corresponding index type. Cannot be paired with `indexGroupId`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details and to see the supported indices. */ - indexId?: number; - /** Numeric index group identifier that can be used for restricting returned results to the corresponding subset of indices (index group). Cannot be paired with `indexId`. Please refer to [Weather Service Concepts](https://aka.ms/AzureMapsWeatherConcepts) for details and to see the supported index groups. */ - indexGroupId?: number; -} - -/** Contains response data for the getDailyIndices operation. */ -export type WeatherGetDailyIndicesResponse = DailyIndicesResponse; - -/** Optional parameters. */ -export interface WeatherClientOptionalParams - extends coreClient.ServiceClientOptions { - /** This parameter specifies where the Azure Maps Creator resource is located. Valid values are us and eu. */ - geography?: Geography; - /** Specifies which account is intended for usage in conjunction with the Azure AD security model. It represents a unique ID for the Azure Maps account and can be retrieved from the Azure Maps management plane Account API. To use Azure AD security in Azure Maps see the following [articles](https://aka.ms/amauthdetails) for guidance. */ - xMsClientId?: string; - /** Api Version */ - apiVersion?: string; - /** Overrides client endpoint. */ - endpoint?: string; -} diff --git a/sdk/maps/maps-weather/src/models/mappers.ts b/sdk/maps/maps-weather/src/models/mappers.ts deleted file mode 100644 index 91d890d2e846..000000000000 --- a/sdk/maps/maps-weather/src/models/mappers.ts +++ /dev/null @@ -1,2159 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; - -export const HourlyForecastResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "HourlyForecastResponse", - modelProperties: { - forecasts: { - serializedName: "forecasts", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "HourlyForecast" - } - } - } - } - } - } -}; - -export const HourlyForecast: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "HourlyForecast", - modelProperties: { - date: { - serializedName: "date", - type: { - name: "String" - } - }, - iconCode: { - serializedName: "iconCode", - type: { - name: "Number" - } - }, - iconPhrase: { - serializedName: "iconPhrase", - type: { - name: "String" - } - }, - hasPrecipitation: { - serializedName: "hasPrecipitation", - type: { - name: "Boolean" - } - }, - isDaylight: { - serializedName: "isDaylight", - type: { - name: "Boolean" - } - }, - temperature: { - serializedName: "temperature", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - realFeelTemperature: { - serializedName: "realFeelTemperature", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - wetBulbTemperature: { - serializedName: "wetBulbTemperature", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - dewPoint: { - serializedName: "dewPoint", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - wind: { - serializedName: "wind", - type: { - name: "Composite", - className: "WindDetails" - } - }, - windGust: { - serializedName: "windGust", - type: { - name: "Composite", - className: "WindDetails" - } - }, - relativeHumidity: { - serializedName: "relativeHumidity", - type: { - name: "Number" - } - }, - visibility: { - serializedName: "visibility", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - ceiling: { - serializedName: "ceiling", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - uvIndex: { - serializedName: "uvIndex", - type: { - name: "Number" - } - }, - uvIndexPhrase: { - serializedName: "uvIndexPhrase", - type: { - name: "String" - } - }, - precipitationProbability: { - serializedName: "precipitationProbability", - type: { - name: "Number" - } - }, - rainProbability: { - serializedName: "rainProbability", - type: { - name: "Number" - } - }, - snowProbability: { - serializedName: "snowProbability", - type: { - name: "Number" - } - }, - iceProbability: { - serializedName: "iceProbability", - type: { - name: "Number" - } - }, - totalLiquid: { - serializedName: "totalLiquid", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - rain: { - serializedName: "rain", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - snow: { - serializedName: "snow", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - ice: { - serializedName: "ice", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - cloudCover: { - serializedName: "cloudCover", - type: { - name: "Number" - } - } - } - } -}; - -export const WeatherUnit: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "WeatherUnit", - modelProperties: { - value: { - serializedName: "value", - type: { - name: "Number" - } - }, - unit: { - serializedName: "unit", - type: { - name: "String" - } - }, - unitType: { - serializedName: "unitType", - type: { - name: "Number" - } - } - } - } -}; - -export const WindDetails: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "WindDetails", - modelProperties: { - direction: { - serializedName: "direction", - type: { - name: "Composite", - className: "WindDirection" - } - }, - speed: { - serializedName: "speed", - type: { - name: "Composite", - className: "WindSpeed" - } - } - } - } -}; - -export const WindDirection: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "WindDirection", - modelProperties: { - degrees: { - serializedName: "degrees", - type: { - name: "Number" - } - }, - localizedDescription: { - serializedName: "localizedDescription", - type: { - name: "String" - } - } - } - } -}; - -export const WindSpeed: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "WindSpeed", - modelProperties: { - value: { - serializedName: "value", - type: { - name: "Number" - } - }, - unit: { - serializedName: "unit", - type: { - name: "String" - } - }, - unitType: { - serializedName: "unitType", - type: { - name: "Number" - } - } - } - } -}; - -export const ErrorResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorResponse", - modelProperties: { - error: { - serializedName: "error", - type: { - name: "Composite", - className: "ErrorDetail" - } - } - } - } -}; - -export const ErrorDetail: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorDetail", - modelProperties: { - code: { - serializedName: "code", - readOnly: true, - type: { - name: "String" - } - }, - message: { - serializedName: "message", - readOnly: true, - type: { - name: "String" - } - }, - target: { - serializedName: "target", - readOnly: true, - type: { - name: "String" - } - }, - details: { - serializedName: "details", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ErrorDetail" - } - } - } - }, - additionalInfo: { - serializedName: "additionalInfo", - readOnly: true, - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ErrorAdditionalInfo" - } - } - } - } - } - } -}; - -export const ErrorAdditionalInfo: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ErrorAdditionalInfo", - modelProperties: { - type: { - serializedName: "type", - readOnly: true, - type: { - name: "String" - } - }, - info: { - serializedName: "info", - readOnly: true, - type: { - name: "Dictionary", - value: { type: { name: "any" } } - } - } - } - } -}; - -export const MinuteForecastResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "MinuteForecastResponse", - modelProperties: { - summary: { - serializedName: "summary", - type: { - name: "Composite", - className: "MinuteForecastSummary" - } - }, - intervalSummaries: { - serializedName: "intervalSummaries", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "IntervalSummary" - } - } - } - }, - intervals: { - serializedName: "intervals", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "ForecastInterval" - } - } - } - } - } - } -}; - -export const MinuteForecastSummary: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "MinuteForecastSummary", - modelProperties: { - briefPhrase60: { - serializedName: "briefPhrase60", - type: { - name: "String" - } - }, - shortPhrase: { - serializedName: "shortPhrase", - type: { - name: "String" - } - }, - briefPhrase: { - serializedName: "briefPhrase", - type: { - name: "String" - } - }, - longPhrase: { - serializedName: "longPhrase", - type: { - name: "String" - } - }, - iconCode: { - serializedName: "iconCode", - type: { - name: "Number" - } - } - } - } -}; - -export const IntervalSummary: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "IntervalSummary", - modelProperties: { - startMinute: { - serializedName: "startMinute", - type: { - name: "Number" - } - }, - endMinute: { - serializedName: "endMinute", - type: { - name: "Number" - } - }, - totalMinutes: { - serializedName: "totalMinutes", - type: { - name: "Number" - } - }, - shortPhrase: { - serializedName: "shortPhrase", - type: { - name: "String" - } - }, - briefPhrase: { - serializedName: "briefPhrase", - type: { - name: "String" - } - }, - longPhrase: { - serializedName: "longPhrase", - type: { - name: "String" - } - }, - iconCode: { - serializedName: "iconCode", - type: { - name: "Number" - } - } - } - } -}; - -export const ForecastInterval: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ForecastInterval", - modelProperties: { - startTime: { - serializedName: "startTime", - type: { - name: "String" - } - }, - minute: { - serializedName: "minute", - type: { - name: "Number" - } - }, - dbz: { - serializedName: "dbz", - type: { - name: "Number" - } - }, - shortPhrase: { - serializedName: "shortPhrase", - type: { - name: "String" - } - }, - threshold: { - serializedName: "threshold", - type: { - name: "String" - } - }, - color: { - serializedName: "color", - type: { - name: "Composite", - className: "ColorValue" - } - }, - simplifiedColor: { - serializedName: "simplifiedColor", - type: { - name: "Composite", - className: "ColorValue" - } - }, - precipitationType: { - serializedName: "precipitationType", - type: { - name: "String" - } - }, - iconCode: { - serializedName: "iconCode", - type: { - name: "Number" - } - }, - cloudCover: { - serializedName: "cloudCover", - type: { - name: "Number" - } - } - } - } -}; - -export const ColorValue: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "ColorValue", - modelProperties: { - red: { - serializedName: "red", - type: { - name: "Number" - } - }, - green: { - serializedName: "green", - type: { - name: "Number" - } - }, - blue: { - serializedName: "blue", - type: { - name: "Number" - } - }, - hex: { - serializedName: "hex", - type: { - name: "String" - } - } - } - } -}; - -export const QuarterDayForecastResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "QuarterDayForecastResponse", - modelProperties: { - forecasts: { - serializedName: "forecasts", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "QuarterDayForecast" - } - } - } - } - } - } -}; - -export const QuarterDayForecast: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "QuarterDayForecast", - modelProperties: { - date: { - serializedName: "date", - type: { - name: "String" - } - }, - effectiveDate: { - serializedName: "effectiveDate", - type: { - name: "String" - } - }, - quarter: { - serializedName: "quarter", - type: { - name: "Number" - } - }, - iconCode: { - serializedName: "iconCode", - type: { - name: "Number" - } - }, - iconPhrase: { - serializedName: "iconPhrase", - type: { - name: "String" - } - }, - phrase: { - serializedName: "phrase", - type: { - name: "String" - } - }, - temperature: { - serializedName: "temperature", - type: { - name: "Composite", - className: "WeatherUnitRange" - } - }, - realFeelTemperature: { - serializedName: "realFeelTemperature", - type: { - name: "Composite", - className: "WeatherUnitRange" - } - }, - dewPoint: { - serializedName: "dewPoint", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - relativeHumidity: { - serializedName: "relativeHumidity", - type: { - name: "Number" - } - }, - wind: { - serializedName: "wind", - type: { - name: "Composite", - className: "WindDetails" - } - }, - windGust: { - serializedName: "windGust", - type: { - name: "Composite", - className: "WindDetails" - } - }, - visibility: { - serializedName: "visibility", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - cloudCover: { - serializedName: "cloudCover", - type: { - name: "Number" - } - }, - hasPrecipitation: { - serializedName: "hasPrecipitation", - type: { - name: "Boolean" - } - }, - precipitationType: { - serializedName: "precipitationType", - type: { - name: "String" - } - }, - precipitationIntensity: { - serializedName: "precipitationIntensity", - type: { - name: "String" - } - }, - precipitationProbability: { - serializedName: "precipitationProbability", - type: { - name: "Number" - } - }, - thunderstormProbability: { - serializedName: "thunderstormProbability", - type: { - name: "Number" - } - }, - totalLiquid: { - serializedName: "totalLiquid", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - rain: { - serializedName: "rain", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - snow: { - serializedName: "snow", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - ice: { - serializedName: "ice", - type: { - name: "Composite", - className: "WeatherUnit" - } - } - } - } -}; - -export const WeatherUnitRange: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "WeatherUnitRange", - modelProperties: { - minimum: { - serializedName: "minimum", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - maximum: { - serializedName: "maximum", - type: { - name: "Composite", - className: "WeatherUnit" - } - } - } - } -}; - -export const CurrentConditionsResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "CurrentConditionsResponse", - modelProperties: { - results: { - serializedName: "results", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "CurrentConditions" - } - } - } - } - } - } -}; - -export const CurrentConditions: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "CurrentConditions", - modelProperties: { - dateTime: { - serializedName: "dateTime", - type: { - name: "String" - } - }, - phrase: { - serializedName: "phrase", - type: { - name: "String" - } - }, - iconCode: { - serializedName: "iconCode", - type: { - name: "Number" - } - }, - hasPrecipitation: { - serializedName: "hasPrecipitation", - type: { - name: "Boolean" - } - }, - isDayTime: { - serializedName: "isDayTime", - type: { - name: "Boolean" - } - }, - temperature: { - serializedName: "temperature", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - realFeelTemperature: { - serializedName: "realFeelTemperature", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - realFeelTemperatureShade: { - serializedName: "realFeelTemperatureShade", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - relativeHumidity: { - serializedName: "relativeHumidity", - type: { - name: "Number" - } - }, - dewPoint: { - serializedName: "dewPoint", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - wind: { - serializedName: "wind", - type: { - name: "Composite", - className: "WindDetails" - } - }, - windGust: { - serializedName: "windGust", - type: { - name: "Composite", - className: "WindDetails" - } - }, - uvIndex: { - serializedName: "uvIndex", - type: { - name: "Number" - } - }, - uvIndexPhrase: { - serializedName: "uvIndexPhrase", - type: { - name: "String" - } - }, - visibility: { - serializedName: "visibility", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - obstructionsToVisibility: { - serializedName: "obstructionsToVisibility", - type: { - name: "String" - } - }, - cloudCover: { - serializedName: "cloudCover", - type: { - name: "Number" - } - }, - ceiling: { - serializedName: "ceiling", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - pressure: { - serializedName: "pressure", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - pressureTendency: { - serializedName: "pressureTendency", - type: { - name: "Composite", - className: "PressureTendency" - } - }, - past24HourTemperatureDeparture: { - serializedName: "past24HourTemperatureDeparture", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - apparentTemperature: { - serializedName: "apparentTemperature", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - windChillTemperature: { - serializedName: "windChillTemperature", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - wetBulbTemperature: { - serializedName: "wetBulbTemperature", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - precipitationSummary: { - serializedName: "precipitationSummary", - type: { - name: "Composite", - className: "PrecipitationSummary" - } - }, - temperatureSummary: { - serializedName: "temperatureSummary", - type: { - name: "Composite", - className: "TemperatureSummary" - } - } - } - } -}; - -export const PressureTendency: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "PressureTendency", - modelProperties: { - localizedDescription: { - serializedName: "localizedDescription", - type: { - name: "String" - } - }, - code: { - serializedName: "code", - type: { - name: "String" - } - } - } - } -}; - -export const PrecipitationSummary: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "PrecipitationSummary", - modelProperties: { - pastHour: { - serializedName: "pastHour", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - past3Hours: { - serializedName: "past3Hours", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - past6Hours: { - serializedName: "past6Hours", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - past9Hours: { - serializedName: "past9Hours", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - past12Hours: { - serializedName: "past12Hours", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - past18Hours: { - serializedName: "past18Hours", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - past24Hours: { - serializedName: "past24Hours", - type: { - name: "Composite", - className: "WeatherUnit" - } - } - } - } -}; - -export const TemperatureSummary: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TemperatureSummary", - modelProperties: { - past6Hours: { - serializedName: "past6Hours", - type: { - name: "Composite", - className: "TemperatureSummaryPast6Hours" - } - }, - past12Hours: { - serializedName: "past12Hours", - type: { - name: "Composite", - className: "TemperatureSummaryPast12Hours" - } - }, - past24Hours: { - serializedName: "past24Hours", - type: { - name: "Composite", - className: "TemperatureSummaryPast24Hours" - } - } - } - } -}; - -export const TemperatureSummaryPast6Hours: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TemperatureSummaryPast6Hours", - modelProperties: { - minimum: { - serializedName: "minimum", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - maximum: { - serializedName: "maximum", - type: { - name: "Composite", - className: "WeatherUnit" - } - } - } - } -}; - -export const TemperatureSummaryPast12Hours: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TemperatureSummaryPast12Hours", - modelProperties: { - minimum: { - serializedName: "minimum", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - maximum: { - serializedName: "maximum", - type: { - name: "Composite", - className: "WeatherUnit" - } - } - } - } -}; - -export const TemperatureSummaryPast24Hours: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "TemperatureSummaryPast24Hours", - modelProperties: { - minimum: { - serializedName: "minimum", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - maximum: { - serializedName: "maximum", - type: { - name: "Composite", - className: "WeatherUnit" - } - } - } - } -}; - -export const DailyForecastResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "DailyForecastResponse", - modelProperties: { - summary: { - serializedName: "summary", - type: { - name: "Composite", - className: "DailyForecastSummary" - } - }, - forecasts: { - serializedName: "forecasts", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "DailyForecast" - } - } - } - } - } - } -}; - -export const DailyForecastSummary: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "DailyForecastSummary", - modelProperties: { - startDate: { - serializedName: "startDate", - type: { - name: "String" - } - }, - endDate: { - serializedName: "endDate", - type: { - name: "String" - } - }, - severity: { - serializedName: "severity", - type: { - name: "Number" - } - }, - phrase: { - serializedName: "phrase", - type: { - name: "String" - } - }, - category: { - serializedName: "category", - type: { - name: "String" - } - } - } - } -}; - -export const DailyForecast: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "DailyForecast", - modelProperties: { - date: { - serializedName: "date", - type: { - name: "String" - } - }, - temperature: { - serializedName: "temperature", - type: { - name: "Composite", - className: "WeatherUnitRange" - } - }, - realFeelTemperature: { - serializedName: "realFeelTemperature", - type: { - name: "Composite", - className: "WeatherUnitRange" - } - }, - realFeelTemperatureShade: { - serializedName: "realFeelTemperatureShade", - type: { - name: "Composite", - className: "WeatherUnitRange" - } - }, - hoursOfSun: { - serializedName: "hoursOfSun", - type: { - name: "Number" - } - }, - degreeDaySummary: { - serializedName: "degreeDaySummary", - type: { - name: "Composite", - className: "DegreeDaySummary" - } - }, - airAndPollen: { - serializedName: "airAndPollen", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "AirAndPollen" - } - } - } - }, - day: { - serializedName: "day", - type: { - name: "Composite", - className: "DayOrNight" - } - }, - night: { - serializedName: "night", - type: { - name: "Composite", - className: "DayOrNight" - } - }, - sources: { - serializedName: "sources", - type: { - name: "Sequence", - element: { - type: { - name: "String" - } - } - } - } - } - } -}; - -export const DegreeDaySummary: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "DegreeDaySummary", - modelProperties: { - heating: { - serializedName: "heating", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - cooling: { - serializedName: "cooling", - type: { - name: "Composite", - className: "WeatherUnit" - } - } - } - } -}; - -export const AirAndPollen: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "AirAndPollen", - modelProperties: { - name: { - serializedName: "name", - type: { - name: "String" - } - }, - value: { - serializedName: "value", - type: { - name: "Number" - } - }, - category: { - serializedName: "category", - type: { - name: "String" - } - }, - categoryValue: { - serializedName: "categoryValue", - type: { - name: "Number" - } - }, - type: { - serializedName: "type", - type: { - name: "String" - } - } - } - } -}; - -export const DayOrNight: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "DayOrNight", - modelProperties: { - iconCode: { - serializedName: "iconCode", - type: { - name: "Number" - } - }, - iconPhrase: { - serializedName: "iconPhrase", - type: { - name: "String" - } - }, - localSource: { - serializedName: "localSource", - type: { - name: "Composite", - className: "LocalSource" - } - }, - hasPrecipitation: { - serializedName: "hasPrecipitation", - type: { - name: "Boolean" - } - }, - precipitationType: { - serializedName: "precipitationType", - type: { - name: "String" - } - }, - precipitationIntensity: { - serializedName: "precipitationIntensity", - type: { - name: "String" - } - }, - shortPhrase: { - serializedName: "shortPhrase", - type: { - name: "String" - } - }, - longPhrase: { - serializedName: "longPhrase", - type: { - name: "String" - } - }, - precipitationProbability: { - serializedName: "precipitationProbability", - type: { - name: "Number" - } - }, - thunderstormProbability: { - serializedName: "thunderstormProbability", - type: { - name: "Number" - } - }, - rainProbability: { - serializedName: "rainProbability", - type: { - name: "Number" - } - }, - snowProbability: { - serializedName: "snowProbability", - type: { - name: "Number" - } - }, - iceProbability: { - serializedName: "iceProbability", - type: { - name: "Number" - } - }, - wind: { - serializedName: "wind", - type: { - name: "Composite", - className: "WindDetails" - } - }, - windGust: { - serializedName: "windGust", - type: { - name: "Composite", - className: "WindDetails" - } - }, - totalLiquid: { - serializedName: "totalLiquid", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - rain: { - serializedName: "rain", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - snow: { - serializedName: "snow", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - ice: { - serializedName: "ice", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - hoursOfPrecipitation: { - serializedName: "hoursOfPrecipitation", - type: { - name: "Number" - } - }, - hoursOfRain: { - serializedName: "hoursOfRain", - type: { - name: "Number" - } - }, - hoursOfSnow: { - serializedName: "hoursOfSnow", - type: { - name: "Number" - } - }, - hoursOfIce: { - serializedName: "hoursOfIce", - type: { - name: "Number" - } - }, - cloudCover: { - serializedName: "cloudCover", - type: { - name: "Number" - } - } - } - } -}; - -export const LocalSource: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "LocalSource", - modelProperties: { - id: { - serializedName: "id", - type: { - name: "Number" - } - }, - name: { - serializedName: "name", - type: { - name: "String" - } - }, - weatherCode: { - serializedName: "weatherCode", - type: { - name: "String" - } - } - } - } -}; - -export const WeatherAlongRouteResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "WeatherAlongRouteResponse", - modelProperties: { - summary: { - serializedName: "summary", - type: { - name: "Composite", - className: "WeatherAlongRouteSummary" - } - }, - waypoints: { - serializedName: "waypoints", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "WeatherWaypoint" - } - } - } - } - } - } -}; - -export const WeatherAlongRouteSummary: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "WeatherAlongRouteSummary", - modelProperties: { - iconCode: { - serializedName: "iconCode", - type: { - name: "Number" - } - }, - hazards: { - serializedName: "hazards", - type: { - name: "Composite", - className: "WeatherHazards" - } - } - } - } -}; - -export const WeatherHazards: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "WeatherHazards", - modelProperties: { - maxHazardIndex: { - serializedName: "maxHazardIndex", - type: { - name: "Number" - } - }, - hazardDetails: { - serializedName: "hazardDetails", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "HazardDetail" - } - } - } - } - } - } -}; - -export const HazardDetail: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "HazardDetail", - modelProperties: { - hazardIndex: { - serializedName: "hazardIndex", - type: { - name: "Number" - } - }, - hazardCode: { - serializedName: "hazardCode", - type: { - name: "String" - } - }, - shortPhrase: { - serializedName: "shortPhrase", - type: { - name: "String" - } - } - } - } -}; - -export const WeatherWaypoint: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "WeatherWaypoint", - modelProperties: { - iconCode: { - serializedName: "iconCode", - type: { - name: "Number" - } - }, - shortPhrase: { - serializedName: "shortPhrase", - type: { - name: "String" - } - }, - isDayTime: { - serializedName: "isDayTime", - type: { - name: "Boolean" - } - }, - cloudCover: { - serializedName: "cloudCover", - type: { - name: "Number" - } - }, - temperature: { - serializedName: "temperature", - type: { - name: "Composite", - className: "WeatherUnit" - } - }, - wind: { - serializedName: "wind", - type: { - name: "Composite", - className: "WindDetails" - } - }, - windGust: { - serializedName: "windGust", - type: { - name: "Composite", - className: "WindDetails" - } - }, - precipitation: { - serializedName: "precipitation", - type: { - name: "Composite", - className: "WeatherAlongRoutePrecipitation" - } - }, - lightningCount: { - serializedName: "lightningCount", - type: { - name: "Number" - } - }, - sunGlare: { - serializedName: "sunGlare", - type: { - name: "Composite", - className: "SunGlare" - } - }, - hazards: { - serializedName: "hazards", - type: { - name: "Composite", - className: "WeatherHazards" - } - }, - notifications: { - serializedName: "notifications", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "WeatherNotification" - } - } - } - } - } - } -}; - -export const WeatherAlongRoutePrecipitation: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "WeatherAlongRoutePrecipitation", - modelProperties: { - dbz: { - serializedName: "dbz", - type: { - name: "Number" - } - }, - type: { - serializedName: "type", - type: { - name: "String" - } - } - } - } -}; - -export const SunGlare: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SunGlare", - modelProperties: { - calculatedVehicleHeading: { - serializedName: "calculatedVehicleHeading", - type: { - name: "Number" - } - }, - glareIndex: { - serializedName: "glareIndex", - type: { - name: "Number" - } - } - } - } -}; - -export const WeatherNotification: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "WeatherNotification", - modelProperties: { - type: { - serializedName: "type", - type: { - name: "String" - } - }, - hazardIndex: { - serializedName: "hazardIndex", - type: { - name: "Number" - } - }, - hazardCode: { - serializedName: "hazardCode", - type: { - name: "String" - } - }, - shortPhrase: { - serializedName: "shortPhrase", - type: { - name: "String" - } - } - } - } -}; - -export const SevereWeatherAlertsResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SevereWeatherAlertsResponse", - modelProperties: { - results: { - serializedName: "results", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "SevereWeatherAlert" - } - } - } - } - } - } -}; - -export const SevereWeatherAlert: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SevereWeatherAlert", - modelProperties: { - countryCode: { - serializedName: "countryCode", - type: { - name: "String" - } - }, - alertId: { - serializedName: "alertId", - type: { - name: "Number" - } - }, - description: { - serializedName: "description", - type: { - name: "Composite", - className: "SevereWeatherAlertDescription" - } - }, - category: { - serializedName: "category", - type: { - name: "String" - } - }, - priority: { - serializedName: "priority", - type: { - name: "Number" - } - }, - class: { - serializedName: "class", - type: { - name: "String" - } - }, - level: { - serializedName: "level", - type: { - name: "String" - } - }, - source: { - serializedName: "source", - type: { - name: "String" - } - }, - sourceId: { - serializedName: "sourceId", - type: { - name: "Number" - } - }, - disclaimer: { - serializedName: "disclaimer", - type: { - name: "String" - } - }, - alertAreas: { - serializedName: "alertAreas", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "AlertArea" - } - } - } - } - } - } -}; - -export const SevereWeatherAlertDescription: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "SevereWeatherAlertDescription", - modelProperties: { - localized: { - serializedName: "localized", - type: { - name: "String" - } - }, - english: { - serializedName: "english", - type: { - name: "String" - } - } - } - } -}; - -export const AlertArea: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "AlertArea", - modelProperties: { - name: { - serializedName: "name", - type: { - name: "String" - } - }, - summary: { - serializedName: "summary", - type: { - name: "String" - } - }, - startTime: { - serializedName: "startTime", - type: { - name: "String" - } - }, - endTime: { - serializedName: "endTime", - type: { - name: "String" - } - }, - latestStatus: { - serializedName: "latestStatus", - type: { - name: "Composite", - className: "LatestStatus" - } - }, - alertDetails: { - serializedName: "alertDetails", - type: { - name: "String" - } - }, - alertDetailsLanguageCode: { - serializedName: "alertDetailsLanguageCode", - type: { - name: "String" - } - } - } - } -}; - -export const LatestStatus: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "LatestStatus", - modelProperties: { - localized: { - serializedName: "localized", - type: { - name: "String" - } - }, - english: { - serializedName: "english", - type: { - name: "String" - } - } - } - } -}; - -export const DailyIndicesResponse: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "DailyIndicesResponse", - modelProperties: { - results: { - serializedName: "results", - type: { - name: "Sequence", - element: { - type: { - name: "Composite", - className: "DailyIndex" - } - } - } - } - } - } -}; - -export const DailyIndex: coreClient.CompositeMapper = { - type: { - name: "Composite", - className: "DailyIndex", - modelProperties: { - indexName: { - serializedName: "indexName", - type: { - name: "String" - } - }, - indexId: { - serializedName: "indexId", - type: { - name: "Number" - } - }, - dateTime: { - serializedName: "dateTime", - type: { - name: "String" - } - }, - value: { - serializedName: "value", - type: { - name: "Number" - } - }, - category: { - serializedName: "category", - type: { - name: "String" - } - }, - categoryValue: { - serializedName: "categoryValue", - type: { - name: "Number" - } - }, - ascending: { - serializedName: "ascending", - type: { - name: "Boolean" - } - }, - description: { - serializedName: "description", - type: { - name: "String" - } - } - } - } -}; diff --git a/sdk/maps/maps-weather/src/models/parameters.ts b/sdk/maps/maps-weather/src/models/parameters.ts deleted file mode 100644 index 7ae047ef5c53..000000000000 --- a/sdk/maps/maps-weather/src/models/parameters.ts +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { - OperationParameter, - OperationURLParameter, - OperationQueryParameter -} from "@azure/core-client"; - -export const accept: OperationParameter = { - parameterPath: "accept", - mapper: { - defaultValue: "application/json", - isConstant: true, - serializedName: "Accept", - type: { - name: "String" - } - } -}; - -export const geography: OperationURLParameter = { - parameterPath: "geography", - mapper: { - serializedName: "geography", - required: true, - type: { - name: "String" - } - } -}; - -export const xMsClientId: OperationParameter = { - parameterPath: "xMsClientId", - mapper: { - serializedName: "x-ms-client-id", - type: { - name: "String" - } - } -}; - -export const apiVersion: OperationQueryParameter = { - parameterPath: "apiVersion", - mapper: { - defaultValue: "1.0", - isConstant: true, - serializedName: "api-version", - type: { - name: "String" - } - } -}; - -export const format: OperationURLParameter = { - parameterPath: "format", - mapper: { - serializedName: "format", - required: true, - type: { - name: "String" - } - } -}; - -export const query: OperationQueryParameter = { - parameterPath: "query", - mapper: { - serializedName: "query", - required: true, - type: { - name: "String" - } - } -}; - -export const unit: OperationQueryParameter = { - parameterPath: ["options", "unit"], - mapper: { - serializedName: "unit", - type: { - name: "String" - } - } -}; - -export const duration: OperationQueryParameter = { - parameterPath: ["options", "duration"], - mapper: { - serializedName: "duration", - type: { - name: "Number" - } - } -}; - -export const language: OperationQueryParameter = { - parameterPath: ["options", "language"], - mapper: { - serializedName: "language", - type: { - name: "String" - } - } -}; - -export const interval: OperationQueryParameter = { - parameterPath: ["options", "interval"], - mapper: { - serializedName: "interval", - type: { - name: "Number" - } - } -}; - -export const details: OperationQueryParameter = { - parameterPath: ["options", "details"], - mapper: { - serializedName: "details", - type: { - name: "String" - } - } -}; - -export const indexId: OperationQueryParameter = { - parameterPath: ["options", "indexId"], - mapper: { - serializedName: "indexId", - type: { - name: "Number" - } - } -}; - -export const indexGroupId: OperationQueryParameter = { - parameterPath: ["options", "indexGroupId"], - mapper: { - serializedName: "indexGroupId", - type: { - name: "Number" - } - } -}; diff --git a/sdk/maps/maps-weather/src/operations/index.ts b/sdk/maps/maps-weather/src/operations/index.ts deleted file mode 100644 index bdb47cad2ed7..000000000000 --- a/sdk/maps/maps-weather/src/operations/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./weather"; diff --git a/sdk/maps/maps-weather/src/operations/weather.ts b/sdk/maps/maps-weather/src/operations/weather.ts deleted file mode 100644 index 5c93442aa913..000000000000 --- a/sdk/maps/maps-weather/src/operations/weather.ts +++ /dev/null @@ -1,486 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { Weather } from "../operationsInterfaces"; -import * as coreClient from "@azure/core-client"; -import * as Mappers from "../models/mappers"; -import * as Parameters from "../models/parameters"; -import { WeatherClientContext } from "../weatherClientContext"; -import { - ResponseFormat, - WeatherGetHourlyForecastOptionalParams, - WeatherGetHourlyForecastResponse, - WeatherGetMinuteForecastOptionalParams, - WeatherGetMinuteForecastResponse, - WeatherGetQuarterDayForecastOptionalParams, - WeatherGetQuarterDayForecastResponse, - WeatherGetCurrentConditionsOptionalParams, - WeatherGetCurrentConditionsResponse, - WeatherGetDailyForecastOptionalParams, - WeatherGetDailyForecastResponse, - WeatherGetWeatherAlongRouteOptionalParams, - WeatherGetWeatherAlongRouteResponse, - WeatherGetSevereWeatherAlertsOptionalParams, - WeatherGetSevereWeatherAlertsResponse, - WeatherGetDailyIndicesOptionalParams, - WeatherGetDailyIndicesResponse -} from "../models"; - -/** Class representing a Weather. */ -export class WeatherImpl implements Weather { - private readonly client: WeatherClientContext; - - /** - * Initialize a new instance of the class Weather class. - * @param client Reference to the service client - */ - constructor(client: WeatherClientContext) { - this.client = client; - } - - /** - * **Get Hourly Forecast** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Request detailed weather forecast by the hour for the next 1, 12, 24 (1 day), 72 (3 days), 120 (5 - * days), and 240 hours (10 days) for the given the given coordinate location. The API returns details - * such as temperature, humidity, wind, precipitation, and ultraviolet (UV) index. - * - * In S0 you can request hourly forecast for the next 1, 12, 24 hours (1 day), and 72 hours (3 days). - * In S1 you can also request hourly forecast for the next 120 (5 days) and 240 hours (10 days). - * @param format Desired format of the response. Only `json` format is supported. - * @param query Coordinates of the location for which hourly forecast information is requested. The - * applicable query is specified as a comma separated string composed by latitude followed by longitude - * e.g. "47.641268,-122.125679". - * @param options The options parameters. - */ - getHourlyForecast( - format: ResponseFormat, - query: string, - options?: WeatherGetHourlyForecastOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getHourlyForecastOperationSpec - ); - } - - /** - * **Get Minute Forecast** - * - * - * **Applies to**: S1 pricing tier. - * - * - * Get Minute Forecast service returns minute-by-minute forecasts for a given location for the next 120 - * minutes. Users can request weather forecasts in the interval of 1, 5 and 15 minutes. The response - * will include details such as the type of precipitation (including rain, snow, or a mixture of both), - * start time, and precipitation intensity value (dBZ). - * @param format Desired format of the response. Only `json` format is supported. - * @param query Coordinates of the location for which minute forecast information is requested. The - * applicable query is specified as a comma separated string composed by latitude followed by longitude - * e.g. "47.641268,-122.125679". - * @param options The options parameters. - */ - getMinuteForecast( - format: ResponseFormat, - query: string, - options?: WeatherGetMinuteForecastOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getMinuteForecastOperationSpec - ); - } - - /** - * **Get Quarter-Day Forecast** - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Service returns detailed weather forecast by quarter-day for the next 1, 5, 10, or 15 days for a - * given location. Response data is presented by quarters of the day - morning, afternoon, evening, and - * overnight. Details such as temperature, humidity, wind, precipitation, and UV index are returned. - * @param format Desired format of the response. Only `json` format is supported. - * @param query Coordinates of the location for which quarter-day forecast information is requested. - * The applicable query is specified as a comma separated string composed by latitude followed by - * longitude e.g. "47.641268,-122.125679". - * @param options The options parameters. - */ - getQuarterDayForecast( - format: ResponseFormat, - query: string, - options?: WeatherGetQuarterDayForecastOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getQuarterDayForecastOperationSpec - ); - } - - /** - * **Get Current Conditions** - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Get Current Conditions service returns detailed current weather conditions such as precipitation, - * temperature and wind for a given coordinate location. Also, observations from the past 6 or 24 hours - * for a particular location can be retrieved. The basic information returned with the response include - * details such as observation date and time, brief description of the weather conditions, weather - * icon, precipitation indicator flags, and temperature. Additional details such as RealFeel™ - * Temperature and UV index are also returned. - * @param format Desired format of the response. Only `json` format is supported. - * @param query Coordinates of the location for which current conditions information is requested. The - * applicable query is specified as a comma separated string composed by latitude followed by longitude - * e.g. "47.641268,-122.125679". - * @param options The options parameters. - */ - getCurrentConditions( - format: ResponseFormat, - query: string, - options?: WeatherGetCurrentConditionsOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getCurrentConditionsOperationSpec - ); - } - - /** - * **Get Daily Forecast** - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * The service returns detailed weather forecast such as temperature and wind by day for the next 1, 5, - * 10, 15, 25, or 45 days for a given coordinate location. The response include details such as - * temperature, wind, precipitation, air quality, and UV index. - * - * In S0 you can request daily forecast for the next 1, 5, 10, and 15 days. In S1 you can also request - * daily forecast for the next 25 days, and 45 days. - * @param format Desired format of the response. Only `json` format is supported. - * @param query Coordinates of the location for which current conditions information is requested. The - * applicable query is specified as a comma separated string composed by latitude followed by longitude - * e.g. "47.641268,-122.125679". - * @param options The options parameters. - */ - getDailyForecast( - format: ResponseFormat, - query: string, - options?: WeatherGetDailyForecastOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getDailyForecastOperationSpec - ); - } - - /** - * **Get Weather along route** - * - * - * **Applies to**: S1 pricing tier. - * - * Weather along a route API returns hyper local (one kilometer or less), up-to-the-minute weather - * nowcasts, weather hazard assessments, and notifications along a route described as a sequence of - * waypoints. - * This includes a list of weather hazards affecting the waypoint or route, and the aggregated hazard - * index for each waypoint might be used to paint each portion of a route according to how safe it is - * for the driver. When submitting the waypoints, it is recommended to stay within, or close to, the - * distance that can be traveled within 120-mins or shortly after. Data is updated every five minutes. - * - * The service supplements Azure Maps [Route Service](https://docs.microsoft.com/rest/api/maps/route) - * that allows you to first request a route between an origin and a destination and use that as an - * input for Weather Along Route endpoint. - * - * In addition, the service supports scenarios to generate weather notifications for waypoints that - * experience an increase in intensity of a weather hazard. For example, if the vehicle is expected to - * begin experiencing heavy rain as it reaches a waypoint, a weather notification for heavy rain will - * be generated for that waypoint allowing the end product to display a heavy rain notification before - * the driver reaches that waypoint. - * The trigger for when to display the notification for a waypoint could be based, for example, on a - * [geofence](https://docs.microsoft.com/azure/azure-maps/tutorial-iot-hub-maps), or selectable - * distance to the waypoint. - * - * The API covers all regions of the planet except latitudes above Greenland and Antarctica. - * @param format Desired format of the response. Only `json` format is supported. - * @param query Coordinates through which the route is calculated, separated by colon (:) and entered - * in chronological order. A minimum of two waypoints is required. A single API call may contain up to - * 60 waypoints. - * A waypoint indicates location, ETA, and optional heading: latitude,longitude,ETA,heading, where - * * `Latitude` - Latitude coordinate in decimal degrees. - * * `Longitude` - Longitude coordinate in decimal degrees. - * * `ETA (estimated time of arrival)` - The number of minutes from the present time that it will - * take for the vehicle to reach the waypoint. Allowed range is from 0.0 to 120.0 minutes. - * * `Heading` - An optional value indicating the vehicle heading as it passes the waypoint. - * Expressed in clockwise degrees relative to true north. This is issued to calculate sun glare as a - * driving hazard. Allowed range is from 0.0 to 360.0 degrees. If not provided, a heading will - * automatically be derived based on the position of neighboring waypoints. - * - * It is recommended to stay within, or close to, the distance that can be traveled within 120-mins or - * shortly after. This way a more accurate assessment can be provided for the trip and prevent isolated - * events not being captured between waypoints. Information can and should be updated along the route - * (especially for trips greater than 2 hours) to continuously pull new waypoints moving forward, but - * also to ensure that forecast information for content such as precipitation type and intensity is - * accurate as storms develop and dissipate over time. - * @param options The options parameters. - */ - getWeatherAlongRoute( - format: ResponseFormat, - query: string, - options?: WeatherGetWeatherAlongRouteOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getWeatherAlongRouteOperationSpec - ); - } - - /** - * **Get Severe Weather Alerts** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * Severe weather phenomenon can significantly impact our everyday life and business operations. For - * example, severe weather conditions such as tropical storms, high winds or flooding can close roads - * and force logistics companies to reroute their fleet causing delays in reaching destinations and - * breaking the cold chain of refrigerated food products.  Azure Maps Severe Weather Alerts API returns - * the severe weather alerts that are available worldwide from both official Government Meteorological - * Agencies and leading global to regional weather alert providers. The service can return details such - * as alert type, category, level and detailed description about the active severe alerts for the - * requested location, like hurricanes, thunderstorms, lightning, heat waves or forest fires. - * @param format Desired format of the response. Only `json` format is supported. - * @param query Coordinates of the location for which severe weather alerts are requested. The - * applicable query is specified as a comma separated string composed by latitude followed by longitude - * e.g. "47.641268,-122.125679". - * @param options The options parameters. - */ - getSevereWeatherAlerts( - format: ResponseFormat, - query: string, - options?: WeatherGetSevereWeatherAlertsOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getSevereWeatherAlertsOperationSpec - ); - } - - /** - * **Get Daily Indices** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * There may be times when you want to know if the weather conditions are optimal for a specific - * activity, for example, for outdoor construction, indoor activities, running or farming including - * soil moisture information. Azure Maps Indices API returns index values that will guide end users to - * plan future activities. For example, a health mobile application can notify users that today is good - * weather for running or for other outdoors activities like for playing golf, and retail stores can - * optimize their digital marketing campaigns based on predicted index values. The service returns in - * daily indices values for current and next 5, 10 and 15 days starting from current day. - * @param format Desired format of the response. Only `json` format is supported. - * @param query Coordinates of the location for which daily indices are requested. The applicable query - * is specified as a comma separated string composed by latitude followed by longitude e.g. - * "47.641268,-122.125679". - * @param options The options parameters. - */ - getDailyIndices( - format: ResponseFormat, - query: string, - options?: WeatherGetDailyIndicesOptionalParams - ): Promise { - return this.client.sendOperationRequest( - { format, query, options }, - getDailyIndicesOperationSpec - ); - } -} -// Operation Specifications -const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); - -const getHourlyForecastOperationSpec: coreClient.OperationSpec = { - path: "/weather/forecast/hourly/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.HourlyForecastResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.query, - Parameters.unit, - Parameters.duration, - Parameters.language - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getMinuteForecastOperationSpec: coreClient.OperationSpec = { - path: "/weather/forecast/minute/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.MinuteForecastResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.query, - Parameters.language, - Parameters.interval - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getQuarterDayForecastOperationSpec: coreClient.OperationSpec = { - path: "/weather/forecast/quarterDay/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.QuarterDayForecastResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.query, - Parameters.unit, - Parameters.duration, - Parameters.language - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getCurrentConditionsOperationSpec: coreClient.OperationSpec = { - path: "/weather/currentConditions/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.CurrentConditionsResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.query, - Parameters.unit, - Parameters.duration, - Parameters.language, - Parameters.details - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getDailyForecastOperationSpec: coreClient.OperationSpec = { - path: "/weather/forecast/daily/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.DailyForecastResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.query, - Parameters.unit, - Parameters.duration, - Parameters.language - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getWeatherAlongRouteOperationSpec: coreClient.OperationSpec = { - path: "/weather/route/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.WeatherAlongRouteResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.query, - Parameters.language - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getSevereWeatherAlertsOperationSpec: coreClient.OperationSpec = { - path: "/weather/severe/alerts/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.SevereWeatherAlertsResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.query, - Parameters.language, - Parameters.details - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; -const getDailyIndicesOperationSpec: coreClient.OperationSpec = { - path: "/weather/indices/daily/{format}", - httpMethod: "GET", - responses: { - 200: { - bodyMapper: Mappers.DailyIndicesResponse - }, - default: { - bodyMapper: Mappers.ErrorResponse - } - }, - queryParameters: [ - Parameters.apiVersion, - Parameters.query, - Parameters.duration, - Parameters.language, - Parameters.indexId, - Parameters.indexGroupId - ], - urlParameters: [Parameters.geography, Parameters.format], - headerParameters: [Parameters.accept, Parameters.xMsClientId], - serializer -}; diff --git a/sdk/maps/maps-weather/src/operationsInterfaces/index.ts b/sdk/maps/maps-weather/src/operationsInterfaces/index.ts deleted file mode 100644 index bdb47cad2ed7..000000000000 --- a/sdk/maps/maps-weather/src/operationsInterfaces/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -export * from "./weather"; diff --git a/sdk/maps/maps-weather/src/operationsInterfaces/weather.ts b/sdk/maps/maps-weather/src/operationsInterfaces/weather.ts deleted file mode 100644 index 1c61c1efb73c..000000000000 --- a/sdk/maps/maps-weather/src/operationsInterfaces/weather.ts +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import { - ResponseFormat, - WeatherGetHourlyForecastOptionalParams, - WeatherGetHourlyForecastResponse, - WeatherGetMinuteForecastOptionalParams, - WeatherGetMinuteForecastResponse, - WeatherGetQuarterDayForecastOptionalParams, - WeatherGetQuarterDayForecastResponse, - WeatherGetCurrentConditionsOptionalParams, - WeatherGetCurrentConditionsResponse, - WeatherGetDailyForecastOptionalParams, - WeatherGetDailyForecastResponse, - WeatherGetWeatherAlongRouteOptionalParams, - WeatherGetWeatherAlongRouteResponse, - WeatherGetSevereWeatherAlertsOptionalParams, - WeatherGetSevereWeatherAlertsResponse, - WeatherGetDailyIndicesOptionalParams, - WeatherGetDailyIndicesResponse -} from "../models"; - -/** Interface representing a Weather. */ -export interface Weather { - /** - * **Get Hourly Forecast** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Request detailed weather forecast by the hour for the next 1, 12, 24 (1 day), 72 (3 days), 120 (5 - * days), and 240 hours (10 days) for the given the given coordinate location. The API returns details - * such as temperature, humidity, wind, precipitation, and ultraviolet (UV) index. - * - * In S0 you can request hourly forecast for the next 1, 12, 24 hours (1 day), and 72 hours (3 days). - * In S1 you can also request hourly forecast for the next 120 (5 days) and 240 hours (10 days). - * @param format Desired format of the response. Only `json` format is supported. - * @param query Coordinates of the location for which hourly forecast information is requested. The - * applicable query is specified as a comma separated string composed by latitude followed by longitude - * e.g. "47.641268,-122.125679". - * @param options The options parameters. - */ - getHourlyForecast( - format: ResponseFormat, - query: string, - options?: WeatherGetHourlyForecastOptionalParams - ): Promise; - /** - * **Get Minute Forecast** - * - * - * **Applies to**: S1 pricing tier. - * - * - * Get Minute Forecast service returns minute-by-minute forecasts for a given location for the next 120 - * minutes. Users can request weather forecasts in the interval of 1, 5 and 15 minutes. The response - * will include details such as the type of precipitation (including rain, snow, or a mixture of both), - * start time, and precipitation intensity value (dBZ). - * @param format Desired format of the response. Only `json` format is supported. - * @param query Coordinates of the location for which minute forecast information is requested. The - * applicable query is specified as a comma separated string composed by latitude followed by longitude - * e.g. "47.641268,-122.125679". - * @param options The options parameters. - */ - getMinuteForecast( - format: ResponseFormat, - query: string, - options?: WeatherGetMinuteForecastOptionalParams - ): Promise; - /** - * **Get Quarter-Day Forecast** - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Service returns detailed weather forecast by quarter-day for the next 1, 5, 10, or 15 days for a - * given location. Response data is presented by quarters of the day - morning, afternoon, evening, and - * overnight. Details such as temperature, humidity, wind, precipitation, and UV index are returned. - * @param format Desired format of the response. Only `json` format is supported. - * @param query Coordinates of the location for which quarter-day forecast information is requested. - * The applicable query is specified as a comma separated string composed by latitude followed by - * longitude e.g. "47.641268,-122.125679". - * @param options The options parameters. - */ - getQuarterDayForecast( - format: ResponseFormat, - query: string, - options?: WeatherGetQuarterDayForecastOptionalParams - ): Promise; - /** - * **Get Current Conditions** - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * Get Current Conditions service returns detailed current weather conditions such as precipitation, - * temperature and wind for a given coordinate location. Also, observations from the past 6 or 24 hours - * for a particular location can be retrieved. The basic information returned with the response include - * details such as observation date and time, brief description of the weather conditions, weather - * icon, precipitation indicator flags, and temperature. Additional details such as RealFeel™ - * Temperature and UV index are also returned. - * @param format Desired format of the response. Only `json` format is supported. - * @param query Coordinates of the location for which current conditions information is requested. The - * applicable query is specified as a comma separated string composed by latitude followed by longitude - * e.g. "47.641268,-122.125679". - * @param options The options parameters. - */ - getCurrentConditions( - format: ResponseFormat, - query: string, - options?: WeatherGetCurrentConditionsOptionalParams - ): Promise; - /** - * **Get Daily Forecast** - * - * - * **Applies to**: S0 and S1 pricing tiers. - * - * - * The service returns detailed weather forecast such as temperature and wind by day for the next 1, 5, - * 10, 15, 25, or 45 days for a given coordinate location. The response include details such as - * temperature, wind, precipitation, air quality, and UV index. - * - * In S0 you can request daily forecast for the next 1, 5, 10, and 15 days. In S1 you can also request - * daily forecast for the next 25 days, and 45 days. - * @param format Desired format of the response. Only `json` format is supported. - * @param query Coordinates of the location for which current conditions information is requested. The - * applicable query is specified as a comma separated string composed by latitude followed by longitude - * e.g. "47.641268,-122.125679". - * @param options The options parameters. - */ - getDailyForecast( - format: ResponseFormat, - query: string, - options?: WeatherGetDailyForecastOptionalParams - ): Promise; - /** - * **Get Weather along route** - * - * - * **Applies to**: S1 pricing tier. - * - * Weather along a route API returns hyper local (one kilometer or less), up-to-the-minute weather - * nowcasts, weather hazard assessments, and notifications along a route described as a sequence of - * waypoints. - * This includes a list of weather hazards affecting the waypoint or route, and the aggregated hazard - * index for each waypoint might be used to paint each portion of a route according to how safe it is - * for the driver. When submitting the waypoints, it is recommended to stay within, or close to, the - * distance that can be traveled within 120-mins or shortly after. Data is updated every five minutes. - * - * The service supplements Azure Maps [Route Service](https://docs.microsoft.com/rest/api/maps/route) - * that allows you to first request a route between an origin and a destination and use that as an - * input for Weather Along Route endpoint. - * - * In addition, the service supports scenarios to generate weather notifications for waypoints that - * experience an increase in intensity of a weather hazard. For example, if the vehicle is expected to - * begin experiencing heavy rain as it reaches a waypoint, a weather notification for heavy rain will - * be generated for that waypoint allowing the end product to display a heavy rain notification before - * the driver reaches that waypoint. - * The trigger for when to display the notification for a waypoint could be based, for example, on a - * [geofence](https://docs.microsoft.com/azure/azure-maps/tutorial-iot-hub-maps), or selectable - * distance to the waypoint. - * - * The API covers all regions of the planet except latitudes above Greenland and Antarctica. - * @param format Desired format of the response. Only `json` format is supported. - * @param query Coordinates through which the route is calculated, separated by colon (:) and entered - * in chronological order. A minimum of two waypoints is required. A single API call may contain up to - * 60 waypoints. - * A waypoint indicates location, ETA, and optional heading: latitude,longitude,ETA,heading, where - * * `Latitude` - Latitude coordinate in decimal degrees. - * * `Longitude` - Longitude coordinate in decimal degrees. - * * `ETA (estimated time of arrival)` - The number of minutes from the present time that it will - * take for the vehicle to reach the waypoint. Allowed range is from 0.0 to 120.0 minutes. - * * `Heading` - An optional value indicating the vehicle heading as it passes the waypoint. - * Expressed in clockwise degrees relative to true north. This is issued to calculate sun glare as a - * driving hazard. Allowed range is from 0.0 to 360.0 degrees. If not provided, a heading will - * automatically be derived based on the position of neighboring waypoints. - * - * It is recommended to stay within, or close to, the distance that can be traveled within 120-mins or - * shortly after. This way a more accurate assessment can be provided for the trip and prevent isolated - * events not being captured between waypoints. Information can and should be updated along the route - * (especially for trips greater than 2 hours) to continuously pull new waypoints moving forward, but - * also to ensure that forecast information for content such as precipitation type and intensity is - * accurate as storms develop and dissipate over time. - * @param options The options parameters. - */ - getWeatherAlongRoute( - format: ResponseFormat, - query: string, - options?: WeatherGetWeatherAlongRouteOptionalParams - ): Promise; - /** - * **Get Severe Weather Alerts** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * Severe weather phenomenon can significantly impact our everyday life and business operations. For - * example, severe weather conditions such as tropical storms, high winds or flooding can close roads - * and force logistics companies to reroute their fleet causing delays in reaching destinations and - * breaking the cold chain of refrigerated food products.  Azure Maps Severe Weather Alerts API returns - * the severe weather alerts that are available worldwide from both official Government Meteorological - * Agencies and leading global to regional weather alert providers. The service can return details such - * as alert type, category, level and detailed description about the active severe alerts for the - * requested location, like hurricanes, thunderstorms, lightning, heat waves or forest fires. - * @param format Desired format of the response. Only `json` format is supported. - * @param query Coordinates of the location for which severe weather alerts are requested. The - * applicable query is specified as a comma separated string composed by latitude followed by longitude - * e.g. "47.641268,-122.125679". - * @param options The options parameters. - */ - getSevereWeatherAlerts( - format: ResponseFormat, - query: string, - options?: WeatherGetSevereWeatherAlertsOptionalParams - ): Promise; - /** - * **Get Daily Indices** - * - * **Applies to**: S0 and S1 pricing tiers. - * - * There may be times when you want to know if the weather conditions are optimal for a specific - * activity, for example, for outdoor construction, indoor activities, running or farming including - * soil moisture information. Azure Maps Indices API returns index values that will guide end users to - * plan future activities. For example, a health mobile application can notify users that today is good - * weather for running or for other outdoors activities like for playing golf, and retail stores can - * optimize their digital marketing campaigns based on predicted index values. The service returns in - * daily indices values for current and next 5, 10 and 15 days starting from current day. - * @param format Desired format of the response. Only `json` format is supported. - * @param query Coordinates of the location for which daily indices are requested. The applicable query - * is specified as a comma separated string composed by latitude followed by longitude e.g. - * "47.641268,-122.125679". - * @param options The options parameters. - */ - getDailyIndices( - format: ResponseFormat, - query: string, - options?: WeatherGetDailyIndicesOptionalParams - ): Promise; -} diff --git a/sdk/maps/maps-weather/src/weatherClient.ts b/sdk/maps/maps-weather/src/weatherClient.ts deleted file mode 100644 index 29ab7aac07ab..000000000000 --- a/sdk/maps/maps-weather/src/weatherClient.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreAuth from "@azure/core-auth"; -import { WeatherImpl } from "./operations"; -import { Weather } from "./operationsInterfaces"; -import { WeatherClientContext } from "./weatherClientContext"; -import { WeatherClientOptionalParams } from "./models"; - -export class WeatherClient extends WeatherClientContext { - /** - * Initializes a new instance of the WeatherClient class. - * @param credentials Subscription credentials which uniquely identify client subscription. - * @param options The parameter options - */ - constructor( - credentials: coreAuth.TokenCredential, - options?: WeatherClientOptionalParams - ) { - super(credentials, options); - this.weather = new WeatherImpl(this); - } - - weather: Weather; -} diff --git a/sdk/maps/maps-weather/src/weatherClientContext.ts b/sdk/maps/maps-weather/src/weatherClientContext.ts deleted file mode 100644 index 2602fd161436..000000000000 --- a/sdk/maps/maps-weather/src/weatherClientContext.ts +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * Code generated by Microsoft (R) AutoRest Code Generator. - * Changes may cause incorrect behavior and will be lost if the code is regenerated. - */ - -import * as coreClient from "@azure/core-client"; -import * as coreAuth from "@azure/core-auth"; -import { Geography, WeatherClientOptionalParams } from "./models"; - -export class WeatherClientContext extends coreClient.ServiceClient { - geography: Geography; - xMsClientId?: string; - apiVersion: string; - - /** - * Initializes a new instance of the WeatherClientContext class. - * @param credentials Subscription credentials which uniquely identify client subscription. - * @param options The parameter options - */ - constructor( - credentials: coreAuth.TokenCredential, - options?: WeatherClientOptionalParams - ) { - if (credentials === undefined) { - throw new Error("'credentials' cannot be null"); - } - - // Initializing default values for options - if (!options) { - options = {}; - } - const defaults: WeatherClientOptionalParams = { - requestContentType: "application/json; charset=utf-8", - credential: credentials - }; - - const packageDetails = `azsdk-js-maps-weather/1.0.0-beta.1`; - const userAgentPrefix = - options.userAgentOptions && options.userAgentOptions.userAgentPrefix - ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` - : `${packageDetails}`; - - if (!options.credentialScopes) { - options.credentialScopes = ["https://atlas.microsoft.com/.default"]; - } - const optionsWithDefaults = { - ...defaults, - ...options, - userAgentOptions: { - userAgentPrefix - }, - baseUri: options.endpoint || "https://{geography}.atlas.microsoft.com" - }; - super(optionsWithDefaults); - - // Assigning values to Constant parameters - this.geography = options.geography || "us"; - this.apiVersion = options.apiVersion || "1.0"; - } -} diff --git a/sdk/maps/maps-weather/tsconfig.json b/sdk/maps/maps-weather/tsconfig.json deleted file mode 100644 index 0ec8659c8e83..000000000000 --- a/sdk/maps/maps-weather/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "module": "es6", - "moduleResolution": "node", - "strict": true, - "target": "es6", - "sourceMap": true, - "declarationMap": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "preserveConstEnums": true, - "lib": ["es6", "dom"], - "declaration": true, - "outDir": "./esm", - "importHelpers": true - }, - "include": ["./src/**/*.ts"], - "exclude": ["node_modules"] -} From 39ba3ac368b0eca59ed5bd8b8076708233554f11 Mon Sep 17 00:00:00 2001 From: Filip Proborszcz Date: Fri, 2 Jul 2021 13:52:53 +0200 Subject: [PATCH 4/4] Fix samples - final --- rush.json | 45 ------------------ .../samples/v1/javascript/data.js | 1 + .../samples/v1/javascript/featurestate.js | 4 +- .../v1/javascript/tmp/Data_uploaded.zip | Bin 946883 -> 0 bytes .../samples/v1/typescript/src/data.ts | 1 + .../samples/v1/typescript/src/featurestate.ts | 4 +- .../samples/v1/javascript/render.js | 15 ++++-- .../samples/v1/typescript/src/render.ts | 15 ++++-- .../maps-route/samples/v1/javascript/route.js | 3 +- .../samples/v1/typescript/src/route.ts | 3 +- .../samples/v1/javascript/search.js | 26 ++++++---- .../samples/v1/typescript/src/search.ts | 24 ++++++---- .../samples/v1/javascript/timezone.js | 6 ++- .../samples/v1/typescript/src/timezone.ts | 6 ++- .../samples/v1/javascript/traffic.js | 3 ++ .../samples/v1/typescript/src/traffic.ts | 3 ++ .../samples/v1/javascript/weather.js | 15 ++++-- .../samples/v1/typescript/src/weather.ts | 15 ++++-- 18 files changed, 97 insertions(+), 92 deletions(-) delete mode 100644 sdk/maps/maps-creator/samples/v1/javascript/tmp/Data_uploaded.zip diff --git a/rush.json b/rush.json index 0c8a4a220845..ddf01f788db5 100644 --- a/rush.json +++ b/rush.json @@ -784,51 +784,6 @@ "packageName": "@azure-tests/perf-core-rest-pipeline", "projectFolder": "sdk/core/perf-tests/core-rest-pipeline", "versionPolicyName": "test" - }, - { - "packageName": "@azure/maps-creator", - "projectFolder": "sdk/maps/maps-creator", - "versionPolicyName": "client" - }, - { - "packageName": "@azure/maps-elevation", - "projectFolder": "sdk/maps/maps-elevation", - "versionPolicyName": "client" - }, - { - "packageName": "@azure/maps-geolocation", - "projectFolder": "sdk/maps/maps-geolocation", - "versionPolicyName": "client" - }, - { - "packageName": "@azure/maps-render", - "projectFolder": "sdk/maps/maps-render", - "versionPolicyName": "client" - }, - { - "packageName": "@azure/maps-route", - "projectFolder": "sdk/maps/maps-route", - "versionPolicyName": "client" - }, - { - "packageName": "@azure/maps-search", - "projectFolder": "sdk/maps/maps-search", - "versionPolicyName": "client" - }, - { - "packageName": "@azure/maps-timezone", - "projectFolder": "sdk/maps/maps-timezone", - "versionPolicyName": "client" - }, - { - "packageName": "@azure/maps-traffic", - "projectFolder": "sdk/maps/maps-traffic", - "versionPolicyName": "client" - }, - { - "packageName": "@azure/maps-weather", - "projectFolder": "sdk/maps/maps-weather", - "versionPolicyName": "client" } ] } diff --git a/sdk/maps/maps-creator/samples/v1/javascript/data.js b/sdk/maps/maps-creator/samples/v1/javascript/data.js index c66c38706951..9255ce460c50 100644 --- a/sdk/maps/maps-creator/samples/v1/javascript/data.js +++ b/sdk/maps/maps-creator/samples/v1/javascript/data.js @@ -142,6 +142,7 @@ async function main() { if (!fs.existsSync("tmp")) fs.mkdirSync("tmp"); + console.log(" --- Download the uploaded Data:"); let zipResult = await data.downloadPreview(zipUdid, operationOptions); console.log("Done (content type: " + zipResult.contentType + ")"); diff --git a/sdk/maps/maps-creator/samples/v1/javascript/featurestate.js b/sdk/maps/maps-creator/samples/v1/javascript/featurestate.js index a633f63ef402..c377ae0cea23 100644 --- a/sdk/maps/maps-creator/samples/v1/javascript/featurestate.js +++ b/sdk/maps/maps-creator/samples/v1/javascript/featurestate.js @@ -51,7 +51,7 @@ async function main() { const featureState = new CreatorClient(credential).featureState; - const filePathForCreate = "../../s/featurestate_sample_create.json"; + const filePathForCreate = "../../resources/featurestate_sample_create.json"; const filePathForUpdate = "../../resources/featurestate_sample_put.json"; const filePathForUpdateStates = "../../resources/featurestate_sample_update_states.json"; @@ -89,7 +89,7 @@ async function main() { console.log(await featureState.getStates(statesetId, featureId, operationOptions)); console.log(" --- Delete state of the Feature State set:"); - console.log(await featureState.deleteState(statesetId, featureId, "s2", operationOptions)); + console.log(await featureState.deleteState(statesetId, featureId, "s1", operationOptions)); console.log(" --- Get states of the Feature State set:"); console.log(await featureState.getStates(statesetId, featureId, operationOptions)); diff --git a/sdk/maps/maps-creator/samples/v1/javascript/tmp/Data_uploaded.zip b/sdk/maps/maps-creator/samples/v1/javascript/tmp/Data_uploaded.zip deleted file mode 100644 index 6ccd256623114fe8c582426ba2d296a459914b17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 946883 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

ZWPOP8NcY=a* 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

s~Vp!)3gNbd$SH$rX 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

7srz6`E8O620-c;uT%iBRm`&LfU(zDiPI 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�Ip8m8NmFTkL;$jYQSz%Up_s%?ww$ zLj|w84VN`67%OV6AcD&8CrluaI<1%bu7mK8NeoTd*6(b#C*1^orq{xo<65C$y7tzF z+jRRJKS})Il$*r1EKE#-<;=ldZR>15tere^vc)ZSVdQMX_1ZDe`&Ea9s#>?!ZETgl z#1UK5YO+6ScKLNE-m&nsK89558~c^Wm5y?6rJIGsdi^0O|A&XGjAzKikwb=zN_7bC zqw;twZ$R`$(Qq;_5s1lQv|C~hb&x|rQwOt~l8JrqOgx-5-SO$@V)K&|afoeXbTks@ zP404rcsLci4}(gfTzwTv+_}VtLH4Yxt5aNd&vt9-f=WEOXm;nCM(Lju z!ZdX%u_1~j@w0zZ%A-FB#xqYR9Q=G>PHbOYq8C^Y^oeUwTeH7zgN(Z5{?QW9_!>pJWkaHDtVm=imyw0R@fwdj0&{HV3h z?xhIisV&%;eX@x=fK?VWHJ8jX&4+I;uYJT`uAs%r)z=QZ(ycw!<780G+ZmgF7L-p2 z`(^N&y~CIE)AU_rY!sLIo#wFlfPKw`N%}sTS?ss_7dWRT75JGWD{Lkfnr4nHc$7{B zw(DjLY}#9qx~XgGn-`hiyL6U3xKS~>O^XeI1v`GckX+E2yBtZ2>H@m6y|#`Y{MGR> zd%N0Cp6N7qsA)Sh@{MehQ_s;;%u zEz+434Q(H8jZt~Ri&dr;d8n~Z7-P9Ee{ge^y@{|Tj;V>CcX~ChTH^HdhFypBqWk_9 zS98lagXZ(tiV+TTufHd3MF?BvY;I{SRPE^>zG2Vh@)3P1 zGmhDtpa}h{vSpv!Lwk=+nppDTW|1g%ylC8L8x2OiX{2Jt?odtFaRD1%zu(|8dGBvg zT|F-N{#LV!_TDEN5D<6VXNqY$SKOMt(E+>~EV751lsSveLVQjw6_Hr(<0g5$-+ zpD(-pl`G%gwiE2hI6G+M#x=b057AQ9LcJ#R-lf;4k|XuwU;mnu)YUP)dQ{D&g;gzf zg>HG)+b-n(n`iHjv~nNu!{@iAhkIKGt)2DZ@P*26%r!%bK5Qw^bQ`DX_uc)-MddF~KJ-}1ES-BbNd`OXPW={}J9D5KCAl&0%dTQ*8()Xt)Q!sd zuvu^pb@B>4P0Iip;0`Lva;)Z~Cx(pMxqdeCmGimA9iZ>9N%AtuT{m0%teP&%So!3N3_WYIqK`6~1-l4K<&=%**4dzJy2gIBoVZ zNp+evoWu`q5yod5jw)zV?Q|T84eaIM3VvV+E|a77ee=FIym>2n&psM0qzVj)I}8WH z2!O)5!x+4U>`9MHks14cs!{gUwLXH_^E9o`UUw zc>}%q?+RO2y*)1+oj*utAw#bPi@xy~ZzM}C@nfHbKchRkrj2(zWq6jlU+XeN!$lG$26t~bTg`cUXEgl1(9!1`K_eRCZp z;TA}6ML8Vx6FJNVv$5YFUfrXd1e>-z-0h~0iglA&mK9+Pize-u=f%6j4EnZg_RiM2 z{Y`DK$x$iNRgnpeZ9%Miz+0@!EYRQAbDTB8o{)?CHSxwsmKMn(@ruQsp1~m4{Lkt| zDEN^ayzWE1QJ%2JCFxjw@dq>QilO6PaS9XAGIWw`m!uRBBuX@|buRn7t2KVviue#V z;>Jf@fdns7HKjJ#VH8y>n*0?kH8a^pU@)LLHgJoGj~0G&Ur55Ko{i|cV-_% z>g|q=FG6RQ>P(EoN2O9$RLu8P;}26WK31^W?wH&}5j^J2T!pc>tJ?Aqp--?(HOa_&Ilo7x~3D1twU6kQ>s(?f<479;E?}G~m<= zm+}_QH2 z8d=8}p*_#~vYU2~4K3m0Sy1U^Itl|m?BeR_WADT9HKXK4mKcX)qsJ`T@g|~_I*F}r zK&zdSm`2h~+AY?ny^#Io#5f8&314Nc$W=2$Mxy7V4J~Kit*0a-GfSLq8JKX$`W*^Q zbxpHJxwX?k-7ou=ljpGJSajxFBnFN&R?4y@vgKUwSg~j!3|81X=0}c#(I)CfsyEH& zZiFlZwr{xjt2<3eEW2#B;f&pa`R-s?Uw3cq*|(YheMS!rAx#^)8~#QS&DSfShK~3{ z^6Bra26QhKB__n!r;dsoR!lk(jzWY(!MyNT>%t~s#?qXu9|NlJOPiM}jmv;HZidgu z?ib4$e<3Vx>90-kt!B8xLjAi)Y@#*NP3D? zbdhs${9@6E<{;W$Hk4;&e9`Q_T90D_RIOt&&0wvOKxa&qgVNsE|4MtkF2v&J{a$&| z=&YcXzhL!IBvitN9kr>9hE`ZgzqH2&RZ*g{4$i0$N0PJ>Vc{FLPdBYo2Wpsg~j$3|3 z>-xg!)7>B!^mSB-2IqQzr#?POowp%btQd5(BZqa0+Doc=d6sK*O2%U-iA&_g5%pD%K}u5IT^MUwBIpna%6FiDZY{KV`6_u=yl|qz2 z^k1@ggq@Cwn;|Z=IqAMQ&azpJO8l-;Jm&6GoCKFq=w{bHFMh~x)vQFD1p!3oDhEcX zfa%x8c2ZV$=7Ejgz(nOjZ|rpnSiP0(8=UiUYA1DoXO;RUPD(Y#q=QD1&5MiT!)$jj z`Rt6+3hp`f&eW{R%3cuc#9FxwHUL&J{dms>x=E?P-Y#x}xe~MY*o)P-v80q$nnOYj zIoZ&}Q8nPuR=uR7aTlHp=9Bj-2Q<3=BCG z(J;f52nwkK3`|r?xZks?9N6LC=4d6Qd$g*Tz#TC~#p-g;Uohwu-u*Pq+DdD`wW$cH zwd*3$e5#Fg==3k1bDpocZoLF@{5=Iewg|eiPJeh=npozh`IGMQDwGCr5h5^fFM3^j z5`&MqlR<$Y?V0+UuT0<}saE27b_m+Ikr}u;Q*}_yBakx($!j%O3fKzjC-LkTOFqUJ zSo!T6HjHD_mms|ObqVr~WP151DLQ0VIh+2$!Q3Rc&FU4#?`$&v29CyYrYen>70^Xq zT97A{4VDyC=s@>+FJfmqR*0)|W4FErbCJ4wa`y%cb(*j3cIfxDUDRCK=w22wg4)ze z0-l!R!xkyZN~GLO<8`Z!M6DEhGl+)p{?ze8An=~oPT+P$xn(AS2;6BIA2CX_~-ZL)0+h9k4FokgZ^ z>6UE<2A4MN6o>Gd8pee3YAIgl&}4U+B43ScUl7O=Lx6w=7^%2aFCyvp$Ep?K-hx zPmf>RJyX>s$ScS+N5+`mL$B3?b&AtqL?Z$dJfbaN;kXQcLWX8)PCiF7~|KcN+_rHK@{(i)%%VM zi?;AM>9l_Ax_*2$Lmvm>ewP7|_2xYAn`cs=s@xn7xCg`h1_If8$ z0-j!+B}?Q(*^+j}b(z!h;cn=wPGome`_UUJk3+L#2+lz1$OXY1X0bQv(^oL!d4fX9 zooJ<<0L6O4&_bQRZ`(%UZorrm*!F7`3W;%_xh?cfY3_$59f}pACT`06*f8Eb5~n8R z6A9{xvpiX{Snu6#7ya((a{ZNvZUF@FHzjmHRsU5UV=TC0-BF9+dJk{EIGO*cQ8mc|Yw|PfR5<4{DayU3M&{J`x#QK^f0nRuH0~0CsQM7OR*Yp?-~xIn zHw;m3nxE!`TgnAZzXhkb*vvM&nK^{YMOxyPTF*XljgWC$;cnao#HFUV+xY_hb~4V! z)#OEWhYR7`)ozKHEfC&;kL{<4TCodghQ)bvVql$b&RWP?K)R0SIm|}LIl22ZwZPf7 zP?Y*Ow)fevZsyuILn)eJS{4c!4E9Axapmmjq-7y`mRrIfuxRTve5w`+sP1b> zt>);q&B;1~#Kp!=7T}t%OH12G-iXHYAiZn94@w+1W0)h~+`<||D`TPHC?=0_oJbR{ zfbC^#H%)pLF=*LD!5gS6lD5IkB^ot6@)>6)ZO@Xi$NZ{vyAzBUJ%TAI%5GvZK!xL} zD_PtaePtDe!CNM-=VxhlsXA?YP*&XtAr+1V7RP))K6!TI!K zJ#R8xbTvR+8#j}Xhx(M-YpfxBea_$nm_6;z?`E?a6)US?Bou{i3TkdrJm+Now(H01 zP_*0Et>yrNd-|%=X)9FON4U}jqn_c<boyjMRA3#>vSy|9zJfsMV zh7-)e5A+r6>dy|>#vsyj7x4Sm99ZPKP~+=k}31@PAbe{A)h^0(GM5w%VAbDUP9)Jv1I*Bu-*hCECT@UBxZ(7m=>|w9q$pJ~FvoY#T>9WW&t)vaH zab2_ZyeW)6$rC5W%IHeTlX{x&Ny@UU=kwYume1R`>UB0w1;HRiad~H|k+#8V_NgrguMRz&IGTP&f`DCHT$${iS= zR+7Cr-5^(3WrvpQX=t@jTNC3IoU-;2ggX%NwA?;j_ac7?;(qW)CT(qVaVQ{^=U^7M zM|L-RqC8g%SR z`&zV{>E0k?S^g?S=p&r=uBJMaY-RpDV~pt&ITnHOUh&9>cfl*oNATk)TxWwdbv^g6IrgwAaO4B-6i_#` zY8C!I6Mf@!sQBGR;ArG6=$eW||3u$*K5j++MYv0?SkmtJhqV!ow@k7SB<0cfJOb*n| zSYi!1@5va}w)j58pM-Lr=D0N2Ut4%0nd%y=f^lY1#CR9kqj3Qeh`i%V^+PPqoBK7 z^Ss;Axa}V??~JzOnD`!i?_>9uRiA*8NC_RQuwFR}FTJNqUTKcaI?SFd0qSDXbK7cI zy5StLitqDrtPIKN7W2{LdfUE)!PyMfeg@k8kR%UymDBnEsGV(vp`J-Ce)i&6mw!<} z*-a3s7l2ZssxNp7lt~H4t+RZ*KJU$=rBB^ZJkx$a792EL^5PdPk8P%y{9#ijD{1Sl zj3Y{Z#4cEdPy+$MQc>~vv6Fjpc#unjAP^Ee)FOrSyO#-~h8kG+0LBX)BmMrE41~NIg*zZ7+8)N6_{j=V%BY{(&Ij#Si2MJjJ(zL zOtmy+wN=39SH2uiQ?;GlZJrU&(3s#C@crwpnHp$;6?qq-@Nk!0YpR=w=_Dz;bv8Mh zSlU5s%heCP6L;vJq+ivR9?)xI-5xP;hk$)K}?qUe?tSZHJ>!N9`i zg`a(|@)t{;1jlMQuJC>$gIwypEBIKN#qA-Vd*u>vNZScpfDf?b&5`@oU)>c-sz!DH zIu&@C*(2}=u9o3?K#8>=oJx*v@|SI1TsKXlIJ&~CHY01C)|EQUfOPwCq3Xye9OUO` z)9+0bdnHN!0gbh2IH&L6U+5ebHwvrM_f6vo3sWFWfBO~7Fupyz!@1hj%qxH{rIX-# zK*8D@Y1hH0mli38hRW_4K-)o82z|IKTuvN1`g5{PKLQ{6{ySh-CMb&j>+^GID9y2x zVj8yaULhxqG}+E?_uvfzdf5Ti=9_2BzApYa!54dOiZ$vqj{b6cSu*HljpL*vl;PyA z+Bnphs=A9#q885z{=LR%qmUeWs$G4M)<|y@hiZG{FD)+0@DQ?2qB^;LjM&J%#NzG+ zh+2Y4`_U0b)81#%ts3+ppXa#O2zsjM*@Fse?_@!ucIqQ^FukjyX0X-k4Ud%(A8#%j z=7E@pWjE%*^xlWVjSJR+!!2M2Uw?X40W;WTZt2a!WL3ICM91PSSLCkM$E?9#4f5nk z>`ubwp6z^SglDY7JNqnOUcLAaJU)6Z(XkeQgpnycmO!agm10kF6c>Vy#StD?gfxPQ#FXtbzdEVnBChXsP@}XdMDtby9|%jXOExcWBe#bS=Dful-Zacb@{}hZ5cX6JsUe#5EC71Z_13Prlpz3UJt4t z4v#*2w%s5WBwcLDy`Al-zXXGtLU}$V)6eALK4kD%PRRV@FRO0cf2eEwnddf}@(CIU zJ-}{Wi(cS7I#sNL#KvqlT7a(*cq~)pIPe$AHb(?YrP8_s*&$< zO`+D30+KdU=qQa+Yv9jud?`2@>X47);l&Ol15z7MK_Msh4+t6UZlfpKWQrEW&bJ$) zO(%3vh!l36@vn+I5ea<^wRwt=9*)H-5^1vS7Ra9O)X}Pq(z5{ zpe%7sz`|P^<;n|er3vArbIzuthrVYQ#+>#a*f}KD-YmQVNuaSWI|jQ9FI$^;74{_t z#7U>3d%kg&{jSr*2{~8r_V@WF4r+P}4v?{5=#)0N)J%F5nu7}MlHhNvJ+|yK$u}Wn zoz5zB7ldox(-h&XN;z2wzATQIfaK@#=}Z;WW(2g9KYwyDgGYyd@8+!AB4r&ah5ECn zjJ_6$W&~dMO>3@-F0{2WY@1N0Iw=q<+T`DdlP&|8>WUX)cY@J;r7pc` z%w`~aTi3;YwXrUoaKK%HpOSQot&vZo&c7L{;y2Zu#l?N-7gu!XY(0^SPxr(w%E}bp zlayN**xZt3DTWVshgA%b1Y*46gLK%j`X{^fpQIj2oVF}9TZ?}k!`K=T5W7aCjN&Lp zj6fcjlp$qVeN;*_Pc`!Tw!NBoP8D(d3j+~BajSA(63Q;1-LCSSh<8}u{lwj%#$)v# zEcmMhCL+5{VrK~kT*)EnUp@*0Rt+J0uuR`eVlCeY8hLISAs@cm1=TC?a|8E8oBmIC z>7P0zQu6mQ9J2q)C`d&vUoXp1hxk{cm+(Iv26d{?>~rb{2bYTTGurTuNT=|MIvR{B zez?;4Vz`IGz!}+G)T_4!RW*nZ;s7w#GJ5VrS!eogKD4TtbQL>2^*_ODwjtHlY6zc; z#GaF#!0}>U&v*xg=R_AQb8bz*ZE-&ZEg>g{;EoyUX&D~EpS}Ig$$>s-s*CO*^>03O zZRYzRCj{%xxzgYh_B_56rs{Ci8GA1;MrJum8OqJs%%oH785#&XE?dd$>`Lc2oUz2? z0O_Jxe=kS0|NLlTRPH-|$#7!V>Ks%V&tp$zUd}e@V?z^uUfVvJ8LLm>J=5dNidyoJ zCsHotK>j<#GBh8i!jUx2SbaYX`P0vK*VI2A+ms~(#VAUAHiClmT^rofHr2$8Lx5t4 zN#CzEP=&>&^Y*`HNPiVw}p=u#^c zYrI}8-zy#wDsbQDP@ZYy4Gd-2H#P>0pyw-$>xZr^Aq?+8#_42X zbe<6J&~LHI_hNu3<*j}zFT%Bti#30vV&|Ci#`ex3rU2z$69(Sd5_1|YjP2OO3KNC`6T zvsKdNP)C$N!bQbUL58MiU-DEnH+-_$EhLnNW)^c|+jdPwN#}b84Y>RN9}Ew_^gtmp z-od@R?Jh! zS)ajuSOpB1dX+gZ1x(ld3Tk9i*-wGc0n#7~|&; z(=nE*Q-d=V&ZD}AQl9UW)480FBlYJXbMSrsRskvuG^c4Zv3gQ|6LSZya@v!J-<((Q z)oP&?UOcZ&5Rw@1w#@pkN%abUcter7~WA*#}f z^AeG4$yE@=rYWUeQ47gO9IW8ysOjJZh36aCm$O%O!q_HJDX*YF3ctuDGv+qoXad)K zUryCzqO^?FsbR)CD(7u&>pAy@2Di!Aj~tT1&7|tJbizjDnZ~?>64H%4{vmmeLvDB} zUvDu0!SQ)_OL<3!>$!7bgXf-E9e5r}jQTN|4+Xggd-lt;v05kuDL6^h6H!phuLRbg ztflut0g=TglAM8wT-%I$oYMvO*g$|Yv~|CshxMa`j_*3>hF^lf@LOOnFNqZM8+6?}81I-ZJ39eCdg6+Wx`u%+Y~brtHy*8ZW5W z@$O4zNOx`_49VNV_;Ufb_`(m`Qb34$XbOQzCZ8oKMqw)?yWj?(={i9*=|ridTFSS? z;9Hmh#)wJdJF(&?g>{f&R6<>>`)(R}2B7SIjR90Ya%i1fZS0}|nf|QWyBi>1l_h2- z!abfl58mV?-1mU+_mM}p@DGC?d#T-9cK5Ci@onbwKspVYylp=-0bItPg@NAHqN+-{ zZKsZ|Jga|WPVlns{M(pDVtWqWR*wu8(ItAcI4D20ByRGv93p6PSxZ0X>`kn`s1M}Z zTf0qCexB(t#y;Qn6lFlcP=SDeAc2Y-sg&Sz;D54Cz<}5eA%LL&wMsZUxY?W1n|fGW zbwlZ@thF)p&cz2II?JaIc|wM80tM|?d&UbEx^W5*M*@e013_b=p(URQAt?cy$mm$% z)r&=&*vaUOvA0U&S(dD7+qD$_v%joYHo5N%pk8(XU2U&BfL*^^fBxIY0E#P@mtC9d zmQ{}$K60W7s(WfT5NAEGEILsmO0ci!=mGCM-eP%@#=VTHvJ9n+laBwFQd+_TX=jw%j*|W;;EO%k-PaTm$E$B zR~f9E;|A@&Upu>Cack{7rHw)g2DnLgcRpL`G6J$sy&krWB_=OSD-l!S4r(_VwR^7q zc4uvU1lhjtN}IF~DesNZy-x4or~U*yttQd~!t^Sk=EYe_0YR?Vi&v*s!Y{K;v%_RfJ`_WCl4 zrR;8)#q)A~9*4MgUZ3aqt~N&u3{a{Kl>3ZF`nyDE+hl}B)hH*0@)0}Ee{m^?jKHXb z_xLTG@Zk@QB%GU=`_Uv;(z#BW zy^sZ1@T9Y(NZK=U^WKsmPeV>|Ox$wb6{rbkeoVmCRrG#X;5$%GhffuR-PH`YShomz z60z~%1>&KbLNvjN+Of;%#rC2X?!`9;qBrPljhgW#NLrf-C1aFM4yr}sFxIxBvDf7d zV}v4&?rhd=`7h%CHfe172*O_|72(5NSc&po1BE}bz5N!1Zw6b%FB;T?OB1WHSFPGw zxxg1;v{cfewU#N`T&!(XzD9TRDeCOe+u1FGu<^;S z5!+cRzp>JI4dgeSP|~9P=*84rD$+26(4-Ytpe*-cMi%0X7#EK&*#V)12=RqM#m1qF zy-pp?tv(R4=bceRHb#Sn~wYmZh0LGmEwfr)goBQ%4 z?B=6xZvrT;#`kl70gD!5XDgu~!7wx@6Sk98_|u`pCk75u`tf3l7MKtv4svjPea*LT zc?XgX9bB-iuWFI4+Z>95rU|Dq<0T$NC6lMeIzUJxdEh)F@|0Vej_cATR@Vsj^mOF; z@?_d6!T~9$G(I#$LP$u+&F#J4A4Ek(g*#?uVKMhFB&NE$y0i16Bu#&_)9rG%#|HtA z+x6jS;$IFv4>z~3kIOnfaDq{n8yrd2cHPdb-~@7lBB|9hKOexL5{G^m?$y$B)RoH075y2x%P`}PU2 z&*+L)5VB~hSgXIGqHQkDW5XiV`lG#7NG@5>{Tzq>?c^*Si+qiAJEZH=$MgV zkApts6Q#MT;Ww!3iC0do{Hkk)?8V4!)PToTS`78s9;hLNb1^O6z9~=a)c>sv2$( z-E_Yx8^TRU7F2t17-1O(cw?z|XV$^7L#)PBrwg0YQqs@nXxQT_AI?U8B`hqRHR($~ zwksKKn+(H}SnKPf|MMWl-(wRpzWo)hwn&t{@= zFhBpq4pLG4WB9aedN1Epip0^iVwPZ}b3y71 zE*!Zm9ePXWh4YglMvX#<cd47Sd^TJk|KJ~Rq*Ek$*GCKnU!%!vI=Q2jHmeuV$N`0}@>mE(E#rl4?|jxqhD$(asvhyXq`u1D-8 z=imkt=rmfan8?8YfMzsz3q0MU@yL^3wg0lxt8b}g9aA|xJp_z?_4vZ_=-RO(8)w{0W z(%R@4%dmr_rLbIRNj4P zUUN~&`jPRX{}PcE4mfIbAV01Bxf!q7>t;RK5is~6@t$2RdldWziD&usBH~5p#C|2g zY6-mvA^^(3N9|~3Ea*c-4T68-#kD4u^DlVQ{YVJVr_J1-c3Ek*pBs(NUp6avTc{@V z-IpFa@~-n)f8nRlAP9y@5g_8h(fNd2XPtL0sq0ja4U z3LhW3*q~Kv&ygade66tX@2<{h!Bg3^ZQi@zCmq?ImPPLNfNz{Sza>%26<3!=o~s;y zh&E3TN9@O!*W#4N)XM|~^!#~CdZYPI|i8kQ@8gD~SG%7L%o)x^G18*g(XFU5dRa0r| zX>?w-T$3RBG=BC6l9p}5XkEN(kyv2(GC*4p!F(sDNIAfqC`25noDf~cmsfP?`%+-J z1M|*|&9Z^%n}XVlee)BaAsF6nU$>WhJ)P!(rCj@2Ve|-O9jtUfy-52h0dg*@UuIhY zrl*4Qr_C%#&0LR6^a8NXUKB_-EPDTvWo;G+#yJ%@Kg@-0%ccor_e#C(8J`NIeg7uD zTKW#?Y;~*McD{{^0)MJ~HeT+V`$xVo{^{VicX}p?rpfd|%u7G*aV-CbLC+NcbMC11 z92JoVH%p=UGmFH8d1D>V_Oy3?D32$StMYxEuJG}X?#@~C9*6sLsL%EAu6dhc=k7%^ zcZ_tpod(ugp-VN&MljrNyVCVAlv@`t+pRLzX9pm#kq2`4;;RkFw!=z;yLbFC7)aaC zboiE+!5;R_x6!-MOZe6(=BfE0@M8G(A~=ifT=KaO^h&Q%fCb%y`%>_}y_Gos*^2(! zYsUa|*|gi5JF{jd@Ai8m$Zof*EG0lfmqR`GvQ0!DWJArV#AiE*Ol8}`F8EklIg40= z@OpXXf`yY?dPy0_Lm#yN#*GIP_prqj7M2ej5T#&-X5`F`js@WmI0dvbJ`Pmq8b1y0 zAJ`8wa{iHt4VsOJP&$Gbb3Fa`!pR<>D%#!%4KIX(-*w&(BWa`H-LJnkLp5?te_{VH zs>gX^@;2;%d|yTK7Z>2*R2Kjr(li7#`Hib)2;2=y835CjK*r9EM*bccRT8gp3ROys z1&JBJ#BB!+f=&$Xzj$}NVIPIszxu))cEz6Hev;5LjC9Ihk|-EOwG=}{J4lDB-a0eC z;!#64cO44U%eX#iQ62Wwc*C-=`;8DWNf=7J54=wt>y!>wP;MJwdk(T%6UDQ!0 z;E2vikKG({*DLOE)V%QS4wMV1(oRy20Uplad`w5Gsnn zPmq9^iR0y!)C5VL4l~UurkM)NWsFn8$4_PrHY|s>SbF#Bcr-_+j1JEPU;_~RkPS$v zy)}n?*+H}d2nOZF2f^zTep{~a%&C7wo4&Bx_YF}e-r34Jv9Ux{2Rh359I__6DL)bFI0 zLZU_%=S!LI4IM}?Xti2ljaJ!`RN#yk3~t%R5<`COJp1;cPd;(Yhf;nE!3yv3{mW9& zO49f%d-c&;orVLcR!U;@4#M;y%mSuBa?9xF1_*WdN6DzpC0e1>!# z!C8cvdhH8)Pa3Ob!gmb}i}qE<0R14BJM7bo4|Lt#e&-w@`Z^F&3S$Y2kV&3z6=YkB zK{dqNx}x@;$P5xrDx0zUE!0BP@I6}r;DtsWE_Lo3EDn2*XHIT#(*7!oVSOfM?*?q_ zqwsaseR!*;=A>`m?+mrSohdQ?!SvEfkHAWHDTGuA!24pQXC~1L?Fv1*o2r zyV9x@S~!Mosd<^6Pkb*Fnz~ITj&q5^QlmBogzJ+3LdLcwc;yk^@?TfJ81RpB;qlPF z@`=RqUlRd19oej7eD_KCQ|-*Z%_>lSFztorG7VFp7`2)(M1t=@rTM1OXJhaL)a{*q zmQ-la+>q+(`xlZvUGsjYGA-p$YJ{di+}+llRbIAlr@gO(o*Z~q>lu*IPV9At%SX3D z#x6zekbE6;iAGwxu9wd8YxIr2aBWZr41BiD@;hEW#(JGDWGj^k^zc&fH*e+4A@5xY ze1Kxz<_-+Qx%#V@3p*rN-|cymxC~wD1Rzxhc%IO%20Sg%jk!m<`}{-A`of$CU!0J) z`gsuv9YnT#t2$nWY8K>RslNU}ymuH~+r)s0_1RwCH!hl!IF3R%?K=u+E9ZHGAi_UJ z&HXWY2)+yd1oA!mZG!ga#XJ z8LkHW+dd+m)eB{*hKL{K(-L=U5sC?B{FEPkcSy_UbyiooH6c&7@{BOl4P-5|ZfS83 z3uF!?4D;*Hk;6yk1H9Wv%0XNj8{`}YN#>yER&v!tV?LQrEuKWJbB~K}zPM<#9{&0x zaobT%`njj%fdM`O@ekZ-4+sR39Si8>gNVbN!18H@=(qb`L9KW%dCZ|--k~qsCEw+a-4}0M5 z`AMMtHf%?;Ms>00BP@{eFb3YK7{F8h_Nbl7IEWSmxD1qnJj4BzUsx}^_nf~l)!u@1 zw|#XX?L>=~+x2o~gt~g;lOmChGh}EHVfHn1-sSz%8z>~uzin?LcF{NohLYy0N1UP_ zMI6caMsT^YLMgddLvuUE~?j)jykhTk=EKNfWdyW?L3Hb()6!8c*VPgMK4 zAQOJOE(C(!9!3gZ$L~A;@RqSm00a2%+n&F{-|x`~KM&sU;w^%q#V#`w#|-I79zxD} zTUpljG4D>haTr&W$H~8JWfnl!ts0xeqor0oV`eHAS*=+)GF8elRLb0}Zt<7MG$ITv zBx0pGQ;77Vq&C#!Z=t zRHC3#j?Dy7AQGXG85eL#QAlkZ9E=6=L9rmtVCS*&Sp+Qt;nnKhg+V%@p{et$0&77! zCx2H92@^I7nyQJxdIxLfHwc;((3v9rGKC+iSSEZIb$Q9OJM9w-xhp4NnpM$9;H8pITx zun8ywe4JL$Ty3>b9112-3uqd|aCMy&q?>l%Ov`4&nKaz8DKHhhnKs`Hm=4BLYgW4z zI|`T<#!w4r3PcmVzY!>vO$+8~JT^?RDKG`Rn%2+^m1C0}wX*u!RD*pcgm%VKi) zD=sO*;o)Be+2d~yOkTLMbs;pv4GLi3AEiX$!6yC?+lZTg=MJdx4-w8`E z7`L3^UJUPrk1B22M=5UMmGt=NZSk?Yp3Ryu1Ad=TFk7Kr3|7uFEr)S0KvfqAhx57> zjX}E=(RChOcP`in@A;pD`^G6xT07if%o*WUSPvjK44oLB^H+o5L~zwpD=r82S-ASc z7^*!S|l*H{HF({6SW zSua!9n@ua5b+nroz{x%E#X{9}=B|Wsu`n|PZy>dQg zU9C;pJ}ZSisij{;(p%u|l`T7Vn+9Q<220I->i@V;OS>r6wNQ_Aay|y-J$a=)1~olmzx%Lo4MEAsx?Ej+`e7#4oe4XZlQ`2qUVvUct#6IE8NCif2voZXt|9tRBe!%a*I?uZcCE7q(s&R=IuAb^=>1Ns|DsoiFrRmp9NiLm-ar$wVgXxx-BiavV?VJtht@A>+QPdlxU|pET9#iLl?O=g?4JKxixLMify@#taKtr z+skLpVxuiE7=M(dg%=nyxa-Zd(w;HW{thhp)e1f3P_%2)bNR(}M6gxh%nu%+<3kgV zL$_ex@v!x_dt&qOUGScr-seD%Ul9at7K^d6#cMC-@VGfn>l!&&A+&E(!Yx5?)`j%TZAX99`kI6$s>Wlww_;`dfsRqoS^TWch=) zoZNB2+oDDDMeJP8dJy4wStc!!G27E2>4S+FTqcj~D^W+DO%N|!Ztw6&baB1*vf$n9 zc$vl{3Gx-RpJMprlgns%!P)w-gj8k06&jaCVE$D<;=zp#xw9@3)R3zc&10%!CM^+O z*~J)LWg67%M$k3>p@$=S5F$lIhn}oOG2Bf>ouxO#7~gmrbgH!Wue0@KO|g{?u+2cH z6)G~XGB!kOICjtC;i%431;;74-GNtd}p&cjjy6Jhb`(srY)r&SvO8UDpMe{dBnX|v0&ejx?lpo`Q z=Q|FHy3*!nsR&aQJ8g-uHgIlEuZ{x;EpCKd(cbSP&en4~q>+D3p+~-;lnxzg3iz)m z%XZzFai}1LU8{WIT3j5to@YyngIl2HXz;UX%645IKGm37OR}x~W}V*dv8jKaoi9Rk zq(+hErizk}m%nAC#ALGJ+>}axSsDzip}>~6(^N9J=fK~EN!{mo|G3MDuF7C zw2$eM7idoJNOZWKqhx?QF9yF94SC%gv$-MsnX_P*N5^Uk+~V@Yd#f#7Rs(rb)Va$nKOj5g zffuYH-s)OjQtMAK{q7Ja2{`vRG4EoF_tl%*RYC z)-^jn;+_-)Ds-kdKWAk}vWi$y#j(=X#=tdUt3=udbV%wMuwoVU1lcyPH*S(Sb;wlGaFl2H8f1!3r` z@M;t;16;^v3hGn@M)@H%U^|v1(au7Of+0*8`=eso7Jj=-60+Q6Zd8++a}P_W)C?t` zE@$^GM3cxh;96l$ClDx@;?Lv0FR1;jLv~e8lu0jm=@ArFKkMW2Ub_n2)hH*;g;n5U zt%+TgGVR{sW$_!0v{V+CFDm*e3uXHcS4n-={EBF!FoKYx)2rAmrct`+sN zfDRb!_(tGpWqVIbH%mKO&SC--%$&z~(oDS15gNp~^0SPiFbwNH{=AI+lk$zFgahjh zU#A}lBPD{?>|?3e|9G>X$E%<>m+a?_^kgsIXi8R}>2NRz$FU3yDLL}2|)+Zrtuia7|0-vjb=o6d*$d%3keO)GTlBq)cklQXS&oRy02yuKA zh=dXzQ3450{l^5&SCJ{Kt4N9%fi*U0NyxqeN1%NI&L$_-tX+ly*vNl$n`5$_aV01M zpmlv7*@J}P{Y7;KHXkp|4?nR|e~*=Lj+9iWH${{=-ry1x|IjC%Jup%gQD{((S=XDBLME3OwL>_u+SyExrU~?u%Cb z;+u6nJ=59b7&Q6x>M--QjP=eS{9uEEWr?q(vyLOm=8=-C2cRPV?7VAlRSk&U4bD&g z@b1C4A8*>>1D@W~XKPK0fx!0f9loh{04aXk0@Op_`bO<7_Z7u91NZ2q>+fuRYtJrU z$s1=4Wa$8b3~Fw@`O^;GcQ&!rYtOZm4;Iz<#%&akxM9imx3vd$_yWS+^N&=;fZXOi zs}6vd#CzWX>Raby)(y96dUho0kY$Wjsv0ohjbbVX_M)vpQ+=d)dEt~dc2tA3Y%%AqA!o(5Z`ds{J z!2tQjECGW@M(zG?_NF)kMur!3iyL0sSLP$w2hT(1y;ZgSXA^Utm0r*C*j4W9)sQ7n z@+lpoC;RPjiXMhh$!^p4LhV7wVbe-lm-}tag@&z=;=gPVxbN1=zuCoc1HHF@udem)7JW{?N7m3G6s{%_Ur{tasYlhoa} z`?F$a6O~vsVA{ze&8{Xh$fGf>su|>GpWjz0_ZQ%>nYDX2Oc#VzYQ|NSd98Fd7$lG< z$bZ>PHu-ZTrub=sx0Q4Q9euC80tDKDK8l;LYVIQMW)rz0oVb4A7U_(fWVE}XwH006tOpc(IgBlIMHWO{w8$7d-fx3emSj@t8GT&dlW?6TPz&jgWuk;XsHG*;FnAz7KXGQ;{|gc)SNvw>RD-#NzWUkn0@{i ztyMf(urLsK?FKXHbTTvlbPIujd*d6Z27U^)VPQxEZwfMomhu^a?ISl^1NHngcYFEw zHB~sUM=vr+3j(L`O!;?)zz=x=_pC4}dh<8d^0K5jp?LV+nxxWYvz_YOmc{>AlQcUE zykZm=B=veFdST#QP(2Hr!i{?FlHCgpLEI?tz%tIeV7l{Zkeb*6Z@r!K=GYk|u(Gh8 zyLA$rsY27bj*J+>BH?l$jBtLp#`(RRMrO(mCbO@nX4$&QOBHeH zjC>;|edKZHLCpCP5gyg=u1)m560-?QC{axByHrs#VyQyy>Ed}peDd*thjp;}Cf`l} zdKvJjixrl7^@qZxia}=?&yAS7JblYieZdrg;085 zQkVYm#!crukT_=I%Wnh6z+%OMdUe_Yn_|Yg{@w_ zqRFNh?c#WbZJ&~R>w7)L*M9Wc3~$9?4Rdmd{w)KrJ^rezAlC z$B<%0ZN2*PW1C_O<5eMaqgLeXrwn_@iU4PpPlPBl8%oYNxxCA7Cy8o z^u0WizMD4aB@rGJS)E~xZGNJ#{k*eY?e>RFVd!NLO~|ixALcC;72Me5`^*dsXWpq- zZ}YJ!jJ*tKTUTcHL6UGU_ZpQDn+Oc=9{@-EZc~_?Af(c}PX?%Vl0pyrwS8^b_ksSp zqh8&%+oqW5qKo>koHzDQZzTI>;^#~1sxB)M>MBpvtKZ;lihLIXzW1dmp8dSV?&7%h z{jYem&>eXM)vnl2{>F&fAXYYBPia=8B zm9~^$Vnz_Q%J1vd^gA}iJSPJ3k@VdYtoCEJ*~Z(I1NHd&V;$wslTiHc@^V%i4;7N#Lh}gk8MaC zK{y-B>J|4THgyf-If9Tr^az}Ocj!mQkhl-*$iD*|B|nGB>lNl-ZHhH6jz6WUh`ven z_mM=gZTv*{{!5u&8@%fkSHG|+)-qlr2zTP*t)ol#-bd8$>~C2W{hval6n^!JK$T5V z=aO@i{XKA?}dY=>7+#HrPz&(Y66<~*UauJ5Xj5!) zDS0H4%PQ-~n=veZj_I82xgAOM3R#Fv(d1(3MgxcCWNadZs88nip9S~7EKiKQ9Fkn8 zh>Cm~^@d9e(w{z-^VBRP?dAsuMmoFjVA8qRGE-kV*HNtx% zNzih2N}#R3jY*6Q_8DKV_;I>T(b9{?EgJLu>T;>Xef+I+clS6A8A)?>ih#(G{dV+% z!TfsmPm}3AknktNJ0&hKBk7Df#e>Mp@?B0A$rF#J;U^M88Zhx~I3;BJI~g+T73*%; z#_#S8jO@%Cf&gkD38 z^@>qZHpSa6k37Sqzt0~Lq9FJkGci__mI zX^=>N9yvl0(`!mWy~3~6rhdQISa<)!@7(%AFA?4D+K}{@klFQ$)tpW7q08EP=*GlT zb3ba35~b%W#|;SaahX!GP7(cLVfe_L{k`3ho;$n!BRz=`OLo57HzHON-n!@pFG84s^eFv!VCkyBpDxcX z9(0KDECK{>Xz!LC8;?n4j*e;R(!=`&q7*a+rK6OhKr#U>2EmK!1HayA3p~PjmO^}l zx1~qyB_u8maTG1jj;`%@J21XDaB+R$ho9R5KY|I95Zn_Fo7xooMb!u!p)L-ztqZ(? zCx!npt1aq5IjwBkhR9QQZewhN`N_M#96)crC-zN`?CE)IQX1DHoV4XBvl05xV{L4M zTiV1^x*1n25pCD)pG8SaMKprr*oYPy7oAU!e5BmJ#tlw@WO*L6j(zFmV(R7d z;jg@BKN)q)Dv+ZGyPlxOlVkosPn0QZ;P4moC)&TDoH`x#q*&xhY;NxnXUxThw1!Gv zNssK7`MDnp+)I)R7KE-|7#j6$IraI*Q6f*?k$E_fwM0^vGuv>a*W7M?=mn zr^YO%LWY)8Uu;Ygc~#!9T>5O)dQ5eQ0zAqAtBLmto|TftWz^~kQ4u9a>>VzyPje1l z?7tNo&_cNj0l+=M^{xZU_BNA+h182{COkf~AoT3vB*8V3%lvK+7QLS`CJC`$cHJ0W z(naQ#QT0hBN6V>m8aj?4ID{a&0W`H6y8P$w}p)ST@@}}?G8si!KYW|qxT(4 zef@i~ZMP$`KCyod>S^pd>6c4V;)$az6c*&UV9dVegkZtD0px9 zt-F(ntzcyUu&HEyYXjkgCsGxyo2)AhYI1`<~8I_sUW(cCRPT-E@XKa8 zKi&Z$8*av+Be;}jTT;Zra!lJqY9CeUe5!Oaj_DRv=@xx# zuZ&08Qb+x{om<3Wgg!;1J6Ly?W&?S6Iow%qhrc5T^09n0GgcCIGo|E|@>J+2uM9;~ zrH*x@?0JlmR@x7di1g9@_B2Sj`%@Iu(oOIjlB!4_JvIc3z&LCiR)8-jo8Aa%9(3!C z0b7sV9O-J#($L%!>yKg{AX-m(1dqVq95s2}18ZTKTc`VJkjV#;$3b zRePx&u47$fMC~ICVRGDD<-n8?Cvb$2%HciPTO3ZELWr!z2%L1o6^-d==ruUETt0iI3ghjCoGPjNv;*OW+Kd_$BbxT1VRBFlI4=7 zrZ<#Z=Nu10p)xkLUo%Yxi?J^7&pzxhR*UV%D^Sz&mSvw@o-3YZ7vn1EYF*07zPME^ z@qSr|JSddBvnKTYdIOG*^T{_MTO~n}G#cHH)sZPB)33N^p=|=1A3aM8zR|D=$5>57 z%EaarV^>P9IVHC$CAT>x-<)!+Src#8Bz9?5G;3BI)2wdRtgF&&KBn0cq1mF*Y^l<0 zuhRTbl{&+my4jril{u|Rlh$O`Zs~dT?no3!JE}jq$;+!~Qbp1vE9i!#60ib0=^#00 ziL{d)@N~el6Ka4WKqMz_3J{N7b##~3CE?S4y!_nXNjOIfH~}wU30e?00HZuytPbx>^T`pbg1^S|rf-m6!w!+3m6c9y? zXrN7&A2qgpyxxmiwR#rs2{evW3AzO;XrcE42F?klNNV&Dc9SNu8ya;K3+OxvZ4A=8 zi3KXu)DP^+I~T6^CTeEf>iZ*X?RJQQxdWthg7FRk5_T)4J|Yn-f({~5iBx%0?BV;H!hdcO=4(?*GV~Nt z$L{1k6N?X$#@i$h5pj^+`Y%5FwVUiNDRYqe_w^r6K5s2LU?hnSP{|S{9iu;*v$>AF zY22*;vB*b%-KZ8K=z$%88ZF(t$FHPd-6-=}0-UK5b{H$oYN<*DxJ2L@m@!l$dqn|C zOMR6=pJQ?~dS@~wCPy<}n)MNyZC#q5PifZo(`>s5nbAzoj*o}9zb=*VDg7qVG+9n! zQkZ0EtOA}97zh34IEYF=SJO z@>!G_i%1>du|I$s53=Hky6S<;ccn}!w`3}QbhUt;AQ|B=iB&4DVAZa{2bsa5A!kd?~Ui>_zpTnp@ z5+CHr`aq4J!<(mBZz#!;H}3;DydB0d(?wpqd@^yY&u%#efr8qJIEa5Pp{VGIcfa(+gH3nQY0e047pgiSh zV#>aRbSuppCm+sG7WmbagirHQ2{`UE<*)#OJ>2SzVuMMT;Hxk@M4{RFlQYR^CLqa! zd#auF2T%L+KD<90#0RkctUn)!6kt8%9l>x9bOaU&u@F|SpL0dfO(;tP^{12r0;dn} zCOehQ0UNCDVDNYnVlIW~lNh&;Bq0-o>5A4F-p6Sm_*>^qPnwRBxn1s{cRKiRBE)?R zN}H3MjxxBu7{t@Tl}wsPbHzvme)Dp8BS_E_ypR|8(+i^S?NAo@PmSyj_YC34aB=X_ zs7bLV{6b{9#f%vW!Al{@1$p|f$Z?<|17+}$`iu72_;komEtn-v1*OwLX(~$ld4PkP z?FK@59|#n5GzS-3i<8i)87`J zjmSX8htgy;6;N={sVBlcW4D1!Mw6jy>Wx{kEx6bVhKnx@8c!rQtu)?`+URw*h9#9p z{24>k(VEl^eV~62!RVsfhUkmcUK{#Os-7DDyVnaS)zt5ME|sq1yoxxbRjw3!PMP4v zdrpdGGtxsBGRVOoYIXa}M_K;c{;*F???t zhpk^I-_R%4>U-oZ&8{dI975pztpC!6w??r>s=}hqA->KvY^|lz06jIjc1J;=VBCSks^ajM(8cn7`uhOE_n60?x&3@2tmED1cD9nrXau^@#-^?_C1A`Rit>LJTvLi5d zD4x7OJfcyqi%G`)?2D!zO%Au_k<-x>7!DJ{^SskzX5guI{)AE$s5C1{Z{E-0_d`aW6VD#kD`YP=%lwYk2$@&e7xHI9#X5`}p?%H<3D z(r4r8?+(!EbLBssbjzh>3R-rOmVHUfF4D3CwCpH7CybU&rDZ@Wq-9s#%4un`Tcz82 z`utW}2Bg07pLWofD`}5EXe+2orezpC_bM%u(=s<&ww0DbzMPg-(z4aG>>XORo|ZMz zSBKKFcv?1;p8GRhJ&Bg>kbv4Tvpij0F$urIY8EDU&@rl1 z6pe{SqjDH?xo~&>^Rezr1XCoOhk_hpQ{<&Lgw>gc-8>?v2Eie3Kc?(9%Brw^Xg`ds2AIM- zVER5>B%thwhkg5Dn9#d0h1U5G`=%(;`H#r4C?lMW!d?HBT_ix8oj*>Hffj(37O>a( zqXo(9L3yCVAEtXSqVh&qO;}Y*Npng`m1bbX=ra+TfspA+DYXW5Z=n_2$}%d=VAckE=n#iU^8 ztk;^I-y`HlO1>HO7lD4xF2FHt)@$2$pq6 zH{qi6H{N(tEa=y-pK4z}tfi&plTG2slbeKB-pRNxo;v`0QAjg!Tk$-Gs1lOnuyfc6 zY=h73{EaRBB^Q>BE?R`f1Dfi~>j&@0aoVZ4Bo%Qy6LH!=@J}0r>xE?O30&N7hfwSK z&+ZwBTZsm|j)o+E(2~4ADs|n*^M8v#LnVC8A7&xT(PY>-h({Gf$qx4um>rMCm-{dG z*XVwKn6E_f5V^{YS?Sz9L285 zIplz-vU%^-7QHX(z^F6`TM;VC-=2#~&2Jg8WxJDK;%R1`Y!MMF_mk-8zw$@G3hH)6GbAF4HZ93T`ZIbdHjI7C{$un^|>V($? zbQYaL*Aa_mLF$71C3FJrT~L1seF1eBpmYn;1>hPWNR}o`hi0{)4`EEypK2B++i7x= z6nf$Ycr{=Rs1^F<3CLApy8(>`q5%CDdTj^vR8j}sG9MKn_AA%epwBr(&h2OTg(;YT z7IEBDB!u42itMB!5oFk*-8tB<$S0zOvwtf=g(jMG{#wQ)w7@(Mc^0Bl7=Z)GrfQ~I z9{j32_?7j+FRu@Nb$#$F^56~2l)Gl5Xk!|2Izq_q!IJ-pum&vIK}yD?BK zU^~3Y4mfqQ_Q+c^_nDF8jlP{ShqOt?dN@27X{QI0@g$Of!=#Ldp^)S$#xuGZ?Kc|= zQG7f49=yatH!;J#14=icd>yq5jtW6b-`ht}BMF`5w=Q8SbQU)fIWRmK#e+6h%F_`v zq2dHYhqG>Ay1;{pTE2k~MuEH^ z3gBaqmCx^}`K_mIlM)Tem2}x9h+L1B`vV6|Bq$Q-1vJo?*Q{|fMl`y8x!6sCYTO78 z>Nfc|x|ti@etgX>fH%Wh4^;|Xqg(SDH!QN;Ex;a}6D1tD!EId>fsI-07RWE~Dl|rk zeuxN1v0zcn!);!96~hcF!XJSdqqDqrcGqdL*Qp3>^+q>iaJHr}GhVvTE_o#$+h&z; z!)JK&g*ov{bL^5;AsBYVE@}3j8nUY;WK{x&J+(>lGFENc7tSd zU))wEDNS17Gdr{2$17G#rmyOUE9*8$jNUbpoPKU`8zk$X;`1_zRpP8@NC@{;tbHfa zTcJc=cn6G=X0Pg%4jd}5?7Fj=GbPpQn+GZsxcN&oIC0(7%nA4((1ofmcL~#=3k`rd z1~bB#aE`AHaIb=~(SQj?yMFS<`O`C_Y2LYoS2zMtFf1^EJl(1iD(4h;i7tsZ<$u`44cm7^Z@|UnQ2E$6{ z&jy2RIcXJki#X-RJ_HPXR$x_L@I#o8C!rt&sSrUtZrj-y-UMsf5Al8 zkKc^`N{Pk`cm*2->uGSoaAp4$bZfV==m`b~Szd{zx(Tghx6mXsk&!w~$pzrfsi!^s zLNp?3F<}NwJ-M#m@i8Nf9-QRQC3%2RViXK3HXL;zr!bNv;16=pKPm_HqlH-`Rk*S? z8#m#w?iHz!x19_ghwTQxcffkw1hbkn1I>2*e9BA^@BEpebSNo1!?5J9Q9wB21OX0L zC|))sDJ!R$I8U*#1ESz#g1J(soIVdPNGe*6rVaX2Gw6|KuuwCY)(l3P!K7v)s~IfQ z4C>Ylx~Ca*Uo+^TX3#Uu#1WdoQq9C9&0t)U>8Z)2HJK7krc^U^kY=!0Gw6vXlNx>H zHFKIhs=n`6itN=TC?&&MUudDbFM22{>4bPKc$;dU~!RCfXCPWK=SQRU_Vk zkdVc3zA0LQ>tTXHN`{FZO~6{=ZxTz40^~0Rfl`7;xjYjcKrjh7%Xte~Gs$-Z;H=IK zVm4z9~Y$>IIUN@a|aU zJF(XAvWWkWvG)OJ;>aGyXS18X1lSEhi2Pe-lMqlKAdm$46EF#jf(%WWi}2bP5Ru+6BtS#{%8Wh zZ8#Ll!rE4R`%D3B>G-GCG zGeK~}^5J};s|gRGQv+#dMI+88I=iO#)AUu5TpL2p0qYn+(t6N5o;@y-rht~bT?oqu z`@g)|vQ}`_C$f%V zBrZt@Ei{XO`PN+7k%bl*RU24(bD9_v7l3t|KbbZHSB_VPMWIsgGfF*k@(H6)WTvw! zLTPo0m>f6h`(SphScZY)bO!>HfqxCGwlxM}vA7k<^3W5EHbLGrZo zCSu3U;IBX;KfJOPTc$g_r)B@U-Bk<2xIrni~2#)7X>g<~Z`(tYB@3-Y* zr(A@!eY0qGsUpFtQkN=f-(+qppi@=)7Q7v*Z&A=Q%Tz(f^MW=2{?52+^t%A@4Vi~I zfWS=%m5E`yS15O{2BtQBv{0OeHjS29GMs zx>=fq?|-g&P>gE?RhMmZ$-=@2@Heoz`|DKmxA6iQR5yaK(K z0Z?n>brDi7Ab~Ha;LWplKg{5*y(e;}tUW95LM8lGxPNDi--N}|{Py2Ytd~!LT9M!W zYrWIEDHA&+ka6?WXig&0f(unNqW`my887#5S1K{-9KSz#%0q1hrMzo*)XRI6Ljh%0 zav^~CbSwQ%NyU`M`<$K_<#&eoZ7cuw%0D;0h(zAC&hK^dpm~3>%m0KXq@TRRe$S^9 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%0AwO>EMMj(9N{qR6nZ2@lbdJw)fL_@(o^vc@4}Na2 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

KbNmrD~ra$tZ_p^ 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�TECDN4!8e|VK2o5Rbu)K!>Pbfg+%VC$zi zSxK!{w3ReXcnM9@v4JRe`xx#0qohrH%}ZFg+*Pg0CVd@TB z?vP<3f%J718Z&DbY~Z!eu843&=_0q8=G6)-nQFT@zi_szaL!QA{0$y;Qv>TuJ#=A* z7(s^{iCl%Dmo&{A+%N;C4Q@vw%~G|PkLaQKT|{Wu7YP3QJ1-w5$baXR*z}n@Xlav< z&>7TSDmgbMfhq0C9SV7<9JLZ5qvcJ(~X7i$CL9?4?VGLhs3hT#x2b ztqd`YgUbzV1-ha~6#1Kea&5Z*$wn+s8rT?BDHd(|%(ZF!FMhl{Vg0&H+)wd^e{gNO z@#5696!RVcD_`^GOPnBzJ9>e4qakCzd)-)HW@wTI*JS@7+hQh-j}D1yC3EG9du-G|#xTgv!@CPaOFA zdCc|>8@p;~9pm!VW?IPh51s9Q{6e2C<=9o6`I=O*+u43#;<-SOae(Fazc&0uaC5l4 zAjDpfeePipSe?e@aWQwBNN11cNNrH$imz-NuR)_WLa`~twJEBV z4JQc_k0eZ)H8}ks^O7nt_+%4^+T0fQ?amCNg~^_Bch@G**B@YSs<5%E@6?SVvbIOV)=EELC*#=60ZkSO|(m{ZJLPZO| zKDb|?J*$ydVyK7Ruj5W&B`Dz5_g@el4{;t(`qH!<_W|MkOOQ)N?6iql-98nICV~jD zO#p&f|FCd(iEczCJ09aa{;1>)Y@3}nbE94P)L)#(C1fx*!bOg)-!&9~QsNCvs!hI5 zZeJH`aN$um(dHP=L7y8C8nKBoKeVs8ct5=e54jWX!7DPgwz9?aS$rZuo$(cEG}#pI zrE82At&!W;eEEJx_zJ(hi-s8Diab6YrFF7Mc}C1{2Ij*CgPDZw60v>FQu~^RVV{(& za;v{N;zrAx1g&9}gh`he&}I}Kw66{P=*p^PoMRv%D+3T#l#GY{Ou0QXHs}Oq&Cagu z*A_?_)UZsxdZ~SNt?3zDngmwPQxY;}0JmLr(7x)Tdi^RXn?BEt&}MB?WGuC3Tzo-T zf!ne5_ddLEMP~7N!F}2EfmK^T{Pa0{d0>mK^C_AFhva46f>c8&yLqlrovq{6aQ!L`NFD8kH+x~`by`UY^7%Ib}zI{>H zroHDaDxh2ink73ca_O720SK%$;ewXgGPSF~@8&nyxmR+V=1A2B&MeBm=gNQhR%s=k zxczBpO+iwt`E1C%3X*o)yh`X(VJGt+xC)5wxD9n|#?b7d-^kr%2(x|kRp-%*<#IfH zWehEEl15}orF)%6pM3N(7BR&Z_K0pzwpF)weJ|Btl+g$ml-}+!T7U`>rOd`(V zbS?Imp~h^aj6qL)Vv>OTQCjHC7V5HsmH8d6{H{5N@YBHBxcbM20#UxVHZ?$$xYV8$ zyC$-{M!N64{wp#s^MF6foP|<9mTjNj+Ft_ZgM`bW8?sdZvAqPpF&drk)d!r>>5^xO z5)aywvR@~+?F?w3y+#NE&pn-?BLp(P5y1W8AJpMberQjs-TdUvX8(Z_TJ91O5g;*b z-p7OuRR#)YHt64-tp~m$yWF01I*;11bM{lT*Bin}kQjC+KkCx!#)gHY9rJim3ihqJ z^=a)D*(_R8B4N4%<_!t8oqi#eOzRqv9rN*J*6HWA#_Vgn6JybSGH;YxUA3xji}1`8J-fq|Ch#jeZHyA+27Rur%bLQq1D9(3~&TK3E`YdG|n`373^}>?8PjZjee& z9N7Ii228gVa@$8K$@T-sTd|9!vxQO31c{t2vBgLDnUHBnN{c!+$Xg-Q0 zy}xgvC0i}4giMJ=;q#->=cn5KKjAL7l4GOp6o?Lg?|jmuI3@uPA>mv)D!1rR;752W z6O&>Q=#nk6Ck4(Yy(OPx(UyX+fkzbXvW@sDJN%6E@WtoXmE-4U{DH6K%u+&)yBhS) z*BTB@42nIcx8Q4RevCPknlP|S!p=nN*+BB}tIoq8e1#nP(9qa;qz*;*a)pPtI}g{s zvhJk}ThV}P=r#G_c<13qKUQOc8C>zeyaB1`(D%;69%&1BZAS3g%vUH53!I0&HS4iH zs%-4~i6G-}oXF>z(dXL3uuJ?fx1nE?&YgW$c-820^TS(RpZF zeKSVCirYMVN|Qgv%2yYoD0K+ zTLGJTCy0~D=DPC2BEH8aT@5x51tDdkzCh@>h*MuRg5)9uH{+Y|V%)_<}}0=R^CP zhcC>=x?FAB(w|~fLixdWod-Ytb_*`bw3S3P0<7JG*~5=*!;W(2Qz@PxTJ%5RHQMVB zeOUc4&CHFbi6XPUKU;JVIS&?ce~Q`Qzjr=op+)|b=wO8N;I<-7#9Ayw=sjTNazqE? zod+L#ds{i4?)}K!r74$?7Ix<7FZc)#u5cc#9Yo+UVzZ4+=nu$zyzMTzvC_5i@y~am z&r~csM|r|{Em5|y#IZjSi{Q?ukvE1XT) zZ~XH(>u@l|KzmpdBEaSN{g&XClx(p(ZN;=@0D zY(AVpI!TMiq%A8&jqf@ezl!cCE(o|q`;QROp|K*}+*n29XU@j&ice#A+RU+u6Dth{ zjbbD1+Q_&U;IeIiU4CaJb}_YUqj&v9>=^58Wq3VA0@p@K_Kxk?FK%PMxT1Disvn9> z{8a^FlbH6fw(3hZ$v2X&jk4I?nE7>VS%3P_Zt}oq&I4acuVUuQIsK?q_KfquD|fcz z23fZ9NHrna|BQ40cgDBzv~B%i20Fcbx z<0>DC{#v$Z|EtdZKYI_BuT|H7b6=fkrR3UPn?LPwSJl!b-2bj~|HC14S4Cvm_C^jZ zp+$F9qWzc^$rq~@t_a=Z4uR9NTs1va3?Pl3*jzakH z>%h7(`fPmo#yBp19N^-ldotx(qtDuhH}Uj5jpgtF8QKB#tV*7n?8<#);iFh(S={!} z0pg65q+Pke>^fd)KN%nREd~l^dxM0gJqENoYN;?+>&i72qb2j!gYAQ1UMO>&wk=xT zu)^7pExL_Ww4U8D5f+@T7S+G&tba&+fjhkh@pxFg#VGS)mOu0ZbA7|1+UOfjvdnjX zV+DX2{mbSUG1qoPRR5W?K{D&l+bRN#4KPOS6*WRo#4yM^G$|>2;IE$yAnUI?8$5m| zEcI^;Vb{{LhlsxivYgE#)_sQ;m1q2A-#Z(;Kc+Az8^DgCA|nY!^%2hcZ6ALgzjk`v zg(@lh6b0!)y{JCkS^wD6zl&K5_eKrvrbT7$qWTri`r0iyTh@3qhKyu5lFSe4Tk=E9 zTI$Dh-#ZdQb4jtTQKP8e=&V05QG{J@3t;U7Cmpw2{y^q%uAKMwxT7aDHg@@deM}}h z=gN8Gg?F)TH?S2$i$ap;i*h<$IWK7Ke0TSAzu&^-`MTjFv`4kOF49EixLi3se_XO* z4_7f3*7>D;?+WMM>>DWML9*ToSlEl=lip}94hg!@?|BioX2M8?8hD24?`L2-Hw>Ay)BrIbfJ8b z=hE)i-d5z4xpJzqNbEFQY^>dw0JByY%6t^Fj6Sm-zVH|>-o~+kouRgg`HqkFDjZKL1*|^|=P}iM2M--Fdl^)_b;j6Adlx$$O z?!hHl&O%pC+hj&m`A^+zmuwT;aUZ4`GSk@tP0_x*=O-}2*T?tmtJ`+1q{C!_aI4@YlfVRCIF zzr7PB_MS3&fB&$nd)F#i{m%pI(bMX5?RxW{GO`HtaYhSD#y0<@`FZVwW`+0nM(-bL z+`cE|{h z+yB+D-H>XO*L?4+d3byb>usa0YAD3fp}$3u*=4Tm9miWXNV(lZ%kM~K`L683WplAi zd0_V)=&F|2Y;@LaJ9HmI<*|>OeF#~qEBn!cl{lXd9>>mH=`YW=xw4l?8?X}dZPlUv z#DxLT`$q4Dro#i)6q;j7<#Mf z&VpITLT70&*O6Bhwz2AL!rW~_g0BX3>yE5Q=(dd2gp>xhR9`9M@Y^qDFnAuOP>?TOeGZ_N- zv%5_oZYh7eOQl&(t>`4F>Af-(sVOUWNO6iWZXE zIjg@-u6oH9S07|k+D>~>Li)54->ixRFIKsMH>+&I7psPG`oHtt zRWHqndi#XiV3nhhgA;TZUnc9;@jEISM|t8`>M=+Rk&GBU)AWFRc5|| zeX}YDHyp)jGw81B%`5Axy4F`^!RL(|uL{oL*BEk?{kqwZiAVkMJBz)5btniPG;dk9yKVaFoWX zY@r>B)9tJh=&jJ9V4rj-n%i;7YFu)%oj$&L0Q7gX#f^%rW z5PqOI?fu#FGXoh(5T|6@WhU(n&ml1Eltt-I1aWR%vNES^tVMRv&kfWKtaf$Lttxafi%0_BnWV*9lhMTiTWfO!D^&6TQRaW5+KZlTdTsi^Sn$w%MV!P;01m_5KTYN^rPz^MvADG6Pv%_x` zTyx5-tRKPRhnH#8)TLc(&$G1WxxJWICTz;%GwF3XetgcQYRa>;)}D-F+w;cS^Q`T8 z?mchjtu^_m|2#@u^v2ZvR2cJoUV`;Ff3y$T&8|BbB2#?-} zY#(f^gJb1z4F7e)+HpA61&?2bW4-X%DmZotj$MXrSK;_&cyb)J#KEWQVAnWo8;7R{ zVf$q`J`TsH;1gHjbpl?8@L)N-9t00p!Rz7hdK`Rm5MED%*URD2XxO?2-spnYG3j1- zqYgH7!5f$0jmxk(8rI9;cp5x`tH$AtDcE)y-X!2n%>Ot%8V7F%!RFhrx(8Ob!<*so zW*ode4sWKxy36p%Tv*!<$EM)PIM^wJ^;Pg@E_`|%K2;8%ybn*5!>%Ccybr65@CHWG z2VGc=1UzJf4Qt@h6xd{hO<0ZX@JSiGUI*DKcyJINcfzjQ@L(<+hwyYeJh%on2Eo%t zc#?o!xv;YjHW1Kx8}2v4)*g7u2(LTgQ+4ogAH3cR_f)}}`>?(kKCuQi$l%F3=)_Dy zSW^rSr@)iFaBmkpa1}N-K_}K*96Su+Q!;og2p+o%Yp+7*6g*fA+X#5@K71N8Tm>6% z!_(pLWD4x)g001HZ#z6v1yA+C_B6P64eU&TPdnkW+9eR0-h*_PRxK2HfrFhAXr-r z$8+Hm*mE>+{}g<34Lno~kM_YM1Z3~SJ>&3DJFJU_d$189eC9H|5f1m?hc_S`4~Lz- z@Tn?zvhc}$C4x=iEC#qm|AAH6M_Zs1|m*BB-`0OC8?t&~%U}wGxT`6$94qnHe z76)sh;nVG~^(uT~9M%!=$#&QY;f*-h)CBh#;r`pu6$d+dU`HH0AcM8xuq_2PUWLa~ zV0#d(zYm|d4Ug2paVNZy1{<*_48lXez3w zZgb%Qj1xk(7rF)6u)4j;B_ze8N2>@a* zsIBc*@(=BQsJcT`T`T}fO8D1bY&p0{JbWz9ag49cVFSPXnm_*>m>XV{H+17#AqoEW z(BXrNh;uqex^4+h`OuP||H7Z14&1sz_I8EvwUb}!wJQzo0ocRv!CJn;K}XD*_%n~qWArk($@X*$i<62vdSCp01buR*tC`8<%i z-I9l9O#h_U(`+y>vRYQd`mig2Bef;9H9?)IR{y{Ki4CB>2G0`-;E?2hsy|Nn|EW|! zs5VclGY%K~0O`?;j1*rhQ6!)RZTPQLP=^0i;#8ZUQ-D{bd=CHK6R?6Doa)5?qyh@3 z4Y;flryMxtgG<{;=d#t!AHYRr9IX&c+udpQ`fNCvN_eyoz7t<4RBw*S9KTImSLnt8V z><*Ex`o9JFzm&^VtyKI^Nh-dR{i7K4ye#Z7ztRoz2SO#GaYSOW%{HKnlTKfk@nPLR zkd!9zH!0iG-3W(PIYTgh`jq~N&Z2Y0;=PaqCJr7Ga`VO1Vg4$F=5F5$5sJ=+GXB=& z0^2aJF0DbOBpKeGOo(_!SG1^1AjFE0?^WzHT-<4Jf7S3_<#t0Ecxv5Vzvkd9pFL}- zFRFt5v)l^TcJ80t89e3)mg0_RPW&+}7}dN&-ejl^|FB_`1IWa2okCIf!PEJRf+rmm zR?ST!s~lh}3vCbn+B5apvW-5r;pecyNCr&%RJ8>V5nY;g{8QIb1TJkxFI@FVdGNSL zw9Qc_@EDF={B?E3(ail+q>+EHq+D9TksSrfZhLy5EGOR=nASG-{Iuk=+Q;179qKZH zEYjoCH%|v>{}9yRCePhsS|6|7yCnps2g=(tVpcipnUI>6yQjG=Zo*bk2_XY+!XLhU z;e(W@##|u{)=dgaHVTz;E!h2HxDdpDZd2VmB=BdYz+d&Soz-yYi7Q6MPR3^wu^rGr zHS{F0l|Nc_WxgwP#53}x>Enb|`ORqIpztiwDrk8_m3lz)v0?b_Y4@`>}UKRh^4KZzy@3%4RM|5P^KDejwS(AT@?f?`}9=Zky zk;!f#h?F9og;yM`b>Do^c}2LqI&x9dHz;bHDMJjb#e+D1Zs}I z(%W)sT2I!SzkU<&XSeeQuv0957`!*<$x*C|ojEFA&G8qTQXGE? zDt~glwubgk6A)3pZuyd&XR^AQfuy!F`6J?YLI>MS35(W=(y6F8M_h#tHPGR<0Lgzp zfyRUY$$vk3;mHBU0bgB005jk#{y)sU4O~=J{y%>1!_3?n2Dr=&kMeLl_s#>u3=9Ye zh%f_)sF(u|I@*Y%q9S6Vp^;$@NQyctDjF5qU|2}jQcD|^wqr|Wt`)V|TG>XM?OIvU zF72XU%HO#IK2^5;zOViNUVnMb%)NJLqQ{(f;Us6cCx$ z%s&{tG-rYpFcj<~>ieh6dNz6=*BC((t_vyzW*g3&DynhCHo4=l|wKWR898?Lt4R|9YPsIs)+#j zRVW3SMmZ^+X#8EiijqR%*Z`+cP*OhN?~;2|54`9~cO|*f0SnSy$*zfDf-4myxeUbh zv2e?Wwwp(}HhN2~C>}SDO{yj>u>}uy?til+J>N+AyU;rZt7!pcwU!X7DK?cGFxlx%dg72U@CK!K2ldV1x`K*k zSc+x3)%g80~q$e@H%z6hA-MBmrld%PgYn|7ylg4d+wYjLGv$NCEWELhwP?+UjxfubSra&_t$BEXAi6-URa;lZ+l}K0j#A>Kx z(kC!7m!3-m)F>jq`&O*t*o&{y&w<|OAI6R5{+`r^)<+~a0C-uZF;C>2YLif-Xxlaw zg#22x4M8~`yGNV0=2%d>E8~E&xWtIxlE70?>XkXAQ0x@LD4Bo|F=A}g)r zVgab>4AI;wm1^QC5MRl_dmI#edJ5%V^e;#`lGx{!pWX<@!R6JxX*YG`=?s^(c(q zFc?EKc#pNMiQ2DXQmSUdsE#nnl;9Ll@PuI9*UyU&M&08RUn6WPU3omS^4N>wbBZSf z&;C`f#X1v$=UM%{bt2PUi5|V9&#)?yNL-aDGp$NACw?-4#E;+wea?=T=MTC%kY_Si z6=RPnAB4b-+YD~Dp*i~#zL<2nf$IvB!tCp~ZNN&C1aX3x0t3k8>ez&}7I_CU>1BYV zu3Up#_uE2oA2+T~wLoT?mZ?Vt_-)|&;X1%VwV@=S#X}+(_z#kp#vcz!RssKFc|B+a zkAuBn8CXmdB%#Ksq874%Xu&Wi?xR$d;Zo#>{y;9#4&*`eKY4sN!-H;u`Q)xIh!f;C zvvx0N^ihVuk0lkbbpQU>(Xg`f?3cLg6O=huQQE=9&4YSYy23=xWAzrx+ zfLF>M#7I<7J)g!G*p_rFnuSI}6_VWgxWh*8w4Z=WUS~eoY%gV7?jVg~{cw z&(%|l*BL_Rn>XD`6q0y%AUBDW5*Jf1%pqi`Q`QP(=H)S`quRhlVyfBwl<@@#z2QCz z#5*lw$O@E0VbvLDWa91-se<(Ny1ZuYSe)OI3HYBWaVCLBB3e?tnp-k!n@;6eL7v5A zJ59%^lPG`Fj?)^u+L)(-!XP-wu0{r>K!t*kOChivl^MSg|FC-9HqAq3()XVLc=!=> z@@YN)`EG?VEmi-;ZZuQZvnKKL-Fq@F?uOC>JEuiJUfM)MO$NDu;@lfh)$Z7bch8H` ze4jxYz4X|(JTj6&&YFxVI{N%K{>I^q*pZkx$6CJGsZ~L)ry3DmCGf5*(H4@s9Gz$U zA$srMG$*nsqn8@p)sblYnqc3=Y(4ru)gkS|_tQATNIH7z)g`e7>mhjZ*sGX{*;p7b zv`hWW%Di1f5d|O7?+sSRS@%HBu!kU^$f9B2OKPcya|;1;Px>>&6-+$6?p?<4ts*XL zE6Upy+rJCS>-wc==$z5jPcWFMX!9Dv}A~rZzBN4o2Yl2aIR_Iu$us6V+1{R z%m&~vxSs`tppe`K9~Osv0siKjt=EiSM`!Fk2Tl{WfuCeoF#QJoMxG_F$TIen!2_Aa zl6%LaUxVKW{Nzz%-f5#MMgQXK$i-dRS<#KgJ!)aieD}wk;j{$vHeqTzOxz6P9>siw zYu$A2M?Qx^R(yZ;yNdn)D|O(fYE;B`Vy|k@;hN-)S<)gTVlDUvQe$U+qafd(2rm z4G==|C?57ZYRLMs`m)3Du+B3`Fl|>FGKs5HvCG|SsGpcazNrQv z_Wj*L4HQ+K*1zz#nE46$Hm>JyeEA8nd3cnQSE0yv%0J{5{vBVa9#wX2>eC~XC8;j#*e^>q?kMeBh3Wn-p>Ysz3H?f$H~nNbgBCKRO;x;MYjp=05E`MW@A>e_#)eh zTejF#GVTxDsc3v2!!Km%dUK(wrj!L1b3Xjq?b4gmAb-L&zu9LZ2VI1Upm{@pqtQcK*#9ulojJM0WycV|6UIU|t;qOC7j?vwme^^{_G zlBp!}-@?A{wneh}9XW7!7e`_s%*3;POMlXwfzFpD>cS_w!{LY%Fk9`( z4Dnkc-|POyFlDNRFM5bp8RFE1{|F9`tAOIl08Gg+-zKJ!N4boyRp{a>RI^HC1%>!l zumRM!3W#%jQvfc+8*;#OVg5n<#%!=RIpfXM1M240Laje~P-I4zRs)8H!aRebL3{^7 z+Jo;rd~b?OvJU5T+a7%Xbk;jS`#xstiOc@v7lh60t{=+fCvPB7!46g97S!^da-fPb zkr=GMsLD*i^j!|%Bs#;yUe7oTXq zqW=5|M(t%mfDD3?67J%F$iui~PW+7d5&pyLGN;VNxbPh>#jjB2lH#*2_4*CSoQzXu zW;~2X>Q%s~A}aw84if>4z6H}?Cs}}rv!?_Ph&<>dgwfC_2TX2P+mpmwf@XF8Tm$J- ztoRpO#ZKOISZ_L_nOrVnLzya(T+nJ2DU@wJPe!rJ6uYzB9g*nckkj>TTw(p9?MZ0I zV|mT~cd3?Ixa?&Us7P&l7m$1_$fPY{e{;3{d-kX85BFYEs%Z6*F1b=~R#VE*b>UVs zax5p#cwbM}wuhm}W8^Y%x<}XQFB;XSEDZO@F3)C&9$hib+=oKj#WogYmXjFpy$M2| zSr%@EMBT1(S*yQzOq(1rR-zR?xK&Fe2FL#AgVfC&s0!KZAR}2cGP!AE48Uir~2fpp~j8*At?}t0|CJf!qQrWlMR@D~cBNvR7Wy zFJXxEraER>6$50dhc1%Yetk#Qr*9`@xlPUfgt<>8BFxs{;`|KrN>sBFF)KwL(1N?K z4uG61fw%#$Y{xy>Ak_LQkI&uHr2pl3}7d}-sn&<*M zJq6zOq-UOB(1S4^eBmPXYm;Tp?s5|=vwKS3ZfbnAsy&b)oAA%-d>ULB z-kEYzvFBOcs`rbV%TsG)MNf1jd?v1UX4x}DFXN_q2s{kX2kdrGB5U509jhpNHsKSQ zcKJQH-K318@wGscIhW$i-y+4`zjLV@J^9WjQ>Ob#2OOJhHC4Zj|5t$DK*wxHovl#| z6wt5B4+iZKJyIq}h-5_=Ozvp9kEf7v5NyTs>U`M`d2KXSz&?DtkfR!-Be7y@0XUW{Z7s zFpSCqDjgUI2r@dRHv2`E;HAsxz1gJ8dPmK&`=pApfU>2#gZ9C7&a&O%4^dB5E*6`8 zT!udtwPI1deGv(QH0CeMw=%3S`8(K_B$=;h#(gtAttq1?ngpn@?!7Y_*z_)O)asmI zZy|lLxo;f;0{Kwo7i^XCyqa>`qzAb`Cl2Mh{2 zoFE5SNx3iywIeX+yN>hAV=fkZTqox&{M>52TLx&!&~?n{loJAGTucJ8{I?_!bb+Fm z+N>{?FH3LrTOR-#F*`Xden9X3RtO@L1?;!R``sd%d2KQuP+iVpoa&$i6-QU+%&`7| z$Je}vsLdH{Oy8#&!1b3s8O&Bz2Fvk@1P^#9xmo{!?IzJ5*(3dKbtu>nt5JXK-sCGY=UK6G9Mj?9?H5$1=T~T_B zA8r=_gwd{W+)QsH^T6nHQ9w-IM(lynv=razKQH-=X>N~~i~OSAsuqF>qM#CyC}_%4 zAgGUmdkugHtm)mZ&M9U2*gQKNG?%JdinMLTB5q@82{gG%ne=8KRl*${YpO5%cMg2c zRmL|u;rgLv!k0%>k)wP`o3>nMUk_C?m!H(Wuzo2|uS{CB{IKq|3Ui?P{q^DL?^nF2 zZK=>z-kW}`0tQULgs5{e{=DW^K6FdKEmkb>`k&`TP3Qcjm>FG*^wdMZvzQvq@2~dz z7i)L9XX{6zCN|U(9svH3&``^rsPmw-YU@c|Ywe*vK7yK*sS6+_49AyXvhb zZRTdXfqV7=vJUlE^97NpU=#dP6G`iUPpDQm-+x~|nl6s*+N|Zd+6_AI{WYtLw)k`B z?sqIFPYR)|#6fY%LP{&%6!!9xhcSw^%haq2O2amB>;pZUGHj{^p&;J0Dc;7Ux2S3Z z;|n$!yBNr_VFWi`RjIo- z(PN=NPVNGdpA7|yN=j@g4=pK9Ik>nWxowdsC1{xng1a{mQ)OK86SOegs$9>*(7Y!y zk3TWF8aSdwc|xQQa|ZqS4r3lLRs$F|bTo4!nVo3Utm+DaBf4TZv9e3t=z>5!-Rr(v zU(uC))e5A2ysXX_QC+C%^sLa=Cd0wwb~tgbm|3nlQL2C=P4akE5}bIvlvxw^19*+R z$Lqeo%rIO=`TP@v4n6ORQFpvDMlR9di(Esu?&7pc8K0KkDl>W}qn@;QlNqIC`*UCa zmWk#Y)3~H`Ovx-}0O^Kg0_bHfYk|ym6A8+S>pDpYp-Zkk%%}pi5P9FUV~gg^#R^j) zJ9;+(F#WB?57uaiXyvsH4iGIK-1Q(>H4V5Q(qAm(m>gOz<}ng5r%P)xx&AER|8VCo zMjRZN?|6S*#39JlaXk=?A2Exk4T3guJ#ZhsAZDr4A`8WNEyz{Jm2cvXnsR>3N}IsLw3ps~jrKUgi~BWl!2~sIu3e+EYJRK(^b7fOh(P zd+LWjd6A+jpO~EDa=PkR~G9`0Uc+K|gSadBQiJCHvXYVzIfMPj1cUf{%aLs-h z(AT1Cw*-S#tf)5ZqCay+bUkVg-&X+d-!;!wC=IGG7A!nIo{;GVMQT;F!I>j8(L=$} zQ}8R%AH^)S`g|8I@9s#`*(fD<;RRD)0vo?Sdp~O02>n$$LhwDrJ@YE!R_vJ0^=2mG zZZ&4zk%^Lr#SWKSePx10!qJntkyt`7Hn8No>ERVzQ#yAnc2rC5ejdFy$qQJ~fz+h4 zx|){>5OmmbtVu(LkbQ>42DIAi3weslPtJ z+2W)C*v$GV<#X?ODfMksWxy9k)LbQ|h@}Jxb^O7)MHw#Vv zRIbQ{A+X}xT^_|LKbA20lg{ISk}KMFt59zZOPc(NPyiMo&zmgODno1`D`}PKn9XG& zER`%K1Sb`zbE{1L3c~~3&^^KjbgIq5i#BhzZ!OZdhQ})JPWab-WIf?RL%TtS=BTxE zZ}M$Lc)Vp`One_x1qDg|HliR)^+iEV{{FN&bn#QkbRmc-GvB#gmgu&_>_Xs&H^iLI z*d=qTO3m&tL+AUJ5ble)au9p2gfH78hK4a8rK45-*K>puML&4D?v2lyk=(F48ZPc2ylc%?WGIyZz?iT5967z4@)m90yLPj@BcPmh)udTpDUVYY<5T4X3ZE_cBB4EL3;o59MEK zoyqnKY|NQnenhXmn2K0EUeH}gMXq||Kq|-TjptKsKM32-rJ_?$qrn&0KX$(XXI!8I ze@ZNUq?>(F0t_#gS?nE{TjNLEm1UMVyq=Sp5dP;sOb-DW|4k?Sb!(120Pz1iZfuVc zUq1r)eHAIRA9jJvv{$5O?F(f$dna6YC=oh$2O*3kd6={nQ91h){vkTufX9$q#~j*c z)aW~su!Tu#vq^qzL!*5|OsqBj2}a&wwo9ZpTQ~%QCk!uLfdPA_|!0PGyNgjO8T;SH~L;X_0h2B=gI-d@VRK_VSn z{BGrtHlaDB3Ec4-Jrfw^?L^*z+Yv&MM_BU_!7=$)poh1}zXCb@wd(Ka*2sF_Pv6jh zg{5Do0lP-|^r+|WXOv)JpKxmt_WD*WSlH81F<79t*Tvv#J1kJ?UsQz0ws^_3Ydi1L zhJ9ysFK$~m4&{bSENtI3wnY$%#|}&o4`PAdcOZgTEF5NnYrG&J2y(G-aDa1-ZZUwH z4$*f=!bP}AKo%~AAH4bSt{u3rMUa%Q9b$`57!VGK@sXXXQFYmOZAK4~^_>LW&m4R; zO?XK|y>q9vi4iW+c6{XcxU#$yklm_4Bj2^+T|N!kWuxd(4VteMk%9;fZOy>XZ{SuT zTDV+-;vf@_#6ee5^r#liG#>Q3MT{n`KchyYPgI_sF*Ul}MEcZd=V7u8Ux1gnW5J?E z;M1d_`>tn>Xq-tTC$ygntECX1dQ5D_J@@P6@u@+}~_Mn(#4;JQXlk7?B0`|S3mvgW32YP1c+ zUl*yvXbHaH0@-rufW43sn!BJ=lfJ8YU8^R9%W9)aWejZo##Yxjn-FCClE#N0tjCvk z)xD5|3i0(zTiHO5U0COxgm78MWNqXKZaE2q7K?Uy8utIJvMssM{zetztZ&b0 zW!CP=>sgfJp(YQxkgmACfHYcy~7ZmQ62<8y(poFM7 zzF9b*&Rz4T8!C6X3i=5eH-?&lg1T*`8N`iRX?^-OkoYv~>k>CrFeqwa1;80&4A5F< zOlsFaK$J`rnX)oHdeh`gB5`u248NN3D~TV$s5{f}OqMILE6YcS1W*ym6=kt;d3o7I zS#;dF{OsZ^3(ybeL!v0l92YhF-}nv#(3z>~V|GG?p*nin zPS&Bwe7?(0F1aK)eV(zaP<4d5+fK%q1-H+0b`NTw$M@Jt1`l$7Fye*Ya!g6l3w9kE zjO0()>*G$?!?@nrgiUR+-WiE`f_lPiVh>q7xq2RSyc?_n}gPbLV+`~OZ( zC|Z&N3ZB8OE0!0>)omqEqtWPWAyRBALR;fzn$s)5?}#}r_wus1`e_#GUjd{Goyp=K z#>g5qG-CLk22y4`R8k_1t1(cc;t*;vFxj&%83KPV7xL7MCkQ|HI5a;8P3L;{tsCdm zh#pZPk4;iVVS3Y#cw+ikt`37xFYcbI#>K z+*?U*WP$OmJMHpO-_!A(^qA*Koq34zg8X^JQ(E025|Bx!FfqalK?lq$wGAN@W~I+k z^R<@_VphJiDZ*tFT~EoW+MV(ak=(8(@O7rT)!eap-DbP9g6~TVA?cJ-uOBF%Vm{ zM_UK&8wp>cRfFu7JS(n7*qTQmL4mQmMFOg{};b{cc+8!1%0)3eL+Eao2x9;$2s z86dTR4d_%c@aydStCt4+ z?X6tD;2tA|Fu^a_$M8>ICS(vqom0S=fdC-N`N%9xJLSt58=a2IE6jWZqYYs|MEty| z5yrHzKtvn+eN#gT8DwXCQ%1E4^Y!4b9S210&r4%4#;SneXt{_PD!h?SreJ~1A1;#v z>88g%9!u-IaKX@!1^Zvkq`8`UWJ-mtyjdM!9v{i8rzCeJi?3%J#xBccrlP9_m@3CQ zbH&%w3z0QT-Ti>*T83e)J@-b6q0W{oxshY2E6$}k^zjr-nPXd~X0IXTu^Y35q(W4i z%>Qjl9$cfV(*0#hB&gLQ-8BBaDM5@cwUB#zif1dR)}qfp5bHk4@+B2+Ogs(Q@3J^< z+n=UyoR|bzS++0#Z_QFUWTUflgzP@oN*H9yhM;7Sn%53uJFP3BjxS{-vQI%X`MBA;J9KCq`f7D3msnzogTLi!LK1Z^ z8EY09`%96nG`=GmT`Cs38z$fZJtm-NXf9`uSs~kxGRNI&V7K{EK#0ZdK&Q&%o-Pk^ zLE>1sG%!5x0CAaq91jwD;}mhAuF-*X?NDwPY3=jj$uHKvp;z}QrAL_?nkf{b8f|x^ zJwQE9T3zmdbIYjFJUZ>jw>q%c)))&GD;h}?SZsh!(e$x=IR{}surlz-PZH&Z7LLXw zxpSfZKTed>RxJr!@zV^se=l^VL$&Ll@*gG0Y2=HErU)D7h`c2^t~}yrljFKIv@bV~ zyO@6VAB;NkpM*fLQ2#~b{Y-Kr{D!{xOp%o_IHXDY4)qODqmegP$_!j0p$|0`8#n!6i4Mp~&>D=vp)srCfsDG*@{El?@@sCGqtzD5|^! zV@AY+-;E|^kK>cr!ik4Fg0;Mh5GVEgSeX+F~^;e^^>KpdO&my>CU{l)pJ?x0e$dz|6xa7&1~X*}vJPH1mI zU+)d*M#EuT&7aZdrghqmRP#WQ=5Aq;PbiVN6d{!)8>658J+;Z%FLQq0z3aP;>n@KhhZ}e1|l1sQJb#e(Wd_e<+w;@}u z095NeRQmAYG?T)oDe6Z;jBH2jPza$ZboHS#Q$*LL!zD#lR}cizj&%5uZ8H97>ktKF z-1A_2vkgWU&H|#_1fy}IbBsdbqCSBEiDY)lnO1_-tj2p|4r`X0!Cd>Mo1*nfT!SEob4 zS7d7Tiukjl3~-0d>)vEIUdkV@8(;eP01fG}ohZ z-w`0@unj$J6Y(iS0=C5eZ5m%kbZGD zJHEFb8ZAu)p+jp};59pZbl$&_W2# z4m7@NywcIa+~n&}Jou2yLOLfic{k^EO0zdEt)pI~gtVF6hIpez6wBVNaXl4mjnVT4 z!}q5A;Pa8{HyX}z?sk-UTs`T;{3AJBWK!(#Q`|>e2z}b|WekuR(vKfi#Vw~LLp<}6 zUUht}oNVM&$29>vJ8cTPfe;e<(%9ow0iv;F7~K3io`cc$h44_x>S7o*^!wDj7htqi z1ZN&AlYy@NLX4*1t7$@%MydiLizPSu$Wh7b=(F!WF=ifuvoCxX_|pm%KX!t3*~GwY zU26GF!BWeY__5>Sa?1|9eya3&bJYC#6T#g7XEiM#eF_Bpq-KRp19boUS{$}On7n{u zs*@!*>Q)>x``uc!qIQD#dc}%U6K-J1?g=-Ss*qgAk>s(Yn{Z@Lx#UKfith648zm|n z0-Cgi-+!kMOaAUo0ZJ|i8+X_IF(kQsJ_eHOv;&Ua)M$~4qNTr3qJk8dli5kiZYfXz zNkF#0VfXxp`V?jU1n@B_>CF`?iXZ>Ks!vgR=#~FXfeIh5>P*C^c-CzQ$L;c`+JBy9 zkhhDy=X?ZL{!+CHZ8X5pSvgF^R}n)J7@UmR;MFG=eJ~au4(EU3XH;_UC{3EWaJjvO z>sRVNigcoLO2hk+lwE2(8ySYYVLpWeQ&)63%!wMJDr8A*RyiRAHZ=DthZoc4)%ca> zn^gc4E>{0bDfWphkj8|OV`9V73tvpMP=iMO(=m(X{6pi?ijA0k=L7?wZjV71l|bZQ zQX;*jc+jZyV5OwlJBcsI5lN1Dr@HL>amtP30{MXmXO?j%t+G$ymyfrQ9z=%X0p_^~ z0(D0ac@Gg!@k^l-tqaMITLdL0eUvE+F%fZbQEhdDd{;zlY?Qo#=R3l;@wHXv*h4Y7 zl<81RSd2q$I27X@wrb-J#%xKdBB8iYs)>rML-Oc4ZOv@0!kTPde7(5~)LRSRl96Zy2QQQuj~=!)<({p<4bxt5ZV0}5#ujN8)@msuk1}7)7Ti( zRrc%z;CW$+>esr7fS)AVFMT7ZrnmBGxJU^C^Zuz`6|us2EG)hZ7e|kIhaF5$8rPFc`51cx+E4&NTup({MFl%&p#m*e zpw!pKcKO*;d4}r^aiqFq_RkV=g^|2-+|gM&WR2vPj;q%>3mm2VigB#wqbM0?kK{gy z_vpMcYzuksjIP*NPZ0d`9#UsJOay6;S||S?CKURxLLIGlZmC)ASk5_SRW7Vv&E1Je z-ov#_qegwhNMwC^(ZkLBYlTa5xY{7*Cg(8MQ!vWXtHttLe8U~njaMWX-M%Be**MG} zFYpkc6vN;XDt%?4u$V_PY~04lr1KnuoU3_py|F#FMn@<&?55z?nsEY|>l zHjM|my2@;aU)l7k7dM*)%dlCn44awVL1UKT&j1bl1&84;n0w18p!#)DS)C*igH@I=n9Vwl=MGTGxl zw~bbKQ6&$iqkl~WNHdsDjaG8u2h+K71MREgvY&&z`Hp~}6lj55%^mU|Rak+^our7a z+HY+}ee=o>Fxk=5W`YNadx5(q;f@Iwiu+3zZp|ZVzF5yh^Bu9=#kQ ze(Tk-gllT>k8}c z(qkDOq>3tsniq9T$g)JLZ>trK;lYfZZKjOwIkhdCb{?m2AMrZ-Q~>U zL^q|=Z8?*sy<|C-rguCLJDkaZRL=1Ls!8Q9XKqOv&eWFK@mAeOE3Npmw(-0>+q)RP zH|kb8(?Dv3s0ZXPOh?|;sCB9X0KcQ$?el<*xFLoJn(;OHKv0r@UOo6L&7D%xy6qi8 zZaU0wtT7li$nol?`)Zyc_KAyJ?&IxoomDxc^)g?cfBZmf`;OxW(1rYjkpeWBWxee6 zIxiz4hnV2lqZ=`!d6UDqz(yN8lY4HBS#4g;d2_hnz4e;R)mA@s$29e^HL(lab?S~a z{J<)W@m_Ya2XIT3w0hcF32HL)@2rOEytQ1xdPkICe9N;-FaRL-kk+jZAZ>Tvh_9t% zMAxKT+w@^YV?9*GfYsZcRgdQa^#Q72kv{KU2tqjS)DJ88HFIX``^H0XrE1QEDixS&gA(=b184&%4)nwf|(f($`)_yhc1(=0wM zT}w|!@&X=A*3p}E$80tUXWtO-)**ZPj^D?zV1*l2S4{g^C7ND>@jJ4UE zH5QIq&V2?P?p!`bRV$v*qf`BaP{Bld@hw{iA($)GpT7mviYcH-eeo^LnWl=TPB(Dd zr@(CO`FBzBRDAOa&KnN?-X`TP&MyB=I{JN4HENjm!#Q~eYTr)?)lxJI-o3wk95HIL zNuq+)JSQMu>d8!Kb?V5g>A;dO2`(r>AE?-qcUB!j_VKAU3^nr*rwg7QK9|egz#?r zbQn_DCNz*wfG^KrOJSR&yTvN`BYh`uTlC%<0TBf8k#$^Q8yWNQCD(h}rng8ya24Ii zkfE8=29sH)R?d&hFhw>6Z<3R2Uimlt!*C#=%$d1)tWL(!eue0R?2XUw_-(JKt2!RpI+(vjQ9zr!Amt+Um(7 zVpq2tP{o zJ+)z??9ZwO^{I)folz`$`@O5*o6)7yeE$q;H7%o}rA|Om%N2a%57Y zfiA8)Q+7+4gbeEeP0ImfIzWxa&`{$6>CG`THlR!af&3YYgwczo?DMR@EfkiPF);cv zL9+q!aWJ}zhS5$LO#O{GfSk^+oqo6;4L*|P4;m3YBV`}hn)|(a-K@(-*CYJ-XCSw3 z)-<@SdX{8y&X|;UQSTm42wI-HVHVeLBIIbuPE>V5p_|B=9jNyREw%Qx2qFF6@>uWJ zV{#rk`A;)~Hb#*1grI~^&nu%x^}Llsf}U44M71s4AXJhuzUFs6*}yy&S{tpiR+#c$ zgIae#Cb(BEBv;p)$DMjpx3%{fzbyW%H$?h|IaenMB77P`=ckz-r);}fWpWrA{=K3$ zOrZ)Rea0(gWf(m0;2TD&Pf^7gY8pP5-dr07lB};P%tXmi@^NN^*PUoQE0(~Relbc*?^(?2qfP?Fy@~m% zVOrNZvGN(4gTM3udTwI9qQHjE1ySI%;PGZf!?qq76t`^Qycxb)e(yZ$LZx?eR<7U` zu2RVrSnx9{jNzHrh7#@fU<_AZ!dIm;-rDQ7Z$UbcOM0DRnj*dxY~Sj6Su1#P#!aSg zg=w;?XMXJYU?lzU3g16Dr0h<6B!0E!a_3i^OoYM7Dc;1%rv|DPhpH6iZzu9%GD0tV zpyVV-npAY&2B}l~2BlPkrC*h2i_O~~XWy?e?QbQV64?}0_Sscqi4{kTJu+5&Mt!az zq%st(VhQe>f?U?DIu@qv4rHZuCHI%FNdnUpYp1YA?x88Y%2(&*2RD~gShtYDk=aEZ zVaTi#of%7&NZFG5q&@M;zqF@*pwLB@6U=BDMEdK^#AE2h{ofk-Xa! z0_t0HVD!Wck@I2RmC6sf)R$7ETi-u%E#j#%`5y{}X89qG{u?V|Ld#xAe`ehd>vwT~ zbqBfF@Y)nf;9swdO6J}AL0!cgauF+yG@g5eJrrh?%&AW!_LI}i?sZ0YV%lIZYER^9 z4V4a#39tOn$b{P@u`rTrdC)Kt%t{-VArK^7P@YSU7u3@RilrNu85<(;Fi^og@*wUI zgKH}YFdqC*@WzVHG?OA#Gs{)ZDjVl0Kb#XoZa;W37@mlfGm}2KR#WVs##V;+^2YY@ zm4EwT+kP6s7*<-NCdAZUam7Y}S#7N1UbS9P6B`nls2_=Ar6H+XB>Y!jKgquzl&QFy zB2*7c8?O#p*jaJOz^Oi6gLe^c2X~7pW>9M+A zO7mnu|9o99sG0i@p{Q4(-&j#E(!4xo&c1{9eFIG=B#K@4NltR}k^oFUA&J>}pZMT? z@jLGm!EcUBB(!_XDL>BGp-$VMXFySj;VhlAgm9w!V^7!Vcjoya<)nO@KUc2jL*l)5 zG$~n#_cw;A4KHe#Sk6(zXC<3L?)-yY-JEAmiA9KfZ-&L9TSe34J7AsBOn${i3@97TY(vMBAEfF@X{l>dC8o zsxhZJH$%U!L{;imui$cbZG&tF6i~r?-%_l`tK_`fZrIr`>k^fnt$R9HvVc_`ZQZFd z+;6D1@_hHL7WPNdZ&=tJnJ{qES0(0pLzRUUh1J6a$v`Q;7cOAPw0{#&^O;M+1TOg3 zJ$~+>dB8ni&m^gbH?ZO7;&t{r)jhLA`&VkJbm*N7f+hOnQCbn|a#VlEcPvA;BJNl& zpZt5SE7u!>n&%r&Iz+LaIBidEEVD88xCRY5_>MTOGnXa%<5|%34u%Yt33;r5i|6*O z1VsCY4MzF%o2y!-(8VDvc7WfJm5d} zMU4@+R#dl|fUl&wUGk&c>sv)a@fh8Q*P{(WFoM|6luM*HCk$I@QXu}W+4ys)h7e)u z@5^X*_|c<*2C7)RG)Jh9dQ+XVK_^YP{^Ig1#=q$f0;~)Q`NRJ~k_`Kmk|Z9E+A*d3 zPujx0zfN1g-}Zl5arb|rG(b>QLj(l9(ma}7J4Gad##co_Hd5qMKga*>Y&{h;r9}iM z@}MfJEYx&?!2D=R0SUqazu~T9iXYXF4Y{>+yLFfz3m_S6K|ucFxRDdwTnQj{nDzg0 zbjU6V_(^aGIhunekVITeTNdekCOs z*xcYb1uS5`czTTIT;eZ3NUy$&&II!xoH?iLfC!mJ(*%qKQb&U^Pg>q!dl;X7k`R&q ziNY`cbrk-;mBoZflfbV>NfYU#*;Ycf^^e2X3k9}c&J~sCqL%3LXSw51M&571ABnVb znveqU2XrjDJm39+uV$d*12hatLG!~DH^!={{H$DNDv23h_#xrCpec!A?PrBd!?99< z$6HE8xbGDbCnQ5Wi+r`I7Y1UY!@YojCYd|_wPRK41a7QMAQ~EPQ%G;F5(v5S=$}A2 zDTZ>NEq@6t7xblfRwbj4looVeIhw8KRoV<90a0{zVkW^$-3P?iEpxT|f5aoqel0!L zXUABC{du8e)eROgGFshFw_WD|%%<}hFA_(oCFUJp8h3{JwI3wQfKbi(tQ2ye>u7XQ z*Lg4;a8051^)FmFReDfFSXa6Z;XzkyE;^*M=jrx_CJAq&a)oYBXcM<5l(YrnB^UR8 z9E;Ay{h%XVjz@Z4o7_Y)Hv*>7Tw{=SFv5DW;ZGuFtZs1Z!616}pYk5=#GR;L`!AL1 z#H>2{*OlrdF3JQ!+T-zL(tz~o(pDk>!#U4kT^qA-5PU+GxZG=v-;0^rd}1=bhvPvc zxmYM<=&VB4poR=GNQkvMs~iJ$RS!8bv`qkmY{j6j@l503yhR-aU;d~U;u$17It$VNX&v0KK!C#0)Rs}N(A$&Qvk4>Kb zQE3E?Gbi4Zr$K|uH9(DZF^qeyFZE9a%E8@5HjxUY``rEcf!O1zbUWo$ah5E z9J0ONDJL+?S2;=9O%*ErWyo$kT%`}f|M}*KEjq3u1z;+w4q$$ii?^?hqM+Y3)6DlF z&vC;cTv$9IR59a*LQo|{{|a&Sp(++c5Z~tbkc$uvvo;2m{D&eIvfCH2pm%2gtERw; z24;=&Q7+9Yy;)iob`8uQCV=dJUlol>&U3<;6xI0TmlrFtGV;na?lQ!eUGv@5mPv0e z_?J>R1x9}pOon_hp}WlY^Wbrx%ZCYt(I+AZp{k6~+Z?7O9looL@` z&YH$K7NK)9s=^3-OMB3~Me@|IWuX=*!aUMxsS@&z$K+gl;_Y!hNn^fWW_&YI}0kg#Kl(k_3_ zZwdbDtx9lMtetM7iM~wk;4G+qZIQf#3oBws>dG~N$!e70ABWczrtK)N2%lAyRyJp5 zo`2VU67wUJa-zirVuT`WhT04$EQQU-HU$jjZIR~9? zm`ebdZLFHZkkT>9DFrT{3&5f!cvn@m6o^k#TR~1?`x_MQH!C`i-o}E^d0Wc@^goV4 zr2ckZgwETU7do4gU&md}d{llf(OADniVE+g_DF@w?WpqJa>AGn8mlBm8!%>o#!jws zLuH^#-bk2s5UWij67|qct?yV<4DQMUFWcR@$Avb0xKL3xk=! zi-uh*&8sy#SJJ#Um;gdaP{+LU!2icFWNjJlJ9)Si!=XSp^`iJS(H!8eGKO!EaL&k; zxq|jY??d<1;Vw9q-j`6-$a~jWUnYc-tK5loTkOYuIrHs*6<<%7*VeQq)PTg~h3Fu3 zLdrm*!Oh6CUE=X6V^3Sa1S{^J_f?u>Dmm(&`%>RND-r@bbc~Z%>#F$?r)Kyb{5%w? z9=xYIn=`?bAqrhUwrm*FF%y=W5`|=U6$GvKF1O+5K{4Y{jU^zdR8X*sW~)zb1o`=9 zcbCzUP4Lf*qfkg1n#m1sCkR(>9n|iAeLP`pNS0*J&+P}xr+VE-4Ug+BWHl5*l1_ls z-Y(5cQJs6+Gfo^CP&XXO{`=EDc_QTTr|DSL<8;TSqKpQNo?^S7);CVkWj<0nNB{T< z$f7Ni6;@<^N=@Tl`Y5_!Mpm_YXOf+rZB7~Ao~9mrhHIYa zB$%zTfka{-?F2i1_&3TSZ5Zi|0Cn4X{vrGXraUh*u@&%)K{&SE`(a$aaQw!>+J7(EMj? zOxBb?MyG27wZy~6`>yG(P8+YYZs@+6}bA^?xqiM({W*`u&eV02O!j<2c8k#bY8g za{QT@lBzU(sw(-j_8(?0=0&+7sM(CVgDeEy^$D~6#GJYeNVR=}?7^g)Qw6E|Pv}XL za~=>lGN7>H6Wrh~5v_Czcub8cqx4=h_!UaKciJ;waRHqAm3z5~q~u;0BPtJu(L5v= zp76|d-xG5dWh6dZ$_#gofozP=0>LedQXtSCes+;(mI9`MHW<^N1n0}T??|6?qBsY} zcNfD1>BgztvTj;X`twA)sLWC8(pDGKLxsAA zMReIixbX)(^c`wF9!4VkEl>5``iEgPu+b|EC2C6{y{ev?isGAVTd=knzj2?lauB`N zTEx838Y~P_Ne=}jGssaugA+J>85P(dX3OqZg{`1SmO_dZwk-7fe4-Y0)evspud`U> z;r#+Jy6`=*Zf!k*{`K7h4QB#7Lh$K(O|@)$I~CXyD_TTuUNmu2K9w2?D4%X5xiru& zIN)F8s$Hs;ZOo?WsAW6Q>1`}`P`4I3k$#gh?2pK{S~Meyiz2N)5o+azuQ0t5O-DGz8hD?ET!ryb`gh@bIU6`L3C zhv;`9Jf3wzCy!@M3-;n!OBO2rMg1Jk`n!ufoV7X_C~|M0X>Si{?Lj36(1+0n-#0BI z6i%XW9Hmvd@A)uqxm=;{fnWjM5R8%!#vgMaKhzW)&NyDi&R`_n!S+!EUo3|^4%NhV z#z?1S4R}?%*_uaoa1io#SKvxT08DKY3j;`Zo*{6+2nGJ2Ca^g_#mOx(_g3&i zz_q6DbiF5o*(^L5qRcx(4~9^J&?UfUqQWr`wI>iRkoz7o_l?Q`R8Z601;O^YRQM+a zs{th#o(s$Lf8ZAEGLiM67)eF3xK)O{`3nnt=c4jBDFgoYcvL24d^(PnN$U!fweqQHE!Gx)_7P9s?hq)now z_sSai?6yKTm`=%GTdbu&O;1KS^XT1AXA?}vQxv&wx6~JXJB?3pcg~~VnrkqlDf9UR zHyh0CT0%0e0*YL|n+l<4W=CNAQuwh#0Md-nWe14mpzZ<&wFC7b+ ziX4hqSuh5Ep&N3j*sTQ<(5j_q?%skVimfg{9X|!Ot+(!{s1~23MuXyk0#8nxQnwZG zbILnk3O+!84ytX5z%2{;v^GV6r8N|L-n))rYddXy_D?F$z3NaCYl5n$0r}+rT zrTmXh7o}A1qCn@;<^n?%C8`z$*EB&}7zny@2HI${Czg_?J?s56DceNAJ3HL4-;D)Bvpf)f$ zQDVfjRv9}aMSYW)o&}hm!gg$eo99VH*<{IDzF?AXHE`EWV#7A+v`s!!i64bC!4Xm? znkJ(UOca|kDPcg8wZfbgcXq2F@W^qgX6Kh-G3LL;?fBA_u=U76{njIT?z$cGtr_fQ+5o}~x{Pi8!xf4=GAei%Jdsts zml^(=)>rI0caizwYrFcwF}!!LoVI*TOAo=P_wC(ebXx3CQLz{LUKRW9dr;=_xthph zV1HczpbEu6yS^xUV0%$^+&1p#<#pL{-2M7pmj1W)7R(0pXeK!M7EqhG@3m2mixQqfD4QzR61A&one;XR82F9yrjbWMOl}OVw>4sv$E4>T67N-tEJ~6)BP$*7?NSnms=!UX3ZrQw z%R;ZW4;!&%;V%mR`%E@>_Q>MT{~_bEN2@9(fRc)ef?HMn51S`=GDv(%XnX=`(SA3v zY5V?P)cxOS^S@;hY0cqLk`wp(@p&ZU9=E<}Z~i6I>3v=YyBI{GT=@+l?Dg{zfo<>oni8bV_@O`xDN7vDt%GAD z=Hjw}FM#Z48 zp8?NW1l7qZ;lzvC*-6b}^ICi*^e-C>b>DVv&|S^mv4Lv%`o#@SRc3V82Fu-Qp{{HL z6dWZB;<+)>e_lR<^M2;}CdpdhE$^PMsh!UhEr4`;4(bi2e~gkkQD5F@dAD|Gf$be! zj*>cL?wW4fKvtayb<=b&?y5qU>DrjK0o)T@F>s*@U7;%mxCbE}PfPJIEaC5rz>0x( zwR(8Lg(~>kF_Hx+$fV>#(}$#s4N5ok;{E-2r^nwMG+>W0N7t9NX1S-vDl+F6RO z7D&ec(9-ADo~-xBn?s7Gqv{au%)ccC+V^G(H0ocX0xbS)Nw^V3vNxlk?fzpZXk-cF zk4v`_jB=MMpN%&b9WdE%)_=Lzk9WEg;~nu<)rFA!JOcWb$CpeqJw|s2S#K`qwxyA7 z-H9KXt^uL%%>~^kPyb8O)_+;it+8XD@vSAukOUI{*LzFGiozlIT^e_CG@Ai2TV@=k z37#HVNbjmeVr+QQ|2LSf$CF52gJ&b%hp{BKDdN zD*Y<3o;O01f2<3W#eJm9#>47_e%;NLuyOr5U0({M`gQS{sr;3$!F|QHXWOUpH~2mI z5fJ+QOb$n-tA2^oR{VEzxaPVJYSI#X#s`BCJY?FJGBIBCLOp8Rhg$X#yx^=%zJsOr z)C(D{1E!<_a}2t>QY06-#b%~-FHG?xYh!%mGbhZr{~oYqwyXA>PFGB-*DXf#bsa^B zUI6@wU#CEFTOI#j>Zh~FQ7O>fb++%0Ki&s6@jbU!Y0Tye{Y37iY@(lojxPukVW;x{ z92~bbrf@HBDZ0jW_c#4w*14a)Gf8ZqZB|sW@-R-?fa?SD6E>gA_Xd1+nLDrq@_j*P+JiR1Y{OK zwl*MHw{DIh-16!IMSJ;#(fqD^-KEOgWYz0nk(ts(7IiI!3KL1USifDWksVN1M-q#H zNC@Ya?~%@E*^o{=NbYpip3wA` zmkDH_hc4SaR3O~&oc%R->b>P*Uh8}Ug%>#?b7i~41FaC02M~(Z|HZw zN~+HoS*px2qu!;Xnq9Jayk<8F%lM9zChu$$-kV`dP_`wYoP<#LI+>M=K^Y>1LuYpe3p#tr}4l(R1@j} zFhOE4-;)8xHBoL;2HVJN$y}yqkIzlc0@44B^=75(5dRt8tn`&&DBXUPo4nM#1wgb;u?R-_Wv5y)V02YD z8Is)nDbMhS&E3=7Zvw`RqC3)iXu~;ec>&Hlo6=U05xE4eFX49djJ6lSU&%F~7HBff zqF~WNE#>bEQ;Y^1im_JZ)MIeZE_H(7n-rFL@t2s?Vo1?1SK$C(g^2e>z_vf|e)F7bvCY z*^=}68~|rsI4^m(%L@*@tf{%59~g!7%7cO+b|Lfhc_>74^?@5$xF7fG*!t6`obdod zQADE0{AmLH*B=O>+x$s``kJ}LJhcGj_Hx&O^~|=$7d308L^}O)6`+=sN`X{yViX%H z6Wxprg{l{xrS0iq_ao!|xbMC(Tc@=9e`f2Xzh7b<<9eczfq-9dJ^5|}p6hu~6j_C@ ze{qwmlXN`Lv-Bbm-PYAf*>~*ru1=*7+}_nG?c{h@C)7SD@E|;qeh?79RSoW>Y8B|ETH~rcT>_#ng!jSz%IyRtSB^V3(hL6)bxl`KYcW zOI3l=95+yf?!JQGe+2yalbTYIZW~LS`G|5vskpvCNvP!9&&PP55+u%LfQq?O8F(M} zNGtCg$K!?>LUq5ARNY1BfC?sWZeVgDou-1iw&x)DR|%`qYcon%)XaK)#n9kH^z@fl z%JjpG1FRIS(Yg>DN$})WC9BA|gRLQ3@M~;c&}-1?8QtqPvjI#3cvod-B~AbKmP7tW zW8cf}SSX9zvCs+0vW4tm83JFD?(#>dYX1zXzWtGJ)*AWF+pL9%@2iZ2^iXEqes2*t zCD12OK`pJJ4e?0$wc<5XHYGdTD&;Q>l+W4LD*hHl`J8KYI@)RDAVr>S6;iU6R`_Zu z$tLd&JXIJ@5#0Ox@56?D6z;z-=+1KCgd*2mD*kM1HkHbMP73#O;LdRCDN$={l{hGX z5~qiXYX2St1w`U�;p|D2;$p?^@}x8VkK{?!S{j1w<%FBA4?%36 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ð~G4JibA_@^Wqc>4zj-oCq6 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 geometries.push(res.dataSources.geometry.id)); + fuzzyResult.results.forEach((res) => geometries.push(res.dataSources.geometry.id)); console.log(" --- Get search nearby:"); - console.log(await search.getSearchNearby("json", 40.706270, -74.011454, { "radius": 8046 }, operationOptions)); + const searchNearbyOptions = { "radius": 8046 }; + console.log(await search.getSearchNearby("json", 40.706270, -74.011454, { ...searchNearbyOptions, ...operationOptions })); console.log(" --- Get search POI:"); - console.log(await search.getSearchPOI("json", "juice bars", { + const searchPOIOptions = { "limit": 5, "lat": 47.606038, "lon": -122.333345, "radius": 8046 - }, operationOptions)); + }; + console.log(await search.getSearchPOI("json", "juice bars", { ...searchPOIOptions, ...operationOptions })); console.log(" --- Get search POI category:"); - console.log(await search.getSearchPOICategory("json", "atm", { + const searchPOICategoryOptions = { "limit": 5, "lat": 47.606038, "lon": -122.333345, "radius": 8046 - }, operationOptions)); + }; + console.log(await search.getSearchPOICategory("json", "atm", operationOptions)); console.log(" --- Get search POI category tree:"); console.log(await search.getSearchPOICategoryTreePreview("json", operationOptions)); @@ -122,12 +126,14 @@ async function main() { console.log(await search.beginPostSearchFuzzyBatchAndWait("json", postSearchFuzzyBatchPayload, operationOptions)); console.log(" --- Post search along route:"); + const searchAlongRouteOptions = { "limit": 2 }; const postSearchAlongRoutePayload = JSON.parse(fs.readFileSync(filePathForPostSearchAlongRoute, "utf8")); - console.log(await search.postSearchAlongRoute("json", "burger", 1000, postSearchAlongRoutePayload, { "limit": 2 }, operationOptions)); + console.log(await search.postSearchAlongRoute("json", "burger", 1000, postSearchAlongRoutePayload, { ...searchAlongRouteOptions, ...operationOptions })); console.log(" --- Post search inside geometry:"); + const searchInsideGeometryOptions = { "limit": 2 }; const postSearchInsideGeometryPayload = JSON.parse(fs.readFileSync(filePathForPostSearchInsideGeometry, "utf8")); - console.log(await search.postSearchInsideGeometry("json", "burger", postSearchInsideGeometryPayload, { "limit": 2 }, operationOptions)); + console.log(await search.postSearchInsideGeometry("json", "burger", postSearchInsideGeometryPayload, { ...searchInsideGeometryOptions, ...operationOptions })); } diff --git a/sdk/maps/maps-search/samples/v1/typescript/src/search.ts b/sdk/maps/maps-search/samples/v1/typescript/src/search.ts index 756450179131..b15bbdda9920 100644 --- a/sdk/maps/maps-search/samples/v1/typescript/src/search.ts +++ b/sdk/maps/maps-search/samples/v1/typescript/src/search.ts @@ -73,14 +73,15 @@ async function main() { console.log(await search.getSearchAddressReverseCrossStreet("json", "37.337,-121.89", operationOptions)); console.log(" --- Get search address structured:"); - console.log(await search.getSearchAddressStructured("json", { + const searchAddressStructuredOptions = { "countryCode": "US", "streetNumber": "15127", "streetName": "NE 24th Street", "municipality": "Redmond", "countrySubdivision": "WA", "postalCode": "98052" - }, operationOptions)); + }; + console.log(await search.getSearchAddressStructured("json", { ...searchAddressStructuredOptions, ...operationOptions })); console.log(" --- Get search fuzzy:"); const fuzzyResult = await search.getSearchFuzzy("json", "Seattle", operationOptions); @@ -91,23 +92,26 @@ async function main() { fuzzyResult.results?.forEach((res) => geometries.push(res.dataSources?.geometry?.id!)); console.log(" --- Get search nearby:"); - console.log(await search.getSearchNearby("json", 40.706270, -74.011454, { "radius": 8046 }, operationOptions)); + const searchNearbyOptions = { "radius": 8046 }; + console.log(await search.getSearchNearby("json", 40.706270, -74.011454, { ...searchNearbyOptions, ...operationOptions })); console.log(" --- Get search POI:"); - console.log(await search.getSearchPOI("json", "juice bars", { + const searchPOIOptions = { "limit": 5, "lat": 47.606038, "lon": -122.333345, "radius": 8046 - }, operationOptions)); + }; + console.log(await search.getSearchPOI("json", "juice bars", { ...searchPOIOptions, ...operationOptions })); console.log(" --- Get search POI category:"); - console.log(await search.getSearchPOICategory("json", "atm", { + const searchPOICategoryOptions = { "limit": 5, "lat": 47.606038, "lon": -122.333345, "radius": 8046 - }, operationOptions)); + }; + console.log(await search.getSearchPOICategory("json", "atm", operationOptions)); console.log(" --- Get search POI category tree:"); console.log(await search.getSearchPOICategoryTreePreview("json", operationOptions)); @@ -128,12 +132,14 @@ async function main() { console.log(await search.beginPostSearchFuzzyBatchAndWait("json", postSearchFuzzyBatchPayload, operationOptions)); console.log(" --- Post search along route:"); + const searchAlongRouteOptions = { "limit": 2 }; const postSearchAlongRoutePayload = JSON.parse(fs.readFileSync(filePathForPostSearchAlongRoute, "utf8")); - console.log(await search.postSearchAlongRoute("json", "burger", 1000, postSearchAlongRoutePayload, { "limit": 2 }, operationOptions)); + console.log(await search.postSearchAlongRoute("json", "burger", 1000, postSearchAlongRoutePayload, { ...searchAlongRouteOptions, ...operationOptions })); console.log(" --- Post search inside geometry:"); + const searchInsideGeometryOptions = { "limit": 2 }; const postSearchInsideGeometryPayload = JSON.parse(fs.readFileSync(filePathForPostSearchInsideGeometry, "utf8")); - console.log(await search.postSearchInsideGeometry("json", "burger", postSearchInsideGeometryPayload, { "limit": 2 }, operationOptions)); + console.log(await search.postSearchInsideGeometry("json", "burger", postSearchInsideGeometryPayload, { ...searchInsideGeometryOptions, ...operationOptions })); } diff --git a/sdk/maps/maps-timezone/samples/v1/javascript/timezone.js b/sdk/maps/maps-timezone/samples/v1/javascript/timezone.js index 4d55e6b4f853..931a14b1c22e 100644 --- a/sdk/maps/maps-timezone/samples/v1/javascript/timezone.js +++ b/sdk/maps/maps-timezone/samples/v1/javascript/timezone.js @@ -51,7 +51,8 @@ async function main() { const timezone = new TimezoneClient(credential).timezone; console.log(" --- Get timezone by coordinates:"); - console.log(await timezone.getTimezoneByCoordinates("json", "47.0,-122", { "options": "all" }, operationOptions)); + const timezoneByCoordinatesOptions = { "options": "all" }; + console.log(await timezone.getTimezoneByCoordinates("json", "47.0,-122", { ...timezoneByCoordinatesOptions, ...operationOptions })); console.log(" --- Get enum IANA timezones:"); console.log(await timezone.getTimezoneEnumIana("json", operationOptions)); @@ -60,7 +61,8 @@ async function main() { console.log(await timezone.getTimezoneIanaVersion("json", operationOptions)); console.log(" --- Get timezone by IANA ID:"); - console.log(await timezone.getTimezoneByID("json", "Asia/Bahrain", { "options": "all" }, operationOptions)); + const timezoneByIdOptions = { "options": "all" }; + console.log(await timezone.getTimezoneByID("json", "Asia/Bahrain", { ...timezoneByIdOptions, ...operationOptions })); console.log(" --- Get enum Windows timezones:"); console.log(await timezone.getTimezoneEnumWindows("json", operationOptions)); diff --git a/sdk/maps/maps-timezone/samples/v1/typescript/src/timezone.ts b/sdk/maps/maps-timezone/samples/v1/typescript/src/timezone.ts index e00cc5784835..fec6d6ffe8eb 100644 --- a/sdk/maps/maps-timezone/samples/v1/typescript/src/timezone.ts +++ b/sdk/maps/maps-timezone/samples/v1/typescript/src/timezone.ts @@ -57,7 +57,8 @@ async function main() { const timezone = new TimezoneClient(credential).timezone; console.log(" --- Get timezone by coordinates:"); - console.log(await timezone.getTimezoneByCoordinates("json", "47.0,-122", { "options": "all" }, operationOptions)); + const timezoneByCoordinatesOptions = { "options": "all" }; + console.log(await timezone.getTimezoneByCoordinates("json", "47.0,-122", { ...timezoneByCoordinatesOptions, ...operationOptions })); console.log(" --- Get enum IANA timezones:"); console.log(await timezone.getTimezoneEnumIana("json", operationOptions)); @@ -66,7 +67,8 @@ async function main() { console.log(await timezone.getTimezoneIanaVersion("json", operationOptions)); console.log(" --- Get timezone by IANA ID:"); - console.log(await timezone.getTimezoneByID("json", "Asia/Bahrain", { "options": "all" }, operationOptions)); + const timezoneByIdOptions = { "options": "all" }; + console.log(await timezone.getTimezoneByID("json", "Asia/Bahrain", { ...timezoneByIdOptions, ...operationOptions })); console.log(" --- Get enum Windows timezones:"); console.log(await timezone.getTimezoneEnumWindows("json", operationOptions)); diff --git a/sdk/maps/maps-traffic/samples/v1/javascript/traffic.js b/sdk/maps/maps-traffic/samples/v1/javascript/traffic.js index d21dcdf402ba..7069ba4e21ea 100644 --- a/sdk/maps/maps-traffic/samples/v1/javascript/traffic.js +++ b/sdk/maps/maps-traffic/samples/v1/javascript/traffic.js @@ -54,6 +54,9 @@ async function main() { console.log(" --- Get traffic flow segment:"); console.log(await traffic.getTrafficFlowSegment("json", "absolute", 10, "52.41072,4.84239", operationOptions)); + if (!fs.existsSync("tmp")) + fs.mkdirSync("tmp"); + console.log(" --- Get traffic flow tile:"); let result = await traffic.getTrafficFlowTile("png", "absolute", 12, 2044, 1360, operationOptions); // use result.blobBody for Browser, readableStreamBody for Node.js: diff --git a/sdk/maps/maps-traffic/samples/v1/typescript/src/traffic.ts b/sdk/maps/maps-traffic/samples/v1/typescript/src/traffic.ts index d355679e5246..b2d2f2523a9a 100644 --- a/sdk/maps/maps-traffic/samples/v1/typescript/src/traffic.ts +++ b/sdk/maps/maps-traffic/samples/v1/typescript/src/traffic.ts @@ -60,6 +60,9 @@ async function main() { console.log(" --- Get traffic flow segment:"); console.log(await traffic.getTrafficFlowSegment("json", "absolute", 10, "52.41072,4.84239", operationOptions)); + if (!fs.existsSync("tmp")) + fs.mkdirSync("tmp"); + console.log(" --- Get traffic flow tile:"); let result = await traffic.getTrafficFlowTile("png", "absolute", 12, 2044, 1360, operationOptions); // use result.blobBody for Browser, readableStreamBody for Node.js: diff --git a/sdk/maps/maps-weather/samples/v1/javascript/weather.js b/sdk/maps/maps-weather/samples/v1/javascript/weather.js index b52ce1248c5d..bfd141445eb8 100644 --- a/sdk/maps/maps-weather/samples/v1/javascript/weather.js +++ b/sdk/maps/maps-weather/samples/v1/javascript/weather.js @@ -54,19 +54,24 @@ async function main() { console.log(await weather.getCurrentConditions("json", "47.641268,-122.125679", operationOptions)); console.log(" --- Get daily forecast:"); - console.log(await weather.getDailyForecast("json", "62.6490341,30.0734812", { "duration": 5 }, operationOptions)); + const dailyForecastOptions = { "duration": 5 }; + console.log(await weather.getDailyForecast("json", "62.6490341,30.0734812", { ...dailyForecastOptions, ...operationOptions })); console.log(" --- Get daily indices:"); - console.log(await weather.getDailyIndices("json", "43.84745,-79.37849", { "indexGroupId": 11 }, operationOptions)); + const dailyIndicesOptions = { "indexGroupId": 11 }; + console.log(await weather.getDailyIndices("json", "43.84745,-79.37849", { ...dailyIndicesOptions, ...operationOptions })); console.log(" --- Get hourly forecast:"); - console.log(await weather.getHourlyForecast("json", "47.632346,-122.138874", { "duration": 12 }, operationOptions)); + const hourlyForecastOptions = { "duration": 12 }; + console.log(await weather.getHourlyForecast("json", "47.632346,-122.138874", { ...hourlyForecastOptions, ...operationOptions })); console.log(" --- Get minute forecast:"); - console.log(await weather.getMinuteForecast("json", "47.632346,-122.138874", { "interval": 15 }, operationOptions)); + const minuteForecastOptions = { "interval": 15 }; + console.log(await weather.getMinuteForecast("json", "47.632346,-122.138874", { ...minuteForecastOptions, ...operationOptions })); console.log(" --- Get quarter day forecast:"); - console.log(await weather.getQuarterDayForecast("json", "47.632346,-122.138874", { "duration": 1 }, operationOptions)); + const quarterDayForecastOptions = { "duration": 1 }; + console.log(await weather.getQuarterDayForecast("json", "47.632346,-122.138874", { ...quarterDayForecastOptions, ...operationOptions })); console.log(" --- Get severe weather alerts:"); console.log(await weather.getSevereWeatherAlerts("json", "48.057,-81.091", operationOptions)); diff --git a/sdk/maps/maps-weather/samples/v1/typescript/src/weather.ts b/sdk/maps/maps-weather/samples/v1/typescript/src/weather.ts index fa2f3789531a..d62e06867ec2 100644 --- a/sdk/maps/maps-weather/samples/v1/typescript/src/weather.ts +++ b/sdk/maps/maps-weather/samples/v1/typescript/src/weather.ts @@ -60,19 +60,24 @@ async function main() { console.log(await weather.getCurrentConditions("json", "47.641268,-122.125679", operationOptions)); console.log(" --- Get daily forecast:"); - console.log(await weather.getDailyForecast("json", "62.6490341,30.0734812", { "duration": 5 }, operationOptions)); + const dailyForecastOptions = { "duration": 5 }; + console.log(await weather.getDailyForecast("json", "62.6490341,30.0734812", { ...dailyForecastOptions, ...operationOptions })); console.log(" --- Get daily indices:"); - console.log(await weather.getDailyIndices("json", "43.84745,-79.37849", { "indexGroupId": 11 }, operationOptions)); + const dailyIndicesOptions = { "indexGroupId": 11 }; + console.log(await weather.getDailyIndices("json", "43.84745,-79.37849", { ...dailyIndicesOptions, ...operationOptions })); console.log(" --- Get hourly forecast:"); - console.log(await weather.getHourlyForecast("json", "47.632346,-122.138874", { "duration": 12 }, operationOptions)); + const hourlyForecastOptions = { "duration": 12 }; + console.log(await weather.getHourlyForecast("json", "47.632346,-122.138874", { ...hourlyForecastOptions, ...operationOptions })); console.log(" --- Get minute forecast:"); - console.log(await weather.getMinuteForecast("json", "47.632346,-122.138874", { "interval": 15 }, operationOptions)); + const minuteForecastOptions = { "interval": 15 }; + console.log(await weather.getMinuteForecast("json", "47.632346,-122.138874", { ...minuteForecastOptions, ...operationOptions })); console.log(" --- Get quarter day forecast:"); - console.log(await weather.getQuarterDayForecast("json", "47.632346,-122.138874", { "duration": 1 }, operationOptions)); + const quarterDayForecastOptions = { "duration": 1 }; + console.log(await weather.getQuarterDayForecast("json", "47.632346,-122.138874", { ...quarterDayForecastOptions, ...operationOptions })); console.log(" --- Get severe weather alerts:"); console.log(await weather.getSevereWeatherAlerts("json", "48.057,-81.091", operationOptions));

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%0DLmWjp+FZDy>k%1ES}C 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�)f9z?UZsnMepJDpGiGo22+ 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%0DLmWjp+FZDy>k%1ES}C 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�)f9z?UZsnMepJDpGiGo22+ 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