From ad7925db3292b952f2d5495cf21bbb0e0029456d Mon Sep 17 00:00:00 2001 From: Jeff McKenna Date: Fri, 13 Dec 2024 08:39:10 -0400 Subject: [PATCH 01/53] update for 8.4.0-beta1 release --- CMakeLists.txt | 4 ++-- HISTORY.md | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 655eee5c87..799b2d9dec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,9 +16,9 @@ include(CheckIncludeFile) include(CheckCSourceCompiles) set (MapServer_VERSION_MAJOR 8) -set (MapServer_VERSION_MINOR 3) +set (MapServer_VERSION_MINOR 4) set (MapServer_VERSION_REVISION 0) -set (MapServer_VERSION_SUFFIX "") +set (MapServer_VERSION_SUFFIX "-beta1") # Set C++ version # Make CMAKE_CXX_STANDARD available as cache option overridable by user diff --git a/HISTORY.md b/HISTORY.md index 5a163b493e..e95ccddee3 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -13,6 +13,23 @@ https://mapserver.org/development/changelog/ The online Migration Guide can be found at https://mapserver.org/MIGRATION_GUIDE.html +8.4.0-beta1 release (2024-12-13) +-------------------------------- + +- add PCRE2 support (#7073) + +- add CONNECTIONTYPE RASTERLABEL (#7135) + +- set MS_LEGEND_KEYSIZE_MAX to 1000 (#7154) + +- add 4 new COMPOSITE.COMPOP blending operations (#7065) + +- allow encryption key files to use paths relative to a mapfile (#7181) + +- allow use_default_extent_for_getfeature to be used for OGC Features API and PostGIS (#7197) + +see detailed changelog for other fixes + 8.2.2 release (2024-09-02) -------------------------- From 68576d0571baee81c2efe955db432da7f283a949 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 14 Dec 2024 09:35:55 -0400 Subject: [PATCH 02/53] Emit explicit error message when proj.db cannot be found (#7204) --- .../wms_custom_projection_not_specified.xml | 2 +- src/mapproject.c | 46 +++++++++++++------ 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/msautotest/wxs/expected/wms_custom_projection_not_specified.xml b/msautotest/wxs/expected/wms_custom_projection_not_specified.xml index 9ba9744f9e..c542496cb3 100644 --- a/msautotest/wxs/expected/wms_custom_projection_not_specified.xml +++ b/msautotest/wxs/expected/wms_custom_projection_not_specified.xml @@ -2,6 +2,6 @@ msWMSLoadGetMapParams(): WMS server error. Invalid CRS given : CRS must be valid for all requested layers. -msProcessProjection(): Projection library error. proj error "Invalid value for an argument" for "init=esri:54009" +msProcessProjection(): Projection library error. PROJ error "Invalid value for an argument" when instantiating "init=esri:54009" diff --git a/src/mapproject.c b/src/mapproject.c index 3fc90a7cf9..966c88699b 100644 --- a/src/mapproject.c +++ b/src/mapproject.c @@ -76,6 +76,7 @@ struct projectionContext { int ref_count; pjCacheEntry pj_cache[PJ_CACHE_ENTRY_SIZE]; int pj_cache_size; + int cannotFindProjDb; }; /************************************************************************/ @@ -327,7 +328,9 @@ static PJ *getBaseGeographicCRS(projectionObj *in) { /************************************************************************/ static void msProjErrorLogger(void *user_data, int level, const char *message) { - (void)user_data; + projectionContext *ctx = (projectionContext *)user_data; + if (strstr(message, "Cannot find proj.db")) + ctx->cannotFindProjDb = MS_TRUE; if (level == PJ_LOG_ERROR && msGetGlobalDebugLevel() >= MS_DEBUGLEVEL_VV) { msDebug("PROJ: Error: %s\n", message); } else if (level == PJ_LOG_DEBUG) { @@ -335,6 +338,25 @@ static void msProjErrorLogger(void *user_data, int level, const char *message) { } } +/************************************************************************/ +/* msProjGetProjErrorString() */ +/************************************************************************/ + +static const char *msProjGetProjErrorString(projectionObj *p) { + const int l_pj_errno = proj_context_errno(p->proj_ctx->proj_ctx); +#if PROJ_VERSION_MAJOR >= 8 + const char *projErrorStr = + proj_context_errno_string(p->proj_ctx->proj_ctx, l_pj_errno); +#else + const char *projErrorStr = proj_errno_string(l_pj_errno); +#endif + if (p->proj_ctx->cannotFindProjDb) { + projErrorStr = "Cannot find proj.db"; + p->proj_ctx->cannotFindProjDb = MS_FALSE; + } + return projErrorStr; +} + /************************************************************************/ /* msProjectionContextCreate() */ /************************************************************************/ @@ -350,7 +372,7 @@ projectionContext *msProjectionContextCreate(void) { } ctx->ref_count = 1; proj_context_use_proj4_init_rules(ctx->proj_ctx, TRUE); - proj_log_func(ctx->proj_ctx, NULL, msProjErrorLogger); + proj_log_func(ctx->proj_ctx, ctx, msProjErrorLogger); return ctx; } @@ -678,10 +700,8 @@ static int _msProcessAutoProjection(projectionObj *p) { args = msStringSplit(szProjBuf, '+', &numargs); if (!(p->proj = proj_create_argv(p->proj_ctx->proj_ctx, numargs, args))) { - int l_pj_errno = proj_context_errno(p->proj_ctx->proj_ctx); - msSetError(MS_PROJERR, "proj error \"%s\" for \"%s\"", - "msProcessProjection()", proj_errno_string(l_pj_errno), - szProjBuf); + msSetError(MS_PROJERR, "PROJ error \"%s\" when instantiating \"%s\"", + "msProcessProjection()", msProjGetProjErrorString(p), szProjBuf); msFreeCharArray(args, numargs); return (-1); } @@ -750,9 +770,8 @@ int msProcessProjection(projectionObj *p) { /* Deal e.g. with EPSG:XXXX or ESRI:XXXX */ if (!(p->proj = proj_create_argv(p->proj_ctx->proj_ctx, p->numargs, p->args))) { - int l_pj_errno = proj_context_errno(p->proj_ctx->proj_ctx); - msSetError(MS_PROJERR, "proj error \"%s\" for \"%s\"", - "msProcessProjection()", proj_errno_string(l_pj_errno), + msSetError(MS_PROJERR, "PROJ error \"%s\" when instantiating \"%s\"", + "msProcessProjection()", msProjGetProjErrorString(p), p->args[0]); return (-1); } @@ -792,14 +811,13 @@ int msProcessProjection(projectionObj *p) { fprintf(stderr, "\n"); #endif if (!(p->proj = proj_create_argv(p->proj_ctx->proj_ctx, numargs, args))) { - int l_pj_errno = proj_context_errno(p->proj_ctx->proj_ctx); if (p->numargs > 1) { - msSetError(MS_PROJERR, "proj error \"%s\" for \"%s:%s\"", - "msProcessProjection()", proj_errno_string(l_pj_errno), + msSetError(MS_PROJERR, "PROJ error \"%s\" when instantiating \"%s:%s\"", + "msProcessProjection()", msProjGetProjErrorString(p), p->args[0], p->args[1]); } else { - msSetError(MS_PROJERR, "proj error \"%s\" for \"%s\"", - "msProcessProjection()", proj_errno_string(l_pj_errno), + msSetError(MS_PROJERR, "PROJ error \"%s\" when instantiating \"%s\"", + "msProcessProjection()", msProjGetProjErrorString(p), p->args[0]); } free(args); From 87f669979bed2071073aa794eaa437617aaac956 Mon Sep 17 00:00:00 2001 From: Jeff McKenna Date: Sat, 14 Dec 2024 10:09:51 -0400 Subject: [PATCH 03/53] update for 8.4.0-beta2 release --- CMakeLists.txt | 2 +- HISTORY.md | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 799b2d9dec..0974236e1a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,7 @@ include(CheckCSourceCompiles) set (MapServer_VERSION_MAJOR 8) set (MapServer_VERSION_MINOR 4) set (MapServer_VERSION_REVISION 0) -set (MapServer_VERSION_SUFFIX "-beta1") +set (MapServer_VERSION_SUFFIX "-beta2") # Set C++ version # Make CMAKE_CXX_STANDARD available as cache option overridable by user diff --git a/HISTORY.md b/HISTORY.md index e95ccddee3..1e3cee12dd 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -13,6 +13,11 @@ https://mapserver.org/development/changelog/ The online Migration Guide can be found at https://mapserver.org/MIGRATION_GUIDE.html +8.4.0-beta2 release (2024-12-14) +-------------------------------- + +- add explicit error message when proj.db cannot be found (#7203) + 8.4.0-beta1 release (2024-12-13) -------------------------------- From 028d99d5ff840c294e17c9af8100bf3a7c5076fb Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Tue, 17 Dec 2024 22:46:19 +0100 Subject: [PATCH 04/53] Add stdbool.h inclusion in mapserver.h MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes build failure on 8.4.0-beta2 on Ubuntu 20.04: ``` In file included from /home/even/mapserver/mapserver-8.4.0-beta2/src/mapoutput.c:31: /home/even/mapserver/mapserver-8.4.0-beta2/src/mapserver.h:3164:15: error: unknown type name ‘bool’ 3164 | MS_DLL_EXPORT bool msLayerPropertyIsCharacter(layerObj *layer, ``` --- src/mapserver.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mapserver.h b/src/mapserver.h index 9581bfe0b5..d86245fe8b 100644 --- a/src/mapserver.h +++ b/src/mapserver.h @@ -39,6 +39,7 @@ #define _GNU_SOURCE /* Required for strcasestr() defn */ #endif +#include #include #include #include From aac86c899ae29923b13ce3d690a2a740c48777c5 Mon Sep 17 00:00:00 2001 From: Jeff McKenna Date: Mon, 6 Jan 2025 15:27:46 -0400 Subject: [PATCH 05/53] update copyright year --- LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE.md b/LICENSE.md index 5ad42611da..fa495ab2b8 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -4,7 +4,7 @@ MapServer Licensing MapServer General ----------------- -Copyright (c) 2008-2024 Open Source Geospatial Foundation. +Copyright (c) 2008-2025 Open Source Geospatial Foundation. Copyright (c) 1996-2008 Regents of the University of Minnesota. Permission is hereby granted, free of charge, to any person obtaining a copy From 030101b82a6a493df1d4a9179551356b8dc01f53 Mon Sep 17 00:00:00 2001 From: Jeff McKenna Date: Wed, 8 Jan 2025 11:02:31 -0400 Subject: [PATCH 06/53] update for 8.4.0-rc1 release --- CMakeLists.txt | 2 +- HISTORY.md | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0974236e1a..61ed373ea6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,7 @@ include(CheckCSourceCompiles) set (MapServer_VERSION_MAJOR 8) set (MapServer_VERSION_MINOR 4) set (MapServer_VERSION_REVISION 0) -set (MapServer_VERSION_SUFFIX "-beta2") +set (MapServer_VERSION_SUFFIX "-rc1") # Set C++ version # Make CMAKE_CXX_STANDARD available as cache option overridable by user diff --git a/HISTORY.md b/HISTORY.md index 1e3cee12dd..b94d071b1a 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -13,6 +13,11 @@ https://mapserver.org/development/changelog/ The online Migration Guide can be found at https://mapserver.org/MIGRATION_GUIDE.html +8.4.0-rc1 release (2025-01-08) +------------------------------ + +- include stdbool.h in mapserver.h (#7205) + 8.4.0-beta2 release (2024-12-14) -------------------------------- From 8942e55eadcb91eb0fb8a8a1fe178fcee97ba801 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 15 Jan 2025 09:23:54 -0400 Subject: [PATCH 07/53] [Backport branch-8-4] add CITATION.cff (#7210) --- CITATION.cff | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 CITATION.cff diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000000..232a577d18 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,64 @@ +cff-version: 1.2.0 +title: MapServer +message: If you use this software, please cite it using the metadata from this file. +version: 8.4.0 +date-released: 2025-01-15 +abstract: MapServer is an Open Source platform for publishing spatial data and interactive mapping applications to the web. +type: software +authors: + - family-names: McKenna + given-names: Jeff + affiliation: GatewayGeo + orcid: https://orcid.org/0000-0003-3900-1863 + - family-names: Lime + given-names: Steve + affiliation: MNIT DNR + - family-names: Bonfort + given-names: Thomas + affiliation: Airbus + - family-names: Boué + given-names: Jérome + - family-names: Butler + given-names: Howard + affiliation: Hobu Inc + orcid: https://orcid.org/0000-0002-5340-1380 + - family-names: Girvin + given-names: Seth + affiliation: Geographika + - family-names: Kralidis + given-names: Tom + - family-names: Meissl + given-names: Stephan + affiliation: EOX + orcid: https://orcid.org/0000-0002-1407-8859 + - family-names: Morissette + given-names: Daniel + affiliation: Mapgears + - family-names: Nacionales + given-names: Perry + affiliation: University of Minnesota + - family-names: Rahkonen + given-names: Jukka + affiliation: National Land Survey of Finland + - family-names: Rouault + given-names: Even + affiliation: Spatialys + orcid: https://orcid.org/0000-0002-5068-0476 + - family-names: Smith + given-names: Mike + affiliation: US Army Corps of Engineers + - family-names: Szekeres + given-names: Tamas +repository-code: https://github.com/MapServer/MapServer +license: MIT +doi: 10.5281/zenodo.6994443 +keywords: + - web + - geospatial + - software + - ogc + - standards + - gdal + - open source + - free software + - MIT From 03bf9c1442782c4e1c413b8a03bf979177a2d160 Mon Sep 17 00:00:00 2001 From: Jeff McKenna Date: Wed, 15 Jan 2025 10:41:15 -0400 Subject: [PATCH 08/53] update for 8.4.0 release --- CMakeLists.txt | 2 +- HISTORY.md | 6 ++++++ SECURITY.md | 8 +++++--- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 61ed373ea6..c7e9209431 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,7 @@ include(CheckCSourceCompiles) set (MapServer_VERSION_MAJOR 8) set (MapServer_VERSION_MINOR 4) set (MapServer_VERSION_REVISION 0) -set (MapServer_VERSION_SUFFIX "-rc1") +set (MapServer_VERSION_SUFFIX "") # Set C++ version # Make CMAKE_CXX_STANDARD available as cache option overridable by user diff --git a/HISTORY.md b/HISTORY.md index b94d071b1a..7d43b9ce54 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -13,6 +13,12 @@ https://mapserver.org/development/changelog/ The online Migration Guide can be found at https://mapserver.org/MIGRATION_GUIDE.html +8.4.0 release (2025-01-15) +-------------------------- + +- add CITATION.cff, useful for Zenodo/DOI (#7209) +(see major changes below) + 8.4.0-rc1 release (2025-01-08) ------------------------------ diff --git a/SECURITY.md b/SECURITY.md index 43e72602a5..f667db5ec6 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -13,17 +13,18 @@ submissions, when describing the vulnerability (see https://mapserver.org/develo The MapServer PSC (Project Steering Committee) will release patches for security vulnerabilities for the last release branch of the **two most recent release series** (such as 8.x, 7.x, 6.x, etc..., where "x" is the most recent release in the series, such as: 7.6.6 being supported, but -not 7.6.5). For example, once 8.4 is released, support for 8.2 will be dropped. +not 7.6.5). For example, once 8.6 is released, support for 8.4 will be dropped. Patches will only be provided **for a period of three years** from the release date of the current series. -For example, as 8.2 has been released, now 8.2.x, and 7.6.x will be supported/patched, and 7.6.x will +For example, as 8.4 has been released, now 8.4.x, and 7.6.x will be supported/patched, and 7.6.x will only be supported for three years from the date of the 8.0 series release (until 2025-09-12). Currently, the following versions are supported: | Version | Supported | Support Until | | ------- | ------------------ |-------------- | -| 8.2.x | :white_check_mark: | | +| 8.4.x | :white_check_mark: | | +| 8.2.x | :x: | | | 8.0.x | :x: | | | 7.6.x | :white_check_mark: | 2025-09-12 | | 7.4.x | :x: | | @@ -32,6 +33,7 @@ Currently, the following versions are supported: | 6.4.x | :x: | | | < 6.4 | :x: | | +- _MapServer 8.4.0 was released on 2025-01-15_ - _MapServer 8.2.0 was released on 2024-07-08_ - _MapServer 8.0.0 was released on 2022-09-12_ - _MapServer 7.0.0 was released on 2015-07-24_ From 2bffd04c54c92ee97846221c26134b1603a63cd0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 09:33:25 -0400 Subject: [PATCH 09/53] [CI] bump PCRE2 for SWIG build (#7214) Co-authored-by: Jeff McKenna --- ci/ubuntu/setup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/ubuntu/setup.sh b/ci/ubuntu/setup.sh index c4011e40a6..e7ca557a0b 100755 --- a/ci/ubuntu/setup.sh +++ b/ci/ubuntu/setup.sh @@ -33,7 +33,7 @@ cmake --version # upgrade to recent SWIG git clone https://github.com/swig/swig.git swig-git-master cd swig-git-master -wget https://github.com/PhilipHazel/pcre2/releases/download/pcre2-10.39/pcre2-10.39.tar.gz +wget https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.44/pcre2-10.44.tar.gz ./Tools/pcre-build.sh ./autogen.sh ./configure --prefix=/usr From 16b85d0d8c4b32d5b10c0b164aebba9338ef41aa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 2 Feb 2025 14:20:33 -0400 Subject: [PATCH 10/53] msDrawRasterBuildRasterPath(): micro-optimization: do not attempt to open non-exiting file (#7216) For a mapfile *without* SHAPEPATH and with a raster layer pointing to a tileindex layer (e.g. PostGIS), we currently try to access an inexisting file with the name of that tileindex layer. Really a micro-optimization. Nothing critical. Found when investigated other useless file opening attempts. Co-authored-by: Even Rouault --- src/mapraster.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/mapraster.c b/src/mapraster.c index 61c9f8c67a..f27d002a94 100644 --- a/src/mapraster.c +++ b/src/mapraster.c @@ -437,9 +437,11 @@ int msDrawRasterBuildRasterPath(mapObj *map, layerObj *layer, char szPath[MS_MAXPATHLEN] /* output */) { /* ** If using a tileindex then build the path relative to that file if SHAPEPATH - *is not set. + * is not set, provided that layer->tileindex does not refer to a layer (to + * save a useless file opening attempt) */ - if (layer->tileindex && !map->shapepath) { + if (layer->tileindex && !map->shapepath && + msGetLayerIndex(map, layer->tileindex) < 0) { char tiAbsFilePath[MS_MAXPATHLEN]; char *tiAbsDirPath = NULL; From fff513a976f58866f083238b6a2c0fa16798b9a9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 22:13:54 +0100 Subject: [PATCH 11/53] Attempt at fuzzer fix (#7220) Co-authored-by: sethg --- fuzzers/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fuzzers/build.sh b/fuzzers/build.sh index 52eb32d5e6..164ee98dfa 100755 --- a/fuzzers/build.sh +++ b/fuzzers/build.sh @@ -80,7 +80,7 @@ for fuzzer in mapfuzzer shapefuzzer configfuzzer; do $CXX $CXXFLAGS $LIB_FUZZING_ENGINE ${fuzzer}.o -o ${fuzzer} \ -L. -lmapserver_static -lgdal \ -Wl,-Bstatic -lpng -ljpeg -lfreetype -lproj -lxml2 -lz -lsqlite3 -llzma \ - -Wl,-Bdynamic -lpthread -ldl -lc++ + -Wl,-Bdynamic -lpthread -ldl -lc++ -lclang_rt.builtins cp ${fuzzer} $OUT/ done From 36b9a469a8cc127a2fd7b7ce11bcc7c13103f0a8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 9 Feb 2025 22:22:20 +0100 Subject: [PATCH 12/53] [Backport branch-8-4] Python MapScript updates (#7222) * Switch to python3-venv and remove virtualenv requirement * Remove Python2 constraints * Hide pip upgrade warning * Switch to demo.mapserver.org for test * Ensure CMake stamp files are created * Set CURL_CA_BUNDLE for Windows CI * Ensure location of stamp files * Add --no-warn-script-location * Remove warnings from CI msautotests --------- Co-authored-by: sethg --- .github/workflows/start.sh | 2 +- appveyor.yml | 4 +++- msautotest/requirements.txt | 8 +------ scripts/vagrant/packages.sh | 2 +- src/mapscript/python/CMakeLists.txt | 22 ++++++++++--------- src/mapscript/python/requirements-dev.txt | 2 +- .../python/tests/cases/thread_test.py | 11 +++++----- 7 files changed, 24 insertions(+), 27 deletions(-) diff --git a/.github/workflows/start.sh b/.github/workflows/start.sh index 19998de616..cf518771dd 100755 --- a/.github/workflows/start.sh +++ b/.github/workflows/start.sh @@ -9,7 +9,7 @@ export PYTHON_VERSION=system LANG=en_US.UTF-8 export LANG DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ - sudo locales tzdata software-properties-common python3-dev python3-pip python3-setuptools git curl \ + sudo locales tzdata software-properties-common python3-dev python3-venv python3-pip python3-setuptools git curl \ apt-transport-https ca-certificates gnupg software-properties-common wget #install PHP 8.1 DEBIAN_FRONTEND=noninteractive add-apt-repository ppa:ondrej/php -y diff --git a/appveyor.yml b/appveyor.yml index ccf6e4db0a..a2ccf10e93 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -91,6 +91,7 @@ build_script: # set the MapScript custom environment variable for python 3.8+ - set MAPSERVER_DLL_PATH=%BUILD_FOLDER%/build/Release;%SDK_BIN% - set PROJ_DATA=%SDK_BIN%/proj9/SHARE + - set CURL_CA_BUNDLE=%SDK_BIN%/curl-ca-bundle.crt # ensure the GIF driver is available for tests - set GDAL_DRIVER_PATH=%SDK_BIN%/gdal/plugins # check the mapserver exe can run @@ -100,8 +101,9 @@ build_script: before_test: - set PATH=%SDK_BIN%/gdal/apps;%PATH%; - cd %BUILD_FOLDER%/msautotest + - set PIP_NO_PYTHON_VERSION_WARNING=1 - "./mssql/create_mssql_db.bat" - - "%Python_ROOT_DIR%/python -m pip install -U -r requirements.txt" + - "%Python_ROOT_DIR%/python -m pip install --no-warn-script-location -U -r requirements.txt" - "%Python_ROOT_DIR%/python -m pip install --no-index --find-links=file://%BUILD_FOLDER%/build/src/mapscript/python/Release/dist mapscript" test_script: diff --git a/msautotest/requirements.txt b/msautotest/requirements.txt index b9e37ff1fe..eaa83d0dee 100644 --- a/msautotest/requirements.txt +++ b/msautotest/requirements.txt @@ -1,10 +1,4 @@ -# Python 2.7 constraints -# more-itertools 6.0 no longer supporting Python 2.7 -more-itertools < 6.0.0; python_version < '3.0' -# pytest 5.0 no longer supporting Python 2.7 -pytest>=3.6.0,<5.0.0; python_version < '3.0' - -pytest>=3.6.0; python_version >= '3.0' +pytest pytest-sugar pytest-env lxml diff --git a/scripts/vagrant/packages.sh b/scripts/vagrant/packages.sh index 75afb4c432..39b6c92271 100755 --- a/scripts/vagrant/packages.sh +++ b/scripts/vagrant/packages.sh @@ -12,7 +12,7 @@ apt-get -y upgrade # install packages we need apt-get install -q -y git build-essential pkg-config cmake libgeos-dev rake \ - libpq-dev python3-dev python3-pip libproj-dev libxml2-dev postgis php-dev \ + libpq-dev python3-dev python3-pip python3-venv libproj-dev libxml2-dev postgis php-dev \ postgresql-server-dev-12 postgresql-12-postgis-3 postgresql-12-postgis-3-scripts vim bison flex swig \ librsvg2-dev libpng-dev libjpeg-dev libgif-dev \ libfreetype6-dev libfcgi-dev libcurl4-gnutls-dev libcairo2-dev \ diff --git a/src/mapscript/python/CMakeLists.txt b/src/mapscript/python/CMakeLists.txt index c7cb8a6e47..f0bc2cc8cf 100644 --- a/src/mapscript/python/CMakeLists.txt +++ b/src/mapscript/python/CMakeLists.txt @@ -60,32 +60,33 @@ endif() add_custom_target( pythonmapscript-wheel - DEPENDS mapscripttests.stamp + DEPENDS ${MAPSCRIPT_WORKING_DIR}/mapscripttests.stamp ) add_custom_command( DEPENDS ${SWIG_MODULE_pythonmapscript_REAL_NAME} - OUTPUT mapscriptvenv.stamp + OUTPUT ${MAPSCRIPT_WORKING_DIR}/mapscriptvenv.stamp WORKING_DIRECTORY ${MAPSCRIPT_WORKING_DIR} - COMMAND ${Python_EXECUTABLE} -m pip install pip --upgrade - COMMAND ${Python_EXECUTABLE} -m pip install virtualenv - COMMAND ${Python_EXECUTABLE} -m virtualenv mapscriptvenv - COMMAND ${Python_VENV_SCRIPTS}/pip install -r ${PROJECT_SOURCE_DIR}/src/mapscript/python/requirements-dev.txt > requires.log + COMMAND ${Python_EXECUTABLE} -m venv mapscriptvenv + COMMAND ${CMAKE_COMMAND} -E env PIP_NO_PYTHON_VERSION_WARNING=1 + ${Python_VENV_SCRIPTS}/pip install --no-warn-script-location -r ${PROJECT_SOURCE_DIR}/src/mapscript/python/requirements-dev.txt > requires.log + COMMAND ${CMAKE_COMMAND} -E touch ${MAPSCRIPT_WORKING_DIR}/mapscriptvenv.stamp COMMENT "Creating a Python virtual environment and installing the required packages" ) add_custom_command( - DEPENDS mapscriptvenv.stamp - OUTPUT mapscriptwheel.stamp + DEPENDS ${MAPSCRIPT_WORKING_DIR}/mapscriptvenv.stamp + OUTPUT ${MAPSCRIPT_WORKING_DIR}/mapscriptwheel.stamp WORKING_DIRECTORY ${MAPSCRIPT_WORKING_DIR} COMMAND ${Python_VENV_SCRIPTS}/python -m build --wheel > wheel_build.log + COMMAND ${CMAKE_COMMAND} -E touch ${MAPSCRIPT_WORKING_DIR}/mapscriptwheel.stamp COMMENT "Building the mapscript Python wheel" ) add_custom_command( WORKING_DIRECTORY ${Python_VENV_SCRIPTS} # make sure scripts aren't run when from the same folder as mapscript.py - DEPENDS mapscriptwheel.stamp - OUTPUT mapscripttests.stamp + DEPENDS ${MAPSCRIPT_WORKING_DIR}/mapscriptwheel.stamp + OUTPUT ${MAPSCRIPT_WORKING_DIR}/mapscripttests.stamp COMMAND ${Python_VENV_SCRIPTS}/pip install --no-index --find-links=${MAPSCRIPT_WORKING_DIR}/dist mapscript # ERROR: file or package not found: mapscript.tests (missing __init__.py?) is caused by # ImportError: DLL load failed while importing _mapscript: The specified module could not be found. @@ -94,6 +95,7 @@ add_custom_command( COMMAND ${Python_VENV_SCRIPTS}/python -m mapscript.examples.shpdump ${PROJECT_SOURCE_DIR}/tests/polygon.shp > shpdump.txt COMMAND ${Python_VENV_SCRIPTS}/python -m mapscript.examples.shpinfo ${PROJECT_SOURCE_DIR}/tests/polygon.shp > shpinfo.txt COMMAND ${Python_VENV_SCRIPTS}/python -m mapscript.examples.wxs ${PROJECT_SOURCE_DIR}/tests/test.map > response.xml + COMMAND ${CMAKE_COMMAND} -E touch ${MAPSCRIPT_WORKING_DIR}/mapscripttests.stamp COMMENT "Installing the Python wheel and testing it in the virtual environment, then running tests and examples" ) diff --git a/src/mapscript/python/requirements-dev.txt b/src/mapscript/python/requirements-dev.txt index 405e52c12e..2e8e4893af 100644 --- a/src/mapscript/python/requirements-dev.txt +++ b/src/mapscript/python/requirements-dev.txt @@ -2,4 +2,4 @@ pytest pillow wheel>=0.38.0 setuptools>=45.0.0 -build[virtualenv] \ No newline at end of file +build \ No newline at end of file diff --git a/src/mapscript/python/tests/cases/thread_test.py b/src/mapscript/python/tests/cases/thread_test.py index 675bcfcd55..34735b66bf 100644 --- a/src/mapscript/python/tests/cases/thread_test.py +++ b/src/mapscript/python/tests/cases/thread_test.py @@ -148,16 +148,15 @@ def draw_map_wms(name, save=0): # print("making map in thread %s" % (name)) mo = mapscript.mapObj(TESTMAPFILE) - # WFS layer + # WMS layer lo = mapscript.layerObj() - lo.name = "jpl_wms" + lo.name = "world_latlong" lo.setProjection("+init=epsg:4326") lo.connectiontype = mapscript.MS_WMS - lo.connection = "http://vmap0.tiles.osgeo.org/wms/vmap0?" + lo.connection = "https://demo.mapserver.org/cgi-bin/msautotest?" lo.metadata.set("wms_service", "WMS") - lo.metadata.set("wms_server_version", "1.1.1") - lo.metadata.set("wms_name", "basic") - lo.metadata.set("wms_style", "visual") + lo.metadata.set("wms_server_version", "1.3.0") + lo.metadata.set("wms_name", "world_latlong") lo.metadata.set("wms_format", "image/jpeg") lo.type = mapscript.MS_LAYER_RASTER lo.status = mapscript.MS_DEFAULT From 75963471e6ae23dbbc592a10847f375829f4f863 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 13 Mar 2025 12:44:22 -0300 Subject: [PATCH 13/53] [Backport branch-8-4] Make sure 130 tests make request for WMS version 1.3.0 (#7253) --- msautotest/wxs/wms_client_111.map | 4 ++++ msautotest/wxs/wms_client_111_axis_fail.map | 2 ++ msautotest/wxs/wms_client_130.map | 6 ++++++ msautotest/wxs/wms_client_130_axis_fail.map | 4 +++- 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/msautotest/wxs/wms_client_111.map b/msautotest/wxs/wms_client_111.map index 07ff8a7992..1e166fe0ff 100644 --- a/msautotest/wxs/wms_client_111.map +++ b/msautotest/wxs/wms_client_111.map @@ -5,11 +5,15 @@ # # # GetMap +# RUN_PARMS: wms_client_111.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180" > [RESULT_DEMIME] # RUN_PARMS: wms_client_111.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90" > [RESULT_DEMIME] # # GetFeatureInfo +# RUN_PARMS: wms_client_111.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT] # RUN_PARMS: wms_client_111.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT] +# # GetLegendGraphic +# RUN_PARMS: wms_client_111_legendgraphic.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetLegendGraphic&LAYER=client&FORMAT=image/png&TRANSPARENT=FALSE&SLD_VERSION=1.1.0" > [RESULT_DEMIME] # RUN_PARMS: wms_client_111_legendgraphic.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetLegendGraphic&LAYER=client&FORMAT=image/png" > [RESULT_DEMIME] diff --git a/msautotest/wxs/wms_client_111_axis_fail.map b/msautotest/wxs/wms_client_111_axis_fail.map index cf28943428..2cffb085b0 100644 --- a/msautotest/wxs/wms_client_111_axis_fail.map +++ b/msautotest/wxs/wms_client_111_axis_fail.map @@ -5,9 +5,11 @@ # # # GetMap +# RUN_PARMS: wms_client_111_axis_fail.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180" > [RESULT_DEMIME] # RUN_PARMS: wms_client_111_axis_fail.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90" > [RESULT_DEMIME] # # GetFeatureInfo +# RUN_PARMS: wms_client_111_axis_fail.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT] # RUN_PARMS: wms_client_111_axis_fail.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT] diff --git a/msautotest/wxs/wms_client_130.map b/msautotest/wxs/wms_client_130.map index 1238c33c12..2c3e5ec54e 100644 --- a/msautotest/wxs/wms_client_130.map +++ b/msautotest/wxs/wms_client_130.map @@ -5,13 +5,19 @@ # # # GetMap +# RUN_PARMS: wms_client_130.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180" > [RESULT_DEMIME] # RUN_PARMS: wms_client_130.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90" > [RESULT_DEMIME] +# +# RUN_PARMS: wms_client_crs_32633.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:32633&BBOX=920482.6044580448652,7662266.090040001087,1317920.914512843126,8079762.906353433616" > [RESULT_DEMIME] # RUN_PARMS: wms_client_crs_32633.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:32633&BBOX=920482.6044580448652,7662266.090040001087,1317920.914512843126,8079762.906353433616" > [RESULT_DEMIME] # # GetFeatureInfo +# RUN_PARMS: wms_client_130.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT] # RUN_PARMS: wms_client_130.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT] +# # GetLegendGraphic # RUN_PARMS: wms_client_130_legendgraphic.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetLegendGraphic&LAYER=client&FORMAT=image/png&TRANSPARENT=FALSE&SLD_VERSION=1.1.0" > [RESULT_DEMIME] +# RUN_PARMS: wms_client_130_legendgraphic.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetLegendGraphic&LAYER=client&FORMAT=image/png&TRANSPARENT=FALSE&SLD_VERSION=1.1.0" > [RESULT_DEMIME] MAP diff --git a/msautotest/wxs/wms_client_130_axis_fail.map b/msautotest/wxs/wms_client_130_axis_fail.map index 8b20f21d2d..e46295c643 100644 --- a/msautotest/wxs/wms_client_130_axis_fail.map +++ b/msautotest/wxs/wms_client_130_axis_fail.map @@ -5,9 +5,11 @@ # # # GetMap +# RUN_PARMS: wms_client_130_axis_fail.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180" > [RESULT_DEMIME] # RUN_PARMS: wms_client_130_axis_fail.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90" > [RESULT_DEMIME] -# + # GetFeatureInfo +# RUN_PARMS: wms_client_130_axis_fail.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT] # RUN_PARMS: wms_client_130_axis_fail.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT] From 85fa884d5a0464a5117b693490f6d24202877e5c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 20 Mar 2025 08:57:02 -0300 Subject: [PATCH 14/53] Fix opacity for gradient legend symbol (#7256) Co-authored-by: Patrik Sylve --- .../wxs/expected/wms_gradient_legend.png | Bin 0 -> 1251 bytes msautotest/wxs/wms_legend.map | 24 ++++++++++++++++++ src/mapagg.cpp | 6 ++++- src/maplegend.c | 7 ++++- 4 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 msautotest/wxs/expected/wms_gradient_legend.png diff --git a/msautotest/wxs/expected/wms_gradient_legend.png b/msautotest/wxs/expected/wms_gradient_legend.png new file mode 100644 index 0000000000000000000000000000000000000000..11944bc9d64e4353de55dc1ab4b3422c3c2c25be GIT binary patch literal 1251 zcmV<91RVQ`P)+*9hs32Qw$-*4Daf>nXB{6_w@FjNi$}?^G?mVe%*|+S*J^Op=n4jEsy>DG&e{yoNv9U2QFo5lW2cw6`ySqDP7*5sJ*1Ed7Vp=yhH;Hp~brsuoe0=;iDImSM zxtZk*4Gl%+FtDkrs;aC@kjeJ;HkP%&zn?6}!NI}c;2=_!zF&6oLebLF;^E;zY>-}D zT-?;u1f3zCg@pwj9UVgS^YgQ^vhx1^KJ$2XcD9p~Q($0Vcz8G#qO`OWbol%GJ3Biw z+k>-yet!D;`pL=3RaI5+#K357!HR8dhur-|+3OnQ1rY%O0mQ~WX=-ZT+}yyP zoSZ~6SPR5Nd3iZHl%JoErlzN-!-Ing3JT;n5FH&|U0u!k7WlotzZZY)?#s&yiNr{; z?*E3Q_x1H9N-#V;OgtAC7Y+^%C`tOGNE#KwfZSVJT2eoxW^r+m841#<&PGN?wzmH9 zT{ky3`c%+6Dd`;@9as)xgKi}yCFZ*g*&(Uc)zvX?I668)Bv$S5@e!npL?YtHk~K6m zu)gK%>q~50f~$y~o106srTB)VZ*6UjNU*cBBbGe9g;%qsHiBsy2N&Ocb6s|vO{d>33i{@U{Fy}@%HwXMuJU}D#VSIn6|byaq8*m z(Vermx5taZ`W9_)eSJMPnAmxFc`_xP2~>zTEiElgBmsE6H1v6c9(LPZ0;!AfEt z%gV}vf`V9A{dLl(rlxFcY#tsS$hV+ib8~aBD=RAz{6@Ao2ys9HNP~(-R#sMQY%Kgx zCv*axV;=c0l8$Q47{Eg$mJBtN1X7E_A|fKN%On`m46V@8(n1*4g>_X$MMYy{Be63x zGx2kt*fB9N)6>(;NDu_YhrE(y#~`BzrlzKN;-s%-!qd}JQv#$xryC209wRGjYwL-L z3D%LZu`x=tKp-e6C?Gc8aF%3=<^Pd#0y*g%Ku$Ubkdw{< [RESULT_DEMIME] # RUN_PARMS: wms_legend_notext.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.0&REQUEST=GetLegendGraphic&LAYER=layer3&FORMAT=image/png" > [RESULT_DEMIME] # RUN_PARMS: wms_keyimage_legend.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.0&REQUEST=GetLegendGraphic&LAYER=layer4&FORMAT=image/png&TRANSPARENT=FALSE&EXCEPTIONS=INIMAGE" > [RESULT_DEMIME] +# RUN_PARMS: wms_gradient_legend.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetLegendGraphic&LAYER=gradient&SLD_VERSION=1.1.0&FORMAT=image/png&TRANSPARENT=FALSE&EXCEPTIONS=INIMAGE" > [RESULT_DEMIME] MAP @@ -228,4 +229,27 @@ LAYER END #Class END # Layer +LAYER + NAME "gradient" + DATA multiband.tif + METADATA + "wms_title" "gradient_opacity" + END + TYPE RASTER + STATUS ON + + CLASSITEM "GRADIENT" + CLASS + NAME "-250 m to -50 m" + GROUP "Blue" + EXPRESSION ([pixel] >= -250 AND [pixel] < -50) + STYLE + OPACITY 70 + RANGEITEM "pixel" + COLORRANGE 128 172 239 7 6 111 + DATARANGE -250.000000 -50.000000 + END # STYLE + TITLE "-250 m to -50 m" + END # CLASS +END # Layer END # Map File diff --git a/src/mapagg.cpp b/src/mapagg.cpp index 693dca8f93..bf06194002 100644 --- a/src/mapagg.cpp +++ b/src/mapagg.cpp @@ -692,8 +692,12 @@ int agg2RenderPixmapSymbol(imageObj *img, double x, double y, symbolObj *symbol, } else { // just copy the image at the correct location (we place the pixmap on // the nearest integer pixel to avoid blurring) + unsigned alpha = mapserver::cover_full; + if (style && style->color) { + alpha = style->color->alpha; + } r->m_renderer_base.blend_from(pf, 0, MS_NINT(x - pixmap->width / 2.), - MS_NINT(y - pixmap->height / 2.)); + MS_NINT(y - pixmap->height / 2.), alpha); } return MS_SUCCESS; } diff --git a/src/maplegend.c b/src/maplegend.c index e1b49085ff..b8227c32d4 100644 --- a/src/maplegend.c +++ b/src/maplegend.c @@ -66,10 +66,15 @@ static int msDrawGradientSymbol(rendererVTableObj *renderer, b[4 * (j * rb->width + i)] = style->color.blue; g[4 * (j * rb->width + i)] = style->color.green; r[4 * (j * rb->width + i)] = style->color.red; - a[4 * (j * rb->width + i)] = style->color.alpha; + if (strncasecmp(image_draw->format->driver, "AGG/", 4) == 0) { + a[4 * (j * rb->width + i)] = 255; // Apply alpha later + } else { + a[4 * (j * rb->width + i)] = style->color.alpha; + } } } INIT_SYMBOL_STYLE(symbolStyle); + symbolStyle.color = &style->color; ret = renderer->renderPixmapSymbol(image_draw, x_center, y_center, &symbol, &symbolStyle); msFreeSymbol(&symbol); From 0e9f04e609530f144647e221156bcb631622f9d1 Mon Sep 17 00:00:00 2001 From: Bas Couwenberg Date: Thu, 3 Apr 2025 13:30:21 +0200 Subject: [PATCH 15/53] Bump C/C++ standard to 17 for ICU 76. (#7259) * Bump C/C++ standard to 17 for ICU 76. * Update OpenAPI-Specification schema URL. --- .github/workflows/start.sh | 4 ++-- CMakeLists.txt | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/start.sh b/.github/workflows/start.sh index cf518771dd..3dd3d98158 100755 --- a/.github/workflows/start.sh +++ b/.github/workflows/start.sh @@ -41,8 +41,8 @@ ci/ubuntu/setup.sh ci/ubuntu/build.sh # Validate openapi document -pip install check-jsonschema -wget https://raw.githubusercontent.com/OAI/OpenAPI-Specification/main/schemas/v3.0/schema.yaml -O openapi_schema.yaml +pip install check-jsonschema --break-system-packages +wget https://raw.githubusercontent.com/OAI/OpenAPI-Specification/refs/heads/main/_archive_/schemas/v3.0/schema.yaml -O openapi_schema.yaml echo "Run check-jsonschema --schemafile openapi_schema.yaml msautotest/api/expected/ogcapi_api.json" check-jsonschema --schemafile openapi_schema.yaml msautotest/api/expected/ogcapi_api.json diff --git a/CMakeLists.txt b/CMakeLists.txt index c7e9209431..578081f005 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,8 +22,8 @@ set (MapServer_VERSION_SUFFIX "") # Set C++ version # Make CMAKE_CXX_STANDARD available as cache option overridable by user -set(CMAKE_CXX_STANDARD 11 - CACHE STRING "C++ standard version to use (default is 11)") +set(CMAKE_CXX_STANDARD 17 + CACHE STRING "C++ standard version to use (default is 17)") message(STATUS "Requiring C++${CMAKE_CXX_STANDARD}") set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) @@ -31,8 +31,8 @@ message(STATUS "Requiring C++${CMAKE_CXX_STANDARD} - done") # Set C version # Make CMAKE_C_STANDARD available as cache option overridable by user -set(CMAKE_C_STANDARD 11 - CACHE STRING "C standard version to use (default is 11)") +set(CMAKE_C_STANDARD 17 + CACHE STRING "C standard version to use (default is 17)") message(STATUS "Requiring C${CMAKE_C_STANDARD}") set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS OFF) From 61c47624a17bfb8abbb01e4ae1efff418f39b7c4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 4 Apr 2025 13:11:12 -0300 Subject: [PATCH 16/53] [Backport branch-8-4] CI: handle Flake8 unused variable violation code (#7265) --------- Co-authored-by: Jeff McKenna --- .flake8 | 2 +- .pre-commit-config.yaml | 2 +- msautotest/pymod/msautotest_viewer.py | 3 --- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.flake8 b/.flake8 index a570f5e020..74f239821f 100644 --- a/.flake8 +++ b/.flake8 @@ -32,4 +32,4 @@ ignore = # line break occurred before a binary operator - let black worry about that W503 # line break occurred after a binary operator - let black worry about that - W504 + W504 \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6465ead931..819ddec657 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,7 +9,7 @@ repos: - id: isort args: ["--profile", "black"] - repo: https://github.com/pycqa/flake8 - rev: 7.1.1 + rev: 7.2.0 hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-clang-format diff --git a/msautotest/pymod/msautotest_viewer.py b/msautotest/pymod/msautotest_viewer.py index 77c1e2806c..87cf00fed0 100755 --- a/msautotest/pymod/msautotest_viewer.py +++ b/msautotest/pymod/msautotest_viewer.py @@ -21,7 +21,6 @@ def main(): function_name = "main: " - global config, logging_flag if not os.path.isdir(os.path.dirname(python_logging_file)): print("Content-type: text/html") @@ -444,7 +443,6 @@ def main(): ## browser def tiff2png(tiff_file): function_name = "tiff2png: " - global python_logging_file, logging_flag, config ## Checking if path is found if not os.path.isdir(os.path.dirname(python_logging_file)): @@ -603,7 +601,6 @@ def tiff2png(tiff_file): ## Remove temporary PNG images file def rmTmpPngImages(): - global config function_name = "rmTmpPngImages: " tmp_path = config.get("Applications", "TmpDir") From 2c9c80590662b613377699ea744a2a00945b5ab2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 15 Apr 2025 13:02:26 -0300 Subject: [PATCH 17/53] [Backport branch-8-4] update OGCAPI Common schemas url (#7269) --------- Co-authored-by: Jeff McKenna --- msautotest/api/expected/ogcapi_api.json | 2 +- src/mapogcapi.cpp | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/msautotest/api/expected/ogcapi_api.json b/msautotest/api/expected/ogcapi_api.json index b12f7242d8..fe0cc1914f 100644 --- a/msautotest/api/expected/ogcapi_api.json +++ b/msautotest/api/expected/ogcapi_api.json @@ -1 +1 @@ -{"components":{"parameters":{"f":{"description":"The optional f parameter indicates the output format which the server shall provide as part of the response document. The default format is GeoJSON.","explode":false,"in":"query","name":"f","required":false,"schema":{"default":"json","enum":["json","html"],"type":"string"},"style":"form"},"offset":{"description":"The optional offset parameter indicates the index within the result set from which the server shall begin presenting results in the response document. The first element has an index of 0 (default).","explode":false,"in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"},"style":"form"}},"responses":{"200":{"description":"successful operation"},"default":{"content":{"application/json":{"schema":{"$ref":"https://raw.githubusercontent.com/opengeospatial/ogcapi-processes/master/core/openapi/schemas/exception.yaml"}}},"description":"unexpected error"}}},"info":{"contact":{"email":"email@example.com","name":"Contact person","url":"http://example.com/contact"},"description":"This is a test OGC API server description set via oga_description.","termsOfService":"Terms of Service","title":"OGC API Test","version":"1.0.0","x-keywords":"keyword1,keyword2"},"openapi":"3.0.2","paths":{"/":{"get":{"description":"Landing page","operationId":"getLandingPage","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/LandingPage"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Landing page","tags":["server"]}},"/api":{"get":{"description":"API documentation","operationId":"getOpenapi","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"#/components/responses/200"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"default":{"$ref":"#/components/responses/default"}},"summary":"API documentation","tags":["server"]}},"/collections":{"get":{"description":"Collections","operationId":"getCollections","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collections"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Collections","tags":["server"]}},"/collections/mn_counties":{"get":{"description":"This is the standard Minnesota State County Boundary dataset.","operationId":"describemn_countiesCollection","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collection"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get State of Minnesota County Boundaries metadata","tags":["mn_counties"]}},"/collections/mn_counties/items":{"get":{"description":"This is the standard Minnesota State County Boundary dataset.","operationId":"getmn_countiesFeatures","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/bbox"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/datetime"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/bbox-crs"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/crs"},{"$ref":"#/components/parameters/offset"},{"description":"The optional limit parameter limits the number of items that are presented in the response document.","explode":false,"in":"query","name":"limit","required":false,"schema":{"default":9,"maximum":15,"minimum":1,"type":"integer"},"style":"form"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Features"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get State of Minnesota County Boundaries items","tags":["mn_counties"]}},"/collections/mn_counties/items/{featureId}":{"get":{"description":"This is the standard Minnesota State County Boundary dataset.","operationId":"getmn_countiesFeature","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/featureId"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Feature"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"404":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/NotFound"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get State of Minnesota County Boundaries item by id","tags":["mn_counties"]}},"/collections/mn_major_rivers":{"get":{"description":"This dataset represents stream centerlines for major rivers in Minnesota.","operationId":"describemn_major_riversCollection","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collection"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Major River Centerlines metadata","tags":["mn_major_rivers"]}},"/collections/mn_major_rivers/items":{"get":{"description":"This dataset represents stream centerlines for major rivers in Minnesota.","operationId":"getmn_major_riversFeatures","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/bbox"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/datetime"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/bbox-crs"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/crs"},{"$ref":"#/components/parameters/offset"},{"description":"The optional limit parameter limits the number of items that are presented in the response document.","explode":false,"in":"query","name":"limit","required":false,"schema":{"default":9,"maximum":15,"minimum":1,"type":"integer"},"style":"form"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Features"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Major River Centerlines items","tags":["mn_major_rivers"]}},"/collections/mn_major_rivers/items/{featureId}":{"get":{"description":"This dataset represents stream centerlines for major rivers in Minnesota.","operationId":"getmn_major_riversFeature","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/featureId"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Feature"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"404":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/NotFound"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Major River Centerlines item by id","tags":["mn_major_rivers"]}},"/collections/mn_population_centers":{"get":{"description":"This dataset contains cities, townships, reservations, county seats and unorganized Territories in Minnesota, represented with point geometry for cartographic purposes.","operationId":"describemn_population_centersCollection","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collection"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Population Centers metadata","tags":["mn_population_centers"]}},"/collections/mn_population_centers/items":{"get":{"description":"This dataset contains cities, townships, reservations, county seats and unorganized Territories in Minnesota, represented with point geometry for cartographic purposes.","operationId":"getmn_population_centersFeatures","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/bbox"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/datetime"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/bbox-crs"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/crs"},{"$ref":"#/components/parameters/offset"},{"description":"The optional limit parameter limits the number of items that are presented in the response document.","explode":false,"in":"query","name":"limit","required":false,"schema":{"default":9,"maximum":15,"minimum":1,"type":"integer"},"style":"form"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Features"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Population Centers items","tags":["mn_population_centers"]}},"/collections/mn_population_centers/items/{featureId}":{"get":{"description":"This dataset contains cities, townships, reservations, county seats and unorganized Territories in Minnesota, represented with point geometry for cartographic purposes.","operationId":"getmn_population_centersFeature","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/featureId"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Feature"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"404":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/NotFound"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Population Centers item by id","tags":["mn_population_centers"]}},"/conformance":{"get":{"description":"API conformance definition","operationId":"getConformanceDeclaration","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ConformanceDeclaration"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"API conformance definition","tags":["server"]}}},"servers":[{"description":"Server description","url":"http://localhost/cgi-bin/mapserv/OGCAPI_TEST/ogcapi"}],"tags":[]} +{"components":{"parameters":{"f":{"description":"The optional f parameter indicates the output format which the server shall provide as part of the response document. The default format is GeoJSON.","explode":false,"in":"query","name":"f","required":false,"schema":{"default":"json","enum":["json","html"],"type":"string"},"style":"form"},"offset":{"description":"The optional offset parameter indicates the index within the result set from which the server shall begin presenting results in the response document. The first element has an index of 0 (default).","explode":false,"in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"},"style":"form"}},"responses":{"200":{"description":"successful operation"},"default":{"content":{"application/json":{"schema":{"$ref":"https://schemas.opengis.net/ogcapi/common/part1/1.0/openapi/schemas/exception.yaml"}}},"description":"unexpected error"}}},"info":{"contact":{"email":"email@example.com","name":"Contact person","url":"http://example.com/contact"},"description":"This is a test OGC API server description set via oga_description.","termsOfService":"Terms of Service","title":"OGC API Test","version":"1.0.0","x-keywords":"keyword1,keyword2"},"openapi":"3.0.2","paths":{"/":{"get":{"description":"Landing page","operationId":"getLandingPage","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/LandingPage"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Landing page","tags":["server"]}},"/api":{"get":{"description":"API documentation","operationId":"getOpenapi","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"#/components/responses/200"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"default":{"$ref":"#/components/responses/default"}},"summary":"API documentation","tags":["server"]}},"/collections":{"get":{"description":"Collections","operationId":"getCollections","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collections"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Collections","tags":["server"]}},"/collections/mn_counties":{"get":{"description":"This is the standard Minnesota State County Boundary dataset.","operationId":"describemn_countiesCollection","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collection"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get State of Minnesota County Boundaries metadata","tags":["mn_counties"]}},"/collections/mn_counties/items":{"get":{"description":"This is the standard Minnesota State County Boundary dataset.","operationId":"getmn_countiesFeatures","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/bbox"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/datetime"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/bbox-crs"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/crs"},{"$ref":"#/components/parameters/offset"},{"description":"The optional limit parameter limits the number of items that are presented in the response document.","explode":false,"in":"query","name":"limit","required":false,"schema":{"default":9,"maximum":15,"minimum":1,"type":"integer"},"style":"form"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Features"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get State of Minnesota County Boundaries items","tags":["mn_counties"]}},"/collections/mn_counties/items/{featureId}":{"get":{"description":"This is the standard Minnesota State County Boundary dataset.","operationId":"getmn_countiesFeature","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/featureId"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Feature"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"404":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/NotFound"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get State of Minnesota County Boundaries item by id","tags":["mn_counties"]}},"/collections/mn_major_rivers":{"get":{"description":"This dataset represents stream centerlines for major rivers in Minnesota.","operationId":"describemn_major_riversCollection","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collection"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Major River Centerlines metadata","tags":["mn_major_rivers"]}},"/collections/mn_major_rivers/items":{"get":{"description":"This dataset represents stream centerlines for major rivers in Minnesota.","operationId":"getmn_major_riversFeatures","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/bbox"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/datetime"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/bbox-crs"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/crs"},{"$ref":"#/components/parameters/offset"},{"description":"The optional limit parameter limits the number of items that are presented in the response document.","explode":false,"in":"query","name":"limit","required":false,"schema":{"default":9,"maximum":15,"minimum":1,"type":"integer"},"style":"form"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Features"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Major River Centerlines items","tags":["mn_major_rivers"]}},"/collections/mn_major_rivers/items/{featureId}":{"get":{"description":"This dataset represents stream centerlines for major rivers in Minnesota.","operationId":"getmn_major_riversFeature","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/featureId"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Feature"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"404":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/NotFound"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Major River Centerlines item by id","tags":["mn_major_rivers"]}},"/collections/mn_population_centers":{"get":{"description":"This dataset contains cities, townships, reservations, county seats and unorganized Territories in Minnesota, represented with point geometry for cartographic purposes.","operationId":"describemn_population_centersCollection","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collection"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Population Centers metadata","tags":["mn_population_centers"]}},"/collections/mn_population_centers/items":{"get":{"description":"This dataset contains cities, townships, reservations, county seats and unorganized Territories in Minnesota, represented with point geometry for cartographic purposes.","operationId":"getmn_population_centersFeatures","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/bbox"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/datetime"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/bbox-crs"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/crs"},{"$ref":"#/components/parameters/offset"},{"description":"The optional limit parameter limits the number of items that are presented in the response document.","explode":false,"in":"query","name":"limit","required":false,"schema":{"default":9,"maximum":15,"minimum":1,"type":"integer"},"style":"form"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Features"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Population Centers items","tags":["mn_population_centers"]}},"/collections/mn_population_centers/items/{featureId}":{"get":{"description":"This dataset contains cities, townships, reservations, county seats and unorganized Territories in Minnesota, represented with point geometry for cartographic purposes.","operationId":"getmn_population_centersFeature","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/featureId"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Feature"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"404":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/NotFound"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Population Centers item by id","tags":["mn_population_centers"]}},"/conformance":{"get":{"description":"API conformance definition","operationId":"getConformanceDeclaration","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ConformanceDeclaration"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"API conformance definition","tags":["server"]}}},"servers":[{"description":"Server description","url":"http://localhost/cgi-bin/mapserv/OGCAPI_TEST/ogcapi"}],"tags":[]} diff --git a/src/mapogcapi.cpp b/src/mapogcapi.cpp index b88ababf22..0ceb14b778 100644 --- a/src/mapogcapi.cpp +++ b/src/mapogcapi.cpp @@ -1885,9 +1885,8 @@ static int processApiRequest(mapObj *map, cgiRequestObj *request, {"content", {{"application/json", {{"schema", - {{"$ref", "https://raw.githubusercontent.com/opengeospatial/" - "ogcapi-processes/master/core/openapi/schemas/" - "exception.yaml"}}}}}}}}; + {{"$ref", "https://schemas.opengis.net/ogcapi/common/part1/1.0/" + "openapi/schemas/exception.yaml"}}}}}}}}; json parameters; parameters["f"] = { From 598859ae2b499514dc44321ff6ec73bf8297a515 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 17 Apr 2025 12:38:11 -0300 Subject: [PATCH 18/53] Fix MSSQL driver crash with NULL fid (#7270) (#7272) Co-authored-by: Tamas Szekeres --- src/mapmssql2008.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mapmssql2008.c b/src/mapmssql2008.c index 631731eacc..f87f88e46b 100644 --- a/src/mapmssql2008.c +++ b/src/mapmssql2008.c @@ -2486,7 +2486,7 @@ int msMSSQL2008LayerGetShapeRandom(layerObj *layer, shapeObj *shape, if (rc == SQL_ERROR || rc == SQL_SUCCESS_WITH_INFO) handleSQLError(layer); - if (retLen < (int)sizeof(oidBuffer)) { + if (retLen > 0 && retLen < (int)sizeof(oidBuffer)) { oidBuffer[retLen] = 0; record_oid = strtol(oidBuffer, NULL, 10); shape->index = record_oid; From 15b3ee3930212d5adc288c25082cb0dfa7416154 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 5 May 2025 09:47:32 -0300 Subject: [PATCH 19/53] [Backport branch-8-4] SHP/DBF: Attempt to read encoding from CPG file (#7276) --------- Co-authored-by: Patrik Sylve --- .../data/tile_index_paths_special_chars.cpg | 1 + .../data/tile_index_paths_special_chars.dbf | Bin 0 -> 363 bytes .../data/tile_index_paths_special_chars.prj | 1 + .../data/tile_index_paths_special_chars.shp | Bin 0 -> 236 bytes .../data/tile_index_paths_special_chars.shx | Bin 0 -> 108 bytes ...3\270\303\246\303\266\303\274\303\247.tif" | Bin 0 -> 2896 bytes .../gdal/expected/tileindex_special_chars.png | Bin 0 -> 3060 bytes .../gdal/tileindex_special_characters.map | 35 ++++++++++++ src/mapshape.c | 5 ++ src/mapshape.h | 2 + src/mapxbase.c | 51 +++++++++++++++++- 11 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 msautotest/gdal/data/tile_index_paths_special_chars.cpg create mode 100644 msautotest/gdal/data/tile_index_paths_special_chars.dbf create mode 100644 msautotest/gdal/data/tile_index_paths_special_chars.prj create mode 100644 msautotest/gdal/data/tile_index_paths_special_chars.shp create mode 100644 msautotest/gdal/data/tile_index_paths_special_chars.shx create mode 100644 "msautotest/gdal/data/utm_4326_spec_char_\303\270\303\246\303\266\303\274\303\247.tif" create mode 100644 msautotest/gdal/expected/tileindex_special_chars.png create mode 100644 msautotest/gdal/tileindex_special_characters.map diff --git a/msautotest/gdal/data/tile_index_paths_special_chars.cpg b/msautotest/gdal/data/tile_index_paths_special_chars.cpg new file mode 100644 index 0000000000..cd89cb9758 --- /dev/null +++ b/msautotest/gdal/data/tile_index_paths_special_chars.cpg @@ -0,0 +1 @@ +ISO-8859-1 \ No newline at end of file diff --git a/msautotest/gdal/data/tile_index_paths_special_chars.dbf b/msautotest/gdal/data/tile_index_paths_special_chars.dbf new file mode 100644 index 0000000000000000000000000000000000000000..3e2b1ae75d800bb47d5f859312476d9bd6c59c0c GIT binary patch literal 363 zcmZRsWo2SyU|>jO-~>^qAe@0ACqFr{Br`t`DB%o}{D-Q7p|~hHzPP9uBnp=2LX+oJ uC@sm2H!(Ici!UxnO^#2_NGyu~@$B25=XxcXX$r$0xCR8fTYpZ(;EYn`dYFTzS3^zY)Ce-FtG*$v)Y8?X_0UhaY}J9h6c> zrEZ?98;rh<@6FTrn;1WP8qZnJpT=|Ei#Nt!x_Rp{_LsQvOCCa#q&SCeW{*d{4vI#-9CHF{%07^ zkN@dk-+%j0-}~V8@xNF9_wPS{@cth^_w%3poj&H}i~oA{>h;W<$7MdY_)sQ-l zSOg&4sJr9M;j>%ZRWBaTKl%DQhfi`Nv9J%CEKaIVOvG*)>%dAQ! z4s!`6k;23YVSV0}N})QJ%XuHIx4rdVPrDS!TSJ&9FVZQXvRVV>oLj3na4WUu+_yf; z=$$W@%h>KqrBsKCl)G)Mq!hRbF-oPDfkI(awr#!j(grfvwp!2k+o+5`ed1f%46HO<(6kLN^%&{d+S5l3j4r`v1$wwQDJXQ%BVgIA?x$` z;SOiiB`cD0Cg+ZTD@lqmC#;uQQl%mrQN({KL-xHS&#lMa)BUxhZ?&Lr8Ia%a!`U_Zh-@f^1Ol8kppK%cJ7lo|v@-iX`atKD z2ZsP$n`=-YZ=GWb4om=qBc3x2gF~!X%vz*Iz?h3e7;vaq5v!rQ90It=xsiVCb}9^V6v`oiV&K4_;vpwwPL-gJ zho%zf5AZy(i@~Am;6NMP1%MLzNU1n5fHMQfmP-IN`=%^t6+#3}*hV{*5*&J*tT&*F z3?ZM^B8UWT=UVIKa=kk%3xKqCVU=X81C)41?i`#E$}t*B-XSVcXboh5jK;lOl}$c^ z&Z&wuX`Mv2K1b^zy@=Tyl10wR*Bvscxz^J*PEhv@B0vrrYiQLN18)h&mpxl7o~Tuu zLa3pX%Xzdib$(J!TyV~SBj7&ifV?^$;?Wh-DJ4yHUUV`AvGuaG4JuR-=y_uhXbmlF zoD0c0TTh+5OUalTqghukVGrK-hffQR7Kg^)bL$cBZx2g#6zOA>|{m(Qnt zAN_uyxDy(nwKj;vT@;m8EbYUJeyu?q#&%pf8_(N4JmwsE69|0VDR%_t^{R!9hLeC> zuu7~#CU|rvU$za_l)TT#sZ3V40-rQ`Sr_Y!HHPJwSKLSEVL;gdcE5v7u{crv;o@AQWN?a6rogWGhuBn`H=)d9Dgq@pue zVwg)hIyfUZJzX;A*@a;zw_5HMYK#W3f)Nq2uz7z_NNsY#3CtWd%x*(u*a7So&^kU< zE{))|*l`$eQiW0@`etGJWpAenn}F-{EC!oYHLes3A$BPpz9Z;tf#C$+dsFMWEDn_} z8VkALeS~olfJEuARYw7o1lKJ-*#9gnx@J-!l$RrXh~gpGNs>em0J2O24wq<)P+W4U z)&fBVY!%ojl|5p$!!+$>(S|$duOVzIF*#$V7Rm)>VW;ZwJaWN8su4-9D@BLjSy|Hh z5TREOl^ft=Ap)=&-VV3$Y+x9BtJo(F$92VybzD-w90SbZ!Z}A;89gbcb#&Hw1DS|V zdNu{{p4OxH91j}HW0Qsr7a6eJ2wREs1!54`s_o==V2!C2j&i*o5mt@qb#A@uYM}>b zExR?;0xK7=1%`(`m^H3zU))^*b&kuvM^jtip4B=rNVsViSU&QyVRe3NZQw-k&XBPQ ziQM1a9Z~cl$INzFkTB9itj26T8--S2Er5ir(bCwNe7;`JrL3qx#y*zgs?k0hbwDF5 z#5OnZy6upF#e2r1>fN}%{`-0eJg@&PqhJk^mfrW;qfrYNleAewJ$pw?1f}W#` z#xv5>dslit(#-nPr-_M)iHV7ciHZLN>xRpQ$H&LxhWiaC;bFu1eEz}_^4nd|Y#L?31qcb{$wRf^SQdST;eYiSom3ho+@=Aobjx0xwXo-qe z7ddEB{=5}TdRa$sf&DOoaIQm>$7P5@r9&_R6ABBmFeh36j;zDsfQp9=<|1he?UMn+ zOVW+q=iI_^%8aA|qG*6(5okTQL0vxm0kc7Q%WyrbK3LRNCIApnu>M{oHdBhOh8Dn!CFgcz!%%88b z0^)Q*rrGhq+B$I+OtSWq9mgqdLSNzzT#O8swCI&<#X>y|CRx8qR^;MtUp6>qC0Muure=v- zIZ>jz=`PxH;Rd0SKkaKSuj0s#m@q;@j3{o}>mTcpj{Ta(B^z=$V`uk>4|QWZ$=Xkr zV{jbD3!54@`!5WJ)6W}{4SagD3`jWlhKqEybKz3MZWwClm7A;1*t*jEQj>bT6)xzTyg@G) z5Y9qL3pOfc6yv)3H)S~*n`G@L%f(^pfbRoXjUmXroYYgwx+smEW}ksvKy*`u>PU-l z7yWRQ?ql7X%+qOjSC6(M$|`Y<)x|?U2=F%*{5e+75y8NWL7+igZhFIEr4KDw9Zwa= z&#r4}w@snvw67d4hr;DL`7 z)~PFP?7T5`-A=K2gn6R_W-iC*v($1NTJ4gl^+vL~?C*$aPw(AulC^^@uimA7Vd3+G zj#GNsHLkC(?Kqv-Wjm;4V48J@dGX~K@1iW!c!*4uw|*u%+Kx1(ulJ;12fV$#aWTo- zPnNTL7yp0@g78Howp*pFr{(C9m-hS@Ifss}upQ$Ww5w1Hx}twV!p`$4y2Y z-)kh`OtSWqWed9)?D{ixxmUP@ZqfqO90#N(7|o7YPCKkaxb~KfzR{U2DrVE5qi?LP zDF_}~m?lmmUSD6E(!uF36L>9nXH#^tHrSS(&7I)&71CYKI5?KRh%y&6jzAii;?!#+ zO@PM7dN2=o#JHFC^9ygPIX)-?VQrH2t7K((H1h`7`eg&=4PYd={|HyuHaqgnIlWG};86HV#$ zWx%oh`jWmpg0BK%Fq}Gj#INmN7+);$eB1G{^H`6t0r5K?X9kH6`Ks$_`+$o-Ct3T+ zqBUkDklPJo4`k86Yd##onhOrc=AuW(dyW#j-6%lXsRcJ_02d#Qh;WQLfArQi`v++9 zF|^+t=MDBGYd=|*o`~xb5rnvymjI9IS65fC=JqZ-imASdghWnQCTqqzgxLYIh8Zmi*bJIU2yD3n=5b zZ2(e^ImDEk@u|2^*B!CgmR&A80Y_El01K(Y&n;k(anq7UmMey?bO0>Q zoF&*dy_GBW`1rvRp#EH6WF>ayXyK#}#IlvMuO*|Ki#V6JicbOtClz2e?wmPr>Feo1 zhx>YL+Z@r*y6Eki3;p1mC`Mc>aP&dkxjiqo(#S~w;!lR)&Qd@2^%7WHc$W)u-(|g< zL0{UN%}fBwJ3cZKSq&e27&6J)K~@&F^>geXs3lc7VL7xN>(5N>p^isMd3NNK=6Izu z6bM=N(_}`Jv8i~dC*aV2fY${$Zbq2`1}YBA;lw0sKUrO#+;nGbpqr0JCzbqbimP_`l3ajg~jp`v@Xo3hmFJ}`+(#`2iz z-DOuRag7=I&7f1B-%13`N9VJSBv4^aqu3;CKUtqYf_)8fT?1E1NrJA+0CZ=~W4T>E zInKW6aY4>GTzusY%AkfDI0+{6Fry5V#D%^7|2_%u7C6b;Ll*YnhT#H8C3TyL*n#(n6jpUnE5>m+Lr zS!f9tiKFfSo48dM5uI@_!_VFB>Z=44da6Gg981L8_Ip$Zd+^ZyOFz5@2}uIkgd|9Z zYwOINoTk}Q?+s~OguDo!eiuTPHy}G1@>}N|3H5Ix zLEX~1Uh7X#T)`(rm<7jg8idE37T9=)=TX9`-BDWGglETlrNq_$;u}2J>X2Tc90cyR~_YKXOwF!EWU~BIW0sp%eB|U zcN}iLyzko|n7S^>!G@>Pk>OH5z(%-trU?|x0Rp=huDt2O1Z$hkZ{vovyR<+q1~6}_ z#n6NK@s~+U`(}u!hlCuMFlh|oWaqfn0cm*$?tGer>-7t=9)X?12lJ(+\(f-cJz zOtSWnencoding && shpfile->hDBF->pszEncoding) { + layer->encoding = msStrdup(shpfile->hDBF->pszEncoding); + } + if (layer->projection.numargs > 0 && EQUAL(layer->projection.args[0], "auto")) { const char *pszPRJFilename = CPLResetExtension(szPath, "prj"); diff --git a/src/mapshape.h b/src/mapshape.h index c93a9d2283..bac547c00b 100644 --- a/src/mapshape.h +++ b/src/mapshape.h @@ -147,6 +147,8 @@ typedef struct { char *pszStringField; int nStringFieldLen; + + char *pszEncoding; #endif /* not SWIG */ } DBFInfo; diff --git a/src/mapxbase.c b/src/mapxbase.c index dd61df6463..772f3343b1 100644 --- a/src/mapxbase.c +++ b/src/mapxbase.c @@ -144,6 +144,8 @@ DBFHandle msDBFOpenVirtualFile(VSILFILE *fp) { psDBF->pszStringField = NULL; psDBF->nStringFieldLen = 0; + psDBF->pszEncoding = NULL; + /* -------------------------------------------------------------------- */ /* Read Table Header info */ /* -------------------------------------------------------------------- */ @@ -219,6 +221,32 @@ DBFHandle msDBFOpenVirtualFile(VSILFILE *fp) { return (psDBF); } +/** + * Attempt to read character encoding from a .CPG-file + */ +char *msReadCPGEncoding(char *cpgFilename) { + VSILFILE *fpCPG = VSIFOpenL(cpgFilename, "rb"); + if (fpCPG == NULL) + return NULL; + + char szEncoding[100] = ""; + size_t nRead = VSIFReadL(szEncoding, 1, sizeof(szEncoding) - 1, fpCPG); + VSIFCloseL(fpCPG); + + if (nRead == 0) + return NULL; + + // Null terminate and remove any line break + szEncoding[nRead] = '\0'; + szEncoding[strcspn(szEncoding, "\r\n")] = 0; + + if (szEncoding[0] == '\0') { + return NULL; + } + + return msStrdup(szEncoding); +} + /************************************************************************/ /* msDBFOpen() */ /* */ @@ -259,12 +287,30 @@ DBFHandle msDBFOpen(const char *pszFilename, const char *pszAccess) fp = VSIFOpenL(pszDBFFilename, pszAccess); } } - msFree(pszDBFFilename); + if (fp == NULL) { + msFree(pszDBFFilename); return (NULL); } - return msDBFOpenVirtualFile(fp); + DBFHandle dbfHandle = msDBFOpenVirtualFile(fp); + if (dbfHandle) { + char *pszCPGFilename = (char *)msSmallMalloc(strlen(pszDBFFilename) + 1); + strcpy(pszCPGFilename, pszDBFFilename); + + if (strcmp(pszDBFFilename + strlen(pszDBFFilename) - 4, ".dbf") == 0) { + strcpy(pszCPGFilename + strlen(pszCPGFilename) - 4, ".cpg"); + } else { + strcpy(pszCPGFilename + strlen(pszCPGFilename) - 4, ".CPG"); + } + + dbfHandle->pszEncoding = msReadCPGEncoding(pszCPGFilename); + + msFree(pszCPGFilename); + } + + msFree(pszDBFFilename); + return dbfHandle; } /************************************************************************/ @@ -319,6 +365,7 @@ void msDBFClose(DBFHandle psDBF) { free(psDBF->pszCurrentRecord); free(psDBF->pszStringField); + free(psDBF->pszEncoding); free(psDBF); } From 71b617ad35c65a5be3c07805d9938d2988ce90fe Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 16 Jun 2025 23:14:46 +0200 Subject: [PATCH 20/53] [Backport branch-8-4] Allow FILTER expressions with SCALETOKENs (#7285) * Wrap raw expressions strings in parenthesis * Check for FILTER type * Use snprintf * Update src/maplayer.c Co-authored-by: Even Rouault * Remove redeclaration --------- Co-authored-by: sethg Co-authored-by: Seth G Co-authored-by: Even Rouault --- .../scaletoken_filterexpression_192k.png | Bin 0 -> 570 bytes .../scaletoken_filterexpression_424k.png | Bin 0 -> 230 bytes msautotest/misc/scaletoken.map | 21 ++++++++++++++ src/maplayer.c | 27 +++++++++++++++--- 4 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 msautotest/misc/expected/scaletoken_filterexpression_192k.png create mode 100644 msautotest/misc/expected/scaletoken_filterexpression_424k.png diff --git a/msautotest/misc/expected/scaletoken_filterexpression_192k.png b/msautotest/misc/expected/scaletoken_filterexpression_192k.png new file mode 100644 index 0000000000000000000000000000000000000000..5ec291601335de27e87f178619270069ca6d68bf GIT binary patch literal 570 zcmV-A0>%A_P)1lw@ErA(BB+42mL)!62fT#Gs@|Jau*b`rW;+ zd+)t_&+vY?yYBA&be?G1V> zl}e@S_4+o8bv~by$)q3%4u|7(I*BLS?KYgL)oLcNR;yJil@ibi27^pl$K%oMc4I)0 zY&I*tJi}SD+05hdl*?s2s8A@}Za3*J!&#ThB^r%lK+R_J`F#Gni_wobnM@Q-`~6<= zdUmxXHw6L#)WwWgs&5}{{Rn%13T7cv+?dc02u9P_W|ssyV19Yh*!Ru2!owAjot& z)sqFSnGyu4*Xx)ew6NmwIHf6(NZ^Oi!Ws^Tl&t&xu0IPZoyN3WF24?;vE(zEjCzOD z=?sU%u~@89sYpv?Ls;AG7UO^x-|O|D*UJ}DDxTytifP_V*TANvu44EhGM}s)if3)olYyVTCJ9uELa)KO|W16I=vXn zf>^Cq3FP&9^Z7hwVd=x__xr_S5sHbvi%Q{tyOD&mNb;ks4`&^`G&q+DHUIzs07*qo IM6N<$g1wv*=l}o! literal 0 HcmV?d00001 diff --git a/msautotest/misc/expected/scaletoken_filterexpression_424k.png b/msautotest/misc/expected/scaletoken_filterexpression_424k.png new file mode 100644 index 0000000000000000000000000000000000000000..72dbbe9bf259b71d7ce3d344959f086918594f60 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AYdu{YLn2z=UfIZdSb@PM@cooY zU7<6YG-ojET$IG8wxES^g}_qnCoT(pin!FRzu?%{8Asxn&fVeYSf2R=G_tileitem = layer->orig_st->tileitem; } if (layer->orig_st->filter) { - msLoadExpressionString(&(layer->filter), layer->orig_st->filter); + if (layer->filter.type == MS_EXPRESSION) { + const size_t tmpval_size = strlen(layer->filter.string) + 3; + char *tmpval = (char *)msSmallMalloc(tmpval_size); + snprintf(tmpval, tmpval_size, "(%s)", layer->filter.string); + msLoadExpressionString(&(layer->filter), tmpval); + msFree(tmpval); + } else { + msLoadExpressionString(&(layer->filter), layer->orig_st->filter); + } msFree(layer->orig_st->filter); } if (layer->orig_st->filteritem) { @@ -196,7 +204,6 @@ int msLayerApplyScaletokens(layerObj *layer, double scale) { msReplaceSubstring(layer->filteritem, st->name, ste->value); } if (layer->filter.string && strstr(layer->filter.string, st->name)) { - char *tmpval; if (layer->debug >= MS_DEBUGLEVEL_DEBUG) { msDebug("replacing scaletoken (%s) with (%s) in layer->filter (%s) for " "scale=%f\n", @@ -204,11 +211,23 @@ int msLayerApplyScaletokens(layerObj *layer, double scale) { } check_st_alloc(layer); layer->orig_st->filter = msStrdup(layer->filter.string); - tmpval = msStrdup(layer->filter.string); + + char *tmpval = NULL; + if (layer->filter.type == MS_EXPRESSION) { + const size_t tmpval_size = strlen(layer->filter.string) + 3; + tmpval = (char *)msSmallMalloc(tmpval_size); + snprintf(tmpval, tmpval_size, "(%s)", layer->filter.string); + } else { + tmpval = msStrdup(layer->filter.string); + } + tmpval = msReplaceSubstring(tmpval, st->name, ste->value); - if (msLoadExpressionString(&(layer->filter), tmpval) == -1) + + if (msLoadExpressionString(&(layer->filter), tmpval) == -1) { + msFree(tmpval); return (MS_FAILURE); /* msLoadExpressionString() cleans up previously allocated expression */ + } msFree(tmpval); } From 00d904e10c56d8aee1e740023bea16bedd172889 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 27 Jun 2025 08:40:06 -0300 Subject: [PATCH 21/53] Fix regex and use PROJ_DATA (#7291) Co-authored-by: sethg --- etc/mapserver-sample.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/etc/mapserver-sample.conf b/etc/mapserver-sample.conf index 331e7a2725..ebf6dc1fd7 100644 --- a/etc/mapserver-sample.conf +++ b/etc/mapserver-sample.conf @@ -12,7 +12,7 @@ CONFIG # # MS_MAP_NO_PATH "1" MS_MAP_PATTERN "^/opt/mapserver" ## required when referencing mapfiles by path - # MS_MAP_BAD_PATTERN "[/\\]{2}|[/\\]?\\.+[/\\]|," + # MS_MAP_BAD_PATTERN "[/\\\\]{2}|[/\\\\]?\\.+[/\\\\]|," # # Global Log/Debug Setup @@ -37,7 +37,7 @@ CONFIG # # Proj Library # - # PROJ_LIB "/usr/local/share/proj" + # PROJ_DATA "/usr/local/share/proj" # # Request Control From 49c0d38fe269d6c65a6c1205168b5b70746c1edd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 27 Jun 2025 10:50:48 -0300 Subject: [PATCH 22/53] add private vulnerability reporting steps (#7300) Co-authored-by: Jeff McKenna --- SECURITY.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index f667db5ec6..008f2a9c44 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -2,8 +2,10 @@ ## Reporting a Vulnerability in MapServer -Security/vulnerability reports should not be submitted through GitHub tickets or the public mailing lists, but instead please send your report -to the email address: **mapserver-security nospam @ osgeo.org** (remove the blanks and ‘nospam’). +Security/vulnerability reports should not be submitted through GitHub tickets or the public mailing lists, +but instead please provide details to the Project Steering Committee via the GitHub [Report a vulnerability](https://github.com/MapServer/MapServer/security/advisories/new) +option link at the top of this page, or send your report to the email address: +**mapserver-security nospam @ osgeo.org** (remove the blanks and ‘nospam’). Please follow the general guidelines for bug submissions, when describing the vulnerability (see https://mapserver.org/development/bugs.html). From e59604c4ab8bb80c3af3ae8dc76ffd5faad32b07 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 27 Jun 2025 17:13:12 -0300 Subject: [PATCH 23/53] [Backport branch-8-4] Shapefile: Parse CPG values (#7302) * Parse CPG values * Fix format string --------- Co-authored-by: Patrik Sylve --- .../misc/data/shp_encoding/encoding_1250.cpg | 1 + .../misc/data/shp_encoding/encoding_1250.dbf | Bin 0 -> 4288 bytes .../misc/data/shp_encoding/encoding_1250.prj | 1 + .../misc/data/shp_encoding/encoding_1250.shp | Bin 0 -> 604 bytes .../misc/data/shp_encoding/encoding_1250.shx | Bin 0 -> 244 bytes .../misc/data/shp_encoding/encoding_1251.cpg | 1 + .../misc/data/shp_encoding/encoding_1251.dbf | Bin 0 -> 4288 bytes .../misc/data/shp_encoding/encoding_1251.prj | 1 + .../misc/data/shp_encoding/encoding_1251.shp | Bin 0 -> 604 bytes .../misc/data/shp_encoding/encoding_1251.shx | Bin 0 -> 244 bytes .../misc/data/shp_encoding/encoding_1253.cpg | 1 + .../misc/data/shp_encoding/encoding_1253.dbf | Bin 0 -> 4288 bytes .../misc/data/shp_encoding/encoding_1253.prj | 1 + .../misc/data/shp_encoding/encoding_1253.shp | Bin 0 -> 604 bytes .../misc/data/shp_encoding/encoding_1253.shx | Bin 0 -> 244 bytes .../misc/data/shp_encoding/encoding_1254.cpg | 1 + .../misc/data/shp_encoding/encoding_1254.dbf | Bin 0 -> 4288 bytes .../misc/data/shp_encoding/encoding_1254.prj | 1 + .../misc/data/shp_encoding/encoding_1254.shp | Bin 0 -> 604 bytes .../misc/data/shp_encoding/encoding_1254.shx | Bin 0 -> 244 bytes .../misc/data/shp_encoding/encoding_437.cpg | 1 + .../misc/data/shp_encoding/encoding_437.dbf | Bin 0 -> 4288 bytes .../misc/data/shp_encoding/encoding_437.prj | 1 + .../misc/data/shp_encoding/encoding_437.shp | Bin 0 -> 604 bytes .../misc/data/shp_encoding/encoding_437.shx | Bin 0 -> 244 bytes .../misc/data/shp_encoding/encoding_88591.cpg | 1 + .../misc/data/shp_encoding/encoding_88591.dbf | Bin 0 -> 4288 bytes .../misc/data/shp_encoding/encoding_88591.prj | 1 + .../misc/data/shp_encoding/encoding_88591.shp | Bin 0 -> 604 bytes .../misc/data/shp_encoding/encoding_88591.shx | Bin 0 -> 244 bytes .../data/shp_encoding/encoding_885910.cpg | 1 + .../data/shp_encoding/encoding_885910.dbf | Bin 0 -> 4288 bytes .../data/shp_encoding/encoding_885910.prj | 1 + .../data/shp_encoding/encoding_885910.shp | Bin 0 -> 604 bytes .../data/shp_encoding/encoding_885910.shx | Bin 0 -> 244 bytes .../data/shp_encoding/encoding_885911.cpg | 1 + .../data/shp_encoding/encoding_885911.dbf | Bin 0 -> 4288 bytes .../data/shp_encoding/encoding_885911.prj | 1 + .../data/shp_encoding/encoding_885911.shp | Bin 0 -> 604 bytes .../data/shp_encoding/encoding_885911.shx | Bin 0 -> 244 bytes .../data/shp_encoding/encoding_885913.cpg | 1 + .../data/shp_encoding/encoding_885913.dbf | Bin 0 -> 4288 bytes .../data/shp_encoding/encoding_885913.prj | 1 + .../data/shp_encoding/encoding_885913.shp | Bin 0 -> 604 bytes .../data/shp_encoding/encoding_885913.shx | Bin 0 -> 244 bytes .../data/shp_encoding/encoding_885915.cpg | 1 + .../data/shp_encoding/encoding_885915.dbf | Bin 0 -> 4288 bytes .../data/shp_encoding/encoding_885915.prj | 1 + .../data/shp_encoding/encoding_885915.shp | Bin 0 -> 604 bytes .../data/shp_encoding/encoding_885915.shx | Bin 0 -> 244 bytes .../misc/data/shp_encoding/encoding_88592.cpg | 1 + .../misc/data/shp_encoding/encoding_88592.dbf | Bin 0 -> 4288 bytes .../misc/data/shp_encoding/encoding_88592.prj | 1 + .../misc/data/shp_encoding/encoding_88592.shp | Bin 0 -> 604 bytes .../misc/data/shp_encoding/encoding_88592.shx | Bin 0 -> 244 bytes .../misc/data/shp_encoding/encoding_88593.cpg | 1 + .../misc/data/shp_encoding/encoding_88593.dbf | Bin 0 -> 4288 bytes .../misc/data/shp_encoding/encoding_88593.prj | 1 + .../misc/data/shp_encoding/encoding_88593.shp | Bin 0 -> 604 bytes .../misc/data/shp_encoding/encoding_88593.shx | Bin 0 -> 244 bytes .../misc/data/shp_encoding/encoding_88594.cpg | 1 + .../misc/data/shp_encoding/encoding_88594.dbf | Bin 0 -> 4288 bytes .../misc/data/shp_encoding/encoding_88594.prj | 1 + .../misc/data/shp_encoding/encoding_88594.shp | Bin 0 -> 604 bytes .../misc/data/shp_encoding/encoding_88594.shx | Bin 0 -> 244 bytes .../misc/data/shp_encoding/encoding_88595.cpg | 1 + .../misc/data/shp_encoding/encoding_88595.dbf | Bin 0 -> 4288 bytes .../misc/data/shp_encoding/encoding_88595.prj | 1 + .../misc/data/shp_encoding/encoding_88595.shp | Bin 0 -> 604 bytes .../misc/data/shp_encoding/encoding_88595.shx | Bin 0 -> 244 bytes .../misc/data/shp_encoding/encoding_88596.cpg | 1 + .../misc/data/shp_encoding/encoding_88596.dbf | Bin 0 -> 4288 bytes .../misc/data/shp_encoding/encoding_88596.prj | 1 + .../misc/data/shp_encoding/encoding_88596.shp | Bin 0 -> 604 bytes .../misc/data/shp_encoding/encoding_88596.shx | Bin 0 -> 244 bytes .../misc/data/shp_encoding/encoding_88597.cpg | 1 + .../misc/data/shp_encoding/encoding_88597.dbf | Bin 0 -> 4288 bytes .../misc/data/shp_encoding/encoding_88597.prj | 1 + .../misc/data/shp_encoding/encoding_88597.shp | Bin 0 -> 604 bytes .../misc/data/shp_encoding/encoding_88597.shx | Bin 0 -> 244 bytes .../misc/data/shp_encoding/encoding_88598.cpg | 1 + .../misc/data/shp_encoding/encoding_88598.dbf | Bin 0 -> 4288 bytes .../misc/data/shp_encoding/encoding_88598.prj | 1 + .../misc/data/shp_encoding/encoding_88598.shp | Bin 0 -> 604 bytes .../misc/data/shp_encoding/encoding_88598.shx | Bin 0 -> 244 bytes .../misc/data/shp_encoding/encoding_88599.cpg | 1 + .../misc/data/shp_encoding/encoding_88599.dbf | Bin 0 -> 4288 bytes .../misc/data/shp_encoding/encoding_88599.prj | 1 + .../misc/data/shp_encoding/encoding_88599.shp | Bin 0 -> 604 bytes .../misc/data/shp_encoding/encoding_88599.shx | Bin 0 -> 244 bytes .../data/shp_encoding/encodings_utf-8.cpg | 1 + .../data/shp_encoding/encodings_utf-8.dbf | Bin 0 -> 4288 bytes .../data/shp_encoding/encodings_utf-8.prj | 1 + .../data/shp_encoding/encodings_utf-8.shp | Bin 0 -> 604 bytes .../data/shp_encoding/encodings_utf-8.shx | Bin 0 -> 244 bytes msautotest/misc/encoding_from_cpg.map | 478 ++++++++++++++++++ msautotest/misc/expected/shp_encodings.png | Bin 0 -> 12078 bytes src/mapxbase.c | 27 + 98 files changed, 543 insertions(+) create mode 100644 msautotest/misc/data/shp_encoding/encoding_1250.cpg create mode 100644 msautotest/misc/data/shp_encoding/encoding_1250.dbf create mode 100644 msautotest/misc/data/shp_encoding/encoding_1250.prj create mode 100644 msautotest/misc/data/shp_encoding/encoding_1250.shp create mode 100644 msautotest/misc/data/shp_encoding/encoding_1250.shx create mode 100644 msautotest/misc/data/shp_encoding/encoding_1251.cpg create mode 100644 msautotest/misc/data/shp_encoding/encoding_1251.dbf create mode 100644 msautotest/misc/data/shp_encoding/encoding_1251.prj create mode 100644 msautotest/misc/data/shp_encoding/encoding_1251.shp create mode 100644 msautotest/misc/data/shp_encoding/encoding_1251.shx create mode 100644 msautotest/misc/data/shp_encoding/encoding_1253.cpg create mode 100644 msautotest/misc/data/shp_encoding/encoding_1253.dbf create mode 100644 msautotest/misc/data/shp_encoding/encoding_1253.prj create mode 100644 msautotest/misc/data/shp_encoding/encoding_1253.shp create mode 100644 msautotest/misc/data/shp_encoding/encoding_1253.shx create mode 100644 msautotest/misc/data/shp_encoding/encoding_1254.cpg create mode 100644 msautotest/misc/data/shp_encoding/encoding_1254.dbf create mode 100644 msautotest/misc/data/shp_encoding/encoding_1254.prj create mode 100644 msautotest/misc/data/shp_encoding/encoding_1254.shp create mode 100644 msautotest/misc/data/shp_encoding/encoding_1254.shx create mode 100644 msautotest/misc/data/shp_encoding/encoding_437.cpg create mode 100644 msautotest/misc/data/shp_encoding/encoding_437.dbf create mode 100644 msautotest/misc/data/shp_encoding/encoding_437.prj create mode 100644 msautotest/misc/data/shp_encoding/encoding_437.shp create mode 100644 msautotest/misc/data/shp_encoding/encoding_437.shx create mode 100644 msautotest/misc/data/shp_encoding/encoding_88591.cpg create mode 100644 msautotest/misc/data/shp_encoding/encoding_88591.dbf create mode 100644 msautotest/misc/data/shp_encoding/encoding_88591.prj create mode 100644 msautotest/misc/data/shp_encoding/encoding_88591.shp create mode 100644 msautotest/misc/data/shp_encoding/encoding_88591.shx create mode 100644 msautotest/misc/data/shp_encoding/encoding_885910.cpg create mode 100644 msautotest/misc/data/shp_encoding/encoding_885910.dbf create mode 100644 msautotest/misc/data/shp_encoding/encoding_885910.prj create mode 100644 msautotest/misc/data/shp_encoding/encoding_885910.shp create mode 100644 msautotest/misc/data/shp_encoding/encoding_885910.shx create mode 100644 msautotest/misc/data/shp_encoding/encoding_885911.cpg create mode 100644 msautotest/misc/data/shp_encoding/encoding_885911.dbf create mode 100644 msautotest/misc/data/shp_encoding/encoding_885911.prj create mode 100644 msautotest/misc/data/shp_encoding/encoding_885911.shp create mode 100644 msautotest/misc/data/shp_encoding/encoding_885911.shx create mode 100644 msautotest/misc/data/shp_encoding/encoding_885913.cpg create mode 100644 msautotest/misc/data/shp_encoding/encoding_885913.dbf create mode 100644 msautotest/misc/data/shp_encoding/encoding_885913.prj create mode 100644 msautotest/misc/data/shp_encoding/encoding_885913.shp create mode 100644 msautotest/misc/data/shp_encoding/encoding_885913.shx create mode 100644 msautotest/misc/data/shp_encoding/encoding_885915.cpg create mode 100644 msautotest/misc/data/shp_encoding/encoding_885915.dbf create mode 100644 msautotest/misc/data/shp_encoding/encoding_885915.prj create mode 100644 msautotest/misc/data/shp_encoding/encoding_885915.shp create mode 100644 msautotest/misc/data/shp_encoding/encoding_885915.shx create mode 100644 msautotest/misc/data/shp_encoding/encoding_88592.cpg create mode 100644 msautotest/misc/data/shp_encoding/encoding_88592.dbf create mode 100644 msautotest/misc/data/shp_encoding/encoding_88592.prj create mode 100644 msautotest/misc/data/shp_encoding/encoding_88592.shp create mode 100644 msautotest/misc/data/shp_encoding/encoding_88592.shx create mode 100644 msautotest/misc/data/shp_encoding/encoding_88593.cpg create mode 100644 msautotest/misc/data/shp_encoding/encoding_88593.dbf create mode 100644 msautotest/misc/data/shp_encoding/encoding_88593.prj create mode 100644 msautotest/misc/data/shp_encoding/encoding_88593.shp create mode 100644 msautotest/misc/data/shp_encoding/encoding_88593.shx create mode 100644 msautotest/misc/data/shp_encoding/encoding_88594.cpg create mode 100644 msautotest/misc/data/shp_encoding/encoding_88594.dbf create mode 100644 msautotest/misc/data/shp_encoding/encoding_88594.prj create mode 100644 msautotest/misc/data/shp_encoding/encoding_88594.shp create mode 100644 msautotest/misc/data/shp_encoding/encoding_88594.shx create mode 100644 msautotest/misc/data/shp_encoding/encoding_88595.cpg create mode 100644 msautotest/misc/data/shp_encoding/encoding_88595.dbf create mode 100644 msautotest/misc/data/shp_encoding/encoding_88595.prj create mode 100644 msautotest/misc/data/shp_encoding/encoding_88595.shp create mode 100644 msautotest/misc/data/shp_encoding/encoding_88595.shx create mode 100644 msautotest/misc/data/shp_encoding/encoding_88596.cpg create mode 100644 msautotest/misc/data/shp_encoding/encoding_88596.dbf create mode 100644 msautotest/misc/data/shp_encoding/encoding_88596.prj create mode 100644 msautotest/misc/data/shp_encoding/encoding_88596.shp create mode 100644 msautotest/misc/data/shp_encoding/encoding_88596.shx create mode 100644 msautotest/misc/data/shp_encoding/encoding_88597.cpg create mode 100644 msautotest/misc/data/shp_encoding/encoding_88597.dbf create mode 100644 msautotest/misc/data/shp_encoding/encoding_88597.prj create mode 100644 msautotest/misc/data/shp_encoding/encoding_88597.shp create mode 100644 msautotest/misc/data/shp_encoding/encoding_88597.shx create mode 100644 msautotest/misc/data/shp_encoding/encoding_88598.cpg create mode 100644 msautotest/misc/data/shp_encoding/encoding_88598.dbf create mode 100644 msautotest/misc/data/shp_encoding/encoding_88598.prj create mode 100644 msautotest/misc/data/shp_encoding/encoding_88598.shp create mode 100644 msautotest/misc/data/shp_encoding/encoding_88598.shx create mode 100644 msautotest/misc/data/shp_encoding/encoding_88599.cpg create mode 100644 msautotest/misc/data/shp_encoding/encoding_88599.dbf create mode 100644 msautotest/misc/data/shp_encoding/encoding_88599.prj create mode 100644 msautotest/misc/data/shp_encoding/encoding_88599.shp create mode 100644 msautotest/misc/data/shp_encoding/encoding_88599.shx create mode 100644 msautotest/misc/data/shp_encoding/encodings_utf-8.cpg create mode 100644 msautotest/misc/data/shp_encoding/encodings_utf-8.dbf create mode 100644 msautotest/misc/data/shp_encoding/encodings_utf-8.prj create mode 100644 msautotest/misc/data/shp_encoding/encodings_utf-8.shp create mode 100644 msautotest/misc/data/shp_encoding/encodings_utf-8.shx create mode 100644 msautotest/misc/encoding_from_cpg.map create mode 100644 msautotest/misc/expected/shp_encodings.png diff --git a/msautotest/misc/data/shp_encoding/encoding_1250.cpg b/msautotest/misc/data/shp_encoding/encoding_1250.cpg new file mode 100644 index 0000000000..746faa2a85 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_1250.cpg @@ -0,0 +1 @@ +1250 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_1250.dbf b/msautotest/misc/data/shp_encoding/encoding_1250.dbf new file mode 100644 index 0000000000000000000000000000000000000000..ce313b02def890e1c0bdf1c445371f30f6e252a6 GIT binary patch literal 4288 zcmZRsWfc};U|?uucn%~nL1qeE%n!ukf^#8^l*E!msE{*=J^|&xsMNgV{FKbRbRZur zF9MT*(!2_AV0iG*k>e*%pFMZ^%C+ma?%ciq@X?d!FJHfX_xa1W@4x>1g)1EF49{SH zT?-3SOI<^3E;U-ZXz`LgJnp_s-jY;NYRdM~)sl ze&Xb*(`U|}JAdKgrOQ{YUb}wd=B?Xz?%uoq;NhdkPo6$|{^I4U*Kgjwd;j6%r_W!$ ze*6C8=da&?{{H)q%}Uyc!M$mO&3t3zxI~LeZ0ZNC7~Gr2*qmrGYaTG!f+FkexeMTQ z3-T){a^AlC08Y2qbPYl=xHnC(InH!BHqjv{2KS~ZHpiP`6C8?SaBpJuk@-;c5;ix( zy@}OF7TB~5MKQQHvHHjowccEXR@m+uGCqcT(-Mo54GoqqztGjUcEir?ACSsiU|Rv& zRDhJZz_!9*Zz{mOX=s4yPeZJ2226E>Uj*SzEM77+UV7}vsS_vryDnb7c71Wro%Mb9 zcRqXa>cz|Xvp#l5Kl|rR8vLGAP(XMSOZ&jk6g6)Shc+#iiqp`9vR3QhiDyT@ zU{75`BU3CnQ$fKHi`NH_(@Aj&%$rzpCeWK$+YF=_KUmblyon`e0=;RDls9kPS#^J~ kxSC{lI0t}|EY@~A(3=(~zkIuPhh#$sp9T|S%vPQh0H)taM*si- literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_1250.prj b/msautotest/misc/data/shp_encoding/encoding_1250.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_1250.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_1250.shp b/msautotest/misc/data/shp_encoding/encoding_1250.shp new file mode 100644 index 0000000000000000000000000000000000000000..eeb7144dbcd97b28472a7fba239272d36e696bb2 GIT binary patch literal 604 zcmZ{hOA^8$5JWrvji0Dzpvs-AtSyetaXf}i2P~*+XTi+$V>$$Y=Lj3a>$3)iADh!s zhLYd0^d&FdpEcWz#w*XRJfjNm1a>Y_-}J1WD@5vB&!_@B&osa9S>B#Qo(C4qKM2(2 z=$Sn8{Wf#*qNIHCj4E*UOrDpX&5=Dro>vyl_bStd$uoK0de*(~-7|SUJPYXy!D$w< literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_1250.shx b/msautotest/misc/data/shp_encoding/encoding_1250.shx new file mode 100644 index 0000000000000000000000000000000000000000..d4436d5bef82ac4d0f9ebc238ccd88fc38261ed2 GIT binary patch literal 244 zcmZQzQ0HR64ys--GcYj17Y(hwdF(g-LHvc~~R`$6d#D4hkRE1+~6 ll%4{m7eVO_P*0{{c14eI~^ literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_1251.cpg b/msautotest/misc/data/shp_encoding/encoding_1251.cpg new file mode 100644 index 0000000000..f0acbc2e3f --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_1251.cpg @@ -0,0 +1 @@ +1251 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_1251.dbf b/msautotest/misc/data/shp_encoding/encoding_1251.dbf new file mode 100644 index 0000000000000000000000000000000000000000..911b826cd0b7d620f6accf148413c3a609b8d813 GIT binary patch literal 4288 zcmZRsWfc};U|?uucn%~nL1qeE%n!ukf^#8^l*E!msE{*=J^|&xsMNgV{FKbRbRZur zF9MT*(!2_AUWe&gn?+js8XyZ_+f zqsLF4K7IE5#miT(-@JYI{=>&lpTB(l_Wj4tU%&tS{r7+8jtR}X_HEw3XV#o~bC)lg zkIfY{7lV7#6q{9M*aU~77~Gp!ePliqy@bupaBpJukp(s_Ls1OwO{_k$9Ex7T=4QAz zvH8f*VENh&+p%dIYGQD28X90a-4JV=0aM-J7eROvitf_W25 z&IEcBYny={&Z4#*FmGbXnLux1Z8K2Y3G^_}IRKPoapXZmtZfE*IE&hLm>6Tmm=pj> Cx|3r7 literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_1251.prj b/msautotest/misc/data/shp_encoding/encoding_1251.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_1251.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_1251.shp b/msautotest/misc/data/shp_encoding/encoding_1251.shp new file mode 100644 index 0000000000000000000000000000000000000000..eeb7144dbcd97b28472a7fba239272d36e696bb2 GIT binary patch literal 604 zcmZ{hOA^8$5JWrvji0Dzpvs-AtSyetaXf}i2P~*+XTi+$V>$$Y=Lj3a>$3)iADh!s zhLYd0^d&FdpEcWz#w*XRJfjNm1a>Y_-}J1WD@5vB&!_@B&osa9S>B#Qo(C4qKM2(2 z=$Sn8{Wf#*qNIHCj4E*UOrDpX&5=Dro>vyl_bStd$uoK0de*(~-7|SUJPYXy!D$w< literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_1251.shx b/msautotest/misc/data/shp_encoding/encoding_1251.shx new file mode 100644 index 0000000000000000000000000000000000000000..d4436d5bef82ac4d0f9ebc238ccd88fc38261ed2 GIT binary patch literal 244 zcmZQzQ0HR64ys--GcYj17Y(hwdF(g-LHvc~~R`$6d#D4hkRE1+~6 ll%4{m7eVO_P*0{{c14eI~^ literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_1253.cpg b/msautotest/misc/data/shp_encoding/encoding_1253.cpg new file mode 100644 index 0000000000..b0a0271f9c --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_1253.cpg @@ -0,0 +1 @@ +1253 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_1253.dbf b/msautotest/misc/data/shp_encoding/encoding_1253.dbf new file mode 100644 index 0000000000000000000000000000000000000000..58c1e1e45b15508b010bfccc04dd1a59eac39e80 GIT binary patch literal 4288 zcmZRsWfc};U|?uucn%~nL1qeE%n!ukf^#8^l*E!msE{*=J^|&xsMNgV{FKbRbRZur zF9MT*(!2_AUv!9$0S96fgY#K}{q&zwDX z{=&t}SFT>We&gn?+js8XyZ_+fqsLF4K70P+<*V0k-oAVP;p3;zU%r0({^RGb-+%u8 z8${s&_og{EM_FJK9ExIaZ({Y4>^n^?SLh_%fy$b3MQa~%DG zJ#`I@OtIul1%=@gn=o%;$(cZJnhlrc0nD3NawgE5SlbLlrIJCW$T$$Y=Lj3a>$3)iADh!s zhLYd0^d&FdpEcWz#w*XRJfjNm1a>Y_-}J1WD@5vB&!_@B&osa9S>B#Qo(C4qKM2(2 z=$Sn8{Wf#*qNIHCj4E*UOrDpX&5=Dro>vyl_bStd$uoK0de*(~-7|SUJPYXy!D$w< literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_1253.shx b/msautotest/misc/data/shp_encoding/encoding_1253.shx new file mode 100644 index 0000000000000000000000000000000000000000..d4436d5bef82ac4d0f9ebc238ccd88fc38261ed2 GIT binary patch literal 244 zcmZQzQ0HR64ys--GcYj17Y(hwdF(g-LHvc~~R`$6d#D4hkRE1+~6 ll%4{m7eVO_P*0{{c14eI~^ literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_1254.cpg b/msautotest/misc/data/shp_encoding/encoding_1254.cpg new file mode 100644 index 0000000000..c789257680 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_1254.cpg @@ -0,0 +1 @@ +1254 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_1254.dbf b/msautotest/misc/data/shp_encoding/encoding_1254.dbf new file mode 100644 index 0000000000000000000000000000000000000000..d1fce52db5747295ea7e5f377673ccc8e3a87da6 GIT binary patch literal 4288 zcmdUyJ5K^Z5XUbuHYPS|Wp!VGgauBZG*mQd!Y43dj14xn7RHWPSrQWyAHl}N!bCe? zpd!9eKtxeQ5#Ivx5+Ao5w|8)3zjp<@`@h@G{4z5;L&Hd8YYW3LqfCRkGl5r@9b_en;Pseb6z$uPg7{#23}EnI#WeTi@99c(=B9e7pX={e#2f zlfda&FcdzITts8nH}TuV-F@;Q_4xGs^7{6X&SXDx`9iVuRsJPsP%*LEx-}*fXVxId z9NnyY-g&jSwBq_%-|%ev{QC!i(_knPjori($<))!YbKk^m&(vysx*SBgUr%H)eQ&6D$!X=nUtK>vr&!GH{enr9rkdWTv^*IB4cNdK%?ozG{ z-^!II=!a5TC}9Hq0pi9dr&jCpQ=XoR5++bMkwM*^tmM_sE}K<@bR3YG zEQyK)u literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_1254.prj b/msautotest/misc/data/shp_encoding/encoding_1254.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_1254.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_1254.shp b/msautotest/misc/data/shp_encoding/encoding_1254.shp new file mode 100644 index 0000000000000000000000000000000000000000..eeb7144dbcd97b28472a7fba239272d36e696bb2 GIT binary patch literal 604 zcmZ{hOA^8$5JWrvji0Dzpvs-AtSyetaXf}i2P~*+XTi+$V>$$Y=Lj3a>$3)iADh!s zhLYd0^d&FdpEcWz#w*XRJfjNm1a>Y_-}J1WD@5vB&!_@B&osa9S>B#Qo(C4qKM2(2 z=$Sn8{Wf#*qNIHCj4E*UOrDpX&5=Dro>vyl_bStd$uoK0de*(~-7|SUJPYXy!D$w< literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_1254.shx b/msautotest/misc/data/shp_encoding/encoding_1254.shx new file mode 100644 index 0000000000000000000000000000000000000000..d4436d5bef82ac4d0f9ebc238ccd88fc38261ed2 GIT binary patch literal 244 zcmZQzQ0HR64ys--GcYj17Y(hwdF(g-LHvc~~R`$6d#D4hkRE1+~6 ll%4{m7eVO_P*0{{c14eI~^ literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_437.cpg b/msautotest/misc/data/shp_encoding/encoding_437.cpg new file mode 100644 index 0000000000..3fa694f245 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_437.cpg @@ -0,0 +1 @@ +437 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_437.dbf b/msautotest/misc/data/shp_encoding/encoding_437.dbf new file mode 100644 index 0000000000000000000000000000000000000000..570d91df95f8a102d4af40b3c4a448ec9228a6b6 GIT binary patch literal 4288 zcmZRsWfc};U|?uucn%~nL1qeE%n!ukf^#8^l*E!msE{*=J^|&xsMNgV{FKbRbRZur zF9MT*(!2_AVA$6`sbRv>nX?|YE@*CPo7mpf)X~|yu%~;;)J2o0e4D;_TH_43;=#=D z4EEQxurRgMHN@shqaS?@6M&us`mw#Kb72q2Z;KnTsT|~DaBmu6bEq-Um$10R5|h}p z3{Ek)H;u8m&jgrgp|ROE5fq)E*qk;5qZ95;6Kviz#U?lu#o*q=>LatE=p}4!hI#+fH!ZP5lA*zmU+86R zH?Zy;dW9`KHVq9h{b`7`&48(H@QWb4iN#BX#(n*uYO|%SY0;E#L$JDphd;ubSlS1M zrYnX?=0tcCOT}quGEADZ3XXokp1OucrdV>Of`TCyufx;9kYd2Ri6v(Oy=gXFng=j% zV#%36Z<@oi=8%dzOvgG0fRZfMc016U7852;nmlFdwCOWu&YC@E?!5V!1`G`m6JyL) Go)iFJ=ClO> literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_437.prj b/msautotest/misc/data/shp_encoding/encoding_437.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_437.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_437.shp b/msautotest/misc/data/shp_encoding/encoding_437.shp new file mode 100644 index 0000000000000000000000000000000000000000..eeb7144dbcd97b28472a7fba239272d36e696bb2 GIT binary patch literal 604 zcmZ{hOA^8$5JWrvji0Dzpvs-AtSyetaXf}i2P~*+XTi+$V>$$Y=Lj3a>$3)iADh!s zhLYd0^d&FdpEcWz#w*XRJfjNm1a>Y_-}J1WD@5vB&!_@B&osa9S>B#Qo(C4qKM2(2 z=$Sn8{Wf#*qNIHCj4E*UOrDpX&5=Dro>vyl_bStd$uoK0de*(~-7|SUJPYXy!D$w< literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_437.shx b/msautotest/misc/data/shp_encoding/encoding_437.shx new file mode 100644 index 0000000000000000000000000000000000000000..d4436d5bef82ac4d0f9ebc238ccd88fc38261ed2 GIT binary patch literal 244 zcmZQzQ0HR64ys--GcYj17Y(hwdF(g-LHvc~~R`$6d#D4hkRE1+~6 ll%4{m7eVO_P*0{{c14eI~^ literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88591.cpg b/msautotest/misc/data/shp_encoding/encoding_88591.cpg new file mode 100644 index 0000000000..0968566aaf --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88591.cpg @@ -0,0 +1 @@ +88591 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88591.dbf b/msautotest/misc/data/shp_encoding/encoding_88591.dbf new file mode 100644 index 0000000000000000000000000000000000000000..1beb2035e6f544f674c1582ef76be827068eb2f7 GIT binary patch literal 4288 zcmdUyOHUI~6vvwwHzsb>m8 zRNfW}ViCbYt;j=K%Cq1(Go9PgIfWuREhm}#ICpyQ{mr@eoYPB>E?>Xq@pvA4(o{O7 zGoo~D+`6K=RwL5!u%oDI;d-#xv8#JscOOJLyY5rp9KT@?6zi*+68(Ko?}un#|G;4E z^4q{34hn#@i*lc z6=qPvY_0`R`eCE#6lSxuvrsLVRo{_jtdmY*hNKM`RT1iR_@qtNqEncL^me#1ZlXMH zTJH8(+(dcY1R5`Hh6PN$$+9Ln4w9Ev;H1_Yv(LqG4?H%`fpaQ>8TP=GJydw$^$iZ3 zTY2oT2QD1C7dVwQ^(H5$t}C9iHk^~yRa3$g(jeW>bkRO4Vu~{kO7^(NIRe+IB`Px9 zG9?R2_P9k^f_vsVQ%_PiF<-IJ%P4n+2c_3G}dY;8v l?(mTn^LD~CV$1!x{O11dQ6l-|>GQ_%oM%N2_?=na%|B2Ox(fgR literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88591.prj b/msautotest/misc/data/shp_encoding/encoding_88591.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88591.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88591.shp b/msautotest/misc/data/shp_encoding/encoding_88591.shp new file mode 100644 index 0000000000000000000000000000000000000000..eeb7144dbcd97b28472a7fba239272d36e696bb2 GIT binary patch literal 604 zcmZ{hOA^8$5JWrvji0Dzpvs-AtSyetaXf}i2P~*+XTi+$V>$$Y=Lj3a>$3)iADh!s zhLYd0^d&FdpEcWz#w*XRJfjNm1a>Y_-}J1WD@5vB&!_@B&osa9S>B#Qo(C4qKM2(2 z=$Sn8{Wf#*qNIHCj4E*UOrDpX&5=Dro>vyl_bStd$uoK0de*(~-7|SUJPYXy!D$w< literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88591.shx b/msautotest/misc/data/shp_encoding/encoding_88591.shx new file mode 100644 index 0000000000000000000000000000000000000000..d4436d5bef82ac4d0f9ebc238ccd88fc38261ed2 GIT binary patch literal 244 zcmZQzQ0HR64ys--GcYj17Y(hwdF(g-LHvc~~R`$6d#D4hkRE1+~6 ll%4{m7eVO_P*0{{c14eI~^ literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_885910.cpg b/msautotest/misc/data/shp_encoding/encoding_885910.cpg new file mode 100644 index 0000000000..9378e6a30d --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_885910.cpg @@ -0,0 +1 @@ +885910 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_885910.dbf b/msautotest/misc/data/shp_encoding/encoding_885910.dbf new file mode 100644 index 0000000000000000000000000000000000000000..8c1fde32774d286a1ea6a9f655e7c9ca1a89de84 GIT binary patch literal 4288 zcmds(NmCj@6vwGbc}Z0+F{hmP0#w<+L^xWWyqHw^39MkHyqJsE9P&|60zwdF2?`=^ zs9@Xx#cd2OC}P}L#0AiF4@^5H@0!$f=0JD-fuZlGOt$(@= zRBI=_mvmU|7&?19Yf>v|!?l6fboG4vZ0PR!gvY}BH{y$0`$|b4G&MaFnw^XMTv}dP zjjydIHn(^9-CxQ5gTvI(apw2=#pPALa9zB;FO@3~bejA+Z5{7bIvuB1A;>nh(PFa? zJN<#F=}Q&`j}CP<{0 z$$Y=Lj3a>$3)iADh!s zhLYd0^d&FdpEcWz#w*XRJfjNm1a>Y_-}J1WD@5vB&!_@B&osa9S>B#Qo(C4qKM2(2 z=$Sn8{Wf#*qNIHCj4E*UOrDpX&5=Dro>vyl_bStd$uoK0de*(~-7|SUJPYXy!D$w< literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_885910.shx b/msautotest/misc/data/shp_encoding/encoding_885910.shx new file mode 100644 index 0000000000000000000000000000000000000000..d4436d5bef82ac4d0f9ebc238ccd88fc38261ed2 GIT binary patch literal 244 zcmZQzQ0HR64ys--GcYj17Y(hwdF(g-LHvc~~R`$6d#D4hkRE1+~6 ll%4{m7eVO_P*0{{c14eI~^ literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_885911.cpg b/msautotest/misc/data/shp_encoding/encoding_885911.cpg new file mode 100644 index 0000000000..8915cc18e4 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_885911.cpg @@ -0,0 +1 @@ +885911 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_885911.dbf b/msautotest/misc/data/shp_encoding/encoding_885911.dbf new file mode 100644 index 0000000000000000000000000000000000000000..759c303989b2271c820e3ef6194b2b29bcb74397 GIT binary patch literal 4288 zcmds(xlY4C6h$o|8YCK^qVf+|Vv-n~5~WHLkn#l)K`2dVXesy<_I+Q&z7uv3J3qj0 zV1s>K&t)Ewo(yuxj;2w_$!KqfkHTy3HoX{ zh`Qc#Pk*sg?(@e#>n+hj*f-i}3QD-h=DQrvbJGqbN(iTeePB|eB;te%U{a!#a5~rr zCM9waCtLuN615AbgMDC9q7K9f7r>-Mo^U$Y2PP#-BTl#gCL>a9!s%cim<&m&;gQj? z@rlW)>6zKN`Gv)$<(1X7^^MJ~%J$Cg-u}Vi(ecUY+4)8F^6L8L_U``S@#*>H_3i!R z6A8=^F(xU46unH%Fs|n!#w19J-ZFX#%!rOL36i2UgBiy4Ty*C0Sw|&Y`m^~zyBT4U wlWE(E)(m>@(TwN_lblQ+lhzDo7}s-==?*^GKhB_{HG^IPGon+;+8t~C26m-L=>Px# literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_885911.prj b/msautotest/misc/data/shp_encoding/encoding_885911.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_885911.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_885911.shp b/msautotest/misc/data/shp_encoding/encoding_885911.shp new file mode 100644 index 0000000000000000000000000000000000000000..eeb7144dbcd97b28472a7fba239272d36e696bb2 GIT binary patch literal 604 zcmZ{hOA^8$5JWrvji0Dzpvs-AtSyetaXf}i2P~*+XTi+$V>$$Y=Lj3a>$3)iADh!s zhLYd0^d&FdpEcWz#w*XRJfjNm1a>Y_-}J1WD@5vB&!_@B&osa9S>B#Qo(C4qKM2(2 z=$Sn8{Wf#*qNIHCj4E*UOrDpX&5=Dro>vyl_bStd$uoK0de*(~-7|SUJPYXy!D$w< literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_885911.shx b/msautotest/misc/data/shp_encoding/encoding_885911.shx new file mode 100644 index 0000000000000000000000000000000000000000..d4436d5bef82ac4d0f9ebc238ccd88fc38261ed2 GIT binary patch literal 244 zcmZQzQ0HR64ys--GcYj17Y(hwdF(g-LHvc~~R`$6d#D4hkRE1+~6 ll%4{m7eVO_P*0{{c14eI~^ literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_885913.cpg b/msautotest/misc/data/shp_encoding/encoding_885913.cpg new file mode 100644 index 0000000000..0d8ed6ba29 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_885913.cpg @@ -0,0 +1 @@ +885913 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_885913.dbf b/msautotest/misc/data/shp_encoding/encoding_885913.dbf new file mode 100644 index 0000000000000000000000000000000000000000..08d8ebb089438f0b7c6148a14b1461a412cb7705 GIT binary patch literal 4288 zcmds)J5K^Z5XVW3jfss~S@8u(Sl|RoLuG>|egY!K*l1&G;a5=;Y>af;fr`R`yb(~I z3W_K%0r3H%a|lbqO)tw8x4Zv+WPZ0ZyK`gP2uVOT8 z8M=~AC>`BKuUOq!*)*kYrLPdXg52R zh2=$=M#E`k1hZLTz1hDt`JBmwIsN%nd2WB(&K>-vKNyYxcjhVo_*!ecGr&zT6&R+{ z#{UuJ*`UD~IvT}PVnbAwT%mmio_h*==<)qDC=MBJIfCn_6U(h}>$w z^0-Z2U-B?!PUi}x;&HjsZql;@&WpoNPa-Lk&8`&T%1J3XbLNGqIv!Df{Z9QBr>H^3|+JW6G9IY ziA=yma|R~328`@sB9RH0>TYbp@8-Zf#+te%!DZ3B9WXV#<){&k@9r^1B{El~6lZy} EzXe1Nl>h($ literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_885913.prj b/msautotest/misc/data/shp_encoding/encoding_885913.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_885913.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_885913.shp b/msautotest/misc/data/shp_encoding/encoding_885913.shp new file mode 100644 index 0000000000000000000000000000000000000000..eeb7144dbcd97b28472a7fba239272d36e696bb2 GIT binary patch literal 604 zcmZ{hOA^8$5JWrvji0Dzpvs-AtSyetaXf}i2P~*+XTi+$V>$$Y=Lj3a>$3)iADh!s zhLYd0^d&FdpEcWz#w*XRJfjNm1a>Y_-}J1WD@5vB&!_@B&osa9S>B#Qo(C4qKM2(2 z=$Sn8{Wf#*qNIHCj4E*UOrDpX&5=Dro>vyl_bStd$uoK0de*(~-7|SUJPYXy!D$w< literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_885913.shx b/msautotest/misc/data/shp_encoding/encoding_885913.shx new file mode 100644 index 0000000000000000000000000000000000000000..d4436d5bef82ac4d0f9ebc238ccd88fc38261ed2 GIT binary patch literal 244 zcmZQzQ0HR64ys--GcYj17Y(hwdF(g-LHvc~~R`$6d#D4hkRE1+~6 ll%4{m7eVO_P*0{{c14eI~^ literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_885915.cpg b/msautotest/misc/data/shp_encoding/encoding_885915.cpg new file mode 100644 index 0000000000..ccdb223253 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_885915.cpg @@ -0,0 +1 @@ +885915 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_885915.dbf b/msautotest/misc/data/shp_encoding/encoding_885915.dbf new file mode 100644 index 0000000000000000000000000000000000000000..3372c76dda50810dc7f96952767c0bb1ca7cdba2 GIT binary patch literal 4288 zcmdUyyG{Z@6oyHRjfss~S@8lS4zLQPp`uX}pMZ!lG}zc$_$nHO#)QH|3vVExh+Gr| zMG!?UqT&URyW-9+JCNNITXwf#X3p+T&X@npo}Yo$!O;lc`UU6Ea)`Qw?EK7APvg z7{R2VU5|lH+1c@}zD^iRROpr*+@0-1CQ_wVfd!}eQCMycT)B+-* z3A%4?+je`uw}Bw`2RE!c=zeoQKCvyRF{S|6sox=ji6(@pAkZ@ipA&ziiwPhhmDA$$Y=Lj3a>$3)iADh!s zhLYd0^d&FdpEcWz#w*XRJfjNm1a>Y_-}J1WD@5vB&!_@B&osa9S>B#Qo(C4qKM2(2 z=$Sn8{Wf#*qNIHCj4E*UOrDpX&5=Dro>vyl_bStd$uoK0de*(~-7|SUJPYXy!D$w< literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_885915.shx b/msautotest/misc/data/shp_encoding/encoding_885915.shx new file mode 100644 index 0000000000000000000000000000000000000000..d4436d5bef82ac4d0f9ebc238ccd88fc38261ed2 GIT binary patch literal 244 zcmZQzQ0HR64ys--GcYj17Y(hwdF(g-LHvc~~R`$6d#D4hkRE1+~6 ll%4{m7eVO_P*0{{c14eI~^ literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88592.cpg b/msautotest/misc/data/shp_encoding/encoding_88592.cpg new file mode 100644 index 0000000000..bda94ad63f --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88592.cpg @@ -0,0 +1 @@ +88592 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88592.dbf b/msautotest/misc/data/shp_encoding/encoding_88592.dbf new file mode 100644 index 0000000000000000000000000000000000000000..daeba2a73fa350ab8a9d7c958d4569673fa3e3ac GIT binary patch literal 4288 zcmds(%QHez9LJk6HfC(Fvg#jb#;Go~G*&j4@fR2wW5dSQ!k>~?3MubA@(P6#QRI?G zR47r(Bad@aNA%k?#>~0yqI1soo^$$s<~;5NFWe&3VirC`)N@St%j==kmhGa z(a_$IlB&4UoNA?CS36?NjxuH3Ng%VV!_70GdpLT zUszmPHm$6#nJw!Zn^xPFeS62TyXSQ6AGi>DjsW;?n02TwUJ;L$~3(`$+U5 z7Jqzteo4H(y+eQbHyXhdL-R{A*Yd|wLj9@L2&M$GC^Z=Iw&fPfYO^QzEyv0&PB0Ws z?ptUSg&M(>LgpA1r1DTBm<(jT91{7c5loP%f{#d$XMzb5$)F*8)CeX>B>(>1)cm+? zr+Gt6Fy(+{RHjtf)!HGQKAdso;;4{H3ZGXljtbN#1%ipnvN;i$8M6D)uY6$wNJyew zHLaU1gX(RE)79O_4r@L7OYfCGFl)Gr#Nwk9iFqUajM(89CXf#h^Zji8hfE86IFa;s zsg<6EuB@rA79lYMoJ^q*0qFEt&&5d^6F8X|6U+>`OixSSG$wE|F=j=^*>tlS4=t{9 e_EA;GZCNn4V@#PP8gsHaPfFhasU$n)m3{!`^hx0W literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88592.prj b/msautotest/misc/data/shp_encoding/encoding_88592.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88592.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88592.shp b/msautotest/misc/data/shp_encoding/encoding_88592.shp new file mode 100644 index 0000000000000000000000000000000000000000..eeb7144dbcd97b28472a7fba239272d36e696bb2 GIT binary patch literal 604 zcmZ{hOA^8$5JWrvji0Dzpvs-AtSyetaXf}i2P~*+XTi+$V>$$Y=Lj3a>$3)iADh!s zhLYd0^d&FdpEcWz#w*XRJfjNm1a>Y_-}J1WD@5vB&!_@B&osa9S>B#Qo(C4qKM2(2 z=$Sn8{Wf#*qNIHCj4E*UOrDpX&5=Dro>vyl_bStd$uoK0de*(~-7|SUJPYXy!D$w< literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88592.shx b/msautotest/misc/data/shp_encoding/encoding_88592.shx new file mode 100644 index 0000000000000000000000000000000000000000..d4436d5bef82ac4d0f9ebc238ccd88fc38261ed2 GIT binary patch literal 244 zcmZQzQ0HR64ys--GcYj17Y(hwdF(g-LHvc~~R`$6d#D4hkRE1+~6 ll%4{m7eVO_P*0{{c14eI~^ literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88593.cpg b/msautotest/misc/data/shp_encoding/encoding_88593.cpg new file mode 100644 index 0000000000..c5d61bb5db --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88593.cpg @@ -0,0 +1 @@ +88593 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88593.dbf b/msautotest/misc/data/shp_encoding/encoding_88593.dbf new file mode 100644 index 0000000000000000000000000000000000000000..34ae9522ff9fc4b7d5abb0e904d0df3d212295a7 GIT binary patch literal 4288 zcmZRsWfc};U|?uucn%~nL1qeE%n!ukf^#8^l*E!msE{*=J^|&xsMNgV{FKbRbRZur zF9MT*(!2_AV0hr*p(DpnoIG{<%-M72FJ8KQ<=XX|w{G9L|KQ=HC(mEJeD(Ux+js9j ze)|07+xMTpe*b}M9Bd5FV1Hc;3sXy7Lu@WHTC`;OidE}3Y}v7EKgh!;PoF&p^6ITS z_d))A`TFfUkPmfDW} zJ9q9Hgy8`9rX?1~85%5KyJ0)Dv^@{3Fp-Me_rMBs=#;l`ZyFk4`qL0=n*meZ;1@x7 z6N{G&jgOqXeC_(3_4l8={QT|vpZ$a1KR8^7@Fte_fuSi%-b7?g)QpM9mpCjLcwvM$ zu~eLfpjHs>hU~z*o@f_1`UQLH8XB2m$(afYhFH8#w8?`?A$$Y=Lj3a>$3)iADh!s zhLYd0^d&FdpEcWz#w*XRJfjNm1a>Y_-}J1WD@5vB&!_@B&osa9S>B#Qo(C4qKM2(2 z=$Sn8{Wf#*qNIHCj4E*UOrDpX&5=Dro>vyl_bStd$uoK0de*(~-7|SUJPYXy!D$w< literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88593.shx b/msautotest/misc/data/shp_encoding/encoding_88593.shx new file mode 100644 index 0000000000000000000000000000000000000000..d4436d5bef82ac4d0f9ebc238ccd88fc38261ed2 GIT binary patch literal 244 zcmZQzQ0HR64ys--GcYj17Y(hwdF(g-LHvc~~R`$6d#D4hkRE1+~6 ll%4{m7eVO_P*0{{c14eI~^ literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88594.cpg b/msautotest/misc/data/shp_encoding/encoding_88594.cpg new file mode 100644 index 0000000000..355a1b7313 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88594.cpg @@ -0,0 +1 @@ +88594 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88594.dbf b/msautotest/misc/data/shp_encoding/encoding_88594.dbf new file mode 100644 index 0000000000000000000000000000000000000000..a4d4d8410f4d4022f7e140d2f967c7662e73b321 GIT binary patch literal 4288 zcmds)Nlzj{6vs)77ZWe)$rE3I!~$C3IPv5~P5cB#%)|>`yw1Uof>9Y=`&kFsCo)m0LSq*oHfXW`MMAzCv# zt02q5MAP2WUX&Wy(OF#ZL#MW*ThpceiPzlq8va6Ytdx=iE!Yl>T@0$ba= z|AXO!!=uRYN$mXcDs!E^xxIhLk=w;PX=-bcsZ@+wh9Dc|x_J~2IGwk_Bl zPS+}C_G|{Wc3I-cY3vLGCog*Y^VDTnM)I5$$Y=Lj3a>$3)iADh!s zhLYd0^d&FdpEcWz#w*XRJfjNm1a>Y_-}J1WD@5vB&!_@B&osa9S>B#Qo(C4qKM2(2 z=$Sn8{Wf#*qNIHCj4E*UOrDpX&5=Dro>vyl_bStd$uoK0de*(~-7|SUJPYXy!D$w< literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88594.shx b/msautotest/misc/data/shp_encoding/encoding_88594.shx new file mode 100644 index 0000000000000000000000000000000000000000..d4436d5bef82ac4d0f9ebc238ccd88fc38261ed2 GIT binary patch literal 244 zcmZQzQ0HR64ys--GcYj17Y(hwdF(g-LHvc~~R`$6d#D4hkRE1+~6 ll%4{m7eVO_P*0{{c14eI~^ literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88595.cpg b/msautotest/misc/data/shp_encoding/encoding_88595.cpg new file mode 100644 index 0000000000..505ed08eb8 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88595.cpg @@ -0,0 +1 @@ +88595 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88595.dbf b/msautotest/misc/data/shp_encoding/encoding_88595.dbf new file mode 100644 index 0000000000000000000000000000000000000000..803ebe61f95c4d6dc1f4101c89ff892bd6708184 GIT binary patch literal 4288 zcmZRsWfc};U|?uucn%~nL1qeE%n!ukf^#8^l*E!msE{*=J^|&xsMNgV{FKbRbRZur zF9MT*(!2_AURJbd){$~I}^!dxzZ{L6X{Pp|K-+%v+ zZKoR>?oCr{R+?cG9ExIaZ({Y4`B3x{HaEk)iPc9I*t85qF}OFe`p9x9dI_7G;oijN zBSV9~Yq4n>dSY;I8X90a-Vke>0aM-J7eROvi$$Y=Lj3a>$3)iADh!s zhLYd0^d&FdpEcWz#w*XRJfjNm1a>Y_-}J1WD@5vB&!_@B&osa9S>B#Qo(C4qKM2(2 z=$Sn8{Wf#*qNIHCj4E*UOrDpX&5=Dro>vyl_bStd$uoK0de*(~-7|SUJPYXy!D$w< literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88595.shx b/msautotest/misc/data/shp_encoding/encoding_88595.shx new file mode 100644 index 0000000000000000000000000000000000000000..d4436d5bef82ac4d0f9ebc238ccd88fc38261ed2 GIT binary patch literal 244 zcmZQzQ0HR64ys--GcYj17Y(hwdF(g-LHvc~~R`$6d#D4hkRE1+~6 ll%4{m7eVO_P*0{{c14eI~^ literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88596.cpg b/msautotest/misc/data/shp_encoding/encoding_88596.cpg new file mode 100644 index 0000000000..4ee2725f57 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88596.cpg @@ -0,0 +1 @@ +88596 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88596.dbf b/msautotest/misc/data/shp_encoding/encoding_88596.dbf new file mode 100644 index 0000000000000000000000000000000000000000..d4ffa1c4fb717d2c225a050715eb79d6cb77f8be GIT binary patch literal 4288 zcmds(J5Iwu5QZ&9G)QTHipm$TlyTzVlqgl2fRqzN7@;(wp{3w1v>YMM-39}8RRDRE0wZ5vBe*vz(7d= literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88596.prj b/msautotest/misc/data/shp_encoding/encoding_88596.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88596.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88596.shp b/msautotest/misc/data/shp_encoding/encoding_88596.shp new file mode 100644 index 0000000000000000000000000000000000000000..eeb7144dbcd97b28472a7fba239272d36e696bb2 GIT binary patch literal 604 zcmZ{hOA^8$5JWrvji0Dzpvs-AtSyetaXf}i2P~*+XTi+$V>$$Y=Lj3a>$3)iADh!s zhLYd0^d&FdpEcWz#w*XRJfjNm1a>Y_-}J1WD@5vB&!_@B&osa9S>B#Qo(C4qKM2(2 z=$Sn8{Wf#*qNIHCj4E*UOrDpX&5=Dro>vyl_bStd$uoK0de*(~-7|SUJPYXy!D$w< literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88596.shx b/msautotest/misc/data/shp_encoding/encoding_88596.shx new file mode 100644 index 0000000000000000000000000000000000000000..d4436d5bef82ac4d0f9ebc238ccd88fc38261ed2 GIT binary patch literal 244 zcmZQzQ0HR64ys--GcYj17Y(hwdF(g-LHvc~~R`$6d#D4hkRE1+~6 ll%4{m7eVO_P*0{{c14eI~^ literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88597.cpg b/msautotest/misc/data/shp_encoding/encoding_88597.cpg new file mode 100644 index 0000000000..ca3fcf9135 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88597.cpg @@ -0,0 +1 @@ +88597 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88597.dbf b/msautotest/misc/data/shp_encoding/encoding_88597.dbf new file mode 100644 index 0000000000000000000000000000000000000000..165da9f5f22f48c5ca816269fd172715c89c5984 GIT binary patch literal 4288 zcmZRsWfc};U|?uucn%~nL1qeE%n!ukf^#8^l*E!msE{*=J^|&xsMNgV{FKbRbRZur zF9MT*(!2_AU z44CQ$zX-ycSiEFtylC+IfG8ItyosfKV2HJrACpEM79i+GZGJJ|N0Dj()+O zx`sxkSaPOZ3d!J$skkY8~{qPIP##O#o|Hc NTymXbVvHGMQUH0-hd%%S literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88597.prj b/msautotest/misc/data/shp_encoding/encoding_88597.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88597.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88597.shp b/msautotest/misc/data/shp_encoding/encoding_88597.shp new file mode 100644 index 0000000000000000000000000000000000000000..eeb7144dbcd97b28472a7fba239272d36e696bb2 GIT binary patch literal 604 zcmZ{hOA^8$5JWrvji0Dzpvs-AtSyetaXf}i2P~*+XTi+$V>$$Y=Lj3a>$3)iADh!s zhLYd0^d&FdpEcWz#w*XRJfjNm1a>Y_-}J1WD@5vB&!_@B&osa9S>B#Qo(C4qKM2(2 z=$Sn8{Wf#*qNIHCj4E*UOrDpX&5=Dro>vyl_bStd$uoK0de*(~-7|SUJPYXy!D$w< literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88597.shx b/msautotest/misc/data/shp_encoding/encoding_88597.shx new file mode 100644 index 0000000000000000000000000000000000000000..d4436d5bef82ac4d0f9ebc238ccd88fc38261ed2 GIT binary patch literal 244 zcmZQzQ0HR64ys--GcYj17Y(hwdF(g-LHvc~~R`$6d#D4hkRE1+~6 ll%4{m7eVO_P*0{{c14eI~^ literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88598.cpg b/msautotest/misc/data/shp_encoding/encoding_88598.cpg new file mode 100644 index 0000000000..231eb307c1 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88598.cpg @@ -0,0 +1 @@ +88598 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88598.dbf b/msautotest/misc/data/shp_encoding/encoding_88598.dbf new file mode 100644 index 0000000000000000000000000000000000000000..fd4d9360f52cab95c927e6ef7fab03c3f8ed82f1 GIT binary patch literal 4288 zcmZRsWfc};U|?uucn%~nL1qeE%n!ukf^#8^l*E!msE{*=J^|&xsMNgV{FKbRbRZur zF9MT*(!2_AV7O`*oIRu&p27aQ78a(Kx`x=iVYFoViVa(K41LeSy=jEao5n-mgAi}Q zy=jcin$mSee*VH{+MpGKd(#4&6D@~b5oC$Qn}!C<*KXL3 zMPkSa!DG|V0MqS;SlbMk>IT0E!kbvUWH|hq2ZmVM2ZpA@E^iuQsW=UXO)JRJFW6Jp z(8v@^&Qwsq=Jmm!53#ur=1nX)6X;E>Z3b+{40bV?H?ibQpf|C$83wzTu({7U0F-30 Xw%dW;v{$$Y=Lj3a>$3)iADh!s zhLYd0^d&FdpEcWz#w*XRJfjNm1a>Y_-}J1WD@5vB&!_@B&osa9S>B#Qo(C4qKM2(2 z=$Sn8{Wf#*qNIHCj4E*UOrDpX&5=Dro>vyl_bStd$uoK0de*(~-7|SUJPYXy!D$w< literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88598.shx b/msautotest/misc/data/shp_encoding/encoding_88598.shx new file mode 100644 index 0000000000000000000000000000000000000000..d4436d5bef82ac4d0f9ebc238ccd88fc38261ed2 GIT binary patch literal 244 zcmZQzQ0HR64ys--GcYj17Y(hwdF(g-LHvc~~R`$6d#D4hkRE1+~6 ll%4{m7eVO_P*0{{c14eI~^ literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88599.cpg b/msautotest/misc/data/shp_encoding/encoding_88599.cpg new file mode 100644 index 0000000000..85bd649b33 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88599.cpg @@ -0,0 +1 @@ +88599 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88599.dbf b/msautotest/misc/data/shp_encoding/encoding_88599.dbf new file mode 100644 index 0000000000000000000000000000000000000000..cfa42521cce3c69208ed57121fc3bdffdbc6af1b GIT binary patch literal 4288 zcmdUyIZpyX6vs)7jfss~S@8u(7+@7jLq&roegY!K&}d_8;aBkpHYOA%+9`-A9-yM& zf#886BA|fW9y81CaO{iq%oaN{Z<)>e?R#(DpPq%@!2y*@wWvzsyYh0_sm)4eeRSEJ z*lqJR$z&$ufwYi^>Dj3{yJL0+uf^v>@&jq?SJMmaxIMexJ>UL;|M2MeBoI714_#b_ zBUjfqx6%0h!{bxp`6c<9dP~1&vboQEq4-rQSE{vo{;Tgf7C7n`r#uF_BEAGucA1RIW9kos8KirVesU@9l_VI3hpXn9=ACn2`a3gw-gg;m7ECF49efJZ)sryNJ#J9^M|mwi^dbrsR9;qOlyFDzIF=} z&<9A^?k>*u+Ei3#dtowDmLhx$6KI?Wt02C$tQ_Dm>!d}4bOKPBYBd7T<&AueGA2-& z7!%YCd;vDSl`(^DPOPthNDZ%tK3j2 L95v{bDsT7?oZMwa literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88599.prj b/msautotest/misc/data/shp_encoding/encoding_88599.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88599.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88599.shp b/msautotest/misc/data/shp_encoding/encoding_88599.shp new file mode 100644 index 0000000000000000000000000000000000000000..eeb7144dbcd97b28472a7fba239272d36e696bb2 GIT binary patch literal 604 zcmZ{hOA^8$5JWrvji0Dzpvs-AtSyetaXf}i2P~*+XTi+$V>$$Y=Lj3a>$3)iADh!s zhLYd0^d&FdpEcWz#w*XRJfjNm1a>Y_-}J1WD@5vB&!_@B&osa9S>B#Qo(C4qKM2(2 z=$Sn8{Wf#*qNIHCj4E*UOrDpX&5=Dro>vyl_bStd$uoK0de*(~-7|SUJPYXy!D$w< literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encoding_88599.shx b/msautotest/misc/data/shp_encoding/encoding_88599.shx new file mode 100644 index 0000000000000000000000000000000000000000..d4436d5bef82ac4d0f9ebc238ccd88fc38261ed2 GIT binary patch literal 244 zcmZQzQ0HR64ys--GcYj17Y(hwdF(g-LHvc~~R`$6d#D4hkRE1+~6 ll%4{m7eVO_P*0{{c14eI~^ literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encodings_utf-8.cpg b/msautotest/misc/data/shp_encoding/encodings_utf-8.cpg new file mode 100644 index 0000000000..3ad133c048 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encodings_utf-8.cpg @@ -0,0 +1 @@ +UTF-8 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encodings_utf-8.dbf b/msautotest/misc/data/shp_encoding/encodings_utf-8.dbf new file mode 100644 index 0000000000000000000000000000000000000000..cc401e2433749a12b15735555c3d2024a68758c9 GIT binary patch literal 4288 zcmds4J8v6D5Ec-m36Lg9mCAp>fN4p#Tn4G!IE8WKL#*}TNuJHMlgyojAH_mn8Gw>FpD|N zV*!g;!ZKE{iZ!fb1GjMpo4AWD+{1lr;{hIG2fGN^!#*D2F`nQlo>`u}wqkn_g}Y;=hMo?WwvO; z;uVK1YdXl1V-9JXk`{+Ww!)Td7`)<-+pf%RLPGM?a zrZCm0VdvnaHVfvA-9Kiq(w$#MNZ^JK@>$v zlto2UMNQO2Lu`v3(GU{p)7G_(SDvuu*8*Bl+tNZ>Sc_;;EvCh_gq9psw6vD7^Zka+f;oG` ze0A}_$QgN~U=)p#Q8p?@)u7+nL5p3xu8kDMdd z$UX9myrYGYZ?rgCvRnK^+ANq4?B4p2`+0x|`4$iHFpuykkMTH9@FY+1G|%uX&+!5; z@)9re3a|1Suk!}q<~zK}cX^BN@qOOr2mFwCc$Wk3@jgG|$NYq!^0VRm&^dGs-9yjN zJ6st0hKs|c;qq{0xH?=LuG_iu&utdWhjwes>6^M=59mRCOAqN`J)%eTm>$;?dQwm6 zX+5K7^_-s93wlv6>1Dm5SM{1+w_EDt+ANrJc78m%t#7jQ+xjMJ(FA>yW!}~|*&b#7 zg}(X72Bza4^RNKRvpTD?&Y;4MR4vU?nN9{fRHtRLbDEWyHCT;x2VHioYGqE<<zI)rDD_$LfM=2;i6`M^quQZGjdn~G$RZ50>EUXyrD2|U5w{G%cP*HLr z_Gq7+6jwbmNk?>|I;B^2N2k&-O6;+iVqPg3>a&Q-fUe4cW5vCP7O<@-xe$BQCKn~B zfyYWkshqeWW$gT)&~^>eMjtq4DL_Gj!P#wl^uMlcuVLCWPRGp0)TI*=HPK_=JbC)~ zuH*i!&Ca}Y$1(d}70{*r`5WqIA_NmXG=^!jGZoAS{}*{MhH0}i70idX?a4p&P3yFI z*)=B$^apup4AWM*JLc3Ox~z`V2kOYQuMWFCJW~g+$$Y=Lj3a>$3)iADh!s zhLYd0^d&FdpEcWz#w*XRJfjNm1a>Y_-}J1WD@5vB&!_@B&osa9S>B#Qo(C4qKM2(2 z=$Sn8{Wf#*qNIHCj4E*UOrDpX&5=Dro>vyl_bStd$uoK0de*(~-7|SUJPYXy!D$w< literal 0 HcmV?d00001 diff --git a/msautotest/misc/data/shp_encoding/encodings_utf-8.shx b/msautotest/misc/data/shp_encoding/encodings_utf-8.shx new file mode 100644 index 0000000000000000000000000000000000000000..d4436d5bef82ac4d0f9ebc238ccd88fc38261ed2 GIT binary patch literal 244 zcmZQzQ0HR64ys--GcYj17Y(hwdF(g-LHvc~~R`$6d#D4hkRE1+~6 ll%4{m7eVO_P*0{{c14eI~^ literal 0 HcmV?d00001 diff --git a/msautotest/misc/encoding_from_cpg.map b/msautotest/misc/encoding_from_cpg.map new file mode 100644 index 0000000000..7ba954461f --- /dev/null +++ b/msautotest/misc/encoding_from_cpg.map @@ -0,0 +1,478 @@ +# Test reading encodings from cpg. +# http://www.madore.org/~david/computers/unicode/cstab.HTML +# +# RUN_PARMS: shp_encodings.png [MAP2IMG] -m [MAPFILE] -o [RESULT] +# +# Recipe to generate the files from the 'encodings_utf-8.shp': +# +# encodings=(88591 88592 88593 88594 88595 88596 88597 88598 88599 885910 885911 885913 885915 437 1250 1251 1253 1254) +# +# for ENC in "${encodings[@]}"; do +# ogr2ogr -f "ESRI Shapefile" "encoding_${ENC}.shp" "encodings_utf-8.shp" -lco ENCODING="$ENC" +# done +# +map + name "test encoding" + size 300 300 + extent -30 -30 40 40 + web + metadata + "ows_enable_request" "*" + "ows_srs" "epsg:4326" + "ows_onlineresource" "http://foo" + end + end + projection + "+init=epsg:4326" + end + + imagetype png + + symbol + type ellipse + name "circle" + points 1 1 end + filled true + end + + LAYER + NAME "latin-1" + DATA "data/shp_encoding/encoding_88591.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + LAYER + NAME "latin-2" + DATA "data/shp_encoding/encoding_88592.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "Ą˘Ł¤ĽŚ§¨ŠŞŤŹŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + + LAYER + NAME "latin-3" + DATA "data/shp_encoding/encoding_88593.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ÄĊĈÇÈÉÊËÌÍÎÏÑÒÓÔĠÖ×ĜÙÚÛÜŬŜßàáâäċĉçèéêëìíîïñòóôġö÷ĝùúûüŭŝ" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + + LAYER + NAME "latin-4" + DATA "data/shp_encoding/encoding_88594.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "šēģŧŊžŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎĪĐŅŌĶÔÕÖרŲÚÛÜŨŪßāáâãäåæįčéęëėíîīđņōķôõö÷øųúûüũū" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + + LAYER + NAME "latin-5" + DATA "data/shp_encoding/encoding_88595.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + + LAYER + NAME "latin-6" + DATA "data/shp_encoding/encoding_88596.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ءآأؤإئابةتثجحخدذرزسشصضطظعغـفقكلمنهوى" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + + LAYER + NAME "latin-7" + DATA "data/shp_encoding/encoding_88597.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + + LAYER + NAME "latin-8" + DATA "data/shp_encoding/encoding_88598.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "אבגדהוזחטיךכלםמןנסעףפץצקרשת" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + + LAYER + NAME "latin-9" + DATA "data/shp_encoding/encoding_88599.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + + LAYER + NAME "latin-10" + DATA "data/shp_encoding/encoding_885910.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ĄĒĢĪĨͧĻĐŠŦŽ­ŪŊ°ąēģīĩķ·ļđšŧž―ūŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎÏÐŅŌÓÔÕÖŨØŲÚÛÜÝÞßāáâãäåæįčéęëėíîïðņōóôõöũøųúûüýþĸ" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + + LAYER + NAME "latin-11" + DATA "data/shp_encoding/encoding_885911.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัำิีึืฺุู" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + LAYER + NAME "latin-13" + DATA "data/shp_encoding/encoding_885913.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž’" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + LAYER + NAME "latin-15" + DATA "data/shp_encoding/encoding_885915.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + LAYER + NAME "ANSI 1250" + DATA "data/shp_encoding/encoding_1250.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüý" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + LAYER + NAME "ANSI 1251" + DATA "data/shp_encoding/encoding_1251.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзиклмнопрстуфхцчшщъыьэюя" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + LAYER + NAME "ANSI 1253" + DATA "data/shp_encoding/encoding_1253.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + LAYER + NAME "ANSI 1254" + DATA "data/shp_encoding/encoding_1254.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖØÙÚÛÜİŞß" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + LAYER + NAME "OEM Codepage 437" + DATA "data/shp_encoding/encoding_437.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ÉæÆôöòûùÿÖÜ¢£¥₧ƒ" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + +END # MAP diff --git a/msautotest/misc/expected/shp_encodings.png b/msautotest/misc/expected/shp_encodings.png new file mode 100644 index 0000000000000000000000000000000000000000..364283169fbce6345206860f6ac825d4f50f831a GIT binary patch literal 12078 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 literal 0 HcmV?d00001 diff --git a/src/mapxbase.c b/src/mapxbase.c index 772f3343b1..d757a9ca6a 100644 --- a/src/mapxbase.c +++ b/src/mapxbase.c @@ -244,6 +244,33 @@ char *msReadCPGEncoding(char *cpgFilename) { return NULL; } + /* See + * https://github.com/OSGeo/gdal/blob/release/3.11/ogr/ogrsf_frmts/shape/ogrshapelayer.cpp#L503 + */ + const int nCPG = atoi(szEncoding); + if ((nCPG >= 437 && nCPG <= 950) || (nCPG >= 1250 && nCPG <= 1258)) { + char szResult[20]; + snprintf(szResult, sizeof(szResult), "CP%d", nCPG); + return msStrdup(szResult); + } + + if (strncasecmp(szEncoding, "8859", 4) == 0) { + const char *suffix = szEncoding + 4; + if (*suffix == '-' || *suffix == '_') + suffix++; + + if (!isdigit((unsigned char)*suffix)) + return msStrdup(szEncoding); + + char szResult[40]; + snprintf(szResult, sizeof(szResult), "ISO-8859-%d", atoi(suffix)); + return msStrdup(szResult); + } + + if (strncasecmp(szEncoding, "ANSI 1251", 9) == 0) { + return msStrdup("CP1251"); + } + return msStrdup(szEncoding); } From a06a1dcfcc7d714b1adfabe6e37c577b88149499 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 27 Jun 2025 17:13:23 -0300 Subject: [PATCH 24/53] Check wms_onlineresource for OpenLayers output (#7301) Co-authored-by: sethg --- src/maptemplate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maptemplate.c b/src/maptemplate.c index 8abfa9eac6..4e61713052 100644 --- a/src/maptemplate.c +++ b/src/maptemplate.c @@ -4060,7 +4060,7 @@ static char *processLine(mapservObj *mapserv, const char *instr, FILE *stream, char *ol; #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) || defined(USE_WMS_LYR) || defined(USE_WFS_LYR) - ol = msOWSGetOnlineResource(mapserv->map, "O", "onlineresource", + ol = msOWSGetOnlineResource(mapserv->map, "MO", "onlineresource", mapserv->request); #else ol = msBuildOnlineResource(mapserv->map, mapserv->request); From 5db53548ccfcc7451b3aa9b86ac06cc95c748e6e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 08:23:36 -0300 Subject: [PATCH 25/53] Update INSTALL.CMAKE (#7304) Fix typo previously fixed in CMakeLists.txt but missed here. See #5091 Co-authored-by: Robin Perkins --- INSTALL.CMAKE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.CMAKE b/INSTALL.CMAKE index 2b3fbda00e..08b28fac46 100644 --- a/INSTALL.CMAKE +++ b/INSTALL.CMAKE @@ -125,7 +125,7 @@ Refer to the CMakeLists.txt file for up-to-date options. - option(WITH_KML "Enable native KML output support (requires libxml2 support)" OFF) - option(WITH_SOS "Enable SOS Server support (requires PROJ and libxml2 support)" OFF) - option(WITH_WMS "Enable WMS Server support (requires proj support)" ON) - - option(WITH_FRIBIDI "Choose if FriBidi glyph reordering should be enabled (useful for left-to-right languages)(requires harfbuzz)" ON) + - option(WITH_FRIBIDI "Choose if FriBidi glyph reordering should be enabled (useful for right-to-left languages)(requires harfbuzz)" ON) - option(WITH_HARFBUZZ "Choose if Harfbuzz complex script glyph shaping support should be built in (requires fribidi)" ON) - option(WITH_ICONV "Choose if Iconv Internationalization support should be built in" ON) - option(WITH_CAIRO "Choose if CAIRO rendering support should be built in (required for SVG and PDF output)" ON) From 6d0016ca462d0dc3bcc7658c571cee63b191f6e0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 4 Jul 2025 10:17:26 -0300 Subject: [PATCH 26/53] [Backport branch-8-4] OGC API: fix issue #7177 (feature geometry of multipolygons is returned with errors) (#7306) * Replace outerList with innerList Co-authored-by: Pietro Perenzoni * Add test for PR --------- Co-authored-by: andrea.capobianco Co-authored-by: Pietro Perenzoni --- msautotest/api/7305_multipolygon.map | 46 ++++++++++++++++++ msautotest/api/data/7305-multipolygon.dbf | Bin 0 -> 433 bytes msautotest/api/data/7305-multipolygon.prj | 1 + msautotest/api/data/7305-multipolygon.shp | Bin 0 -> 536 bytes msautotest/api/data/7305-multipolygon.shx | Bin 0 -> 108 bytes ...ogcapi_collections_multipolygon_items.html | 39 +++++++++++++++ ...ogcapi_collections_multipolygon_items.json | 1 + src/mapogcapi.cpp | 2 +- 8 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 msautotest/api/7305_multipolygon.map create mode 100644 msautotest/api/data/7305-multipolygon.dbf create mode 100644 msautotest/api/data/7305-multipolygon.prj create mode 100644 msautotest/api/data/7305-multipolygon.shp create mode 100644 msautotest/api/data/7305-multipolygon.shx create mode 100644 msautotest/api/expected/ogcapi_collections_multipolygon_items.html create mode 100644 msautotest/api/expected/ogcapi_collections_multipolygon_items.json diff --git a/msautotest/api/7305_multipolygon.map b/msautotest/api/7305_multipolygon.map new file mode 100644 index 0000000000..0e6b58c146 --- /dev/null +++ b/msautotest/api/7305_multipolygon.map @@ -0,0 +1,46 @@ +# RUN_PARMS: ogcapi_collections_multipolygon_items.json [MAPSERV] "PATH_INFO=/[MAPFILE]/ogcapi/collections/multipolygon_layer/items" "QUERY_STRING=f=json" > [RESULT_DEMIME] +# RUN_PARMS: ogcapi_collections_multipolygon_items.html [MAPSERV] "PATH_INFO=/[MAPFILE]/ogcapi/collections/multipolygon_layer/items" "QUERY_STRING=f=html" > [RESULT_DEMIME] + +MAP + EXTENT -23422614 -11650014 23758273 18540865 + SIZE 800 800 + + PROJECTION + "+init=epsg:4326" + END + UNITS METERS + + WEB + METADATA + "oga_html_template_directory" "../../share/ogcapi/templates/html-plain" + "oga_title" "Pull Request #7305" + "oga_description" "This is a test OGC API server description for pull request #7305." + "oga_onlineresource" "http://localhost/cgi-bin/mapserv/7305/ogcapi" + "oga_server_description" "Server description" + "oga_enable_request" "OGCAPI" + "oga_geometry_precision" "4" + "oga_compliance_mode" "true" + END + END + + LAYER + NAME "multipolygon_layer" + DATA "data/7305-multipolygon" + TYPE POLYGON + STATUS OFF + METADATA + "oga_keywords" "multipolygon" + "oga_description" "Layer with multipolygon with holes" + "oga_title" "Multipolygon layer" + "oga_featureid" "ogc_fid" + END + VALIDATION + "ogc_fid" "^3$" # only one acceptable value + END + PROJECTION + "+init=epsg:4326" + END + TEMPLATE VOID + END +END + \ No newline at end of file diff --git a/msautotest/api/data/7305-multipolygon.dbf b/msautotest/api/data/7305-multipolygon.dbf new file mode 100644 index 0000000000000000000000000000000000000000..555e8ebb42d27b6396ed410ea581797a63de0581 GIT binary patch literal 433 zcmZRsWoKe!U|?uu&<9Z%AU{1hJ}ol^B<=?yB=|uj0zjm|d}k2(4d|jV%mN!$k@J%aSo| literal 0 HcmV?d00001 diff --git a/msautotest/api/data/7305-multipolygon.prj b/msautotest/api/data/7305-multipolygon.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/api/data/7305-multipolygon.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/api/data/7305-multipolygon.shp b/msautotest/api/data/7305-multipolygon.shp new file mode 100644 index 0000000000000000000000000000000000000000..22e8af72bda11f049c6b3c397db6c5e63e5d1ee5 GIT binary patch literal 536 zcmZQzQ0HR63K)4_Ff%Z)0_74rrtY0{LeatT<16{DlWq=NouAF#KU8#hvt9b-#Jt7mzQa r(rHl%RDbTm+DjXN{=aoe#cvakZ}3`m`iuvP4*z);qw5C%U4GA7 literal 0 HcmV?d00001 diff --git a/msautotest/api/data/7305-multipolygon.shx b/msautotest/api/data/7305-multipolygon.shx new file mode 100644 index 0000000000000000000000000000000000000000..e348e6119fad33d7a21fc0dff8eac7725b1a0d0c GIT binary patch literal 108 zcmZQzQ0HR64$NLKGcd3M + + + Pull Request #7305 + + + + + +

Pull Request #7305 - Collection Items: Multipolygon layer

+ +

+ Number of matching items: 1
+ Number of returned items: 1
+

+ + + + + + + + + + + + + + + + +
ID
3.000000000000000
+ + + + + + + diff --git a/msautotest/api/expected/ogcapi_collections_multipolygon_items.json b/msautotest/api/expected/ogcapi_collections_multipolygon_items.json new file mode 100644 index 0000000000..8fdc2ef557 --- /dev/null +++ b/msautotest/api/expected/ogcapi_collections_multipolygon_items.json @@ -0,0 +1 @@ +{"features":[{"geometry":{"coordinates":[[[[8.9216,45.5746],[8.8919,45.6027],[8.936,45.607],[8.9413,45.599],[8.9413,45.599],[8.9329,45.5924],[8.9216,45.5746],[8.9216,45.5746]],[[8.9112,45.6001],[8.9178,45.5871],[8.9308,45.5933],[8.9256,45.6004],[8.9112,45.6001]],[[8.9234,45.5865],[8.92,45.5851],[8.9208,45.5803],[8.9263,45.5832],[8.9234,45.5865]]],[[[8.9341,45.5868],[8.9337,45.5819],[8.9409,45.5836],[8.9387,45.5894],[8.9341,45.5868]]]],"type":"MultiPolygon"},"id":"3.000000000000000","properties":{},"type":"Feature"}],"links":[{"href":"http://localhost/cgi-bin/mapserv/7305/ogcapi/collections/multipolygon_layer/items?f=json&limit=10&offset=0","rel":"self","title":"Items for this collection as GeoJSON","type":"application/geo+json"},{"href":"http://localhost/cgi-bin/mapserv/7305/ogcapi/collections/multipolygon_layer/items?f=html&limit=10&offset=0","rel":"alternate","title":"Items for this collection as HTML","type":"text/html"}],"numberMatched":1,"numberReturned":1,"type":"FeatureCollection"} diff --git a/src/mapogcapi.cpp b/src/mapogcapi.cpp index 0ceb14b778..0f4ca3381c 100644 --- a/src/mapogcapi.cpp +++ b/src/mapogcapi.cpp @@ -625,7 +625,7 @@ static json getFeatureGeometry(shapeObj *shape, int precision, json polygon = json::array(); for (int i = 0; i < shape->numlines; i++) { if (i == k || - outerList[i] == + innerList[i] == MS_TRUE) { // add outer ring (k) and any inner rings json part = json::array(); for (int j = 0; j < shape->line[i].numpoints; j++) { From 77f74de08baeed114cf70dca7a36e227846df8cd Mon Sep 17 00:00:00 2001 From: Jeff McKenna Date: Tue, 22 Jul 2025 09:47:18 -0300 Subject: [PATCH 27/53] use master for CRLF check --- .github/workflows/check-crlf.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check-crlf.yml b/.github/workflows/check-crlf.yml index 1df7d3136b..fa4b5201da 100644 --- a/.github/workflows/check-crlf.yml +++ b/.github/workflows/check-crlf.yml @@ -22,6 +22,6 @@ jobs: uses: actions/checkout@v4 - name: Use action to check for CRLF endings - uses: erclu/check-crlf@v1.2.0 + uses: erclu/check-crlf@master with: # ignore directories containing *.pdf and *.tab exclude: msautotest/misc/data/ /msautotest/renderers/expected/ From 8e96877d06dbeacb410bdf735ce0e1cfb7224afb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 26 Jul 2025 06:41:12 -0300 Subject: [PATCH 28/53] Check for all possible use_default_extent_for_getfeature metadata keys (#7311) Co-authored-by: sethg --- src/mapwms.cpp | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/src/mapwms.cpp b/src/mapwms.cpp index 98b7db960a..82e77f6980 100644 --- a/src/mapwms.cpp +++ b/src/mapwms.cpp @@ -500,17 +500,21 @@ static int msWMSApplyFilter(mapObj *map, int version, const char *filter, /* Apply filter to this layer */ - /* But first, start by removing any wfs_use_default_extent_for_getfeature - * metadata item */ - /* that could result in the BBOX to be removed */ - std::string old_value_wfs_use_default_extent_for_getfeature; - { - const char *old_value_tmp = msLookupHashTable( - &(lp->metadata), "wfs_use_default_extent_for_getfeature"); - if (old_value_tmp) { - old_value_wfs_use_default_extent_for_getfeature = old_value_tmp; - msRemoveHashTable(&(lp->metadata), - "wfs_use_default_extent_for_getfeature"); + /* But first, start by removing any use_default_extent_for_getfeature + * metadata items that could result in the BBOX to be removed */ + + hashTableObj *tmpTable = msCreateHashTable(); + + std::vector keys_to_temporarily_remove = { + "wfs_use_default_extent_for_getfeature", + "ows_use_default_extent_for_getfeature", + "oga_use_default_extent_for_getfeature"}; + + for (const auto &key : keys_to_temporarily_remove) { + const char *value = msLookupHashTable(&(lp->metadata), key.c_str()); + if (value) { + msInsertHashTable(tmpTable, key.c_str(), value); + msRemoveHashTable(&(lp->metadata), key.c_str()); } } @@ -520,12 +524,15 @@ static int msWMSApplyFilter(mapObj *map, int version, const char *filter, msRemoveHashTable(&(lp->metadata), "gml_wmsfilter_flag"); - if (!old_value_wfs_use_default_extent_for_getfeature.empty()) { - msInsertHashTable( - &(lp->metadata), "wfs_use_default_extent_for_getfeature", - old_value_wfs_use_default_extent_for_getfeature.c_str()); + const char *pszKey; + pszKey = msFirstKeyFromHashTable(tmpTable); + for (; pszKey != NULL; pszKey = msNextKeyFromHashTable(tmpTable, pszKey)) { + msInsertHashTable(&(lp->metadata), pszKey, + msLookupHashTable(tmpTable, pszKey)); } + msFreeHashTable(tmpTable); + if (ret != MS_SUCCESS) { errorObj *ms_error = msGetErrorObj(); From 547e55887b8fdb0ebf0deddc08e50c04825f2bad Mon Sep 17 00:00:00 2001 From: Patrik Sylve Date: Wed, 21 May 2025 17:09:36 +0200 Subject: [PATCH 29/53] Fix vector tileindex infinite recursion --- src/mapogr.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/mapogr.cpp b/src/mapogr.cpp index c1f837f596..97f8d42d5f 100644 --- a/src/mapogr.cpp +++ b/src/mapogr.cpp @@ -2490,9 +2490,6 @@ static int msOGRFileWhichShapes(layerObj *layer, rectObj rect, msFree(select); return MS_FAILURE; } - - // Update itemindexes / layer->iteminfo - msOGRLayerInitItemInfo(layer); } else { // case of 1) GetLayer + SetFilter @@ -4009,6 +4006,10 @@ int msOGRLayerWhichShapes(layerObj *layer, rectObj rect, int /*isQuery*/) { status = msOGRFileWhichShapes(layer, rect, psInfo); + // Update itemindexes / layer->iteminfo + if (status == MS_SUCCESS) + msOGRLayerInitItemInfo(layer); + if (status != MS_SUCCESS || layer->tileindex == NULL) return status; From 6992c264ef275eaee65ee3314dec1eb22571ccd4 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Thu, 7 Aug 2025 12:11:01 +0200 Subject: [PATCH 30/53] maptree.c: fix warning with latest GCC --- src/maptree.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maptree.c b/src/maptree.c index 3f053d6ab6..88cf85a9b8 100644 --- a/src/maptree.c +++ b/src/maptree.c @@ -734,7 +734,7 @@ static void writeTreeNode(SHPTreeHandle disktree, treeNodeObj *node) { } int msWriteTree(treeObj *tree, char *filename, int B_order) { - char signature[3] = "SQT"; + char signature[3] = {'S', 'Q', 'T'}; char version = 1; char reserved[3] = {0, 0, 0}; SHPTreeHandle disktree; From eacdaee40cbc7dfe6f09c27a10bcc3fd7d60a574 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Thu, 7 Aug 2025 11:57:19 +0200 Subject: [PATCH 31/53] Fix GDAL 3.12dev deprecation warnings about GDALGetDataTypeSize() --- src/mapdrawgdal.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mapdrawgdal.c b/src/mapdrawgdal.c index e9e5c259b0..6288378285 100644 --- a/src/mapdrawgdal.c +++ b/src/mapdrawgdal.c @@ -1191,7 +1191,7 @@ static int ApplyLUT(int iColorIndex, const char *lut_def, const void *pInBuffer, if (lut_def == NULL) { if (pInBuffer != pabyOutBuffer) { - GDALCopyWords((void *)pInBuffer, eDT, GDALGetDataTypeSize(eDT) / 8, + GDALCopyWords(pInBuffer, eDT, GDALGetDataTypeSizeBytes(eDT), pabyOutBuffer, GDT_Byte, 1, nPixelCount); } return 0; @@ -1332,7 +1332,7 @@ static int LoadGDALImages(GDALDatasetH hDS, int band_numbers[4], int band_count, result_code = ApplyLUT(iColorIndex + 1, papszLUTs[iColorIndex], (GByte *)pBuffer + dst_xsize * dst_ysize * iColorIndex * - (GDALGetDataTypeSize(eDT) / 8), + GDALGetDataTypeSizeBytes(eDT), eDT, pabyWholeBuffer + dst_xsize * dst_ysize * iColorIndex, dst_xsize * dst_ysize); } @@ -1824,7 +1824,7 @@ msDrawRasterLayerGDAL_RawMode(mapObj *map, layerObj *layer, imageObj *image, /* Allocate buffer, and read data into it. */ /* -------------------------------------------------------------------- */ pBuffer = malloc(((size_t)dst_xsize) * dst_ysize * image->format->bands * - (GDALGetDataTypeSize(eDataType) / 8)); + GDALGetDataTypeSizeBytes(eDataType)); if (pBuffer == NULL) { msSetError(MS_MEMERR, "Allocating work image of size %dx%d failed.", "msDrawRasterLayerGDAL()", dst_xsize, dst_ysize); From 9cd969e7bb59b8ddd8c967c0c926e666bdd16cdd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 9 Aug 2025 07:34:55 -0300 Subject: [PATCH 32/53] msautotest: fix get_gdal_version() to support GDAL version nickname (#7319) Fixes ``` Cannot validate XML because SCHEMAS_OPENGIS_NET not found. Run "python ../pymod/xmlvalidate.py -download_ogc_schemas" from msautotest/wxs Traceback (most recent call last): File "/home/runner/work/mapserver/mapserver/msautotest/wxs/./run_test.py", line 43, in mstestlib.get_pytests(os.path.dirname(os.path.abspath(__file__))), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/runner/work/mapserver/mapserver/msautotest/wxs/../pymod/mstestlib.py", line 536, in get_pytests if not has_requires(version_info, gdal_version, requires_list): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/runner/work/mapserver/mapserver/msautotest/wxs/../pymod/mstestlib.py", line 111, in has_requires if compare_version(gdal_version, item[len("GDAL>=") :]) < 0: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/runner/work/mapserver/mapserver/msautotest/wxs/../pymod/mstestlib.py", line 84, in compare_version a_x, a_y, a_z = int(a[0]), int(a[1]), int(a[2]) ^^^^^^^^^ ValueError: invalid literal for int() with base 10: '3 "Eganville"' ``` Co-authored-by: Even Rouault --- msautotest/pymod/mstestlib.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/msautotest/pymod/mstestlib.py b/msautotest/pymod/mstestlib.py index bf8b8f50b0..39abbb2835 100644 --- a/msautotest/pymod/mstestlib.py +++ b/msautotest/pymod/mstestlib.py @@ -495,6 +495,10 @@ def get_gdal_version(): pos = gdal_version.find(",") if pos >= 0: return gdal_version[0:pos] + # e.g. "GDAL 3.11.3 Eganville" + pos = gdal_version.find(" ") + if pos >= 0: + return gdal_version[0:pos] return None From 7503865b086c09809a1df20db2d3e244f6e9bdab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 07:31:27 -0300 Subject: [PATCH 33/53] build(deps): bump actions/checkout from 4 to 5 (#7322) Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-mapscript-php.yml | 2 +- .github/workflows/build-mapscript-python.yml | 2 +- .github/workflows/build.yml | 2 +- .github/workflows/build_alpine.yml | 2 +- .github/workflows/check-crlf.yml | 2 +- .github/workflows/code_checks.yml | 2 +- .github/workflows/codeql.yml | 2 +- .github/workflows/conda.yml | 2 +- .github/workflows/coverity-scan.yml | 2 +- .github/workflows/cppcheck.yml | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build-mapscript-php.yml b/.github/workflows/build-mapscript-php.yml index 3ce61bcbfa..7c93fc8770 100644 --- a/.github/workflows/build-mapscript-php.yml +++ b/.github/workflows/build-mapscript-php.yml @@ -30,7 +30,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Set up Python uses: actions/setup-python@v5 diff --git a/.github/workflows/build-mapscript-python.yml b/.github/workflows/build-mapscript-python.yml index d14bd36c01..d164973725 100644 --- a/.github/workflows/build-mapscript-python.yml +++ b/.github/workflows/build-mapscript-python.yml @@ -25,7 +25,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Set up Python uses: actions/setup-python@v5 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4511b81bfe..5e27badfb5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -29,7 +29,7 @@ jobs: steps: - name: Checkout repository contents - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Build run: | diff --git a/.github/workflows/build_alpine.yml b/.github/workflows/build_alpine.yml index e1f6861d7e..3fe2b2262a 100644 --- a/.github/workflows/build_alpine.yml +++ b/.github/workflows/build_alpine.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout repository contents - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Build run: | diff --git a/.github/workflows/check-crlf.yml b/.github/workflows/check-crlf.yml index fa4b5201da..9bd0b81fc0 100644 --- a/.github/workflows/check-crlf.yml +++ b/.github/workflows/check-crlf.yml @@ -19,7 +19,7 @@ jobs: steps: - name: Checkout repository contents - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Use action to check for CRLF endings uses: erclu/check-crlf@master diff --git a/.github/workflows/code_checks.yml b/.github/workflows/code_checks.yml index d3a61b0807..d9894e7867 100644 --- a/.github/workflows/code_checks.yml +++ b/.github/workflows/code_checks.yml @@ -14,7 +14,7 @@ jobs: linting: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: actions/setup-python@v5 with: python-version: '3.12' diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 1467a258e2..b0c519edd7 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -37,7 +37,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/conda.yml b/.github/workflows/conda.yml index 00f0f6b823..1f023a11c4 100644 --- a/.github/workflows/conda.yml +++ b/.github/workflows/conda.yml @@ -15,7 +15,7 @@ jobs: os: [macos-latest, windows-latest, ubuntu-latest] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: ilammy/msvc-dev-cmd@v1 if: matrix.os == 'windows-latest' - name: Support longpaths diff --git a/.github/workflows/coverity-scan.yml b/.github/workflows/coverity-scan.yml index 4ea9667da7..9b4edea437 100644 --- a/.github/workflows/coverity-scan.yml +++ b/.github/workflows/coverity-scan.yml @@ -22,7 +22,7 @@ jobs: runs-on: ubuntu-20.04 if: github.repository == 'MapServer/MapServer' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install Libraries run: | diff --git a/.github/workflows/cppcheck.yml b/.github/workflows/cppcheck.yml index 4e2970b091..e6b19101ef 100644 --- a/.github/workflows/cppcheck.yml +++ b/.github/workflows/cppcheck.yml @@ -16,7 +16,7 @@ jobs: if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')" steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install Requirements run: | From 32786ac6d69a44c2d18696b41eb70e1a8f971a38 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 17 Aug 2025 08:37:23 -0300 Subject: [PATCH 34/53] [Backport branch-8-4] Fixed non numerical expressions in a getFeature request (#7323) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixed non numerical expressions in a getFeature request * Added testcase * Fixed typo --------- Co-authored-by: Léon van der Kaap --- ...cite_postgis_filter_or_resourceid_stringvalue.xml | 12 ++++++++++++ msautotest/wxs/wfs_200_cite_postgis.map | 1 + src/mapogcfiltercommon.cpp | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 msautotest/wxs/expected/wfs_200_cite_postgis_filter_or_resourceid_stringvalue.xml diff --git a/msautotest/wxs/expected/wfs_200_cite_postgis_filter_or_resourceid_stringvalue.xml b/msautotest/wxs/expected/wfs_200_cite_postgis_filter_or_resourceid_stringvalue.xml new file mode 100644 index 0000000000..eb76eeeb0d --- /dev/null +++ b/msautotest/wxs/expected/wfs_200_cite_postgis_filter_or_resourceid_stringvalue.xml @@ -0,0 +1,12 @@ +Content-Type: text/xml; subtype="gml/3.2.1"; charset=UTF-8 + + + + + diff --git a/msautotest/wxs/wfs_200_cite_postgis.map b/msautotest/wxs/wfs_200_cite_postgis.map index af180e424e..ce1469a1c6 100644 --- a/msautotest/wxs/wfs_200_cite_postgis.map +++ b/msautotest/wxs/wfs_200_cite_postgis.map @@ -16,6 +16,7 @@ # RUN_PARMS: wfs_200_cite_postgis_propertyisnil_nillable_property.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&service=WFS&version=2.0.0&request=GetFeature&resultType=hits&typenames=province&filter=NomFrancais" > [RESULT_DEVERSION] # RUN_PARMS: wfs_200_cite_postgis_not_propertyisnil_nillable_property.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&service=WFS&version=2.0.0&request=GetFeature&resultType=hits&typenames=province&filter=NomFrancais" > [RESULT_DEVERSION] # RUN_PARMS: wfs_200_cite_postgis_filter_resourceid_stringvalue.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&service=WFS&version=2.0.0&request=GetFeature&typenames=province&Filter=" > [RESULT_DEVERSION] +# RUN_PARMS: wfs_200_cite_postgis_filter_or_resourceid_stringvalue.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&service=WFS&version=2.0.0&request=GetFeature&typenames=province&Filter=" > [RESULT_DEVERSION] # RUN_PARMS: wfs_200_cite_postgis_filter_like.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&service=WFS&version=2.0.0&request=GetFeature&typenames=province&Filter=island_e*" > [RESULT_DEVERSION] MAP diff --git a/src/mapogcfiltercommon.cpp b/src/mapogcfiltercommon.cpp index 7116707cb8..28d26bbda1 100644 --- a/src/mapogcfiltercommon.cpp +++ b/src/mapogcfiltercommon.cpp @@ -543,13 +543,13 @@ FLTGetFeatureIdCommonExpression(FilterEncodingNode *psFilterNode, if (pszAttribute) { const auto tokens = msStringSplit(psFilterNode->pszValue, ','); if (!tokens.empty()) { + bool bString = false; for (size_t i = 0; i < tokens.size(); i++) { const char *pszId = tokens[i].c_str(); const char *pszDot = strrchr(pszId, '.'); if (pszDot) pszId = pszDot + 1; - bool bString = false; if (i == 0) { if (FLTIsNumeric(pszId) == MS_FALSE) bString = true; From 5560cca20e656d8d85ea9e5e0a02ec5f85cb319f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 3 Sep 2025 09:32:00 +0200 Subject: [PATCH 35/53] [Backport branch-8-4] Update SDTS test to use SXF driver (#7332) * Remove SDTS test * Switch to SXF --------- Co-authored-by: sethg --- .../wxs/expected/wfs_ogr_drv_nocreatedatasource_caps.xml | 4 ++-- msautotest/wxs/wfs_ogr_drv_nocreatedatasource.map | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/msautotest/wxs/expected/wfs_ogr_drv_nocreatedatasource_caps.xml b/msautotest/wxs/expected/wfs_ogr_drv_nocreatedatasource_caps.xml index 23f115a9cf..35c7fe0834 100644 --- a/msautotest/wxs/expected/wfs_ogr_drv_nocreatedatasource_caps.xml +++ b/msautotest/wxs/expected/wfs_ogr_drv_nocreatedatasource_caps.xml @@ -3,6 +3,6 @@ Content-Type: text/html MapServer Message -loadOutputFormat(): General error message. OUTPUTFORMAT (nocreatedatasource) clause references driver (OGR/SDTS), but this driver isn't configured. -msInitDefaultOGROutputFormat(): General error message. OGR `SDTS' driver does not support output. +loadOutputFormat(): General error message. OUTPUTFORMAT (nocreatedatasource) clause references driver (OGR/SXF), but this driver isn't configured. +msInitDefaultOGROutputFormat(): General error message. OGR `SXF' driver does not support output. \ No newline at end of file diff --git a/msautotest/wxs/wfs_ogr_drv_nocreatedatasource.map b/msautotest/wxs/wfs_ogr_drv_nocreatedatasource.map index 3b1f9b8758..08035e3531 100644 --- a/msautotest/wxs/wfs_ogr_drv_nocreatedatasource.map +++ b/msautotest/wxs/wfs_ogr_drv_nocreatedatasource.map @@ -12,7 +12,7 @@ MAP OUTPUTFORMAT NAME "nocreatedatasource" - DRIVER "OGR/SDTS" + DRIVER "OGR/SXF" MIMETYPE "text/nocreatedatasource" END From 767fd189861eea667a1c12924fb3ae451db58532 Mon Sep 17 00:00:00 2001 From: sethg Date: Tue, 2 Sep 2025 10:11:39 +0200 Subject: [PATCH 36/53] Remove comma check --- msautotest/pymod/mstestlib.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/msautotest/pymod/mstestlib.py b/msautotest/pymod/mstestlib.py index 39abbb2835..09d2bce54f 100644 --- a/msautotest/pymod/mstestlib.py +++ b/msautotest/pymod/mstestlib.py @@ -490,9 +490,6 @@ def get_gdal_version(): if gdal_version.startswith("GDAL "): gdal_version = gdal_version[len("GDAL ") :] pos = gdal_version.find("dev") - if pos >= 0: - return gdal_version[0:pos] - pos = gdal_version.find(",") if pos >= 0: return gdal_version[0:pos] # e.g. "GDAL 3.11.3 Eganville" From 6396818a8f8a487cb8e3081e1b22b0c03283cab9 Mon Sep 17 00:00:00 2001 From: sethg Date: Wed, 3 Sep 2025 11:13:42 +0200 Subject: [PATCH 37/53] Handle various GDAL version formats --- msautotest/pymod/mstestlib.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/msautotest/pymod/mstestlib.py b/msautotest/pymod/mstestlib.py index 09d2bce54f..ea8b0ecc0e 100644 --- a/msautotest/pymod/mstestlib.py +++ b/msautotest/pymod/mstestlib.py @@ -486,14 +486,18 @@ def get_gdal_version(): except Exception: gdal_version = os.popen("gdalinfo --version").read() - # Parse something like "GDAL x.y.zdev, released..." to extract "x.y.z" + # Parse GDAL version formats to extract "x.y.z" e.g. + # 'GDAL x.y.zdev' + # 'GDAL 3.11.3 "Eganville", released 2025/07/12' + # 'GDAL 3.11.3 Eganville' + # 'GDAL 3.x.y, released' if gdal_version.startswith("GDAL "): gdal_version = gdal_version[len("GDAL ") :] - pos = gdal_version.find("dev") - if pos >= 0: - return gdal_version[0:pos] - # e.g. "GDAL 3.11.3 Eganville" - pos = gdal_version.find(" ") + dev_pos = gdal_version.find("dev") + comma_pos = gdal_version.find(",") + space_pos = gdal_version.find(" ") + positions = [p for p in (dev_pos, comma_pos, space_pos) if p != -1] + pos = min(positions) if positions else -1 if pos >= 0: return gdal_version[0:pos] return None From c271c325c4ef30a039961488e88e84a35012e880 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 15:55:57 -0300 Subject: [PATCH 38/53] build(deps): bump actions/setup-python from 5 to 6 (#7339) Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/setup-python dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/code_checks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/code_checks.yml b/.github/workflows/code_checks.yml index d9894e7867..cf95b1280e 100644 --- a/.github/workflows/code_checks.yml +++ b/.github/workflows/code_checks.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v6 with: python-version: '3.12' - uses: pre-commit/action@v3.0.1 From 94d49b69aecd5b3f7a7f91eb5808ab2f322bc34c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 16 Sep 2025 23:49:09 +0200 Subject: [PATCH 39/53] Make projection context ref counting thread safe again (#7079) (#7346) Co-authored-by: Tamas Szekeres --- src/mapproject.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/mapproject.c b/src/mapproject.c index 966c88699b..56ab7a484f 100644 --- a/src/mapproject.c +++ b/src/mapproject.c @@ -73,7 +73,7 @@ struct projectionContext { void *thread_id; PJ_CONTEXT *proj_ctx; unsigned ms_proj_data_change_counter; - int ref_count; + int refcount; pjCacheEntry pj_cache[PJ_CACHE_ENTRY_SIZE]; int pj_cache_size; int cannotFindProjDb; @@ -370,7 +370,7 @@ projectionContext *msProjectionContextCreate(void) { msFree(ctx); return NULL; } - ctx->ref_count = 1; + MS_REFCNT_INIT(ctx); proj_context_use_proj4_init_rules(ctx->proj_ctx, TRUE); proj_log_func(ctx->proj_ctx, ctx, msProjErrorLogger); return ctx; @@ -383,8 +383,7 @@ projectionContext *msProjectionContextCreate(void) { void msProjectionContextUnref(projectionContext *ctx) { if (!ctx) return; - --ctx->ref_count; - if (ctx->ref_count == 0) { + if (MS_REFCNT_DECR_IS_ZERO(ctx)) { int i; for (i = 0; i < ctx->pj_cache_size; i++) { msFree(ctx->pj_cache[i].inStr); @@ -577,7 +576,7 @@ void msProjectionInheritContextFrom(projectionObj *pDst, if (pDst->proj_ctx == NULL && pSrc->proj_ctx != NULL) { if (pSrc->proj_ctx->thread_id == msGetThreadId()) { pDst->proj_ctx = pSrc->proj_ctx; - pDst->proj_ctx->ref_count++; + MS_REFCNT_INCR(pDst->proj_ctx); } else { pDst->proj_ctx = msProjectionContextClone(pSrc->proj_ctx); } @@ -591,7 +590,7 @@ void msProjectionInheritContextFrom(projectionObj *pDst, void msProjectionSetContext(projectionObj *p, projectionContext *ctx) { if (p->proj_ctx == NULL && ctx != NULL) { p->proj_ctx = ctx; - p->proj_ctx->ref_count++; + MS_REFCNT_INCR(p->proj_ctx); } } From 1c73acaa2d7a8b1d3955f076186e57fc8c06e0c6 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Fri, 19 Sep 2025 14:21:25 +0200 Subject: [PATCH 40/53] Add missing column name escaping in FLTGetCommonExpression() (#7349) and use msLayerEscapePropertyName() insead of msOGRGetQuotedItem() in OGR backend Fixes https://github.com/MapServer/MapServer/security/advisories/GHSA-256m-rx4h-r55w --- msautotest/wxs/data/weird_column_names.csv | 3 + msautotest/wxs/data/weird_column_names.csvt | 1 + msautotest/wxs/data/weird_column_names.db | Bin 0 -> 24576 bytes ..._sql_is_equal_to_invalid_property_name.xml | 8 + ...r_weird_column_names_binary_op_numeric.xml | 37 + ...gr_weird_column_names_binary_op_string.xml | 37 + msautotest/wxs/wfs_ogr_native_sql.map | 27 + msautotest/wxs/wfs_ogr_no_native_sql.map | 28 + src/maplexer.c | 2379 ++++++++--------- src/maplexer.l | 14 +- src/mapogcfiltercommon.cpp | 27 +- src/mapogr.cpp | 25 +- src/mapserver.h | 1 + src/mapstring.cpp | 21 + 14 files changed, 1395 insertions(+), 1213 deletions(-) create mode 100644 msautotest/wxs/data/weird_column_names.csv create mode 100644 msautotest/wxs/data/weird_column_names.csvt create mode 100644 msautotest/wxs/data/weird_column_names.db create mode 100644 msautotest/wxs/expected/wfs_ogr_native_sql_is_equal_to_invalid_property_name.xml create mode 100644 msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_numeric.xml create mode 100644 msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_string.xml diff --git a/msautotest/wxs/data/weird_column_names.csv b/msautotest/wxs/data/weird_column_names.csv new file mode 100644 index 0000000000..edfcac5d1a --- /dev/null +++ b/msautotest/wxs/data/weird_column_names.csv @@ -0,0 +1,3 @@ +"]","a""b",WKT +1,foo,"POINT (1000000 4000000)" +2,bar,"POINT (1000000 4000000)" diff --git a/msautotest/wxs/data/weird_column_names.csvt b/msautotest/wxs/data/weird_column_names.csvt new file mode 100644 index 0000000000..0322d0cf5b --- /dev/null +++ b/msautotest/wxs/data/weird_column_names.csvt @@ -0,0 +1 @@ +Integer,String,WKT diff --git a/msautotest/wxs/data/weird_column_names.db b/msautotest/wxs/data/weird_column_names.db new file mode 100644 index 0000000000000000000000000000000000000000..e700280462d2a2e343b0bc1ad2ff59878bd3aba1 GIT binary patch literal 24576 zcmeI)Z*S5-90%~b^3NF=OBUr3=0akCz(|OR&rB>!qhyQ?EGiF7)4?$tfsVFhL!S)Y z8}orL!iPTF%kZwWa}-T{h|BjvY43h_$K9uWa&74AcGL1W8`{p;^w?9fLntLL7$bzl z#Fi9Wm}EX4X2hP}I{w>Xj8s2O)0sF)q;n+mV4H1!Put=U2?7v+00bZa0SG_<0uX?} zW(gc8lG$>Z_B``s#NFvgtdtCwPiK76k7kqm9Zl6WrmOX)#v*l#6LZWfqGf4Oji<7; z8vT;;`#k5CGcfx0Xf~c0vXZ-Al33}vuwJ3SiY#xR_Kl%6$g@UE*IsHJcHC(ks+}G? z(0WYm>PL;1=;u&t=@nKu<@VS(|L7H1y?Im@1@8-CJCQN-Ck6IK?d-o&JEcWlNlAmn z=Ox0K=~?E;aQM)0=dQb&jjaqd5@bOt`g_;02H|hAZmZGmY85|V&b$vk1=F>6Vz4s# zWqym_Wv=7#3(v1qdLBz=+ht0u$$(!3_M(mL=Z(lXj9R2Xu4(Vd3vV%{sqEe!{rb?K zt5o8iGY`&>8_g>#vyDc@Ns(!2_Ex)0Z~ZwwwC&~p|F22rdNZeoQ9%F#5P$## cAOHafKmY;|fB*y_@b3bTXskxpUj?B20@z&{UH||9 literal 0 HcmV?d00001 diff --git a/msautotest/wxs/expected/wfs_ogr_native_sql_is_equal_to_invalid_property_name.xml b/msautotest/wxs/expected/wfs_ogr_native_sql_is_equal_to_invalid_property_name.xml new file mode 100644 index 0000000000..4907bb2c37 --- /dev/null +++ b/msautotest/wxs/expected/wfs_ogr_native_sql_is_equal_to_invalid_property_name.xml @@ -0,0 +1,8 @@ +Content-Type: text/xml; charset=UTF-8 + + + + +msWFSGetFeature(): WFS server error. Invalid or Unsupported FILTER in GetFeature : <Filter><PropertyIsEqualTo matchCase=false><PropertyName> + + diff --git a/msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_numeric.xml b/msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_numeric.xml new file mode 100644 index 0000000000..a5fdf00f11 --- /dev/null +++ b/msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_numeric.xml @@ -0,0 +1,37 @@ +Content-Type: text/xml; charset=UTF-8 + + + + + + 1000000.000000,4000000.000000 1000000.000000,4000000.000000 + + + + + + + + 1000000.000000,4000000.000000 1000000.000000,4000000.000000 + + + + + 1000000.000000,4000000.000000 + + + + 1 + + foo + + + + diff --git a/msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_string.xml b/msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_string.xml new file mode 100644 index 0000000000..a5fdf00f11 --- /dev/null +++ b/msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_string.xml @@ -0,0 +1,37 @@ +Content-Type: text/xml; charset=UTF-8 + + + + + + 1000000.000000,4000000.000000 1000000.000000,4000000.000000 + + + + + + + + 1000000.000000,4000000.000000 1000000.000000,4000000.000000 + + + + + 1000000.000000,4000000.000000 + + + + 1 + + foo + + + + diff --git a/msautotest/wxs/wfs_ogr_native_sql.map b/msautotest/wxs/wfs_ogr_native_sql.map index 2245e23ec7..0c349be172 100644 --- a/msautotest/wxs/wfs_ogr_native_sql.map +++ b/msautotest/wxs/wfs_ogr_native_sql.map @@ -21,6 +21,8 @@ # RUN_PARMS: wfs_ogr_native_sql_05.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=namefanano" > [RESULT] # RUN_PARMS: wfs_ogr_native_sql_06.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=nameFanano" > [RESULT] +# RUN_PARMS: wfs_ogr_native_sql_is_equal_to_invalid_property_name.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=" OR 1=1 OR 1="fanano" > [RESULT] + # RUN_PARMS: wfs_ogr_native_sql_06_disable_default_extent_for_getfeature.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns_disable_default_extent_for_getfeature&OUTPUTFORMAT=GML2&FILTER=nameFanano" > [RESULT] # RUN_PARMS: wfs_ogr_native_sql_07.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=namefanano" > [RESULT] @@ -98,6 +100,9 @@ # RUN_PARMS: wfs_ogr_native_sql_42.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAME=towns_disable_default_extent_for_getfeature&OUTPUTFORMAT=GML2&COUNT=1" > [RESULT_DEVERSION] # RUN_PARMS: wfs_ogr_native_sql_43.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAME=towns_disable_default_extent_for_getfeature&OUTPUTFORMAT=GML2&COUNT=1&SRSNAME=EPSG:4326" > [RESULT_DEVERSION] +# RUN_PARMS: wfs_ogr_weird_column_names_binary_op_numeric.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=weird_column_names&OUTPUTFORMAT=GML2&FILTER=]1" > [RESULT] +# RUN_PARMS: wfs_ogr_weird_column_names_binary_op_string.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=weird_column_names&OUTPUTFORMAT=GML2&FILTER=a%26quot;bfoo" > [RESULT] + MAP NAME WFS_OGR_NATIVE_SQL_TEST @@ -358,4 +363,26 @@ LAYER TEMPLATE "wfs_ogr_native_sql.map" END # Layer +LAYER + + NAME weird_column_names + CONNECTIONTYPE OGR + CONNECTION "./data/weird_column_names.db" + PROCESSING "NATIVE_SQL=YES" + METADATA + "ows_title" "weird_column_names" + "wfs_featureid" "ID" + "gml_include_items" "all" + "gml_types" "auto" + "wfs_getfeature_formatlist" "ogrgml" + END + TYPE POINT + STATUS ON + PROJECTION + "init=epsg:32632" + END + + TEMPLATE "wfs_ogr_native_sql.map" +END # Layer + END # Map File diff --git a/msautotest/wxs/wfs_ogr_no_native_sql.map b/msautotest/wxs/wfs_ogr_no_native_sql.map index 8a8686304b..7a3d4f95e2 100644 --- a/msautotest/wxs/wfs_ogr_no_native_sql.map +++ b/msautotest/wxs/wfs_ogr_no_native_sql.map @@ -17,6 +17,9 @@ # # RUN_PARMS: wfs_ogr_native_sql_05.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=namefanano" > [RESULT] # RUN_PARMS: wfs_ogr_native_sql_06.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=nameFanano" > [RESULT] + +# RUN_PARMS: wfs_ogr_native_sql_is_equal_to_invalid_property_name.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=" OR 1=1 OR 1="fanano" > [RESULT] + # RUN_PARMS: wfs_ogr_native_sql_07.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=namefanano" > [RESULT] # RUN_PARMS: wfs_ogr_native_sql_08.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=nameFanano" > [RESULT] # @@ -62,6 +65,9 @@ # RUN_PARMS: wfs_ogr_native_sql_31.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=20000Geometry653627 4881103 653174 4890443 663148 4887813 663330 4879471 653627 4881103" > [RESULT] # RUN_PARMS: wfs_ogr_native_sql_32.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=1000Geometry653627 4881103 653174 4890443 663148 4887813 663330 4879471 653627 4881103" > [RESULT] +# RUN_PARMS: wfs_ogr_weird_column_names_binary_op_numeric.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=weird_column_names&OUTPUTFORMAT=GML2&FILTER=]1" > [RESULT] +# RUN_PARMS: wfs_ogr_weird_column_names_binary_op_string.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=weird_column_names&OUTPUTFORMAT=GML2&FILTER=a%26quot;bfoo" > [RESULT] + MAP NAME WFS_OGR_NATIVE_SQL_TEST @@ -119,4 +125,26 @@ LAYER TEMPLATE "wfs_ogr_native_sql.map" END # Layer +LAYER + + NAME weird_column_names + CONNECTIONTYPE OGR + CONNECTION "./data/weird_column_names.db" + PROCESSING "NATIVE_SQL=NO" + METADATA + "ows_title" "weird_column_names" + "wfs_featureid" "ID" + "gml_include_items" "all" + "gml_types" "auto" + "wfs_getfeature_formatlist" "ogrgml" + END + TYPE POINT + STATUS ON + PROJECTION + "init=epsg:32632" + END + + TEMPLATE "wfs_ogr_native_sql.map" +END # Layer + END # Map File diff --git a/src/maplexer.c b/src/maplexer.c index 9fbc84a63a..d3813c561b 100644 --- a/src/maplexer.c +++ b/src/maplexer.c @@ -1,6 +1,6 @@ -#line 2 "src/maplexer.c" +#line 1 "src/maplexer.c" -#line 4 "src/maplexer.c" +#line 3 "src/maplexer.c" #define YY_INT_ALIGNED short int @@ -620,7 +620,7 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[1737] = +static const flex_int16_t yy_accept[1745] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 346, 343, 1, 341, 334, 2, 343, 343, @@ -672,147 +672,148 @@ static const flex_int16_t yy_accept[1737] = 340, 340, 340, 340, 340, 340, 340, 305, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 234, 318, 340, 236, 319, - 340, 68, 0, 0, 0, 0, 0, 328, 328, 0, - 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, + 340, 68, 0, 0, 0, 0, 0, 0, 0, 328, + 328, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 340, 9, 340, 340, 327, 330, 330, 2, 2, - 0, 327, 340, 340, 340, 340, 340, 239, 340, 340, - 340, 340, 340, 340, 340, 243, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 83, 340, 340, 340, + 0, 0, 329, 2, 340, 9, 340, 340, 327, 330, + 330, 2, 2, 0, 327, 340, 340, 340, 340, 340, + 239, 340, 340, 340, 340, 340, 340, 340, 243, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 340, 83, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 258, 340, 340, 340, 340, 98, 340, 340, 340, 102, - 340, 340, 340, 105, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 121, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 269, 340, 270, 340, 145, + 340, 340, 340, 258, 340, 340, 340, 340, 98, 340, + 340, 340, 102, 340, 340, 340, 105, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 121, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 269, 340, + 270, 340, 145, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 175, 340, - 279, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 340, 175, 340, 279, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 207, - 340, 340, 340, 340, 340, 340, 340, 218, 340, 307, - 340, 340, 340, 340, 309, 228, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 237, 325, 0, 328, 25, + 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 340, 340, 207, 340, 340, 340, 340, 340, 340, 340, + 218, 340, 307, 340, 340, 340, 340, 309, 228, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 237, 325, + 325, 0, 328, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, - 0, 0, 0, 0, 326, 340, 10, 340, 2, 61, - 340, 63, 340, 340, 240, 340, 340, 241, 340, 340, - 340, 340, 340, 340, 246, 340, 72, 340, 76, 340, - 340, 340, 340, 340, 340, 84, 340, 340, 340, 340, - 256, 86, 340, 89, 340, 340, 257, 340, 340, 340, - 340, 340, 340, 340, 100, 340, 340, 260, 340, 340, - 108, 261, 340, 340, 110, 340, 340, 118, 340, 340, - - 186, 340, 340, 340, 340, 340, 125, 267, 340, 135, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 0, 0, 56, 0, 0, 0, 0, 0, 326, 0, + 340, 10, 340, 2, 61, 340, 63, 340, 340, 240, + 340, 340, 241, 340, 340, 340, 340, 340, 340, 246, + 340, 72, 340, 76, 340, 340, 340, 340, 340, 340, + 84, 340, 340, 340, 340, 256, 86, 340, 89, 340, + 340, 257, 340, 340, 340, 340, 340, 340, 340, 100, + 340, 340, 260, 340, 340, 108, 261, 340, 340, 110, + + 340, 340, 118, 340, 340, 186, 340, 340, 340, 340, + 340, 125, 267, 340, 135, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 276, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 277, 340, 252, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 276, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 340, 277, + 340, 252, 340, 340, 340, 340, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 291, 340, 340, + 340, 340, 340, 340, 340, 340, 295, 340, 340, 340, + 340, 340, 340, 340, 340, 298, 299, 200, 340, 340, + 340, 340, 340, 340, 303, 340, 340, 210, 340, 216, + + 340, 340, 340, 340, 222, 340, 340, 340, 340, 314, + 229, 340, 340, 340, 340, 340, 340, 235, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, + 0, 0, 0, 0, 43, 0, 0, 0, 31, 42, + 0, 29, 0, 0, 0, 0, 30, 0, 0, 0, + 0, 0, 0, 340, 340, 340, 340, 340, 340, 340, + 340, 242, 340, 70, 245, 340, 247, 340, 340, 340, + 340, 340, 79, 340, 80, 340, 340, 340, 340, 340, + 85, 340, 340, 340, 340, 91, 340, 94, 95, 340, + 259, 340, 97, 340, 340, 340, 340, 109, 264, 340, + + 340, 340, 340, 340, 265, 340, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 134, 136, + 137, 340, 340, 143, 340, 340, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 273, 340, 274, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 291, 340, 340, 340, 340, 340, 340, 340, - 340, 295, 340, 340, 340, 340, 340, 340, 340, 340, - 298, 299, 200, 340, 340, 340, 340, 340, 340, 303, - 340, 340, 210, 340, 216, 340, 340, 340, 340, 222, - - 340, 340, 340, 340, 314, 229, 340, 340, 340, 340, - 340, 340, 235, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 57, 0, 0, 0, 0, 43, - 0, 0, 0, 31, 42, 0, 29, 0, 0, 0, - 0, 30, 0, 0, 0, 0, 340, 340, 340, 340, - 340, 340, 340, 340, 242, 340, 70, 245, 340, 247, - 340, 340, 340, 340, 340, 79, 340, 80, 340, 340, - 340, 340, 340, 85, 340, 340, 340, 340, 91, 340, - 94, 95, 340, 259, 340, 97, 340, 340, 340, 340, - 109, 264, 340, 340, 340, 340, 340, 265, 340, 340, - + 340, 340, 340, 340, 280, 176, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 290, 289, 294, 185, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 134, 136, 137, 340, 340, 143, 340, 340, 340, + 340, 296, 340, 195, 340, 340, 340, 340, 340, 340, + 340, 340, 340, 340, 301, 302, 340, 304, 209, 340, + + 212, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 233, 317, 53, 34, 0, + 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, + 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, + 50, 0, 0, 0, 326, 8, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 75, 340, 340, + 340, 340, 316, 340, 253, 340, 255, 340, 340, 340, + 93, 340, 340, 99, 340, 340, 340, 340, 340, 340, + 340, 340, 340, 117, 340, 340, 340, 340, 123, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 139, 340, + + 340, 146, 340, 340, 340, 340, 340, 340, 340, 340, + 155, 340, 340, 340, 340, 340, 161, 340, 340, 340, + 340, 340, 340, 171, 340, 340, 340, 340, 340, 177, + 340, 178, 340, 340, 340, 340, 184, 340, 340, 292, + 340, 293, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 273, 340, 274, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 280, 176, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 290, 289, - 294, 185, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 296, 340, 195, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 301, 302, 340, - 304, 209, 340, 212, 340, 340, 340, 340, 340, 340, - - 340, 340, 340, 340, 340, 340, 340, 340, 233, 317, - 53, 34, 0, 0, 0, 0, 0, 0, 0, 0, - 52, 0, 0, 0, 0, 0, 0, 26, 0, 0, - 0, 0, 0, 50, 0, 0, 0, 8, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 75, - 340, 340, 340, 340, 316, 340, 253, 340, 255, 340, - 340, 340, 93, 340, 340, 99, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 117, 340, 340, 340, 340, - 123, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 139, 340, 340, 146, 340, 340, 340, 340, 340, 340, - - 340, 340, 155, 340, 340, 340, 340, 340, 161, 340, - 340, 340, 340, 340, 340, 171, 340, 340, 340, 340, - 340, 177, 340, 178, 340, 340, 340, 340, 184, 340, - 340, 292, 340, 293, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 221, 340, 340, 340, 340, 340, 230, 231, 340, 340, + 0, 28, 0, 49, 41, 0, 0, 54, 0, 0, + 0, 32, 0, 0, 0, 0, 0, 0, 47, 0, + + 0, 321, 11, 340, 340, 340, 340, 340, 67, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 340, 87, + 340, 340, 340, 340, 340, 340, 340, 106, 340, 340, + 340, 340, 116, 340, 340, 340, 122, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 140, 340, 340, 340, + 340, 340, 340, 340, 340, 151, 340, 340, 158, 159, + 160, 340, 340, 340, 340, 340, 168, 340, 340, 174, + 278, 340, 340, 340, 340, 340, 340, 340, 183, 340, + 340, 187, 340, 340, 189, 340, 340, 340, 193, 340, + 340, 340, 340, 340, 197, 340, 202, 340, 340, 300, + + 340, 340, 340, 340, 340, 340, 340, 217, 115, 340, + 220, 340, 340, 340, 308, 310, 315, 340, 0, 51, + 0, 46, 33, 55, 0, 0, 0, 48, 36, 0, + 27, 0, 0, 340, 340, 64, 340, 66, 340, 71, + 340, 73, 340, 340, 78, 340, 59, 340, 340, 92, + 340, 340, 340, 340, 107, 340, 113, 114, 112, 340, + 120, 340, 340, 340, 340, 340, 128, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 154, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 221, 340, 340, 340, 340, 340, 230, 231, - 340, 340, 0, 28, 0, 49, 41, 0, 0, 54, - 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, - 47, 0, 0, 321, 11, 340, 340, 340, 340, 340, - - 67, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 87, 340, 340, 340, 340, 340, 340, 340, 106, - 340, 340, 340, 340, 116, 340, 340, 340, 122, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 140, 340, - 340, 340, 340, 340, 340, 340, 340, 151, 340, 340, - 158, 159, 160, 340, 340, 340, 340, 340, 168, 340, - 340, 174, 278, 340, 340, 340, 340, 340, 340, 340, - 183, 340, 340, 187, 340, 340, 189, 340, 340, 340, - 193, 340, 340, 340, 340, 340, 197, 340, 202, 340, - 340, 300, 340, 340, 340, 340, 340, 340, 340, 217, - - 115, 340, 220, 340, 340, 340, 308, 310, 315, 340, - 0, 51, 0, 46, 33, 55, 0, 0, 0, 48, - 36, 0, 27, 0, 0, 340, 340, 64, 340, 66, - 340, 71, 340, 73, 340, 340, 78, 340, 59, 340, - 340, 92, 340, 340, 340, 340, 107, 340, 113, 114, - 112, 340, 120, 340, 340, 340, 340, 340, 128, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 154, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 60, 340, 194, - - 340, 340, 340, 340, 340, 340, 340, 206, 208, 211, - 340, 215, 219, 224, 227, 340, 340, 0, 0, 0, - 0, 0, 0, 39, 0, 0, 340, 238, 340, 340, - 74, 58, 77, 81, 340, 90, 96, 283, 340, 340, - 111, 119, 340, 124, 266, 126, 340, 340, 340, 340, - 340, 340, 144, 147, 340, 340, 340, 340, 340, 340, - 340, 340, 162, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 285, 340, 340, 340, 340, 340, 340, 251, - 340, 190, 191, 340, 340, 196, 340, 198, 201, 203, - 340, 205, 340, 340, 340, 232, 40, 35, 38, 45, - - 44, 37, 0, 0, 62, 340, 340, 340, 340, 340, - 340, 340, 340, 127, 340, 340, 340, 340, 340, 148, - 149, 153, 150, 340, 340, 340, 157, 163, 340, 170, - 167, 340, 340, 173, 340, 286, 340, 340, 340, 340, - 288, 306, 340, 192, 297, 340, 204, 213, 340, 226, - 0, 0, 340, 69, 340, 340, 340, 101, 340, 340, - 340, 340, 340, 138, 340, 340, 340, 156, 340, 340, - 172, 340, 340, 180, 181, 182, 340, 340, 340, 340, - 0, 0, 340, 340, 340, 199, 104, 262, 129, 131, - 133, 340, 340, 152, 340, 169, 275, 287, 340, 340, - - 340, 340, 0, 0, 340, 340, 82, 340, 340, 340, - 340, 166, 188, 164, 340, 225, 0, 322, 65, 340, - 340, 340, 141, 165, 340, 323, 340, 340, 340, 214, - 179, 340, 340, 130, 132, 0 + + 340, 340, 340, 340, 340, 60, 340, 194, 340, 340, + 340, 340, 340, 340, 340, 206, 208, 211, 340, 215, + 219, 224, 227, 340, 340, 0, 0, 0, 0, 0, + 0, 39, 0, 0, 340, 238, 340, 340, 74, 58, + 77, 81, 340, 90, 96, 283, 340, 340, 111, 119, + 340, 124, 266, 126, 340, 340, 340, 340, 340, 340, + 144, 147, 340, 340, 340, 340, 340, 340, 340, 340, + 162, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 285, 340, 340, 340, 340, 340, 340, 251, 340, 190, + 191, 340, 340, 196, 340, 198, 201, 203, 340, 205, + + 340, 340, 340, 232, 40, 35, 38, 45, 44, 37, + 0, 0, 62, 340, 340, 340, 340, 340, 340, 340, + 340, 127, 340, 340, 340, 340, 340, 148, 149, 153, + 150, 340, 340, 340, 157, 163, 340, 170, 167, 340, + 340, 173, 340, 286, 340, 340, 340, 340, 288, 306, + 340, 192, 297, 340, 204, 213, 340, 226, 0, 0, + 340, 69, 340, 340, 340, 101, 340, 340, 340, 340, + 340, 138, 340, 340, 340, 156, 340, 340, 172, 340, + 340, 180, 181, 182, 340, 340, 340, 340, 0, 0, + 340, 340, 340, 199, 104, 262, 129, 131, 133, 340, + + 340, 152, 340, 169, 275, 287, 340, 340, 340, 340, + 0, 0, 340, 340, 82, 340, 340, 340, 340, 166, + 188, 164, 340, 225, 0, 322, 65, 340, 340, 340, + 141, 165, 340, 323, 340, 340, 340, 214, 179, 340, + 340, 130, 132, 0 } ; static const YY_CHAR yy_ec[256] = @@ -849,32 +850,32 @@ static const YY_CHAR yy_ec[256] = static const YY_CHAR yy_meta[87] = { 0, - 1, 1, 2, 1, 1, 3, 1, 1, 4, 1, - 1, 5, 1, 6, 6, 6, 6, 6, 1, 6, - 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 1, 7, 1, - 6, 1, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, + 1, 1, 2, 1, 1, 3, 1, 1, 3, 1, + 1, 4, 1, 5, 5, 5, 5, 5, 1, 5, + 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 1, 3, 1, + 5, 1, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1 } ; -static const flex_int16_t yy_base[1761] = +static const flex_int16_t yy_base[1770] = { 0, 0, 0, 86, 0, 171, 172, 173, 177, 181, 182, - 226, 0, 1082, 3985, 185, 3985, 3985, 0, 1013, 173, + 226, 0, 1383, 3953, 185, 3953, 3953, 0, 1350, 173, 296, 353, 310, 304, 353, 416, 359, 354, 421, 436, 356, 467, 156, 290, 474, 473, 354, 483, 532, 275, - 533, 579, 585, 540, 374, 631, 0, 961, 907, 810, - 3985, 193, 3985, 194, 820, 732, 751, 700, 184, 314, - 611, 183, 188, 725, 424, 479, 521, 615, 280, 644, + 533, 579, 585, 540, 374, 631, 0, 1247, 1195, 1189, + 3953, 193, 3953, 194, 1191, 1149, 1186, 1139, 184, 314, + 611, 183, 188, 1068, 424, 479, 521, 615, 280, 644, 575, 284, 299, 628, 624, 636, 306, 637, 355, 343, - 367, 678, 157, 653, 687, 3985, 3985, 208, 687, 678, - 0, 411, 418, 475, 0, 3985, 666, 661, 473, 477, + 367, 678, 157, 1002, 1012, 3953, 3953, 208, 1005, 979, + 0, 411, 418, 475, 0, 3953, 877, 824, 473, 477, - 492, 484, 209, 0, 638, 616, 690, 704, 0, 706, - 201, 603, 3985, 763, 849, 720, 203, 531, 759, 525, + 492, 484, 209, 0, 769, 748, 690, 704, 0, 706, + 201, 732, 3953, 763, 849, 720, 203, 531, 759, 525, 649, 524, 645, 551, 686, 0, 685, 703, 687, 756, 755, 0, 686, 690, 0, 727, 725, 758, 769, 771, 754, 760, 766, 781, 769, 782, 836, 769, 771, 774, @@ -886,16 +887,16 @@ static const flex_int16_t yy_base[1761] = 989, 1003, 1014, 1025, 1011, 1039, 1025, 0, 0, 1033, 0, 1037, 1026, 1034, 1044, 1047, 1031, 1047, 1035, 1037, - 1056, 534, 3985, 499, 493, 486, 3985, 487, 3985, 466, - 1087, 1099, 1093, 316, 1103, 451, 3985, 3985, 3985, 3985, + 1056, 695, 3953, 652, 618, 603, 3953, 522, 3953, 573, + 1087, 1099, 1093, 316, 1103, 451, 3953, 3953, 3953, 3953, 1059, 1061, 1060, 1095, 1088, 1092, 1088, 1093, 1103, 1101, - 1090, 1100, 1095, 1099, 1101, 3985, 1110, 1095, 1104, 1097, - 3985, 1101, 3985, 1105, 1121, 1106, 1115, 1116, 1144, 1126, - 1138, 1140, 420, 1163, 1168, 1159, 3985, 415, 274, 3985, - 3985, 455, 3985, 444, 0, 3985, 3985, 3985, 0, 3985, + 1090, 1100, 1095, 1099, 1101, 3953, 1110, 1095, 1104, 1097, + 3953, 1101, 3953, 1105, 1121, 1106, 1115, 1116, 1144, 1126, + 1138, 1140, 632, 1163, 1168, 1159, 585, 575, 274, 3953, + 3953, 613, 3953, 575, 0, 3953, 3953, 3953, 0, 3953, 1221, 1154, 1210, 1156, 1163, 1184, 722, 189, 207, 326, - 434, 1177, 1307, 1178, 627, 1393, 1479, 1226, 1178, 559, + 564, 1177, 1307, 1178, 627, 1393, 1479, 1226, 1178, 559, 724, 1186, 1208, 1213, 1211, 1218, 1213, 1218, 1226, 1228, 1230, 1222, 1213, 1231, 1218, 1219, 1222, 1238, 1223, 1224, 1229, 1230, 1294, 0, 1277, 1280, 1305, 1288, 1302, 1307, @@ -906,355 +907,357 @@ static const flex_int16_t yy_base[1761] = 1410, 1395, 1411, 1444, 0, 1450, 1461, 1544, 1464, 1473, 1476, 1477, 1598, 1478, 1464, 1468, 1481, 1467, 1484, 1477, - 1472, 0, 430, 1490, 1491, 1483, 1476, 1477, 1495, 1518, + 1472, 0, 560, 1490, 1491, 1483, 1476, 1477, 1495, 1518, 1494, 1488, 1533, 1540, 1520, 1575, 1534, 1548, 1537, 1556, 1561, 1571, 1570, 1572, 1581, 1589, 1594, 1598, 1606, 1609, 1596, 1607, 1610, 1607, 1619, 1602, 1611, 0, 1624, 1617, 1616, 1614, 1632, 1615, 1635, 1650, 1644, 1658, 1656, 1657, 1649, 1663, 1665, 1661, 1653, 0, 0, 1654, 0, 0, - 1659, 3985, 358, 522, 354, 573, 735, 799, 1680, 1687, - 849, 871, 1680, 1672, 1682, 1671, 1681, 1676, 1680, 1683, - 1701, 1698, 1689, 1709, 1692, 1695, 1702, 1712, 1700, 1716, - 1718, 1723, 1719, 1723, 3985, 1724, 1713, 1718, 1718, 1720, - - 1716, 1734, 1738, 1739, 1739, 1729, 1740, 1752, 583, 1033, - 1752, 1758, 0, 1751, 1764, 1010, 3985, 0, 1763, 1764, - 1180, 1186, 1762, 1762, 1774, 1762, 1782, 327, 1778, 1767, - 1776, 1767, 1789, 1772, 1788, 0, 1789, 1795, 1785, 1779, - 1779, 1782, 1803, 1796, 1801, 1796, 1794, 1816, 1805, 1827, - 1828, 1818, 1831, 1813, 1835, 1823, 1839, 1831, 1842, 1827, - 0, 1845, 1846, 1845, 1838, 1836, 1851, 1853, 1858, 0, - 1840, 1841, 1853, 1848, 1852, 1863, 1868, 1854, 1872, 1875, - 1864, 1864, 1885, 1877, 1877, 0, 1892, 1887, 1894, 1888, - 1894, 1902, 1894, 1894, 1908, 0, 1900, 1912, 1912, 0, - - 1900, 1905, 1912, 1918, 1919, 1915, 1925, 1911, 1947, 1930, - 1927, 1918, 1938, 1929, 1938, 1938, 1941, 1947, 1954, 1960, - 1964, 1957, 1971, 1967, 1966, 1958, 1968, 1967, 0, 1973, - 0, 1982, 1986, 1964, 1976, 1974, 1988, 1977, 1992, 1999, - 2004, 2000, 2017, 2010, 2000, 2003, 2017, 2005, 2024, 2009, - 2025, 2028, 2009, 2032, 2033, 2021, 2026, 2022, 2043, 2036, - 2034, 2027, 2044, 2048, 2051, 2042, 2054, 2048, 2051, 2045, - 2059, 2056, 2059, 2076, 2067, 2078, 2077, 0, 2077, 0, - 2082, 2074, 2076, 2084, 2079, 0, 2086, 2082, 2102, 2084, - 2087, 2103, 2103, 2094, 2102, 0, 3985, 1257, 1307, 3985, - - 2101, 2111, 2114, 2112, 2121, 2106, 2119, 2128, 2121, 2134, - 2131, 2139, 2125, 2128, 2131, 2148, 2136, 2137, 2138, 2138, - 2142, 2143, 2150, 2159, 2153, 2146, 2150, 2161, 3985, 2152, - 2162, 2176, 1360, 2174, 3985, 2169, 0, 2172, 0, 0, - 2165, 0, 2183, 2175, 0, 2177, 2189, 0, 2203, 2190, - 2202, 2192, 2193, 2210, 0, 2211, 2210, 2215, 2204, 2214, - 2208, 2218, 2225, 2209, 2230, 0, 2220, 2214, 2216, 2217, - 0, 0, 2230, 0, 2221, 2226, 0, 2225, 2245, 2234, - 2252, 2237, 2261, 2250, 0, 2249, 2254, 0, 2270, 2255, - 0, 0, 2260, 2274, 2292, 2265, 2281, 0, 2285, 2265, - - 0, 2277, 2289, 2266, 2292, 2289, 2324, 0, 2284, 0, - 2283, 2303, 2313, 2304, 2304, 2325, 2307, 2315, 2334, 2325, - 2321, 2332, 2342, 2347, 2323, 2349, 2339, 2350, 2342, 2355, - 2338, 0, 2335, 2360, 2343, 2350, 2369, 2359, 2355, 2375, - 2355, 2382, 2376, 2386, 0, 2376, 0, 2390, 2383, 2376, - 2377, 2384, 2382, 2398, 2390, 2388, 2408, 2392, 2397, 2394, - 2398, 2402, 2398, 2403, 2404, 2413, 2420, 2424, 2422, 2413, - 2433, 2445, 2428, 2425, 2441, 2438, 2445, 2435, 2439, 2438, - 0, 0, 2471, 2441, 2441, 2449, 2461, 2465, 2457, 0, - 2467, 2457, 2469, 2467, 0, 2479, 2480, 2473, 2466, 0, - - 2493, 2492, 2492, 2475, 0, 0, 2485, 2508, 2494, 2515, - 2498, 2501, 0, 2516, 2503, 2505, 2520, 2518, 2523, 2526, - 2515, 2525, 2526, 2518, 3985, 2535, 2535, 2540, 2541, 3985, - 2524, 2543, 2541, 3985, 3985, 2552, 3985, 2546, 2548, 2551, - 2556, 3985, 2548, 1446, 2567, 2570, 2560, 2562, 2562, 2559, - 2572, 2567, 2563, 2573, 0, 2582, 0, 0, 2569, 0, - 2572, 2574, 2577, 2596, 2588, 0, 2593, 0, 2583, 2586, - 2591, 2588, 2596, 0, 2610, 2603, 2599, 2613, 0, 2618, - 0, 2615, 2612, 0, 2609, 0, 2615, 2631, 2616, 2633, - 0, 0, 2625, 2626, 2642, 2619, 2627, 0, 2642, 2638, - - 2650, 2648, 2649, 2652, 2656, 2642, 2663, 2650, 2646, 2676, - 2662, 0, 0, 2664, 2657, 2670, 2661, 2665, 2667, 2669, - 2671, 2669, 2689, 2692, 2682, 2690, 2698, 2701, 2690, 2687, - 0, 2689, 0, 2696, 2694, 2695, 2698, 2699, 2698, 2719, - 2714, 2722, 2724, 2713, 2712, 2723, 2738, 0, 0, 2736, - 327, 2717, 2727, 2742, 2742, 2739, 2739, 2734, 0, 0, - 0, 0, 2750, 2747, 2747, 2745, 2760, 2765, 2748, 2750, - 2751, 2759, 2774, 2756, 2768, 2767, 0, 2761, 2782, 2783, - 2769, 2789, 2786, 2779, 2792, 2805, 2800, 0, 0, 2794, - 0, 0, 2784, 2790, 2790, 2793, 2811, 2811, 2799, 2809, - - 2811, 2826, 2817, 2814, 2830, 2820, 2831, 2817, 0, 0, - 3985, 3985, 2826, 2817, 2829, 2826, 2823, 2845, 2837, 2838, - 3985, 2852, 2832, 2847, 2847, 2860, 2848, 3985, 2854, 2865, - 2853, 2861, 2858, 3985, 2875, 2881, 288, 0, 2861, 2870, - 2879, 2888, 2870, 2887, 2874, 2880, 2893, 2884, 2895, 0, - 2891, 2887, 2892, 2904, 0, 2907, 0, 2903, 0, 2911, - 2912, 2910, 0, 2907, 2926, 0, 2916, 2919, 2922, 2919, - 2925, 2935, 2920, 2925, 2930, 0, 2940, 2936, 2945, 2946, - 0, 2944, 2949, 2952, 2939, 2955, 2937, 2948, 2950, 2954, - 0, 2960, 2966, 0, 2967, 2976, 2959, 2974, 2969, 2969, - - 2978, 2989, 0, 2986, 2984, 2989, 2998, 2996, 0, 2993, - 3002, 2983, 3000, 2992, 3007, 0, 3004, 3003, 3008, 3012, - 3007, 0, 3009, 0, 3007, 3026, 3016, 3017, 0, 3036, - 3032, 0, 3025, 0, 3023, 3040, 3026, 3043, 3047, 3039, - 3042, 3054, 3060, 3060, 3059, 3056, 3047, 3062, 3054, 3060, - 3064, 3073, 3063, 3070, 3061, 3064, 3080, 3088, 3081, 3090, - 3094, 3087, 0, 3098, 3086, 3089, 3106, 3108, 0, 0, - 3096, 3109, 3110, 3985, 3101, 3985, 3985, 3107, 3103, 3985, - 3109, 3106, 3118, 3985, 3125, 3124, 3115, 3111, 3128, 3132, - 3985, 3142, 3131, 3985, 0, 3132, 3131, 3129, 3139, 3142, - - 0, 3143, 3144, 3142, 3153, 3162, 3168, 3170, 3161, 3175, - 3160, 0, 3167, 3169, 3180, 3166, 3168, 3170, 3185, 0, - 3176, 3190, 3188, 3193, 0, 3198, 3182, 3188, 0, 3189, - 3187, 3200, 3196, 3197, 3196, 3198, 3202, 3206, 3212, 3202, - 3205, 3221, 3219, 3234, 3220, 3235, 3243, 3241, 3225, 3248, - 0, 0, 0, 3224, 3237, 3234, 3249, 3235, 3254, 3238, - 3260, 0, 0, 3250, 3263, 3251, 3266, 3255, 3262, 3254, - 0, 3270, 3260, 0, 3268, 3274, 0, 3273, 3275, 3280, - 0, 3284, 3297, 3295, 3284, 3286, 0, 3291, 0, 3292, - 3304, 0, 3299, 3286, 3305, 3295, 3302, 3318, 3300, 0, - - 0, 3298, 0, 3318, 3312, 3321, 0, 0, 0, 3312, - 3315, 3985, 3329, 3985, 3985, 3985, 3307, 3314, 3323, 3985, - 3325, 3346, 3985, 3337, 3340, 3334, 3341, 0, 3355, 0, - 3348, 0, 3346, 0, 3362, 3350, 0, 3357, 0, 3353, - 3360, 0, 3362, 3370, 3368, 3375, 0, 3364, 0, 0, - 0, 3368, 0, 3366, 3380, 3369, 3384, 3390, 0, 3391, - 3392, 3387, 3384, 3399, 3396, 3398, 3406, 3405, 3391, 3413, - 0, 3401, 3416, 3414, 3404, 3424, 3427, 3428, 3415, 3435, - 3432, 3429, 3419, 3434, 3430, 3441, 3427, 3437, 3446, 3438, - 3448, 3451, 3445, 3455, 3452, 3448, 3462, 0, 3460, 0, - - 3456, 3452, 3459, 3463, 3465, 3468, 3480, 0, 0, 0, - 3474, 0, 0, 3470, 0, 3478, 3481, 3492, 3493, 3494, - 3481, 3481, 3485, 3985, 3496, 3490, 3486, 0, 3508, 3511, - 0, 0, 0, 3498, 3506, 0, 0, 0, 3505, 3506, - 0, 0, 3515, 0, 0, 0, 3507, 3532, 3533, 3517, - 3537, 3517, 0, 0, 3540, 3528, 3540, 3538, 3552, 3540, - 3552, 3552, 0, 3554, 3541, 3553, 3550, 3549, 3563, 3563, - 3558, 3546, 0, 3564, 3559, 3555, 3576, 3561, 3562, 0, - 3582, 0, 0, 3566, 3577, 0, 3594, 0, 0, 0, - 3578, 0, 3592, 3586, 3583, 0, 3985, 3985, 3985, 3985, - - 3985, 3985, 3590, 3601, 0, 3592, 3592, 3599, 3591, 3603, - 3607, 3604, 3603, 0, 3612, 3613, 3624, 3612, 3614, 0, - 0, 0, 0, 3621, 3621, 3632, 0, 0, 3630, 0, - 0, 3627, 3639, 0, 3640, 0, 3647, 3632, 3643, 3637, - 0, 0, 3655, 0, 0, 3645, 0, 3657, 3653, 0, - 3656, 3643, 3659, 0, 3654, 3661, 3664, 0, 3667, 3658, - 3679, 3681, 3668, 0, 3682, 3687, 3682, 0, 3671, 3685, - 0, 3680, 3689, 0, 0, 0, 3695, 3701, 3701, 3687, - 3684, 3707, 3701, 3710, 3715, 0, 0, 0, 3717, 3719, - 0, 3698, 3715, 0, 3726, 0, 0, 0, 3728, 3734, - - 3726, 3723, 3739, 285, 3727, 3731, 0, 3743, 3744, 3748, - 3751, 0, 0, 0, 3742, 0, 273, 3985, 0, 3745, - 3746, 3747, 0, 0, 3750, 3985, 3746, 3751, 3752, 0, - 0, 3756, 3759, 0, 0, 3985, 3824, 3831, 3838, 3845, - 3852, 309, 3859, 3866, 3873, 3880, 3887, 3894, 3901, 3908, - 3914, 3921, 3928, 3935, 3942, 3949, 3956, 3963, 3970, 3977 + 1659, 3953, 627, 564, 643, 1688, 528, 1689, 735, 799, + 1683, 1715, 849, 871, 1682, 1669, 1679, 1671, 1681, 1676, + 1680, 1683, 1703, 1700, 1700, 1720, 1704, 1705, 1713, 1723, + 1709, 1726, 1727, 1733, 1728, 1731, 3953, 1732, 1720, 1725, + + 1726, 1728, 1724, 1742, 1741, 1742, 1740, 1729, 1755, 1760, + 1033, 1148, 464, 1741, 1750, 0, 1745, 1765, 1010, 3953, + 0, 1773, 1774, 1186, 1257, 1771, 1771, 1783, 1770, 1790, + 452, 1786, 1775, 1784, 1775, 1797, 1780, 1795, 0, 1796, + 1803, 1793, 1787, 1787, 1790, 1803, 1801, 1806, 1797, 1797, + 1813, 1805, 1828, 1829, 1828, 1841, 1822, 1844, 1832, 1847, + 1839, 1850, 1835, 0, 1853, 1854, 1853, 1846, 1843, 1858, + 1861, 1866, 0, 1848, 1849, 1861, 1852, 1856, 1865, 1869, + 1857, 1875, 1877, 1864, 1864, 1886, 1878, 1887, 0, 1902, + 1896, 1901, 1899, 1902, 1910, 1903, 1902, 1916, 0, 1908, + + 1920, 1919, 0, 1907, 1913, 1920, 1926, 1927, 1919, 1929, + 1913, 1964, 1934, 1935, 1926, 1946, 1939, 1939, 1948, 1951, + 1956, 1963, 1969, 1971, 1963, 1988, 1974, 1971, 1964, 1974, + 1972, 0, 1977, 0, 1986, 1985, 1972, 1984, 1983, 1987, + 1980, 1997, 2007, 2014, 2008, 2028, 2021, 2011, 2015, 2027, + 2015, 2029, 2020, 2034, 2037, 2019, 2040, 2041, 2029, 2033, + 2029, 2051, 2044, 2042, 2035, 2052, 2052, 2055, 2044, 2058, + 2056, 2059, 2053, 2069, 2064, 2070, 2087, 2078, 2090, 2084, + 0, 2088, 0, 2093, 2083, 2084, 2090, 2086, 0, 2094, + 2090, 2109, 2091, 2095, 2111, 2111, 2102, 2110, 0, 461, + + 452, 1307, 1393, 3953, 2105, 2115, 2116, 2116, 2129, 2114, + 2127, 2138, 2129, 2145, 2142, 2150, 2137, 2138, 2141, 2157, + 2144, 2145, 2146, 2146, 2150, 2151, 2158, 2167, 2160, 2153, + 2158, 2169, 3953, 2160, 2170, 2182, 1446, 2166, 401, 1540, + 2172, 0, 2178, 0, 0, 2174, 0, 2197, 2193, 0, + 2188, 2206, 0, 2215, 2201, 2214, 2202, 2203, 2219, 0, + 2219, 2218, 2221, 2210, 2221, 2215, 2225, 2230, 2214, 2237, + 0, 2227, 2221, 2223, 2223, 0, 0, 2234, 0, 2225, + 2248, 0, 2227, 2245, 2236, 2255, 2254, 2273, 2261, 0, + 2261, 2264, 0, 2280, 2264, 0, 0, 2268, 2282, 2303, + + 2270, 2286, 0, 2293, 2273, 0, 2284, 2296, 2274, 2300, + 2297, 2333, 0, 2289, 0, 2286, 2303, 2321, 2314, 2312, + 2337, 2317, 2324, 2343, 2330, 2328, 2335, 2347, 2355, 2331, + 2356, 2346, 2358, 2350, 2363, 2346, 0, 2341, 2365, 2345, + 2359, 2380, 2369, 2365, 2385, 2365, 2390, 2385, 2397, 0, + 2386, 0, 2400, 2392, 2385, 2386, 2392, 2388, 2405, 2397, + 2393, 2413, 2400, 2405, 2401, 2405, 2410, 2406, 2411, 2412, + 2419, 2422, 2429, 2434, 2427, 2444, 2447, 2439, 2436, 2458, + 2450, 2456, 2446, 2449, 2447, 0, 0, 2468, 2449, 2450, + 2459, 2471, 2475, 2467, 0, 2477, 2464, 2477, 2475, 0, + + 2488, 2489, 2488, 2474, 0, 2492, 2499, 2502, 2485, 0, + 0, 2496, 2517, 2505, 2525, 2508, 2510, 0, 2525, 2512, + 2513, 2526, 2525, 2530, 2531, 2520, 2533, 2534, 2525, 3953, + 2542, 2543, 2548, 2549, 3953, 2532, 2549, 2546, 3953, 3953, + 2554, 3953, 2555, 2559, 2561, 2566, 3953, 2558, 1544, 2575, + 2579, 2558, 398, 2581, 2576, 2575, 2572, 2584, 2579, 2576, + 2585, 0, 2593, 0, 0, 2580, 0, 2587, 2586, 2589, + 2609, 2599, 0, 2603, 0, 2593, 2596, 2602, 2597, 2603, + 0, 2615, 2612, 2610, 2623, 0, 2628, 0, 2625, 2620, + 0, 2619, 0, 2625, 2645, 2629, 2647, 0, 0, 2638, + + 2639, 2654, 2631, 2640, 0, 2654, 2649, 2661, 2663, 2661, + 2664, 2669, 2653, 2673, 2660, 2656, 2679, 2673, 0, 0, + 2673, 2666, 2682, 2675, 2676, 2677, 2677, 2681, 2679, 2703, + 2705, 2696, 2703, 2711, 2713, 2702, 2700, 0, 2701, 0, + 2707, 2705, 2710, 2710, 2711, 2711, 2730, 2724, 2732, 2734, + 2724, 2721, 2730, 2743, 0, 0, 2745, 430, 2728, 2737, + 2752, 2752, 2747, 2749, 2744, 0, 0, 0, 0, 2764, + 2760, 2761, 2758, 2773, 2777, 2760, 2763, 2763, 2770, 2785, + 2771, 2780, 2779, 0, 2774, 2793, 2793, 2779, 2799, 2797, + 2788, 2799, 2817, 2805, 0, 0, 2803, 0, 0, 2795, + + 2799, 2799, 2801, 2821, 2821, 2813, 2824, 2824, 2839, 2829, + 2826, 2843, 2832, 2842, 2828, 0, 0, 3953, 3953, 2841, + 2829, 2841, 2839, 2834, 2855, 2847, 2848, 3953, 2863, 2841, + 2854, 2852, 2869, 2859, 3953, 2864, 2875, 2863, 2869, 2868, + 3953, 2891, 2893, 358, 352, 0, 2869, 2885, 2892, 2901, + 2882, 2899, 2887, 2892, 2904, 2895, 2910, 0, 2902, 2897, + 2901, 2914, 0, 2917, 0, 2914, 0, 2920, 2919, 2915, + 0, 2916, 2937, 0, 2926, 2929, 2932, 2929, 2937, 2946, + 2931, 2937, 2944, 0, 2953, 2950, 2958, 2959, 0, 2956, + 2961, 2965, 2951, 2966, 2948, 2963, 2961, 2964, 0, 2969, + + 2976, 0, 2977, 2987, 2968, 2981, 2974, 2978, 2989, 2999, + 0, 2996, 2994, 2999, 3010, 3007, 0, 3004, 3014, 2997, + 3013, 3006, 3020, 0, 3017, 3015, 3020, 3025, 3019, 0, + 3026, 0, 3017, 3031, 3025, 3026, 0, 3046, 3042, 0, + 3036, 0, 3032, 3047, 3035, 3054, 3057, 3049, 3052, 3064, + 3072, 3071, 3070, 3068, 3061, 3075, 3068, 3073, 3077, 3085, + 3075, 3083, 3073, 3075, 3091, 3098, 3097, 3099, 3104, 3097, + 0, 3109, 3095, 3096, 3111, 3117, 0, 0, 3107, 3119, + 3120, 3953, 3111, 3953, 3953, 3117, 3115, 3953, 3120, 3117, + 3130, 3953, 3139, 3137, 3129, 3124, 3141, 3144, 3953, 3147, + + 3142, 295, 0, 3146, 3142, 3139, 3149, 3151, 0, 3147, + 3151, 3151, 3161, 3168, 3173, 3179, 3172, 3185, 3170, 0, + 3177, 3179, 3192, 3177, 3179, 3182, 3197, 0, 3189, 3202, + 3200, 3205, 0, 3210, 3193, 3199, 0, 3200, 3198, 3209, + 3206, 3207, 3206, 3207, 3206, 3213, 3221, 3210, 3211, 3226, + 3228, 3245, 3230, 3245, 3253, 3251, 3237, 3259, 0, 0, + 0, 3235, 3249, 3246, 3262, 3247, 3266, 3250, 3272, 0, + 0, 3261, 3274, 3262, 3277, 3264, 3272, 3264, 0, 3280, + 3269, 0, 3272, 3281, 0, 3282, 3283, 3286, 0, 3289, + 3306, 3306, 3294, 3296, 0, 3301, 0, 3302, 3316, 0, + + 3310, 3297, 3317, 3307, 3315, 3330, 3312, 0, 0, 3310, + 0, 3330, 3323, 3332, 0, 0, 0, 3323, 3326, 3953, + 3338, 3953, 3953, 3953, 3317, 3324, 3333, 3953, 3334, 3350, + 3953, 3348, 3349, 3341, 3344, 0, 3360, 0, 3357, 0, + 3357, 0, 3371, 3361, 0, 3369, 0, 3364, 3371, 0, + 3374, 3382, 3381, 3387, 0, 3376, 0, 0, 0, 3380, + 0, 3378, 3391, 3380, 3395, 3401, 0, 3400, 3402, 3397, + 3395, 3408, 3406, 3407, 3410, 3412, 3400, 3421, 0, 3407, + 3421, 3423, 3415, 3433, 3438, 3440, 3426, 3446, 3444, 3441, + 3432, 3446, 3442, 3453, 3439, 3448, 3457, 3449, 3459, 3460, + + 3455, 3465, 3463, 3457, 3472, 0, 3469, 0, 3460, 3459, + 3468, 3471, 3471, 3473, 3489, 0, 0, 0, 3485, 0, + 0, 3479, 0, 3489, 3493, 3503, 3504, 3506, 3493, 3494, + 3497, 3953, 3506, 3501, 3501, 0, 3519, 3522, 0, 0, + 0, 3509, 3517, 0, 0, 0, 3512, 3517, 0, 0, + 3524, 0, 0, 0, 3516, 3536, 3540, 3526, 3545, 3523, + 0, 0, 3545, 3537, 3551, 3549, 3561, 3551, 3562, 3564, + 0, 3565, 3552, 3565, 3562, 3562, 3575, 3575, 3570, 3558, + 0, 3575, 3570, 3566, 3587, 3570, 3571, 0, 3593, 0, + 0, 3575, 3586, 0, 3598, 0, 0, 0, 3585, 0, + + 3601, 3594, 3589, 0, 3953, 3953, 3953, 3953, 3953, 3953, + 3599, 3603, 0, 3606, 3603, 3608, 3602, 3616, 3619, 3617, + 3616, 0, 3626, 3629, 3637, 3624, 3626, 0, 0, 0, + 0, 3632, 3632, 3643, 0, 0, 3641, 0, 0, 3636, + 3648, 0, 3651, 0, 3656, 3641, 3652, 3641, 0, 0, + 3660, 0, 0, 3651, 0, 3664, 3661, 0, 3671, 3645, + 3671, 0, 3665, 3670, 3675, 0, 3680, 3670, 3692, 3693, + 3684, 0, 3695, 3698, 3693, 0, 3681, 3695, 0, 3690, + 3698, 0, 0, 0, 3704, 3710, 3710, 3698, 3693, 3716, + 3708, 3716, 3722, 0, 0, 0, 3726, 3727, 0, 3706, + + 3721, 0, 3737, 0, 0, 0, 3742, 3743, 3737, 3734, + 3752, 291, 3737, 3744, 0, 3755, 3760, 3761, 3762, 0, + 0, 0, 3753, 0, 288, 285, 0, 3755, 3756, 3757, + 0, 0, 3759, 273, 3755, 3760, 3761, 0, 0, 3764, + 3767, 0, 0, 3953, 3832, 3837, 3842, 3847, 3852, 310, + 3857, 3862, 3867, 3872, 3877, 3882, 3887, 3892, 3897, 3902, + 3907, 3912, 3917, 3922, 3927, 3932, 3937, 3942, 3947 } ; -static const flex_int16_t yy_def[1761] = +static const flex_int16_t yy_def[1770] = { 0, - 1736, 1, 1736, 3, 1737, 1737, 1738, 1738, 1739, 1739, - 1736, 11, 1736, 1736, 1736, 1736, 1736, 1740, 1741, 1736, - 1742, 1743, 1736, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1744, 1745, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1746, 1747, 1736, 1736, 1736, 1736, 1736, 1748, 1749, - 1750, 1736, 1736, 1736, 1751, 1736, 1736, 1742, 1742, 1742, - - 1742, 1742, 1736, 1740, 1741, 1741, 1736, 1736, 1742, 1742, - 1742, 1752, 1736, 1753, 1754, 1736, 1736, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1744, 1736, 1745, 1745, 1736, 1736, 1755, 1736, 1756, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1746, 1746, 1746, 1746, 1736, 1747, 1757, 1736, - 1736, 1748, 1736, 1749, 1750, 1736, 1736, 1736, 1751, 1736, - 1758, 1742, 1742, 1742, 1742, 1736, 1736, 1736, 1742, 1742, - - 1752, 1736, 1753, 1742, 1759, 1754, 1758, 1736, 1736, 1736, - 1736, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1736, 1755, 1755, 1756, 1756, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - - 1736, 1736, 1736, 1736, 1736, 1746, 1746, 1746, 1757, 1757, - 307, 1742, 1742, 1742, 1742, 1736, 1736, 1742, 1760, 307, - 1736, 1736, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1736, 1736, 1736, 1736, - - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1746, 1746, 1746, 1736, 1742, 1742, 1742, 1760, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1746, 1746, 1746, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1746, 1746, 1746, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1746, 1746, 1736, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1746, 1746, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1746, 1746, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1736, 1736, 1736, 1736, - - 1736, 1736, 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1746, 1736, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1736, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 0, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736 + 1744, 1, 1744, 3, 1745, 1745, 1746, 1746, 1747, 1747, + 1744, 11, 1744, 1744, 1744, 1744, 1744, 1748, 1749, 1744, + 1750, 1751, 1744, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1752, 1753, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1754, 1755, 1744, 1744, 1744, 1744, 1744, 1756, 1757, + 1758, 1744, 1744, 1744, 1759, 1744, 1744, 1750, 1750, 1750, + + 1750, 1750, 1744, 1748, 1749, 1749, 1744, 1744, 1750, 1750, + 1750, 1760, 1744, 1761, 1762, 1744, 1744, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1752, 1744, 1753, 1753, 1744, 1744, 1763, 1744, 1764, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1754, 1754, 1754, 1754, 1744, 1755, 1765, 1744, + 1744, 1756, 1744, 1757, 1758, 1744, 1744, 1744, 1759, 1744, + 1766, 1750, 1750, 1750, 1750, 1744, 1744, 1744, 1750, 1750, + + 1760, 1744, 1761, 1750, 1767, 1762, 1766, 1744, 1744, 1744, + 1744, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1744, 1763, 1744, 1763, 1764, 1744, 1764, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1754, 1754, 1754, + 1765, 1765, 1744, 307, 1750, 1750, 1750, 1750, 1744, 1744, + 1750, 1768, 307, 1744, 1744, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1744, + + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1754, 1754, 1754, 1744, 1769, + 1750, 1750, 1750, 1768, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1754, 1754, + 1754, 1769, 1744, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1754, 1754, 1754, 1744, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1754, + + 1754, 1744, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1754, 1754, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1754, 1754, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1744, 1744, 1744, 1744, 1744, 1744, + 1754, 1754, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1754, 1754, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1754, 1754, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1754, 1754, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1754, 1744, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1744, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 0, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744 } ; -static const flex_int16_t yy_nxt[4072] = +static const flex_int16_t yy_nxt[4040] = { 0, 14, 15, 16, 15, 14, 17, 18, 14, 17, 19, 14, 14, 14, 20, 21, 22, 23, 23, 14, 14, @@ -1278,7 +1281,7 @@ static const flex_int16_t yy_nxt[4072] = 90, 93, 92, 96, 96, 93, 103, 107, 103, 108, 108, 160, 97, 97, 103, 103, 103, 103, 231, 238, - 232, 232, 237, 227, 279, 516, 516, 239, 280, 103, + 232, 232, 237, 227, 279, 519, 519, 239, 280, 103, 103, 103, 103, 298, 299, 310, 310, 300, 300, 311, 311, 94, 160, 300, 300, 94, 14, 15, 16, 15, 14, 17, 18, 14, 17, 14, 14, 14, 14, 14, @@ -1291,69 +1294,69 @@ static const flex_int16_t yy_nxt[4072] = 47, 47, 47, 47, 14, 14, 14, 14, 14, 14, 14, 14, 110, 110, 109, 161, 188, 251, 257, 162, - 258, 111, 1726, 510, 116, 280, 108, 108, 467, 467, - 233, 233, 468, 468, 1718, 117, 118, 1294, 119, 234, - 1223, 266, 300, 300, 745, 120, 161, 188, 251, 257, + 258, 111, 273, 512, 116, 513, 108, 108, 469, 469, + 233, 233, 470, 470, 273, 117, 118, 1734, 119, 234, + 1726, 266, 300, 300, 273, 120, 161, 188, 251, 257, 162, 258, 111, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 113, 112, 117, 118, 115, 119, 234, 112, 266, 112, 121, 174, 120, 153, 122, 271, 134, 154, 123, 135, 136, 155, 138, 139, 140, 175, 269, 124, 141, 270, 125, 214, 272, 137, 142, 215, - 112, 112, 112, 466, 112, 121, 174, 464, 153, 122, + 112, 112, 112, 740, 112, 121, 174, 1302, 153, 122, 271, 134, 154, 123, 135, 136, 155, 138, 139, 140, 175, 269, 124, 141, 270, 125, 214, 272, 137, 142, 215, 112, 112, 112, 112, 112, 112, 112, 112, 126, - 286, 127, 143, 634, 128, 129, 144, 287, 130, 302, - 145, 131, 283, 146, 132, 133, 147, 149, 241, 148, - 283, 150, 242, 471, 471, 151, 280, 472, 472, 277, + 286, 127, 143, 1231, 128, 129, 144, 287, 130, 740, + 145, 131, 740, 146, 132, 133, 147, 149, 241, 148, + 466, 150, 242, 473, 473, 151, 463, 474, 474, 750, 126, 286, 127, 143, 152, 128, 129, 144, 287, 130, 288, 145, 131, 288, 146, 132, 133, 147, 149, 241, 148, 156, 150, 242, 169, 163, 151, 164, 170, 165, 157, 158, 171, 166, 243, 152, 167, 159, 292, 176, - 177, 293, 168, 294, 172, 466, 295, 178, 173, 179, - 244, 180, 156, 288, 181, 169, 163, 697, 164, 170, - 165, 157, 158, 171, 166, 243, 464, 167, 159, 292, + 177, 293, 168, 294, 172, 740, 295, 178, 173, 179, + 244, 180, 156, 288, 181, 169, 163, 464, 164, 170, + 165, 157, 158, 171, 166, 243, 466, 167, 159, 292, 176, 177, 293, 168, 294, 172, 245, 295, 178, 173, 179, 244, 180, 182, 189, 181, 246, 183, 190, 247, - 312, 184, 191, 208, 185, 317, 320, 186, 192, 462, - 187, 464, 209, 225, 210, 311, 311, 245, 211, 225, - 212, 697, 213, 223, 182, 189, 323, 246, 183, 190, + 312, 184, 191, 208, 185, 317, 320, 186, 192, 463, + 187, 465, 209, 637, 210, 311, 311, 245, 211, 302, + 212, 467, 213, 283, 182, 189, 323, 246, 183, 190, 247, 312, 184, 191, 208, 185, 317, 320, 186, 192, 255, 187, 193, 209, 194, 210, 202, 195, 196, 211, - 203, 212, 197, 213, 204, 256, 198, 323, 302, 199, - 205, 200, 466, 206, 201, 235, 106, 232, 232, 301, - 207, 255, 510, 193, 280, 194, 236, 202, 195, 196, - 248, 203, 519, 197, 249, 204, 256, 198, 106, 227, + 203, 212, 197, 213, 204, 256, 198, 323, 283, 199, + 205, 200, 468, 206, 201, 235, 280, 232, 232, 301, + 207, 255, 464, 193, 273, 194, 236, 202, 195, 196, + 248, 203, 522, 197, 249, 204, 256, 198, 700, 227, 199, 205, 200, 259, 206, 201, 216, 217, 250, 262, 218, 207, 219, 260, 220, 252, 267, 236, 261, 221, - 268, 248, 318, 253, 263, 249, 291, 264, 265, 321, - 227, 290, 254, 319, 259, 322, 283, 216, 217, 250, - 262, 218, 283, 219, 260, 220, 252, 267, 281, 261, + 268, 248, 318, 253, 263, 249, 465, 264, 265, 321, + 227, 277, 254, 319, 259, 322, 462, 216, 217, 250, + 262, 218, 465, 219, 260, 220, 252, 267, 225, 261, 221, 268, 274, 318, 253, 263, 296, 296, 264, 265, 321, 275, 324, 254, 319, 297, 322, 276, 116, 326, 108, 108, 110, 110, 327, 328, 325, 277, 334, 117, - 335, 111, 263, 274, 298, 298, 308, 308, 516, 516, - 311, 311, 275, 324, 240, 309, 297, 230, 276, 336, - 326, 468, 468, 337, 338, 327, 328, 325, 229, 334, + 335, 111, 225, 274, 298, 298, 308, 308, 519, 519, + 311, 311, 275, 324, 223, 309, 297, 302, 276, 336, + 326, 470, 470, 337, 338, 327, 328, 325, 106, 334, 117, 335, 111, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 309, 329, 304, 228, + 301, 301, 301, 301, 301, 301, 309, 329, 304, 106, 336, 301, 313, 301, 337, 338, 314, 331, 332, 333, 339, 340, 344, 315, 342, 343, 345, 330, 347, 316, 346, 350, 348, 351, 356, 341, 349, 357, 329, 358, - 301, 301, 301, 313, 301, 468, 468, 314, 331, 332, + 301, 301, 301, 313, 301, 470, 470, 314, 331, 332, 333, 339, 340, 344, 315, 342, 343, 345, 330, 347, - 316, 346, 350, 348, 351, 356, 341, 349, 357, 227, + 316, 346, 350, 348, 351, 356, 341, 349, 357, 291, 358, 301, 301, 301, 301, 301, 301, 301, 301, 305, 305, 301, 305, 305, 305, 305, 305, 305, 305, 305, - 305, 305, 359, 363, 307, 472, 472, 305, 352, 305, + 305, 305, 359, 363, 307, 474, 474, 305, 352, 305, 353, 354, 360, 364, 355, 365, 366, 367, 368, 369, - 361, 372, 373, 374, 370, 376, 362, 472, 472, 384, - 375, 395, 226, 359, 363, 371, 305, 305, 305, 352, + 361, 372, 373, 374, 370, 376, 362, 474, 474, 384, + 375, 395, 290, 359, 363, 371, 305, 305, 305, 352, 305, 353, 354, 360, 364, 355, 365, 366, 367, 368, 369, 361, 372, 373, 374, 370, 376, 362, 381, 377, @@ -1363,350 +1366,346 @@ static const flex_int16_t yy_nxt[4072] = 377, 398, 400, 394, 382, 383, 389, 401, 402, 403, 404, 405, 406, 407, 409, 408, 378, 385, 379, 386, 387, 396, 390, 380, 397, 388, 391, 392, 393, 399, - 410, 411, 398, 400, 394, 417, 426, 225, 401, 402, + 410, 411, 398, 400, 394, 417, 426, 283, 401, 402, 403, 404, 405, 406, 407, 409, 408, 412, 415, 427, 413, 418, 428, 429, 416, 430, 419, 414, 420, 421, - 223, 410, 411, 434, 422, 435, 417, 426, 423, 424, - 438, 425, 439, 106, 436, 440, 516, 516, 412, 415, + 283, 410, 411, 434, 422, 435, 417, 426, 423, 424, + 438, 425, 439, 281, 436, 440, 519, 519, 412, 415, 427, 413, 418, 428, 429, 416, 430, 419, 414, 420, 421, 431, 432, 446, 434, 422, 435, 441, 437, 423, 424, 438, 425, 439, 433, 436, 440, 443, 442, 444, 447, 450, 451, 452, 453, 445, 454, 455, 448, 456, 457, 458, 431, 432, 446, 459, 460, 461, 441, 437, - 449, 1736, 510, 229, 735, 433, 473, 1736, 443, 442, + 449, 263, 512, 229, 513, 433, 475, 240, 443, 442, 444, 447, 450, 451, 452, 453, 445, 454, 455, 448, - 456, 457, 458, 233, 233, 474, 459, 460, 461, 233, - 233, 449, 234, 235, 229, 232, 232, 473, 234, 469, - 469, 475, 476, 479, 236, 477, 478, 480, 470, 481, - 483, 484, 485, 486, 487, 488, 474, 492, 493, 489, - 494, 495, 482, 234, 490, 496, 497, 498, 499, 234, - 491, 500, 475, 476, 479, 236, 477, 478, 480, 470, - 481, 483, 484, 485, 486, 487, 488, 503, 492, 493, - 489, 494, 495, 482, 504, 490, 496, 497, 498, 499, - 505, 491, 500, 501, 506, 502, 1736, 508, 512, 507, - 521, 521, 514, 1736, 522, 522, 522, 522, 503, 1736, - - 296, 296, 522, 522, 515, 504, 517, 518, 277, 297, - 1736, 505, 277, 523, 501, 506, 502, 277, 508, 512, - 507, 104, 104, 514, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 343, 515, 524, 517, 518, 104, - 297, 104, 308, 308, 523, 525, 526, 527, 528, 529, - 530, 309, 513, 531, 532, 533, 534, 535, 536, 537, - 538, 539, 540, 541, 542, 343, 543, 524, 104, 104, - 104, 1736, 104, 699, 699, 1736, 525, 526, 527, 528, - 529, 530, 309, 513, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 1736, 543, 547, 104, + 456, 457, 458, 233, 233, 476, 459, 460, 461, 233, + 233, 449, 234, 235, 229, 232, 232, 475, 234, 471, + 471, 477, 478, 481, 236, 479, 480, 482, 472, 483, + 485, 486, 487, 488, 489, 490, 476, 494, 495, 491, + 496, 497, 484, 234, 492, 498, 499, 500, 501, 234, + 493, 502, 477, 478, 481, 236, 479, 480, 482, 472, + 483, 485, 486, 487, 488, 489, 490, 505, 494, 495, + 491, 496, 497, 484, 506, 492, 498, 499, 500, 501, + 507, 493, 502, 503, 508, 504, 230, 510, 515, 509, + 524, 524, 517, 229, 525, 525, 228, 512, 505, 739, + + 296, 296, 525, 525, 518, 506, 520, 521, 277, 297, + 227, 507, 277, 526, 503, 508, 504, 277, 510, 515, + 509, 104, 104, 517, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 343, 518, 527, 520, 521, 104, + 297, 104, 308, 308, 526, 528, 529, 530, 531, 532, + 533, 309, 516, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 343, 546, 527, 104, 104, + 104, 226, 104, 525, 525, 225, 528, 529, 530, 531, + 532, 533, 309, 516, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 223, 546, 550, 104, 104, 104, 104, 104, 104, 104, 104, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, - 544, 548, 304, 699, 699, 301, 549, 301, 545, 547, - 551, 552, 553, 554, 546, 555, 556, 557, 558, 559, - 560, 561, 562, 550, 564, 565, 566, 567, 570, 571, - 563, 544, 548, 572, 301, 301, 301, 549, 301, 545, - 1736, 551, 552, 553, 554, 546, 555, 556, 557, 558, - 559, 560, 561, 562, 550, 564, 565, 566, 567, 570, - 571, 563, 1736, 573, 572, 301, 301, 301, 301, 301, + 547, 551, 304, 703, 703, 301, 552, 301, 548, 550, + 554, 555, 556, 557, 549, 558, 559, 560, 561, 562, + 563, 564, 565, 553, 567, 568, 569, 570, 573, 574, + 566, 547, 551, 575, 301, 301, 301, 552, 301, 548, + 106, 554, 555, 556, 557, 549, 558, 559, 560, 561, + 562, 563, 564, 565, 553, 567, 568, 569, 570, 573, + 574, 566, 1744, 576, 575, 301, 301, 301, 301, 301, 301, 301, 301, 305, 305, 301, 305, 305, 305, 305, - 305, 305, 305, 305, 305, 305, 568, 574, 307, 277, - 945, 305, 575, 305, 573, 576, 569, 577, 578, 579, - 580, 582, 583, 584, 581, 585, 586, 587, 590, 588, - 591, 592, 593, 594, 595, 596, 597, 568, 574, 589, - 305, 305, 305, 575, 305, 1736, 576, 569, 577, 578, - 579, 580, 582, 583, 584, 581, 585, 586, 587, 590, - 588, 591, 592, 593, 594, 595, 596, 597, 1736, 598, - 589, 305, 305, 305, 305, 305, 305, 305, 305, 104, - 104, 599, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 600, 612, 613, 277, 1135, 104, 614, 104, - - 598, 615, 616, 626, 627, 628, 629, 630, 520, 631, - 632, 633, 599, 635, 636, 637, 639, 640, 641, 638, - 1736, 644, 645, 600, 612, 613, 104, 104, 104, 614, - 104, 1736, 615, 616, 626, 627, 628, 629, 630, 520, - 631, 632, 633, 642, 635, 636, 637, 639, 640, 641, - 638, 643, 644, 645, 646, 650, 1736, 104, 104, 104, - 104, 104, 104, 104, 104, 601, 602, 1736, 603, 648, - 604, 605, 653, 606, 642, 654, 607, 655, 647, 608, - 649, 656, 643, 609, 610, 646, 650, 611, 1736, 1736, - 657, 1736, 658, 1736, 1736, 659, 601, 602, 651, 603, - - 648, 604, 605, 653, 606, 652, 654, 607, 655, 647, - 608, 649, 656, 660, 609, 610, 661, 662, 611, 617, - 618, 657, 619, 658, 620, 621, 659, 622, 663, 651, - 664, 665, 668, 666, 669, 670, 652, 623, 624, 671, - 672, 625, 673, 674, 660, 667, 675, 661, 662, 676, - 617, 618, 677, 619, 678, 620, 621, 679, 622, 663, - 680, 664, 665, 668, 666, 669, 670, 681, 623, 624, - 671, 672, 625, 673, 674, 682, 667, 675, 683, 684, - 676, 685, 686, 677, 687, 678, 691, 689, 679, 688, - 692, 680, 690, 694, 695, 696, 469, 469, 681, 698, - - 698, 700, 693, 699, 699, 470, 682, 701, 702, 683, - 684, 703, 685, 686, 704, 687, 705, 691, 689, 706, - 688, 692, 707, 690, 694, 695, 696, 708, 709, 710, - 711, 712, 700, 693, 713, 714, 470, 715, 701, 702, - 716, 717, 703, 718, 719, 704, 720, 705, 721, 722, - 706, 723, 724, 707, 725, 726, 727, 728, 708, 709, - 710, 711, 712, 729, 730, 713, 714, 731, 715, 732, - 1736, 716, 717, 734, 718, 719, 733, 720, 277, 721, - 722, 511, 723, 724, 736, 725, 726, 727, 728, 277, - 737, 738, 739, 511, 729, 730, 740, 741, 731, 742, - - 732, 277, 743, 744, 734, 746, 747, 733, 748, 749, - 750, 751, 511, 752, 753, 736, 754, 756, 757, 758, - 759, 737, 738, 739, 511, 762, 763, 740, 741, 760, - 742, 764, 765, 743, 744, 755, 746, 747, 761, 748, - 749, 750, 751, 766, 752, 753, 767, 754, 756, 757, - 758, 759, 768, 769, 770, 771, 762, 763, 772, 773, - 760, 774, 764, 765, 775, 776, 755, 777, 778, 761, - 779, 780, 781, 782, 766, 783, 784, 767, 785, 786, - 787, 788, 789, 768, 769, 770, 771, 790, 791, 772, - 773, 792, 774, 793, 794, 775, 776, 795, 777, 778, - - 796, 779, 780, 781, 782, 797, 783, 784, 798, 785, - 786, 787, 788, 789, 799, 800, 801, 802, 790, 791, - 803, 806, 792, 804, 793, 794, 807, 808, 795, 809, - 805, 796, 810, 811, 812, 813, 797, 815, 816, 798, - 817, 818, 814, 819, 820, 799, 800, 801, 802, 821, - 822, 803, 806, 823, 804, 827, 828, 807, 808, 829, - 809, 805, 830, 810, 811, 812, 813, 831, 815, 816, - 824, 817, 818, 814, 819, 820, 825, 832, 833, 834, - 821, 822, 835, 836, 823, 837, 827, 828, 826, 838, - 829, 839, 843, 830, 840, 844, 845, 846, 831, 847, - - 841, 824, 848, 849, 852, 853, 854, 825, 832, 833, - 834, 850, 842, 835, 836, 851, 837, 855, 856, 826, - 838, 857, 839, 843, 858, 840, 844, 845, 846, 859, - 847, 841, 860, 848, 849, 852, 853, 854, 861, 862, - 863, 864, 850, 842, 865, 866, 851, 869, 855, 856, - 870, 867, 857, 871, 872, 858, 868, 873, 874, 875, - 859, 876, 877, 860, 878, 879, 880, 881, 882, 861, - 862, 863, 864, 883, 884, 865, 866, 885, 869, 886, - 887, 870, 867, 888, 871, 872, 889, 868, 873, 874, - 875, 890, 876, 877, 891, 878, 879, 880, 881, 882, - - 892, 893, 894, 895, 883, 884, 898, 900, 885, 896, - 886, 887, 901, 897, 888, 902, 899, 889, 903, 904, - 905, 906, 890, 907, 908, 891, 909, 910, 911, 912, - 913, 892, 893, 894, 895, 914, 915, 898, 900, 916, - 896, 917, 918, 901, 897, 919, 902, 899, 920, 903, - 904, 905, 906, 921, 907, 908, 922, 909, 910, 911, - 912, 913, 923, 924, 925, 926, 914, 915, 927, 928, - 916, 929, 917, 918, 930, 931, 919, 932, 933, 920, - 934, 935, 936, 937, 921, 938, 939, 922, 940, 941, - 942, 943, 1736, 923, 924, 925, 926, 944, 947, 927, - - 928, 948, 929, 949, 950, 930, 931, 951, 932, 933, - 946, 934, 935, 936, 937, 952, 938, 939, 953, 940, - 941, 942, 943, 277, 954, 277, 955, 956, 944, 947, - 957, 958, 948, 959, 949, 950, 960, 961, 951, 962, - 963, 946, 964, 965, 966, 968, 952, 967, 969, 953, - 970, 971, 972, 973, 974, 954, 975, 955, 956, 976, - 977, 957, 958, 980, 959, 978, 979, 960, 961, 981, - 962, 963, 982, 964, 965, 966, 968, 983, 967, 969, - 984, 970, 971, 972, 973, 974, 985, 975, 986, 987, - 976, 977, 988, 989, 980, 990, 978, 979, 991, 992, - - 981, 1736, 1736, 982, 998, 999, 1000, 1001, 983, 1002, - 1003, 984, 1004, 1005, 1006, 993, 1736, 985, 1012, 986, - 987, 1013, 1736, 988, 989, 994, 990, 1014, 995, 991, - 992, 1736, 996, 997, 1015, 998, 999, 1000, 1001, 1016, - 1002, 1003, 1017, 1004, 1005, 1006, 993, 1007, 1018, 1012, - 1008, 1019, 1013, 1009, 1020, 1021, 994, 1010, 1014, 995, - 1022, 1023, 1011, 996, 997, 1015, 1024, 1025, 1026, 1027, - 1016, 1028, 1029, 1017, 1030, 1031, 1032, 1033, 1007, 1018, - 1034, 1008, 1019, 1035, 1009, 1020, 1021, 1036, 1010, 1037, - 1038, 1022, 1023, 1011, 1039, 1040, 1041, 1024, 1025, 1026, - - 1027, 1042, 1028, 1029, 1043, 1030, 1031, 1032, 1033, 1044, - 1045, 1034, 1046, 1047, 1035, 1048, 1049, 1050, 1036, 1051, - 1037, 1038, 1052, 1053, 1054, 1039, 1040, 1041, 1055, 1056, - 1057, 1058, 1042, 1059, 1060, 1043, 1061, 1062, 1063, 1064, - 1044, 1045, 1065, 1046, 1047, 1068, 1048, 1049, 1050, 1066, - 1051, 1069, 1070, 1052, 1053, 1054, 1071, 1074, 1067, 1055, - 1056, 1057, 1058, 1075, 1059, 1060, 1076, 1061, 1062, 1063, - 1064, 1072, 1077, 1065, 1078, 1079, 1068, 1080, 1073, 1081, - 1066, 1085, 1069, 1070, 1086, 1087, 1088, 1071, 1074, 1067, - 1089, 1090, 1091, 1082, 1075, 1083, 1092, 1076, 1093, 1094, - - 1095, 1096, 1072, 1077, 1099, 1078, 1079, 1097, 1080, 1073, - 1081, 1084, 1085, 1098, 1100, 1086, 1087, 1088, 1101, 1103, - 1104, 1089, 1090, 1091, 1082, 1105, 1083, 1092, 1102, 1093, - 1094, 1095, 1096, 1106, 1107, 1099, 1108, 1109, 1097, 1110, - 1111, 1112, 1084, 1113, 1098, 1100, 1114, 1115, 1116, 1101, - 1103, 1104, 1117, 1118, 1119, 1120, 1105, 1121, 1122, 1102, - 1123, 1124, 1125, 1126, 1106, 1107, 1127, 1108, 1109, 1128, - 1110, 1111, 1112, 1129, 1113, 1130, 1131, 1114, 1115, 1116, - 1132, 1133, 1134, 1117, 1118, 1119, 1120, 1138, 1121, 1122, - 1136, 1123, 1124, 1125, 1126, 1137, 1139, 1127, 1140, 1141, - - 1128, 1142, 1143, 1144, 1129, 1145, 1130, 1131, 1146, 1147, - 1148, 1132, 1133, 1134, 1149, 1150, 277, 1151, 1138, 277, - 1152, 1136, 1153, 1154, 1155, 1156, 1137, 1139, 1157, 1140, - 1141, 1158, 1142, 1143, 1144, 1159, 1145, 1160, 1161, 1146, - 1147, 1148, 1162, 1163, 1164, 1149, 1150, 1165, 1151, 1166, - 1167, 1152, 1168, 1153, 1154, 1155, 1156, 1169, 1170, 1157, - 1171, 1172, 1158, 1173, 1174, 1175, 1159, 1176, 1160, 1161, - 1177, 1178, 1179, 1162, 1163, 1164, 1180, 1181, 1165, 1182, - 1166, 1167, 1183, 1168, 1184, 1185, 1186, 1189, 1169, 1170, - 1190, 1171, 1172, 1191, 1173, 1174, 1175, 1187, 1176, 1192, - - 1193, 1177, 1178, 1179, 1194, 1188, 1195, 1180, 1181, 1196, - 1182, 1197, 1198, 1183, 1199, 1184, 1185, 1186, 1189, 1200, - 1201, 1190, 1202, 1203, 1191, 1204, 1205, 1206, 1187, 1207, - 1192, 1193, 1208, 1209, 1210, 1194, 1188, 1195, 1211, 1212, - 1196, 1213, 1197, 1198, 1214, 1199, 1215, 1216, 1217, 1218, - 1200, 1201, 1219, 1202, 1203, 1220, 1204, 1205, 1206, 1221, - 1207, 1222, 1224, 1208, 1209, 1210, 1225, 1226, 1227, 1211, - 1212, 1228, 1213, 1229, 1230, 1214, 1231, 1215, 1216, 1217, - 1218, 1232, 1233, 1219, 1234, 1235, 1220, 1236, 1237, 1238, - 1221, 1239, 1222, 1224, 1240, 1241, 1242, 1225, 1226, 1227, - - 1243, 1244, 1228, 1245, 1229, 1230, 1246, 1231, 1247, 1248, - 1249, 1250, 1232, 1233, 1251, 1234, 1235, 1252, 1236, 1237, - 1238, 1255, 1239, 1256, 1257, 1240, 1241, 1242, 1253, 1258, - 1259, 1243, 1244, 1260, 1245, 1261, 1262, 1246, 1263, 1247, - 1248, 1249, 1250, 1264, 1254, 1251, 1265, 1266, 1252, 1267, - 1268, 1269, 1255, 1270, 1256, 1257, 1271, 1272, 1273, 1253, - 1258, 1259, 1274, 1275, 1260, 1276, 1261, 1262, 1277, 1263, - 1278, 1279, 1280, 1281, 1264, 1254, 1282, 1265, 1266, 1283, - 1267, 1268, 1269, 1284, 1270, 1285, 1286, 1271, 1272, 1273, - 1287, 1288, 1289, 1274, 1275, 1290, 1276, 1291, 1292, 1277, - - 1295, 1278, 1279, 1280, 1281, 1296, 1293, 1282, 1297, 1298, - 1283, 1299, 1300, 1301, 1284, 1302, 1285, 1286, 1303, 1304, - 1305, 1287, 1288, 1289, 277, 1306, 1290, 1307, 1291, 1292, - 277, 1295, 1308, 1309, 1310, 1311, 1296, 1293, 1312, 1297, - 1298, 1313, 1299, 1300, 1301, 1314, 1302, 1315, 1316, 1303, - 1304, 1305, 1317, 1318, 1319, 1320, 1306, 1321, 1307, 1322, - 1323, 1324, 1325, 1308, 1309, 1310, 1311, 1326, 1327, 1312, - 1328, 1329, 1313, 1330, 1331, 1332, 1314, 1333, 1315, 1316, - 1334, 1335, 1336, 1317, 1318, 1319, 1320, 1337, 1321, 1338, - 1322, 1323, 1324, 1325, 1339, 1340, 1341, 1342, 1326, 1327, - - 1343, 1328, 1329, 1344, 1330, 1331, 1332, 1345, 1333, 1346, - 1347, 1334, 1335, 1336, 1348, 1349, 1350, 1351, 1337, 1352, - 1338, 1353, 1354, 1355, 1356, 1339, 1340, 1341, 1342, 1357, - 1358, 1343, 1359, 1360, 1344, 1361, 1362, 1363, 1345, 1364, - 1346, 1347, 1365, 1367, 1366, 1348, 1349, 1350, 1351, 1368, - 1352, 1370, 1353, 1354, 1355, 1356, 1371, 1372, 1373, 1374, - 1357, 1358, 1375, 1359, 1360, 1376, 1361, 1362, 1363, 1369, - 1364, 1377, 1378, 1365, 1367, 1366, 1379, 1380, 1381, 1382, - 1368, 1383, 1370, 1384, 1385, 1386, 1387, 1371, 1372, 1373, - 1374, 1388, 1389, 1375, 1390, 1391, 1376, 1392, 1393, 1394, - - 1369, 1395, 1377, 1378, 1396, 1397, 1400, 1379, 1380, 1381, - 1382, 1398, 1383, 1399, 1384, 1385, 1386, 1387, 1401, 1402, - 1403, 1404, 1388, 1389, 1405, 1390, 1391, 1406, 1392, 1393, - 1394, 1407, 1395, 1408, 1409, 1396, 1397, 1400, 1410, 1411, - 1412, 1413, 1398, 1414, 1399, 1415, 1416, 1417, 1418, 1401, - 1402, 1403, 1404, 1419, 1420, 1405, 1421, 1422, 1406, 1423, - 1736, 1426, 1407, 1425, 1408, 1409, 1427, 1424, 1428, 1410, - 1411, 1412, 1413, 1429, 1414, 1430, 1415, 1416, 1417, 1418, - 277, 1431, 1432, 1433, 1419, 1420, 1434, 1421, 1422, 1435, - 1423, 277, 1426, 1436, 1425, 1437, 1438, 1427, 1424, 1428, - - 1439, 1440, 1441, 1442, 1429, 1443, 1430, 1444, 1445, 1446, - 1447, 1448, 1431, 1432, 1433, 1449, 1450, 1434, 1451, 1452, - 1435, 1453, 1454, 1455, 1436, 1456, 1437, 1438, 1457, 1458, - 1459, 1439, 1440, 1441, 1442, 1460, 1443, 1461, 1444, 1445, - 1446, 1447, 1448, 1462, 1463, 1464, 1449, 1450, 1465, 1451, - 1452, 1466, 1453, 1454, 1455, 1467, 1456, 1468, 1469, 1457, - 1458, 1459, 1470, 1471, 1472, 1473, 1460, 1474, 1461, 1475, - 1476, 1477, 1478, 1479, 1462, 1463, 1464, 1480, 1481, 1465, - 1482, 1483, 1466, 1484, 1485, 1486, 1467, 1487, 1468, 1469, - 1488, 1489, 1490, 1470, 1471, 1472, 1473, 1491, 1474, 1492, - - 1475, 1476, 1477, 1478, 1479, 1493, 1494, 1495, 1480, 1481, - 1496, 1482, 1483, 1497, 1484, 1485, 1486, 1498, 1487, 1499, - 1500, 1488, 1489, 1490, 1501, 1502, 1503, 1504, 1491, 1505, - 1492, 1506, 1507, 1508, 1509, 1510, 1493, 1494, 1495, 1511, - 1512, 1496, 1513, 1514, 1497, 1515, 1516, 1517, 1498, 1518, - 1499, 1500, 1519, 1520, 1521, 1501, 1502, 1503, 1504, 1522, - 1505, 1523, 1506, 1507, 1508, 1509, 1510, 1524, 1527, 1525, - 1511, 1512, 1526, 1513, 1514, 1528, 1515, 1516, 1517, 1529, - 1518, 1530, 1531, 1519, 1520, 1521, 277, 1532, 1533, 277, - 1522, 1534, 1523, 1535, 1536, 1537, 1538, 1539, 1524, 1527, - - 1525, 1540, 1541, 1526, 1542, 1543, 1528, 1544, 1545, 1546, - 1529, 1547, 1530, 1531, 1548, 1549, 1550, 1551, 1532, 1533, - 1552, 1553, 1534, 1554, 1535, 1536, 1537, 1538, 1539, 1555, - 1556, 1557, 1540, 1541, 1558, 1542, 1543, 1559, 1544, 1545, - 1546, 1560, 1547, 1561, 1562, 1548, 1549, 1550, 1551, 1563, - 1564, 1552, 1553, 1565, 1554, 1566, 1567, 1568, 1569, 1570, - 1555, 1556, 1557, 1571, 1572, 1558, 1573, 1574, 1559, 1575, - 1576, 1577, 1560, 1578, 1561, 1562, 1579, 1580, 1581, 1582, - 1563, 1564, 1583, 1584, 1565, 1585, 1566, 1567, 1568, 1569, - 1570, 1586, 1587, 1588, 1571, 1572, 1589, 1573, 1574, 1590, - - 1575, 1576, 1577, 1591, 1578, 1592, 1593, 1579, 1580, 1581, - 1582, 1594, 1595, 1583, 1584, 1596, 1585, 1597, 1598, 1599, - 1600, 1601, 1586, 1587, 1588, 1602, 1605, 1589, 1603, 1604, - 1590, 1606, 1607, 1608, 1591, 1610, 1592, 1593, 1609, 277, - 1611, 1612, 1594, 1595, 1613, 277, 1596, 1614, 1597, 1598, - 1599, 1600, 1601, 1615, 1616, 1617, 1602, 1605, 1618, 1603, - 1604, 1619, 1606, 1607, 1608, 1620, 1610, 1621, 1622, 1609, - 1623, 1611, 1612, 1624, 1625, 1613, 1626, 1627, 1614, 1628, - 1629, 1630, 1631, 1632, 1615, 1616, 1617, 1633, 1634, 1618, - 1635, 1636, 1619, 1637, 1638, 1639, 1620, 1640, 1621, 1622, - - 1641, 1623, 1642, 1643, 1624, 1625, 1644, 1626, 1627, 1645, - 1628, 1629, 1630, 1631, 1632, 1646, 1647, 1648, 1633, 1634, - 1649, 1635, 1636, 1650, 1637, 1638, 1639, 1653, 1640, 1651, - 1652, 1641, 1654, 1642, 1643, 1655, 1656, 1644, 1657, 277, - 1645, 1658, 1659, 1660, 1661, 1662, 1646, 1647, 1648, 1663, - 277, 1649, 1664, 1665, 1650, 1666, 1667, 1668, 1653, 1669, - 1651, 1652, 1670, 1654, 1671, 1672, 1655, 1656, 1673, 1657, - 1674, 1675, 1658, 1659, 1660, 1661, 1662, 1676, 1677, 1678, - 1663, 1679, 1680, 1664, 1665, 1681, 1666, 1667, 1668, 1682, - 1669, 1683, 277, 1670, 1684, 1671, 1672, 1685, 1686, 1673, - - 1687, 1674, 1675, 1688, 1689, 277, 1690, 1691, 1676, 1677, - 1678, 1692, 1679, 1680, 1693, 1694, 1681, 1695, 1696, 1697, - 1682, 1698, 1683, 1699, 1700, 1684, 1701, 1702, 1685, 1686, - 1703, 1687, 1704, 277, 1688, 1689, 1705, 1690, 1691, 1706, - 1707, 1708, 1692, 1709, 1710, 1693, 1694, 1711, 1695, 1696, - 1697, 1712, 1698, 1713, 1699, 1700, 277, 1701, 1702, 1714, - 1715, 1703, 1716, 1704, 1717, 1719, 1720, 1705, 1721, 1722, - 1706, 1707, 1708, 1723, 1709, 1710, 1724, 1725, 1711, 1727, - 1728, 1729, 1712, 1730, 1713, 1731, 1732, 1733, 277, 1734, - 1714, 1715, 1735, 1716, 1736, 1717, 1719, 1720, 1736, 1721, - - 1722, 1736, 1736, 1736, 1723, 1736, 1736, 1724, 1725, 1736, - 1727, 1728, 1729, 1736, 1730, 1736, 1731, 1732, 1733, 1736, - 1734, 1736, 1736, 1735, 87, 87, 87, 87, 87, 87, - 87, 91, 91, 91, 91, 91, 91, 91, 95, 95, - 95, 95, 95, 95, 95, 104, 1736, 104, 104, 104, - 104, 104, 105, 1736, 105, 105, 105, 105, 105, 114, - 114, 114, 114, 114, 114, 114, 222, 222, 222, 222, - 222, 222, 222, 224, 1736, 224, 224, 224, 224, 224, - 273, 273, 273, 273, 273, 273, 273, 278, 278, 278, - 278, 278, 278, 278, 282, 282, 282, 282, 282, 282, - - 282, 284, 284, 284, 284, 284, 284, 284, 285, 285, - 1736, 1736, 285, 285, 289, 1736, 289, 289, 1736, 289, - 289, 301, 301, 301, 301, 301, 301, 301, 303, 303, - 303, 303, 303, 303, 303, 306, 306, 306, 306, 306, - 306, 306, 463, 463, 1736, 463, 463, 463, 463, 465, - 465, 465, 1736, 465, 465, 465, 509, 509, 509, 509, - 509, 509, 509, 511, 1736, 511, 511, 511, 511, 511, - 305, 305, 305, 305, 305, 305, 305, 104, 1736, 104, - 104, 104, 104, 104, 13, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736 + 305, 305, 305, 305, 305, 305, 571, 577, 307, 703, + 703, 305, 578, 305, 576, 579, 572, 580, 581, 582, + 583, 585, 586, 587, 584, 588, 589, 590, 593, 591, + 594, 595, 596, 597, 598, 599, 600, 571, 577, 592, + 305, 305, 305, 578, 305, 1744, 579, 572, 580, 581, + 582, 583, 585, 586, 587, 584, 588, 589, 590, 593, + 591, 594, 595, 596, 597, 598, 599, 600, 1744, 601, + 592, 305, 305, 305, 305, 305, 305, 305, 305, 104, + 104, 602, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 603, 615, 616, 277, 950, 104, 617, 104, + + 601, 618, 619, 629, 630, 631, 632, 633, 523, 634, + 635, 636, 602, 638, 639, 640, 642, 643, 644, 641, + 1744, 647, 648, 603, 615, 616, 104, 104, 104, 617, + 104, 1744, 618, 619, 629, 630, 631, 632, 633, 523, + 634, 635, 636, 645, 638, 639, 640, 642, 643, 644, + 641, 646, 647, 648, 649, 653, 1744, 104, 104, 104, + 104, 104, 104, 104, 104, 604, 605, 1744, 606, 651, + 607, 608, 656, 609, 645, 657, 610, 658, 650, 611, + 652, 659, 646, 612, 613, 649, 653, 614, 1744, 952, + 660, 953, 661, 277, 1142, 662, 604, 605, 654, 606, + + 651, 607, 608, 656, 609, 655, 657, 610, 658, 650, + 611, 652, 659, 663, 612, 613, 664, 665, 614, 620, + 621, 660, 622, 661, 623, 624, 662, 625, 666, 654, + 667, 668, 671, 669, 672, 673, 655, 626, 627, 674, + 675, 628, 676, 677, 663, 670, 678, 664, 665, 679, + 620, 621, 680, 622, 681, 623, 624, 682, 625, 666, + 683, 667, 668, 671, 669, 672, 673, 684, 626, 627, + 674, 675, 628, 676, 677, 685, 670, 678, 686, 687, + 679, 688, 689, 680, 690, 681, 694, 692, 682, 691, + 695, 683, 693, 697, 698, 699, 467, 701, 684, 471, + + 471, 1744, 696, 704, 705, 706, 685, 1744, 472, 686, + 687, 707, 688, 689, 708, 690, 709, 694, 692, 710, + 691, 695, 711, 693, 697, 698, 699, 702, 702, 712, + 713, 703, 703, 696, 704, 705, 706, 468, 468, 472, + 714, 715, 707, 716, 717, 708, 718, 709, 719, 720, + 710, 721, 722, 711, 723, 724, 725, 726, 727, 728, + 712, 713, 729, 730, 731, 732, 733, 734, 735, 736, + 514, 714, 715, 1744, 716, 717, 741, 718, 277, 719, + 720, 738, 721, 722, 742, 723, 724, 725, 726, 727, + 728, 737, 743, 729, 730, 731, 732, 733, 734, 735, + + 736, 514, 744, 514, 277, 745, 746, 741, 747, 277, + 748, 749, 738, 751, 752, 742, 753, 754, 755, 756, + 757, 758, 737, 743, 759, 761, 762, 763, 764, 765, + 767, 768, 769, 744, 514, 770, 745, 746, 766, 747, + 771, 748, 749, 760, 751, 752, 772, 753, 754, 755, + 756, 757, 758, 773, 774, 759, 761, 762, 763, 764, + 765, 767, 768, 769, 775, 776, 770, 777, 778, 766, + 779, 771, 780, 781, 760, 782, 783, 772, 784, 785, + 786, 787, 788, 789, 773, 774, 790, 791, 792, 793, + 794, 795, 796, 797, 798, 775, 776, 799, 777, 778, + + 800, 779, 801, 780, 781, 802, 782, 783, 803, 784, + 785, 786, 787, 788, 789, 804, 805, 790, 791, 792, + 793, 794, 795, 796, 797, 798, 806, 807, 799, 808, + 809, 800, 811, 801, 812, 813, 802, 810, 814, 803, + 815, 816, 817, 818, 820, 821, 804, 805, 822, 823, + 819, 824, 825, 826, 827, 828, 1744, 806, 807, 832, + 808, 809, 1744, 811, 833, 812, 813, 834, 810, 814, + 835, 815, 816, 817, 818, 820, 821, 836, 837, 822, + 823, 819, 824, 825, 826, 827, 828, 829, 838, 839, + 832, 840, 841, 830, 842, 833, 843, 844, 834, 848, + + 849, 835, 850, 851, 852, 831, 853, 854, 836, 837, + 855, 845, 857, 858, 856, 859, 860, 846, 829, 838, + 839, 861, 840, 841, 830, 842, 862, 843, 844, 847, + 848, 849, 863, 850, 851, 852, 831, 853, 854, 864, + 865, 855, 845, 857, 858, 856, 859, 860, 846, 866, + 867, 868, 861, 869, 870, 871, 872, 862, 874, 875, + 847, 873, 876, 863, 877, 878, 879, 880, 881, 882, + 864, 865, 883, 884, 885, 886, 887, 888, 889, 890, + 866, 867, 868, 891, 869, 870, 871, 872, 892, 874, + 875, 893, 873, 876, 894, 877, 878, 879, 880, 881, + + 882, 895, 896, 883, 884, 885, 886, 887, 888, 889, + 890, 897, 898, 899, 891, 900, 901, 903, 905, 892, + 902, 906, 893, 907, 908, 894, 909, 904, 910, 911, + 912, 913, 895, 896, 914, 915, 916, 917, 918, 919, + 920, 921, 897, 898, 899, 922, 900, 901, 903, 905, + 923, 902, 906, 924, 907, 908, 925, 909, 904, 910, + 911, 912, 913, 926, 927, 914, 915, 916, 917, 918, + 919, 920, 921, 928, 929, 930, 922, 931, 932, 933, + 934, 923, 935, 936, 924, 937, 938, 925, 939, 940, + 941, 942, 943, 944, 926, 927, 945, 946, 947, 948, + + 1744, 954, 951, 949, 928, 929, 930, 955, 931, 932, + 933, 934, 956, 935, 936, 277, 937, 938, 957, 939, + 940, 941, 942, 943, 944, 958, 959, 945, 946, 947, + 948, 277, 954, 951, 949, 960, 961, 962, 955, 963, + 964, 965, 966, 956, 967, 968, 970, 969, 971, 957, + 972, 973, 975, 976, 974, 977, 958, 959, 978, 979, + 980, 981, 982, 983, 984, 987, 960, 961, 962, 988, + 963, 964, 965, 966, 989, 967, 968, 970, 969, 971, + 990, 972, 973, 975, 976, 974, 977, 985, 986, 978, + 979, 980, 981, 982, 983, 984, 987, 991, 992, 993, + + 988, 994, 995, 996, 997, 989, 998, 999, 1744, 1005, + 1006, 990, 1744, 1744, 1007, 1008, 1009, 1010, 985, 986, + 1011, 1012, 1013, 1019, 1020, 1744, 1000, 1021, 991, 992, + 993, 1744, 994, 995, 996, 997, 1001, 998, 999, 1002, + 1005, 1006, 1022, 1003, 1004, 1007, 1008, 1009, 1010, 1023, + 1024, 1011, 1012, 1013, 1019, 1020, 1014, 1000, 1021, 1015, + 1025, 1026, 1016, 1027, 1028, 1029, 1017, 1001, 1030, 1031, + 1002, 1018, 1032, 1022, 1003, 1004, 1033, 1034, 1035, 1036, + 1023, 1024, 1037, 1038, 1039, 1040, 1041, 1014, 1042, 1043, + 1015, 1025, 1026, 1016, 1027, 1028, 1029, 1017, 1044, 1030, + + 1031, 1045, 1018, 1032, 1046, 1047, 1048, 1033, 1034, 1035, + 1036, 1049, 1050, 1037, 1038, 1039, 1040, 1041, 1051, 1042, + 1043, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1044, + 1060, 1061, 1045, 1062, 1063, 1046, 1047, 1048, 1064, 1065, + 1066, 1067, 1049, 1050, 1068, 1069, 1070, 1071, 1072, 1051, + 1075, 1073, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, + 1074, 1060, 1061, 1076, 1062, 1063, 1077, 1078, 1081, 1064, + 1065, 1066, 1067, 1079, 1082, 1068, 1069, 1070, 1071, 1072, + 1080, 1075, 1073, 1083, 1084, 1085, 1086, 1087, 1088, 1092, + 1089, 1074, 1090, 1093, 1076, 1094, 1095, 1077, 1078, 1081, + + 1096, 1097, 1098, 1099, 1079, 1082, 1100, 1101, 1091, 1102, + 1103, 1080, 1106, 1107, 1083, 1084, 1085, 1086, 1087, 1088, + 1092, 1089, 1104, 1090, 1093, 1108, 1094, 1095, 1105, 1110, + 1111, 1096, 1097, 1098, 1099, 1109, 1112, 1100, 1101, 1091, + 1102, 1103, 1113, 1106, 1107, 1114, 1115, 1116, 1117, 1118, + 1119, 1120, 1121, 1104, 1122, 1123, 1108, 1124, 1125, 1105, + 1110, 1111, 1126, 1127, 1128, 1129, 1109, 1112, 1130, 1131, + 1132, 1133, 1134, 1113, 1135, 1136, 1114, 1115, 1116, 1117, + 1118, 1119, 1120, 1121, 1137, 1122, 1123, 1138, 1124, 1125, + 1139, 1140, 1141, 1126, 1127, 1128, 1129, 1744, 1143, 1130, + + 1131, 1132, 1133, 1134, 1144, 1135, 1136, 952, 1146, 1145, + 1147, 1148, 1149, 1150, 1151, 1137, 1152, 1153, 1138, 1154, + 1155, 1139, 1140, 1141, 277, 1156, 1157, 1158, 277, 1143, + 1159, 1160, 1161, 1162, 1163, 1144, 1164, 1165, 1166, 1146, + 1167, 1147, 1148, 1149, 1150, 1151, 1168, 1152, 1153, 1169, + 1154, 1155, 1170, 1171, 1172, 1173, 1156, 1157, 1158, 1174, + 1175, 1159, 1160, 1161, 1162, 1163, 1176, 1164, 1165, 1166, + 1177, 1167, 1178, 1179, 1180, 1181, 1182, 1168, 1183, 1184, + 1169, 1185, 1186, 1170, 1171, 1172, 1173, 1187, 1188, 1189, + 1174, 1175, 1190, 1191, 1192, 1193, 1194, 1176, 1197, 1198, + + 1195, 1177, 1199, 1178, 1179, 1180, 1181, 1182, 1196, 1183, + 1184, 1200, 1185, 1186, 1201, 1202, 1203, 1204, 1187, 1188, + 1189, 1205, 1206, 1190, 1191, 1192, 1193, 1194, 1207, 1197, + 1198, 1195, 1208, 1199, 1209, 1210, 1211, 1212, 1213, 1196, + 1214, 1215, 1200, 1216, 1217, 1201, 1202, 1203, 1204, 1218, + 1219, 1220, 1205, 1206, 1221, 1222, 1223, 1224, 1225, 1207, + 1226, 1227, 1228, 1208, 1229, 1209, 1210, 1211, 1212, 1213, + 1230, 1214, 1215, 1232, 1216, 1217, 1233, 1234, 1235, 1236, + 1218, 1219, 1220, 1237, 1238, 1221, 1222, 1223, 1224, 1225, + 1239, 1226, 1227, 1228, 1240, 1229, 1241, 1242, 1243, 1244, + + 1245, 1230, 1246, 1247, 1232, 1248, 1249, 1233, 1234, 1235, + 1236, 1250, 1251, 1252, 1237, 1238, 1253, 1254, 1255, 1256, + 1257, 1239, 1258, 1259, 1260, 1240, 1263, 1241, 1242, 1243, + 1244, 1245, 1264, 1246, 1247, 1265, 1248, 1249, 1266, 1267, + 1261, 1268, 1250, 1251, 1252, 1269, 1270, 1253, 1254, 1255, + 1256, 1257, 1271, 1258, 1259, 1260, 1262, 1263, 1272, 1273, + 1274, 1275, 1276, 1264, 1277, 1278, 1265, 1279, 1280, 1266, + 1267, 1261, 1268, 1281, 1282, 1283, 1269, 1270, 1284, 1285, + 1286, 1287, 1288, 1271, 1289, 1290, 1291, 1262, 1292, 1272, + 1273, 1274, 1275, 1276, 1293, 1277, 1278, 1294, 1279, 1280, + + 1295, 1296, 1297, 1298, 1281, 1282, 1283, 1299, 1303, 1284, + 1285, 1286, 1287, 1288, 1300, 1289, 1290, 1291, 1301, 1292, + 1304, 1305, 1306, 1307, 1308, 1293, 1309, 1310, 1294, 1311, + 1312, 1295, 1296, 1297, 1298, 1313, 1314, 1315, 1299, 1303, + 277, 1316, 277, 1317, 1318, 1300, 1319, 1320, 1321, 1301, + 1322, 1304, 1305, 1306, 1307, 1308, 1323, 1309, 1310, 1324, + 1311, 1312, 1325, 1326, 1327, 1328, 1313, 1314, 1315, 1329, + 1330, 1331, 1316, 1332, 1317, 1318, 1333, 1319, 1320, 1321, + 1334, 1322, 1335, 1336, 1337, 1338, 1339, 1323, 1340, 1341, + 1324, 1342, 1343, 1325, 1326, 1327, 1328, 1344, 1345, 1346, + + 1329, 1330, 1331, 1347, 1332, 1348, 1349, 1333, 1350, 1351, + 1352, 1334, 1353, 1335, 1336, 1337, 1338, 1339, 1354, 1340, + 1341, 1355, 1342, 1343, 1356, 1357, 1358, 1359, 1344, 1345, + 1346, 1360, 1361, 1362, 1347, 1363, 1348, 1349, 1364, 1350, + 1351, 1352, 1365, 1353, 1366, 1367, 1368, 1369, 1370, 1354, + 1371, 1372, 1355, 1375, 1376, 1356, 1357, 1358, 1359, 1373, + 1378, 1374, 1360, 1361, 1362, 1379, 1363, 1380, 1381, 1364, + 1382, 1383, 1384, 1365, 1377, 1366, 1367, 1368, 1369, 1370, + 1385, 1371, 1372, 1386, 1375, 1376, 1387, 1388, 1389, 1390, + 1373, 1378, 1374, 1391, 1392, 1393, 1379, 1394, 1380, 1381, + + 1395, 1382, 1383, 1384, 1396, 1377, 1397, 1398, 1399, 1400, + 1401, 1385, 1402, 1403, 1386, 1404, 1405, 1387, 1388, 1389, + 1390, 1406, 1408, 1407, 1391, 1392, 1393, 1409, 1394, 1410, + 1411, 1395, 1412, 1413, 1414, 1396, 1415, 1397, 1398, 1399, + 1400, 1401, 1416, 1402, 1403, 1417, 1404, 1405, 1418, 1419, + 1420, 1421, 1406, 1408, 1407, 1422, 1423, 1424, 1409, 1425, + 1410, 1411, 1426, 1412, 1413, 1414, 1427, 1415, 1428, 1429, + 1430, 1431, 1432, 1416, 1433, 1434, 1417, 1435, 1436, 1418, + 1419, 1420, 1421, 1437, 1438, 1439, 1422, 1423, 1424, 1440, + 1425, 277, 1441, 1426, 1442, 1443, 277, 1427, 1444, 1428, + + 1429, 1430, 1431, 1432, 1445, 1433, 1434, 1446, 1435, 1436, + 1447, 1448, 1449, 1450, 1437, 1438, 1439, 1451, 1452, 1453, + 1440, 1454, 1455, 1441, 1456, 1442, 1443, 1457, 1458, 1444, + 1459, 1460, 1461, 1462, 1463, 1445, 1464, 1465, 1446, 1466, + 1467, 1447, 1448, 1449, 1450, 1468, 1469, 1470, 1451, 1452, + 1453, 1471, 1454, 1455, 1472, 1456, 1473, 1474, 1457, 1458, + 1475, 1459, 1460, 1461, 1462, 1463, 1476, 1464, 1465, 1477, + 1466, 1467, 1478, 1479, 1480, 1481, 1468, 1469, 1470, 1482, + 1483, 1484, 1471, 1485, 1486, 1472, 1487, 1473, 1474, 1488, + 1489, 1475, 1490, 1491, 1492, 1493, 1494, 1476, 1495, 1496, + + 1477, 1497, 1498, 1478, 1479, 1480, 1481, 1499, 1500, 1501, + 1482, 1483, 1484, 1502, 1485, 1486, 1503, 1487, 1504, 1505, + 1488, 1489, 1506, 1490, 1491, 1492, 1493, 1494, 1507, 1495, + 1496, 1508, 1497, 1498, 1509, 1510, 1511, 1512, 1499, 1500, + 1501, 1513, 1514, 1515, 1502, 1516, 1517, 1503, 1518, 1504, + 1505, 1519, 1520, 1506, 1521, 1522, 1523, 1524, 1525, 1507, + 1526, 1527, 1508, 1528, 1529, 1509, 1510, 1511, 1512, 1530, + 1531, 1532, 1513, 1514, 1515, 1535, 1516, 1517, 1536, 1518, + 1533, 1534, 1519, 1520, 1537, 1521, 1522, 1523, 1524, 1525, + 1538, 1526, 1527, 1539, 1528, 1529, 1540, 277, 277, 1541, + + 1530, 1531, 1532, 1542, 1543, 1544, 1535, 1545, 1546, 1536, + 1547, 1533, 1534, 1548, 1549, 1537, 1550, 1551, 1552, 1553, + 1554, 1538, 1555, 1556, 1539, 1557, 1558, 1540, 1559, 1560, + 1541, 1561, 1562, 1563, 1542, 1543, 1544, 1564, 1545, 1546, + 1565, 1547, 1566, 1567, 1548, 1549, 1568, 1550, 1551, 1552, + 1553, 1554, 1569, 1555, 1556, 1570, 1557, 1558, 1571, 1559, + 1560, 1572, 1561, 1562, 1563, 1573, 1574, 1575, 1564, 1576, + 1577, 1565, 1578, 1566, 1567, 1579, 1580, 1568, 1581, 1582, + 1583, 1584, 1585, 1569, 1586, 1587, 1570, 1588, 1589, 1571, + 1590, 1591, 1572, 1592, 1593, 1594, 1573, 1574, 1575, 1595, + + 1576, 1577, 1596, 1578, 1597, 1598, 1579, 1580, 1599, 1581, + 1582, 1583, 1584, 1585, 1600, 1586, 1587, 1601, 1588, 1589, + 1602, 1590, 1591, 1603, 1592, 1593, 1594, 1604, 1605, 1606, + 1595, 1607, 1608, 1596, 1609, 1597, 1598, 1610, 1611, 1599, + 1612, 1613, 1614, 1615, 1616, 1600, 1618, 1619, 1601, 1617, + 277, 1602, 1620, 1621, 1603, 277, 1622, 1623, 1604, 1605, + 1606, 1624, 1607, 1608, 1625, 1609, 1626, 1627, 1610, 1611, + 1628, 1612, 1613, 1614, 1615, 1616, 1629, 1618, 1619, 1630, + 1617, 1631, 1632, 1620, 1621, 1633, 1634, 1622, 1623, 1635, + 1636, 1637, 1624, 1638, 1639, 1625, 1640, 1626, 1627, 1641, + + 1642, 1628, 1643, 1644, 1645, 1646, 1647, 1629, 1648, 1649, + 1630, 1650, 1631, 1632, 1651, 1652, 1633, 1634, 1653, 1654, + 1635, 1636, 1637, 1655, 1638, 1639, 1656, 1640, 1657, 1658, + 1641, 1642, 1660, 1643, 1644, 1645, 1646, 1647, 1659, 1648, + 1649, 1661, 1650, 1662, 1663, 1651, 1652, 1664, 277, 1653, + 1654, 1665, 277, 1666, 1655, 1667, 1668, 1656, 1669, 1657, + 1658, 1670, 1671, 1660, 1672, 1673, 1674, 1675, 1676, 1659, + 1677, 1678, 1661, 1679, 1662, 1663, 1680, 1681, 1664, 1682, + 1683, 1684, 1665, 1685, 1666, 1686, 1667, 1668, 1687, 1669, + 1688, 1690, 1670, 1671, 277, 1672, 1673, 1674, 1675, 1676, + + 1689, 1677, 1678, 1691, 1679, 1692, 1693, 1680, 1681, 1694, + 1682, 1683, 1684, 1695, 1685, 1696, 1686, 1697, 1698, 1687, + 277, 1688, 1690, 1699, 1700, 1701, 1702, 1703, 1704, 1705, + 1706, 1689, 1707, 1708, 1691, 1709, 1692, 1693, 1710, 1711, + 1694, 1712, 277, 1713, 1695, 1714, 1696, 1715, 1697, 1698, + 1716, 1717, 1718, 1719, 1699, 1700, 1701, 1702, 1703, 1704, + 1705, 1706, 1720, 1707, 1708, 277, 1709, 1721, 1722, 1710, + 1711, 1723, 1712, 1724, 1713, 1727, 1714, 1725, 1715, 1728, + 1729, 1716, 1717, 1718, 1719, 1730, 1731, 1732, 1733, 1735, + 1736, 1737, 1738, 1720, 1739, 1740, 1741, 1742, 1721, 1722, + + 1743, 277, 1723, 1744, 1724, 1744, 1727, 1744, 1725, 1744, + 1728, 1729, 1744, 1744, 1744, 1744, 1730, 1731, 1732, 1733, + 1735, 1736, 1737, 1738, 1744, 1739, 1740, 1741, 1742, 1744, + 1744, 1743, 87, 87, 87, 87, 87, 91, 91, 91, + 91, 91, 95, 95, 95, 95, 95, 104, 1744, 104, + 104, 104, 105, 1744, 105, 105, 105, 114, 114, 114, + 114, 114, 222, 222, 222, 222, 222, 224, 1744, 224, + 224, 224, 273, 273, 273, 273, 273, 278, 278, 278, + 278, 278, 282, 282, 282, 282, 282, 284, 284, 284, + 284, 284, 285, 285, 1744, 285, 285, 289, 1744, 289, + + 1744, 289, 301, 301, 301, 301, 301, 303, 303, 303, + 303, 303, 306, 306, 306, 306, 306, 463, 463, 463, + 463, 463, 466, 466, 466, 466, 466, 511, 511, 511, + 511, 511, 514, 1744, 514, 514, 514, 305, 305, 305, + 305, 305, 104, 1744, 104, 104, 104, 740, 740, 740, + 740, 740, 13, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744 } ; -static const flex_int16_t yy_chk[4072] = +static const flex_int16_t yy_chk[4040] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1742,70 +1741,70 @@ static const flex_int16_t yy_chk[4072] = 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 21, 21, 1742, 34, 40, 69, 72, 34, - 73, 21, 1717, 279, 23, 279, 23, 23, 234, 234, - 60, 60, 234, 234, 1704, 23, 24, 1137, 24, 60, - 1051, 77, 300, 300, 528, 24, 34, 40, 69, 72, + 11, 11, 21, 21, 1750, 34, 40, 69, 72, 34, + 73, 21, 1734, 279, 23, 279, 23, 23, 234, 234, + 60, 60, 234, 234, 1726, 23, 24, 1725, 24, 60, + 1712, 77, 300, 300, 1302, 24, 34, 40, 69, 72, 34, 73, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 24, 22, 24, 60, 22, 77, 22, 25, 37, 24, 31, 25, 80, 27, 31, 25, 27, 27, 31, 28, 28, 28, 37, 79, 25, 28, 79, 25, 45, 81, 27, 28, 45, - 22, 22, 22, 465, 22, 25, 37, 463, 31, 25, + 22, 22, 22, 1145, 22, 25, 37, 1144, 31, 25, 80, 27, 31, 25, 27, 27, 31, 28, 28, 28, 37, 79, 25, 28, 79, 25, 45, 81, 27, 28, 45, 22, 22, 22, 22, 22, 22, 22, 22, 26, - 92, 26, 29, 403, 26, 26, 29, 93, 26, 301, - 29, 26, 284, 29, 26, 26, 29, 30, 65, 29, - 282, 30, 65, 236, 236, 30, 278, 236, 236, 273, + 92, 26, 29, 1058, 26, 26, 29, 93, 26, 953, + 29, 26, 739, 29, 26, 26, 29, 30, 65, 29, + 701, 30, 65, 236, 236, 30, 700, 236, 236, 531, 26, 92, 26, 29, 30, 26, 26, 29, 93, 26, 94, 29, 26, 94, 29, 26, 26, 29, 30, 65, 29, 32, 30, 65, 36, 35, 30, 35, 36, 35, 32, 32, 36, 35, 66, 30, 35, 32, 99, 38, - 38, 100, 35, 101, 36, 230, 102, 38, 36, 38, - 66, 38, 32, 94, 38, 36, 35, 464, 35, 36, - 35, 32, 32, 36, 35, 66, 228, 35, 32, 99, + 38, 100, 35, 101, 36, 513, 102, 38, 36, 38, + 66, 38, 32, 94, 38, 36, 35, 228, 35, 36, + 35, 32, 32, 36, 35, 66, 467, 35, 32, 99, 38, 38, 100, 35, 101, 36, 67, 102, 38, 36, 38, 66, 38, 39, 41, 38, 67, 39, 41, 67, - 118, 39, 41, 44, 39, 120, 122, 39, 41, 226, - 39, 464, 44, 225, 44, 310, 310, 67, 44, 224, - 44, 466, 44, 222, 39, 41, 124, 67, 39, 41, + 118, 39, 41, 44, 39, 120, 122, 39, 41, 464, + 39, 228, 44, 403, 44, 310, 310, 67, 44, 301, + 44, 230, 44, 284, 39, 41, 124, 67, 39, 41, 67, 118, 39, 41, 44, 39, 120, 122, 39, 41, 71, 39, 42, 44, 42, 44, 43, 42, 42, 44, - 43, 44, 42, 44, 43, 71, 42, 124, 112, 42, - 43, 42, 466, 43, 42, 61, 106, 61, 61, 305, - 43, 71, 509, 42, 509, 42, 61, 43, 42, 42, - 68, 43, 305, 42, 68, 43, 71, 42, 105, 75, + 43, 44, 42, 44, 43, 71, 42, 124, 282, 42, + 43, 42, 230, 43, 42, 61, 278, 61, 61, 305, + 43, 71, 463, 42, 277, 42, 61, 43, 42, 42, + 68, 43, 305, 42, 68, 43, 71, 42, 465, 75, 42, 43, 42, 74, 43, 42, 46, 46, 68, 75, 46, 43, 46, 74, 46, 70, 78, 61, 74, 46, - 78, 68, 121, 70, 76, 68, 98, 76, 76, 123, - 75, 97, 70, 121, 74, 123, 90, 46, 46, 68, - 75, 46, 89, 46, 74, 46, 70, 78, 85, 74, + 78, 68, 121, 70, 76, 68, 463, 76, 76, 123, + 75, 273, 70, 121, 74, 123, 226, 46, 46, 68, + 75, 46, 465, 46, 74, 46, 70, 78, 225, 74, 46, 78, 82, 121, 70, 76, 107, 107, 76, 76, 123, 82, 125, 70, 121, 107, 123, 82, 108, 127, 108, 108, 110, 110, 128, 129, 125, 82, 133, 108, - 134, 110, 84, 82, 297, 297, 116, 116, 297, 297, - 311, 311, 82, 125, 64, 116, 107, 58, 82, 136, - 127, 467, 467, 136, 137, 128, 129, 125, 57, 133, + 134, 110, 224, 82, 297, 297, 116, 116, 297, 297, + 311, 311, 82, 125, 222, 116, 107, 112, 82, 136, + 127, 469, 469, 136, 137, 128, 129, 125, 106, 133, 108, 134, 110, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 114, 114, 116, 130, 114, 56, + 114, 114, 114, 114, 114, 114, 116, 130, 114, 105, 136, 114, 119, 114, 136, 137, 119, 131, 131, 131, 138, 139, 141, 119, 140, 140, 142, 130, 143, 119, 142, 145, 144, 146, 148, 139, 144, 149, 130, 150, - 114, 114, 114, 119, 114, 468, 468, 119, 131, 131, + 114, 114, 114, 119, 114, 470, 470, 119, 131, 131, 131, 138, 139, 141, 119, 140, 140, 142, 130, 143, - 119, 142, 145, 144, 146, 148, 139, 144, 149, 55, + 119, 142, 145, 144, 146, 148, 139, 144, 149, 98, 150, 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 151, 153, 115, 471, 471, 115, 147, 115, + 115, 115, 151, 153, 115, 473, 473, 115, 147, 115, 147, 147, 152, 154, 147, 155, 156, 157, 158, 158, - 152, 159, 160, 161, 158, 162, 152, 472, 472, 166, - 161, 172, 50, 151, 153, 158, 115, 115, 115, 147, + 152, 159, 160, 161, 158, 162, 152, 474, 474, 166, + 161, 172, 97, 151, 153, 158, 115, 115, 115, 147, 115, 147, 147, 152, 154, 147, 155, 156, 157, 158, 158, 152, 159, 160, 161, 158, 162, 152, 165, 163, @@ -1815,18 +1814,18 @@ static const flex_int16_t yy_chk[4072] = 163, 174, 175, 171, 165, 165, 170, 176, 177, 178, 179, 180, 181, 182, 183, 182, 163, 169, 163, 169, 169, 173, 170, 163, 174, 169, 171, 171, 171, 175, - 184, 185, 174, 175, 171, 188, 191, 49, 176, 177, + 184, 185, 174, 175, 171, 188, 191, 90, 176, 177, 178, 179, 180, 181, 182, 183, 182, 186, 187, 192, 186, 189, 193, 194, 187, 195, 189, 186, 190, 190, - 48, 184, 185, 197, 190, 198, 188, 191, 190, 190, - 200, 190, 201, 19, 199, 202, 516, 516, 186, 187, + 89, 184, 185, 197, 190, 198, 188, 191, 190, 190, + 200, 190, 201, 85, 199, 202, 519, 519, 186, 187, 192, 186, 189, 193, 194, 187, 195, 189, 186, 190, 190, 196, 196, 205, 197, 190, 198, 203, 199, 190, 190, 200, 190, 201, 196, 199, 202, 204, 203, 204, 206, 207, 210, 212, 213, 204, 214, 215, 206, 216, 217, 218, 196, 196, 205, 219, 220, 221, 203, 199, - 206, 13, 510, 241, 510, 196, 242, 0, 204, 203, + 206, 84, 511, 241, 511, 196, 242, 64, 204, 203, 204, 206, 207, 210, 212, 213, 204, 214, 215, 206, 216, 217, 218, 231, 231, 243, 219, 220, 221, 233, @@ -1837,33 +1836,33 @@ static const flex_int16_t yy_chk[4072] = 257, 268, 244, 245, 247, 232, 246, 246, 248, 235, 249, 250, 251, 252, 253, 254, 255, 270, 258, 259, 257, 260, 262, 249, 271, 257, 264, 265, 266, 267, - 272, 257, 268, 269, 274, 269, 0, 276, 292, 275, - 309, 309, 294, 0, 309, 309, 521, 521, 270, 0, + 272, 257, 268, 269, 274, 269, 58, 276, 292, 275, + 309, 309, 294, 57, 309, 309, 56, 512, 270, 512, - 296, 296, 522, 522, 295, 271, 302, 304, 276, 296, - 0, 272, 274, 312, 269, 274, 269, 275, 276, 292, + 296, 296, 524, 524, 295, 271, 302, 304, 276, 296, + 55, 272, 274, 312, 269, 274, 269, 275, 276, 292, 275, 291, 291, 294, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 293, 295, 313, 302, 304, 291, 296, 291, 308, 308, 312, 314, 315, 316, 317, 318, 319, 308, 293, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 293, 332, 313, 291, 291, - 291, 0, 291, 698, 698, 0, 314, 315, 316, 317, + 291, 50, 291, 525, 525, 49, 314, 315, 316, 317, 318, 319, 308, 293, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 0, 332, 335, 291, + 326, 327, 328, 329, 330, 331, 48, 332, 335, 291, 291, 291, 291, 291, 291, 291, 291, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, - 333, 336, 303, 699, 699, 303, 337, 303, 333, 335, + 333, 336, 303, 702, 702, 303, 337, 303, 333, 335, 338, 339, 340, 341, 333, 342, 344, 345, 346, 347, 348, 349, 350, 337, 351, 352, 353, 354, 356, 358, 350, 333, 336, 359, 303, 303, 303, 337, 303, 333, - 0, 338, 339, 340, 341, 333, 342, 344, 345, 346, + 19, 338, 339, 340, 341, 333, 342, 344, 345, 346, 347, 348, 349, 350, 337, 351, 352, 353, 354, 356, - 358, 350, 0, 360, 359, 303, 303, 303, 303, 303, + 358, 350, 13, 360, 359, 303, 303, 303, 303, 303, 303, 303, 303, 306, 306, 306, 306, 306, 306, 306, - 306, 306, 306, 306, 306, 306, 355, 361, 306, 733, - 733, 306, 362, 306, 360, 363, 355, 364, 365, 367, + 306, 306, 306, 306, 306, 306, 355, 361, 306, 703, + 703, 306, 362, 306, 360, 363, 355, 364, 365, 367, 368, 369, 370, 371, 368, 372, 373, 374, 376, 375, 377, 378, 379, 380, 381, 382, 383, 355, 361, 375, 306, 306, 306, 362, 306, 0, 363, 355, 364, 365, @@ -1871,7 +1870,7 @@ static const flex_int16_t yy_chk[4072] = 375, 377, 378, 379, 380, 381, 382, 383, 0, 384, 375, 306, 306, 306, 306, 306, 306, 306, 306, 307, 307, 386, 307, 307, 307, 307, 307, 307, 307, 307, - 307, 307, 387, 389, 390, 944, 944, 307, 390, 307, + 307, 307, 387, 389, 390, 737, 737, 307, 390, 307, 384, 391, 392, 394, 395, 396, 397, 398, 307, 399, 400, 401, 386, 404, 405, 406, 407, 408, 409, 406, @@ -1881,8 +1880,8 @@ static const flex_int16_t yy_chk[4072] = 406, 410, 411, 412, 413, 415, 0, 307, 307, 307, 307, 307, 307, 307, 307, 388, 388, 0, 388, 414, 388, 388, 417, 388, 410, 418, 388, 419, 413, 388, - 414, 420, 410, 388, 388, 413, 415, 388, 0, 0, - 421, 0, 422, 0, 0, 423, 388, 388, 416, 388, + 414, 420, 410, 388, 388, 413, 415, 388, 0, 740, + 421, 740, 422, 949, 949, 423, 388, 388, 416, 388, 414, 388, 388, 417, 388, 416, 418, 388, 419, 413, 388, 414, 420, 424, 388, 388, 425, 426, 388, 393, @@ -1893,269 +1892,265 @@ static const flex_int16_t yy_chk[4072] = 444, 428, 429, 431, 430, 432, 433, 445, 393, 393, 434, 435, 393, 436, 437, 446, 430, 439, 447, 448, 440, 449, 450, 441, 451, 442, 453, 452, 443, 451, - 454, 444, 452, 455, 458, 461, 469, 469, 445, 470, - - 470, 473, 454, 470, 470, 469, 446, 474, 475, 447, - 448, 476, 449, 450, 477, 451, 478, 453, 452, 479, - 451, 454, 480, 452, 455, 458, 461, 481, 482, 483, - 484, 485, 473, 454, 486, 487, 469, 488, 474, 475, - 489, 490, 476, 491, 492, 477, 493, 478, 494, 496, - 479, 497, 498, 480, 499, 500, 501, 502, 481, 482, - 483, 484, 485, 503, 504, 486, 487, 505, 488, 506, - 0, 489, 490, 508, 491, 492, 507, 493, 506, 494, - 496, 511, 497, 498, 512, 499, 500, 501, 502, 507, - 514, 515, 519, 520, 503, 504, 523, 524, 505, 525, - - 506, 508, 526, 527, 508, 529, 530, 507, 531, 532, - 533, 534, 511, 535, 537, 512, 538, 539, 540, 541, - 542, 514, 515, 519, 520, 544, 545, 523, 524, 543, - 525, 546, 547, 526, 527, 538, 529, 530, 543, 531, - 532, 533, 534, 548, 535, 537, 549, 538, 539, 540, - 541, 542, 550, 551, 552, 553, 544, 545, 554, 555, - 543, 556, 546, 547, 557, 558, 538, 559, 560, 543, - 562, 563, 564, 565, 548, 566, 567, 549, 568, 569, - 571, 572, 573, 550, 551, 552, 553, 574, 575, 554, - 555, 576, 556, 577, 578, 557, 558, 579, 559, 560, - - 580, 562, 563, 564, 565, 581, 566, 567, 582, 568, - 569, 571, 572, 573, 583, 584, 585, 587, 574, 575, - 588, 590, 576, 589, 577, 578, 591, 592, 579, 593, - 589, 580, 594, 595, 597, 598, 581, 599, 601, 582, - 602, 603, 598, 604, 605, 583, 584, 585, 587, 606, - 607, 588, 590, 608, 589, 610, 611, 591, 592, 612, - 593, 589, 613, 594, 595, 597, 598, 614, 599, 601, - 609, 602, 603, 598, 604, 605, 609, 615, 616, 617, - 606, 607, 618, 619, 608, 620, 610, 611, 609, 621, - 612, 622, 624, 613, 623, 625, 626, 627, 614, 628, - - 623, 609, 630, 632, 634, 635, 636, 609, 615, 616, - 617, 633, 623, 618, 619, 633, 620, 637, 638, 609, - 621, 639, 622, 624, 640, 623, 625, 626, 627, 641, - 628, 623, 642, 630, 632, 634, 635, 636, 643, 644, - 645, 646, 633, 623, 647, 648, 633, 650, 637, 638, - 651, 649, 639, 652, 653, 640, 649, 654, 655, 656, - 641, 657, 658, 642, 659, 660, 661, 662, 663, 643, - 644, 645, 646, 664, 665, 647, 648, 666, 650, 667, - 668, 651, 649, 669, 652, 653, 670, 649, 654, 655, - 656, 671, 657, 658, 672, 659, 660, 661, 662, 663, - - 673, 674, 675, 676, 664, 665, 679, 681, 666, 677, - 667, 668, 682, 677, 669, 683, 679, 670, 684, 685, - 687, 688, 671, 689, 690, 672, 691, 692, 693, 694, - 695, 673, 674, 675, 676, 701, 702, 679, 681, 703, - 677, 704, 705, 682, 677, 706, 683, 679, 707, 684, - 685, 687, 688, 708, 689, 690, 709, 691, 692, 693, - 694, 695, 710, 711, 712, 713, 701, 702, 714, 715, - 703, 716, 704, 705, 717, 718, 706, 719, 720, 707, - 721, 722, 723, 724, 708, 725, 726, 709, 727, 728, - 730, 731, 0, 710, 711, 712, 713, 732, 736, 714, - - 715, 738, 716, 741, 743, 717, 718, 744, 719, 720, - 734, 721, 722, 723, 724, 746, 725, 726, 747, 727, - 728, 730, 731, 734, 749, 732, 750, 751, 732, 736, - 752, 753, 738, 754, 741, 743, 756, 757, 744, 757, - 758, 734, 759, 760, 761, 762, 746, 761, 763, 747, - 764, 765, 767, 768, 769, 749, 770, 750, 751, 773, - 775, 752, 753, 778, 754, 776, 776, 756, 757, 779, - 757, 758, 780, 759, 760, 761, 762, 781, 761, 763, - 782, 764, 765, 767, 768, 769, 783, 770, 784, 786, - 773, 775, 787, 789, 778, 790, 776, 776, 793, 794, - - 779, 0, 0, 780, 796, 797, 799, 800, 781, 802, - 803, 782, 804, 805, 806, 795, 0, 783, 809, 784, - 786, 811, 0, 787, 789, 795, 790, 812, 795, 793, - 794, 0, 795, 795, 813, 796, 797, 799, 800, 814, - 802, 803, 815, 804, 805, 806, 795, 807, 816, 809, - 807, 817, 811, 807, 818, 819, 795, 807, 812, 795, - 820, 821, 807, 795, 795, 813, 822, 823, 824, 825, - 814, 826, 827, 815, 828, 829, 830, 831, 807, 816, - 833, 807, 817, 834, 807, 818, 819, 835, 807, 836, - 837, 820, 821, 807, 838, 839, 840, 822, 823, 824, - - 825, 841, 826, 827, 842, 828, 829, 830, 831, 843, - 844, 833, 846, 848, 834, 849, 850, 851, 835, 852, - 836, 837, 853, 854, 855, 838, 839, 840, 856, 857, - 858, 859, 841, 860, 861, 842, 862, 863, 864, 865, - 843, 844, 866, 846, 848, 868, 849, 850, 851, 867, - 852, 869, 870, 853, 854, 855, 871, 873, 867, 856, - 857, 858, 859, 874, 860, 861, 875, 862, 863, 864, - 865, 872, 876, 866, 877, 878, 868, 879, 872, 880, - 867, 884, 869, 870, 885, 886, 887, 871, 873, 867, - 888, 889, 891, 883, 874, 883, 892, 875, 893, 894, - - 896, 897, 872, 876, 899, 877, 878, 898, 879, 872, - 880, 883, 884, 898, 901, 885, 886, 887, 902, 903, - 904, 888, 889, 891, 883, 907, 883, 892, 902, 893, - 894, 896, 897, 908, 909, 899, 910, 911, 898, 912, - 914, 915, 883, 916, 898, 901, 917, 918, 919, 902, - 903, 904, 920, 921, 922, 923, 907, 924, 926, 902, - 927, 928, 929, 931, 908, 909, 932, 910, 911, 933, - 912, 914, 915, 936, 916, 938, 939, 917, 918, 919, - 940, 941, 943, 920, 921, 922, 923, 947, 924, 926, - 945, 927, 928, 929, 931, 946, 948, 932, 949, 950, - - 933, 951, 952, 953, 936, 954, 938, 939, 956, 959, - 961, 940, 941, 943, 962, 963, 945, 964, 947, 946, - 965, 945, 967, 969, 970, 971, 946, 948, 972, 949, - 950, 973, 951, 952, 953, 975, 954, 976, 977, 956, - 959, 961, 978, 980, 982, 962, 963, 983, 964, 985, - 987, 965, 988, 967, 969, 970, 971, 989, 990, 972, - 993, 994, 973, 995, 996, 997, 975, 999, 976, 977, - 1000, 1001, 1002, 978, 980, 982, 1003, 1004, 983, 1005, - 985, 987, 1006, 988, 1007, 1008, 1009, 1011, 989, 990, - 1014, 993, 994, 1015, 995, 996, 997, 1010, 999, 1016, - - 1017, 1000, 1001, 1002, 1018, 1010, 1019, 1003, 1004, 1020, - 1005, 1021, 1022, 1006, 1023, 1007, 1008, 1009, 1011, 1024, - 1025, 1014, 1026, 1027, 1015, 1028, 1029, 1030, 1010, 1032, - 1016, 1017, 1034, 1035, 1036, 1018, 1010, 1019, 1037, 1038, - 1020, 1039, 1021, 1022, 1040, 1023, 1041, 1042, 1043, 1044, - 1024, 1025, 1045, 1026, 1027, 1046, 1028, 1029, 1030, 1047, - 1032, 1050, 1052, 1034, 1035, 1036, 1053, 1054, 1055, 1037, - 1038, 1056, 1039, 1057, 1058, 1040, 1063, 1041, 1042, 1043, - 1044, 1064, 1065, 1045, 1066, 1067, 1046, 1068, 1069, 1070, - 1047, 1071, 1050, 1052, 1072, 1073, 1074, 1053, 1054, 1055, - - 1075, 1076, 1056, 1078, 1057, 1058, 1079, 1063, 1080, 1081, - 1082, 1083, 1064, 1065, 1084, 1066, 1067, 1085, 1068, 1069, - 1070, 1087, 1071, 1090, 1093, 1072, 1073, 1074, 1086, 1094, - 1095, 1075, 1076, 1096, 1078, 1097, 1098, 1079, 1099, 1080, - 1081, 1082, 1083, 1100, 1086, 1084, 1101, 1102, 1085, 1103, - 1104, 1105, 1087, 1106, 1090, 1093, 1107, 1108, 1113, 1086, - 1094, 1095, 1114, 1115, 1096, 1116, 1097, 1098, 1117, 1099, - 1118, 1119, 1120, 1122, 1100, 1086, 1123, 1101, 1102, 1124, - 1103, 1104, 1105, 1125, 1106, 1126, 1127, 1107, 1108, 1113, - 1129, 1130, 1131, 1114, 1115, 1132, 1116, 1133, 1135, 1117, - - 1139, 1118, 1119, 1120, 1122, 1140, 1136, 1123, 1141, 1142, - 1124, 1143, 1144, 1145, 1125, 1146, 1126, 1127, 1147, 1148, - 1149, 1129, 1130, 1131, 1135, 1151, 1132, 1152, 1133, 1135, - 1136, 1139, 1153, 1154, 1156, 1158, 1140, 1136, 1160, 1141, - 1142, 1161, 1143, 1144, 1145, 1162, 1146, 1164, 1165, 1147, - 1148, 1149, 1167, 1168, 1169, 1170, 1151, 1171, 1152, 1172, - 1173, 1174, 1175, 1153, 1154, 1156, 1158, 1177, 1178, 1160, - 1179, 1180, 1161, 1182, 1183, 1184, 1162, 1185, 1164, 1165, - 1186, 1187, 1188, 1167, 1168, 1169, 1170, 1189, 1171, 1190, - 1172, 1173, 1174, 1175, 1192, 1193, 1195, 1196, 1177, 1178, - - 1197, 1179, 1180, 1198, 1182, 1183, 1184, 1199, 1185, 1200, - 1201, 1186, 1187, 1188, 1202, 1204, 1205, 1206, 1189, 1207, - 1190, 1208, 1210, 1211, 1212, 1192, 1193, 1195, 1196, 1213, - 1214, 1197, 1215, 1217, 1198, 1218, 1219, 1220, 1199, 1221, - 1200, 1201, 1223, 1225, 1223, 1202, 1204, 1205, 1206, 1226, - 1207, 1227, 1208, 1210, 1211, 1212, 1228, 1230, 1231, 1233, - 1213, 1214, 1235, 1215, 1217, 1236, 1218, 1219, 1220, 1226, - 1221, 1237, 1238, 1223, 1225, 1223, 1239, 1240, 1241, 1242, - 1226, 1243, 1227, 1244, 1245, 1246, 1247, 1228, 1230, 1231, - 1233, 1248, 1249, 1235, 1250, 1251, 1236, 1252, 1253, 1254, - - 1226, 1255, 1237, 1238, 1256, 1257, 1259, 1239, 1240, 1241, - 1242, 1258, 1243, 1258, 1244, 1245, 1246, 1247, 1260, 1261, - 1262, 1264, 1248, 1249, 1265, 1250, 1251, 1266, 1252, 1253, - 1254, 1267, 1255, 1268, 1271, 1256, 1257, 1259, 1272, 1273, - 1275, 1278, 1258, 1279, 1258, 1281, 1282, 1283, 1285, 1260, - 1261, 1262, 1264, 1286, 1287, 1265, 1288, 1289, 1266, 1290, - 0, 1296, 1267, 1293, 1268, 1271, 1297, 1292, 1298, 1272, - 1273, 1275, 1278, 1299, 1279, 1300, 1281, 1282, 1283, 1285, - 1293, 1302, 1303, 1304, 1286, 1287, 1305, 1288, 1289, 1306, - 1290, 1292, 1296, 1307, 1293, 1308, 1309, 1297, 1292, 1298, - - 1310, 1311, 1313, 1314, 1299, 1315, 1300, 1316, 1317, 1318, - 1319, 1321, 1302, 1303, 1304, 1322, 1323, 1305, 1324, 1326, - 1306, 1327, 1328, 1330, 1307, 1331, 1308, 1309, 1332, 1333, - 1334, 1310, 1311, 1313, 1314, 1335, 1315, 1336, 1316, 1317, - 1318, 1319, 1321, 1337, 1338, 1339, 1322, 1323, 1340, 1324, - 1326, 1341, 1327, 1328, 1330, 1342, 1331, 1343, 1344, 1332, - 1333, 1334, 1345, 1346, 1347, 1348, 1335, 1349, 1336, 1350, - 1354, 1355, 1356, 1357, 1337, 1338, 1339, 1358, 1359, 1340, - 1360, 1361, 1341, 1364, 1365, 1366, 1342, 1367, 1343, 1344, - 1368, 1369, 1370, 1345, 1346, 1347, 1348, 1372, 1349, 1373, - - 1350, 1354, 1355, 1356, 1357, 1375, 1376, 1378, 1358, 1359, - 1379, 1360, 1361, 1380, 1364, 1365, 1366, 1382, 1367, 1383, - 1384, 1368, 1369, 1370, 1385, 1386, 1388, 1390, 1372, 1391, - 1373, 1393, 1394, 1395, 1396, 1397, 1375, 1376, 1378, 1398, - 1399, 1379, 1402, 1404, 1380, 1405, 1406, 1410, 1382, 1411, - 1383, 1384, 1413, 1417, 1418, 1385, 1386, 1388, 1390, 1419, - 1391, 1421, 1393, 1394, 1395, 1396, 1397, 1422, 1426, 1424, - 1398, 1399, 1425, 1402, 1404, 1427, 1405, 1406, 1410, 1429, - 1411, 1431, 1433, 1413, 1417, 1418, 1424, 1435, 1436, 1425, - 1419, 1438, 1421, 1440, 1441, 1443, 1444, 1445, 1422, 1426, - - 1424, 1446, 1448, 1425, 1452, 1454, 1427, 1455, 1456, 1457, - 1429, 1458, 1431, 1433, 1460, 1461, 1462, 1463, 1435, 1436, - 1464, 1465, 1438, 1466, 1440, 1441, 1443, 1444, 1445, 1467, - 1468, 1469, 1446, 1448, 1470, 1452, 1454, 1472, 1455, 1456, - 1457, 1473, 1458, 1474, 1475, 1460, 1461, 1462, 1463, 1476, - 1477, 1464, 1465, 1478, 1466, 1479, 1480, 1481, 1482, 1483, - 1467, 1468, 1469, 1484, 1485, 1470, 1486, 1487, 1472, 1488, - 1489, 1490, 1473, 1491, 1474, 1475, 1492, 1493, 1494, 1495, - 1476, 1477, 1496, 1497, 1478, 1499, 1479, 1480, 1481, 1482, - 1483, 1501, 1502, 1503, 1484, 1485, 1504, 1486, 1487, 1505, - - 1488, 1489, 1490, 1506, 1491, 1507, 1511, 1492, 1493, 1494, - 1495, 1514, 1516, 1496, 1497, 1517, 1499, 1518, 1519, 1520, - 1521, 1522, 1501, 1502, 1503, 1523, 1527, 1504, 1525, 1526, - 1505, 1529, 1530, 1534, 1506, 1535, 1507, 1511, 1534, 1526, - 1539, 1540, 1514, 1516, 1543, 1525, 1517, 1547, 1518, 1519, - 1520, 1521, 1522, 1548, 1549, 1550, 1523, 1527, 1551, 1525, - 1526, 1552, 1529, 1530, 1534, 1555, 1535, 1556, 1557, 1534, - 1558, 1539, 1540, 1559, 1560, 1543, 1561, 1562, 1547, 1564, - 1565, 1566, 1567, 1568, 1548, 1549, 1550, 1569, 1570, 1551, - 1571, 1572, 1552, 1574, 1575, 1576, 1555, 1577, 1556, 1557, - - 1578, 1558, 1579, 1581, 1559, 1560, 1584, 1561, 1562, 1585, - 1564, 1565, 1566, 1567, 1568, 1587, 1591, 1593, 1569, 1570, - 1594, 1571, 1572, 1595, 1574, 1575, 1576, 1606, 1577, 1603, - 1604, 1578, 1607, 1579, 1581, 1608, 1609, 1584, 1610, 1603, - 1585, 1611, 1612, 1613, 1615, 1616, 1587, 1591, 1593, 1617, - 1604, 1594, 1618, 1619, 1595, 1624, 1625, 1626, 1606, 1629, - 1603, 1604, 1632, 1607, 1633, 1635, 1608, 1609, 1637, 1610, - 1638, 1639, 1611, 1612, 1613, 1615, 1616, 1640, 1643, 1646, - 1617, 1648, 1649, 1618, 1619, 1651, 1624, 1625, 1626, 1652, - 1629, 1653, 1652, 1632, 1655, 1633, 1635, 1656, 1657, 1637, - - 1659, 1638, 1639, 1660, 1661, 1651, 1662, 1663, 1640, 1643, - 1646, 1665, 1648, 1649, 1666, 1667, 1651, 1669, 1670, 1672, - 1652, 1673, 1653, 1677, 1678, 1655, 1679, 1680, 1656, 1657, - 1681, 1659, 1682, 1681, 1660, 1661, 1683, 1662, 1663, 1684, - 1685, 1689, 1665, 1690, 1692, 1666, 1667, 1693, 1669, 1670, - 1672, 1695, 1673, 1699, 1677, 1678, 1682, 1679, 1680, 1700, - 1701, 1681, 1702, 1682, 1703, 1705, 1706, 1683, 1708, 1709, - 1684, 1685, 1689, 1710, 1690, 1692, 1711, 1715, 1693, 1720, - 1721, 1722, 1695, 1725, 1699, 1727, 1728, 1729, 1703, 1732, - 1700, 1701, 1733, 1702, 0, 1703, 1705, 1706, 0, 1708, - - 1709, 0, 0, 0, 1710, 0, 0, 1711, 1715, 0, - 1720, 1721, 1722, 0, 1725, 0, 1727, 1728, 1729, 0, - 1732, 0, 0, 1733, 1737, 1737, 1737, 1737, 1737, 1737, - 1737, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1739, 1739, - 1739, 1739, 1739, 1739, 1739, 1740, 0, 1740, 1740, 1740, - 1740, 1740, 1741, 0, 1741, 1741, 1741, 1741, 1741, 1743, - 1743, 1743, 1743, 1743, 1743, 1743, 1744, 1744, 1744, 1744, - 1744, 1744, 1744, 1745, 0, 1745, 1745, 1745, 1745, 1745, - 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1747, 1747, 1747, - 1747, 1747, 1747, 1747, 1748, 1748, 1748, 1748, 1748, 1748, - - 1748, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1750, 1750, - 0, 0, 1750, 1750, 1751, 0, 1751, 1751, 0, 1751, - 1751, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1753, 1753, - 1753, 1753, 1753, 1753, 1753, 1754, 1754, 1754, 1754, 1754, - 1754, 1754, 1755, 1755, 0, 1755, 1755, 1755, 1755, 1756, - 1756, 1756, 0, 1756, 1756, 1756, 1757, 1757, 1757, 1757, - 1757, 1757, 1757, 1758, 0, 1758, 1758, 1758, 1758, 1758, - 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1760, 0, 1760, - 1760, 1760, 1760, 1760, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736 + 454, 444, 452, 455, 458, 461, 466, 468, 445, 471, + + 471, 0, 454, 475, 476, 477, 446, 0, 471, 447, + 448, 478, 449, 450, 479, 451, 480, 453, 452, 481, + 451, 454, 482, 452, 455, 458, 461, 472, 472, 483, + 484, 472, 472, 454, 475, 476, 477, 466, 468, 471, + 485, 486, 478, 487, 488, 479, 489, 480, 490, 491, + 481, 492, 493, 482, 494, 495, 496, 498, 499, 500, + 483, 484, 501, 502, 503, 504, 505, 506, 507, 508, + 514, 485, 486, 0, 487, 488, 515, 489, 508, 490, + 491, 510, 492, 493, 517, 494, 495, 496, 498, 499, + 500, 509, 518, 501, 502, 503, 504, 505, 506, 507, + + 508, 514, 522, 523, 509, 526, 527, 515, 528, 510, + 529, 530, 510, 532, 533, 517, 534, 535, 536, 537, + 538, 540, 509, 518, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 522, 523, 550, 526, 527, 546, 528, + 551, 529, 530, 541, 532, 533, 552, 534, 535, 536, + 537, 538, 540, 553, 554, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 555, 556, 550, 557, 558, 546, + 559, 551, 560, 561, 541, 562, 563, 552, 565, 566, + 567, 568, 569, 570, 553, 554, 571, 572, 574, 575, + 576, 577, 578, 579, 580, 555, 556, 581, 557, 558, + + 582, 559, 583, 560, 561, 584, 562, 563, 585, 565, + 566, 567, 568, 569, 570, 586, 587, 571, 572, 574, + 575, 576, 577, 578, 579, 580, 588, 590, 581, 591, + 592, 582, 593, 583, 594, 595, 584, 592, 596, 585, + 597, 598, 600, 601, 602, 604, 586, 587, 605, 606, + 601, 607, 608, 609, 610, 611, 0, 588, 590, 613, + 591, 592, 0, 593, 614, 594, 595, 615, 592, 596, + 616, 597, 598, 600, 601, 602, 604, 617, 618, 605, + 606, 601, 607, 608, 609, 610, 611, 612, 619, 620, + 613, 621, 622, 612, 623, 614, 624, 625, 615, 627, + + 628, 616, 629, 630, 631, 612, 633, 635, 617, 618, + 636, 626, 637, 638, 636, 639, 640, 626, 612, 619, + 620, 641, 621, 622, 612, 623, 642, 624, 625, 626, + 627, 628, 643, 629, 630, 631, 612, 633, 635, 644, + 645, 636, 626, 637, 638, 636, 639, 640, 626, 646, + 647, 648, 641, 649, 650, 651, 652, 642, 653, 654, + 626, 652, 655, 643, 656, 657, 658, 659, 660, 661, + 644, 645, 662, 663, 664, 665, 666, 667, 668, 669, + 646, 647, 648, 670, 649, 650, 651, 652, 671, 653, + 654, 672, 652, 655, 673, 656, 657, 658, 659, 660, + + 661, 674, 675, 662, 663, 664, 665, 666, 667, 668, + 669, 676, 677, 678, 670, 679, 680, 682, 684, 671, + 680, 685, 672, 686, 687, 673, 688, 682, 690, 691, + 692, 693, 674, 675, 694, 695, 696, 697, 698, 705, + 706, 707, 676, 677, 678, 708, 679, 680, 682, 684, + 709, 680, 685, 710, 686, 687, 711, 688, 682, 690, + 691, 692, 693, 712, 713, 694, 695, 696, 697, 698, + 705, 706, 707, 714, 715, 716, 708, 717, 718, 719, + 720, 709, 721, 722, 710, 723, 724, 711, 725, 726, + 727, 728, 729, 730, 712, 713, 731, 732, 734, 735, + + 0, 741, 738, 736, 714, 715, 716, 743, 717, 718, + 719, 720, 746, 721, 722, 738, 723, 724, 748, 725, + 726, 727, 728, 729, 730, 749, 751, 731, 732, 734, + 735, 736, 741, 738, 736, 752, 754, 755, 743, 756, + 757, 758, 759, 746, 761, 762, 763, 762, 764, 748, + 765, 766, 767, 768, 766, 769, 749, 751, 770, 772, + 773, 774, 775, 778, 780, 783, 752, 754, 755, 784, + 756, 757, 758, 759, 785, 761, 762, 763, 762, 764, + 786, 765, 766, 767, 768, 766, 769, 781, 781, 770, + 772, 773, 774, 775, 778, 780, 783, 787, 788, 789, + + 784, 791, 792, 794, 795, 785, 798, 799, 0, 801, + 802, 786, 0, 0, 804, 805, 807, 808, 781, 781, + 809, 810, 811, 814, 816, 0, 800, 817, 787, 788, + 789, 0, 791, 792, 794, 795, 800, 798, 799, 800, + 801, 802, 818, 800, 800, 804, 805, 807, 808, 819, + 820, 809, 810, 811, 814, 816, 812, 800, 817, 812, + 821, 822, 812, 823, 824, 825, 812, 800, 826, 827, + 800, 812, 828, 818, 800, 800, 829, 830, 831, 832, + 819, 820, 833, 834, 835, 836, 838, 812, 839, 840, + 812, 821, 822, 812, 823, 824, 825, 812, 841, 826, + + 827, 842, 812, 828, 843, 844, 845, 829, 830, 831, + 832, 846, 847, 833, 834, 835, 836, 838, 848, 839, + 840, 849, 851, 853, 854, 855, 856, 857, 858, 841, + 859, 860, 842, 861, 862, 843, 844, 845, 863, 864, + 865, 866, 846, 847, 867, 868, 869, 870, 871, 848, + 873, 872, 849, 851, 853, 854, 855, 856, 857, 858, + 872, 859, 860, 874, 861, 862, 875, 876, 878, 863, + 864, 865, 866, 877, 879, 867, 868, 869, 870, 871, + 877, 873, 872, 880, 881, 882, 883, 884, 885, 889, + 888, 872, 888, 890, 874, 891, 892, 875, 876, 878, + + 893, 894, 896, 897, 877, 879, 898, 899, 888, 901, + 902, 877, 904, 906, 880, 881, 882, 883, 884, 885, + 889, 888, 903, 888, 890, 907, 891, 892, 903, 908, + 909, 893, 894, 896, 897, 907, 912, 898, 899, 888, + 901, 902, 913, 904, 906, 914, 915, 916, 917, 919, + 920, 921, 922, 903, 923, 924, 907, 925, 926, 903, + 908, 909, 927, 928, 929, 931, 907, 912, 932, 933, + 934, 936, 937, 913, 938, 941, 914, 915, 916, 917, + 919, 920, 921, 922, 943, 923, 924, 944, 925, 926, + 945, 946, 948, 927, 928, 929, 931, 0, 950, 932, + + 933, 934, 936, 937, 951, 938, 941, 952, 954, 952, + 955, 956, 957, 958, 959, 943, 960, 961, 944, 963, + 966, 945, 946, 948, 950, 968, 969, 970, 951, 950, + 971, 972, 974, 976, 977, 951, 978, 979, 980, 954, + 982, 955, 956, 957, 958, 959, 983, 960, 961, 984, + 963, 966, 985, 987, 989, 990, 968, 969, 970, 992, + 994, 971, 972, 974, 976, 977, 995, 978, 979, 980, + 996, 982, 997, 1000, 1001, 1002, 1003, 983, 1004, 1006, + 984, 1007, 1008, 985, 987, 989, 990, 1009, 1010, 1011, + 992, 994, 1012, 1013, 1014, 1015, 1016, 995, 1018, 1021, + + 1017, 996, 1022, 997, 1000, 1001, 1002, 1003, 1017, 1004, + 1006, 1023, 1007, 1008, 1024, 1025, 1026, 1027, 1009, 1010, + 1011, 1028, 1029, 1012, 1013, 1014, 1015, 1016, 1030, 1018, + 1021, 1017, 1031, 1022, 1032, 1033, 1034, 1035, 1036, 1017, + 1037, 1039, 1023, 1041, 1042, 1024, 1025, 1026, 1027, 1043, + 1044, 1045, 1028, 1029, 1046, 1047, 1048, 1049, 1050, 1030, + 1051, 1052, 1053, 1031, 1054, 1032, 1033, 1034, 1035, 1036, + 1057, 1037, 1039, 1059, 1041, 1042, 1060, 1061, 1062, 1063, + 1043, 1044, 1045, 1064, 1065, 1046, 1047, 1048, 1049, 1050, + 1070, 1051, 1052, 1053, 1071, 1054, 1072, 1073, 1074, 1075, + + 1076, 1057, 1077, 1078, 1059, 1079, 1080, 1060, 1061, 1062, + 1063, 1081, 1082, 1083, 1064, 1065, 1085, 1086, 1087, 1088, + 1089, 1070, 1090, 1091, 1092, 1071, 1094, 1072, 1073, 1074, + 1075, 1076, 1097, 1077, 1078, 1100, 1079, 1080, 1101, 1102, + 1093, 1103, 1081, 1082, 1083, 1104, 1105, 1085, 1086, 1087, + 1088, 1089, 1106, 1090, 1091, 1092, 1093, 1094, 1107, 1108, + 1109, 1110, 1111, 1097, 1112, 1113, 1100, 1114, 1115, 1101, + 1102, 1093, 1103, 1120, 1121, 1122, 1104, 1105, 1123, 1124, + 1125, 1126, 1127, 1106, 1129, 1130, 1131, 1093, 1132, 1107, + 1108, 1109, 1110, 1111, 1133, 1112, 1113, 1134, 1114, 1115, + + 1136, 1137, 1138, 1139, 1120, 1121, 1122, 1140, 1147, 1123, + 1124, 1125, 1126, 1127, 1142, 1129, 1130, 1131, 1143, 1132, + 1148, 1149, 1150, 1151, 1152, 1133, 1153, 1154, 1134, 1155, + 1156, 1136, 1137, 1138, 1139, 1157, 1159, 1160, 1140, 1147, + 1142, 1161, 1143, 1162, 1164, 1142, 1166, 1168, 1169, 1143, + 1170, 1148, 1149, 1150, 1151, 1152, 1172, 1153, 1154, 1173, + 1155, 1156, 1175, 1176, 1177, 1178, 1157, 1159, 1160, 1179, + 1180, 1181, 1161, 1182, 1162, 1164, 1183, 1166, 1168, 1169, + 1185, 1170, 1186, 1187, 1188, 1190, 1191, 1172, 1192, 1193, + 1173, 1194, 1195, 1175, 1176, 1177, 1178, 1196, 1197, 1198, + + 1179, 1180, 1181, 1200, 1182, 1201, 1203, 1183, 1204, 1205, + 1206, 1185, 1207, 1186, 1187, 1188, 1190, 1191, 1208, 1192, + 1193, 1209, 1194, 1195, 1210, 1212, 1213, 1214, 1196, 1197, + 1198, 1215, 1216, 1218, 1200, 1219, 1201, 1203, 1220, 1204, + 1205, 1206, 1221, 1207, 1222, 1223, 1225, 1226, 1227, 1208, + 1228, 1229, 1209, 1233, 1234, 1210, 1212, 1213, 1214, 1231, + 1235, 1231, 1215, 1216, 1218, 1236, 1219, 1238, 1239, 1220, + 1241, 1243, 1244, 1221, 1234, 1222, 1223, 1225, 1226, 1227, + 1245, 1228, 1229, 1246, 1233, 1234, 1247, 1248, 1249, 1250, + 1231, 1235, 1231, 1251, 1252, 1253, 1236, 1254, 1238, 1239, + + 1255, 1241, 1243, 1244, 1256, 1234, 1257, 1258, 1259, 1260, + 1261, 1245, 1262, 1263, 1246, 1264, 1265, 1247, 1248, 1249, + 1250, 1266, 1267, 1266, 1251, 1252, 1253, 1268, 1254, 1269, + 1270, 1255, 1272, 1273, 1274, 1256, 1275, 1257, 1258, 1259, + 1260, 1261, 1276, 1262, 1263, 1279, 1264, 1265, 1280, 1281, + 1283, 1286, 1266, 1267, 1266, 1287, 1289, 1290, 1268, 1291, + 1269, 1270, 1293, 1272, 1273, 1274, 1294, 1275, 1295, 1296, + 1297, 1298, 1300, 1276, 1301, 1304, 1279, 1305, 1306, 1280, + 1281, 1283, 1286, 1307, 1308, 1310, 1287, 1289, 1290, 1311, + 1291, 1301, 1312, 1293, 1313, 1314, 1300, 1294, 1315, 1295, + + 1296, 1297, 1298, 1300, 1316, 1301, 1304, 1317, 1305, 1306, + 1318, 1319, 1321, 1322, 1307, 1308, 1310, 1323, 1324, 1325, + 1311, 1326, 1327, 1312, 1329, 1313, 1314, 1330, 1331, 1315, + 1332, 1334, 1335, 1336, 1338, 1316, 1339, 1340, 1317, 1341, + 1342, 1318, 1319, 1321, 1322, 1343, 1344, 1345, 1323, 1324, + 1325, 1346, 1326, 1327, 1347, 1329, 1348, 1349, 1330, 1331, + 1350, 1332, 1334, 1335, 1336, 1338, 1351, 1339, 1340, 1352, + 1341, 1342, 1353, 1354, 1355, 1356, 1343, 1344, 1345, 1357, + 1358, 1362, 1346, 1363, 1364, 1347, 1365, 1348, 1349, 1366, + 1367, 1350, 1368, 1369, 1372, 1373, 1374, 1351, 1375, 1376, + + 1352, 1377, 1378, 1353, 1354, 1355, 1356, 1380, 1381, 1383, + 1357, 1358, 1362, 1384, 1363, 1364, 1386, 1365, 1387, 1388, + 1366, 1367, 1390, 1368, 1369, 1372, 1373, 1374, 1391, 1375, + 1376, 1392, 1377, 1378, 1393, 1394, 1396, 1398, 1380, 1381, + 1383, 1399, 1401, 1402, 1384, 1403, 1404, 1386, 1405, 1387, + 1388, 1406, 1407, 1390, 1410, 1412, 1413, 1414, 1418, 1391, + 1419, 1421, 1392, 1425, 1426, 1393, 1394, 1396, 1398, 1427, + 1429, 1430, 1399, 1401, 1402, 1434, 1403, 1404, 1435, 1405, + 1432, 1433, 1406, 1407, 1437, 1410, 1412, 1413, 1414, 1418, + 1439, 1419, 1421, 1441, 1425, 1426, 1443, 1432, 1433, 1444, + + 1427, 1429, 1430, 1446, 1448, 1449, 1434, 1451, 1452, 1435, + 1453, 1432, 1433, 1454, 1456, 1437, 1460, 1462, 1463, 1464, + 1465, 1439, 1466, 1468, 1441, 1469, 1470, 1443, 1471, 1472, + 1444, 1473, 1474, 1475, 1446, 1448, 1449, 1476, 1451, 1452, + 1477, 1453, 1478, 1480, 1454, 1456, 1481, 1460, 1462, 1463, + 1464, 1465, 1482, 1466, 1468, 1483, 1469, 1470, 1484, 1471, + 1472, 1485, 1473, 1474, 1475, 1486, 1487, 1488, 1476, 1489, + 1490, 1477, 1491, 1478, 1480, 1492, 1493, 1481, 1494, 1495, + 1496, 1497, 1498, 1482, 1499, 1500, 1483, 1501, 1502, 1484, + 1503, 1504, 1485, 1505, 1507, 1509, 1486, 1487, 1488, 1510, + + 1489, 1490, 1511, 1491, 1512, 1513, 1492, 1493, 1514, 1494, + 1495, 1496, 1497, 1498, 1515, 1499, 1500, 1519, 1501, 1502, + 1522, 1503, 1504, 1524, 1505, 1507, 1509, 1525, 1526, 1527, + 1510, 1528, 1529, 1511, 1530, 1512, 1513, 1531, 1533, 1514, + 1534, 1535, 1537, 1538, 1542, 1515, 1543, 1547, 1519, 1542, + 1534, 1522, 1548, 1551, 1524, 1533, 1555, 1556, 1525, 1526, + 1527, 1557, 1528, 1529, 1558, 1530, 1559, 1560, 1531, 1533, + 1563, 1534, 1535, 1537, 1538, 1542, 1564, 1543, 1547, 1565, + 1542, 1566, 1567, 1548, 1551, 1568, 1569, 1555, 1556, 1570, + 1572, 1573, 1557, 1574, 1575, 1558, 1576, 1559, 1560, 1577, + + 1578, 1563, 1579, 1580, 1582, 1583, 1584, 1564, 1585, 1586, + 1565, 1587, 1566, 1567, 1589, 1592, 1568, 1569, 1593, 1595, + 1570, 1572, 1573, 1599, 1574, 1575, 1601, 1576, 1602, 1603, + 1577, 1578, 1612, 1579, 1580, 1582, 1583, 1584, 1611, 1585, + 1586, 1614, 1587, 1615, 1616, 1589, 1592, 1617, 1611, 1593, + 1595, 1618, 1612, 1619, 1599, 1620, 1621, 1601, 1623, 1602, + 1603, 1624, 1625, 1612, 1626, 1627, 1632, 1633, 1634, 1611, + 1637, 1640, 1614, 1641, 1615, 1616, 1643, 1645, 1617, 1646, + 1647, 1648, 1618, 1651, 1619, 1654, 1620, 1621, 1656, 1623, + 1657, 1660, 1624, 1625, 1660, 1626, 1627, 1632, 1633, 1634, + + 1659, 1637, 1640, 1661, 1641, 1663, 1664, 1643, 1645, 1665, + 1646, 1647, 1648, 1667, 1651, 1668, 1654, 1669, 1670, 1656, + 1659, 1657, 1660, 1671, 1673, 1674, 1675, 1677, 1678, 1680, + 1681, 1659, 1685, 1686, 1661, 1687, 1663, 1664, 1688, 1689, + 1665, 1690, 1689, 1691, 1667, 1692, 1668, 1693, 1669, 1670, + 1697, 1698, 1700, 1701, 1671, 1673, 1674, 1675, 1677, 1678, + 1680, 1681, 1703, 1685, 1686, 1690, 1687, 1707, 1708, 1688, + 1689, 1709, 1690, 1710, 1691, 1713, 1692, 1711, 1693, 1714, + 1716, 1697, 1698, 1700, 1701, 1717, 1718, 1719, 1723, 1728, + 1729, 1730, 1733, 1703, 1735, 1736, 1737, 1740, 1707, 1708, + + 1741, 1711, 1709, 0, 1710, 0, 1713, 0, 1711, 0, + 1714, 1716, 0, 0, 0, 0, 1717, 1718, 1719, 1723, + 1728, 1729, 1730, 1733, 0, 1735, 1736, 1737, 1740, 0, + 0, 1741, 1745, 1745, 1745, 1745, 1745, 1746, 1746, 1746, + 1746, 1746, 1747, 1747, 1747, 1747, 1747, 1748, 0, 1748, + 1748, 1748, 1749, 0, 1749, 1749, 1749, 1751, 1751, 1751, + 1751, 1751, 1752, 1752, 1752, 1752, 1752, 1753, 0, 1753, + 1753, 1753, 1754, 1754, 1754, 1754, 1754, 1755, 1755, 1755, + 1755, 1755, 1756, 1756, 1756, 1756, 1756, 1757, 1757, 1757, + 1757, 1757, 1758, 1758, 0, 1758, 1758, 1759, 0, 1759, + + 0, 1759, 1760, 1760, 1760, 1760, 1760, 1761, 1761, 1761, + 1761, 1761, 1762, 1762, 1762, 1762, 1762, 1763, 1763, 1763, + 1763, 1763, 1764, 1764, 1764, 1764, 1764, 1765, 1765, 1765, + 1765, 1765, 1766, 0, 1766, 1766, 1766, 1767, 1767, 1767, + 1767, 1767, 1768, 0, 1768, 1768, 1768, 1769, 1769, 1769, + 1769, 1769, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744 } ; static yy_state_type yy_last_accepting_state; @@ -2285,9 +2280,9 @@ int include_lineno[MAX_INCLUDE_DEPTH]; int include_stack_ptr = 0; char path[MS_MAXPATHLEN]; -#line 2289 "src/maplexer.c" +#line 2283 "src/maplexer.c" -#line 2291 "src/maplexer.c" +#line 2285 "src/maplexer.c" #define INITIAL 0 #define EXPRESSION_STRING 1 @@ -2567,7 +2562,7 @@ YY_DECL break; } -#line 2571 "src/maplexer.c" +#line 2565 "src/maplexer.c" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -2594,13 +2589,13 @@ YY_DECL while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1737 ) + if ( yy_current_state >= 1745 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 1736 ); + while ( yy_current_state != 1744 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); @@ -4264,27 +4259,28 @@ YY_RULE_SETUP MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); + msStringUnescape(msyystring_buffer, ']'); return(MS_TOKEN_BINDING_DOUBLE); } YY_BREAK case 325: /* rule 325 can match eol */ YY_RULE_SETUP -#line 552 "src/maplexer.l" +#line 553 "src/maplexer.l" { /* attribute binding - string (single or double quotes) */ - msyytext+=2; - msyytext[msyyleng-2-2] = '\0'; + msyytext[msyyleng-2] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); - strcpy(msyystring_buffer, msyytext); + strcpy(msyystring_buffer, msyytext + 2); + msStringUnescape(msyystring_buffer, msyytext[0]); return(MS_TOKEN_BINDING_STRING); } YY_BREAK case 326: /* rule 326 can match eol */ YY_RULE_SETUP -#line 561 "src/maplexer.l" +#line 562 "src/maplexer.l" { /* attribute binding - time */ msyytext+=2; @@ -4292,12 +4288,13 @@ YY_RULE_SETUP MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); + msStringUnescape(msyystring_buffer, '`'); return(MS_TOKEN_BINDING_TIME); } YY_BREAK case 327: YY_RULE_SETUP -#line 571 "src/maplexer.l" +#line 573 "src/maplexer.l" { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); @@ -4308,7 +4305,7 @@ YY_RULE_SETUP YY_BREAK case 328: YY_RULE_SETUP -#line 579 "src/maplexer.l" +#line 581 "src/maplexer.l" { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); @@ -4320,7 +4317,7 @@ YY_RULE_SETUP case 329: /* rule 329 can match eol */ YY_RULE_SETUP -#line 587 "src/maplexer.l" +#line 589 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; @@ -4333,7 +4330,7 @@ YY_RULE_SETUP case 330: /* rule 330 can match eol */ YY_RULE_SETUP -#line 596 "src/maplexer.l" +#line 598 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-2] = '\0'; @@ -4346,7 +4343,7 @@ YY_RULE_SETUP case 331: /* rule 331 can match eol */ YY_RULE_SETUP -#line 605 "src/maplexer.l" +#line 607 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; @@ -4358,7 +4355,7 @@ YY_RULE_SETUP YY_BREAK case 332: YY_RULE_SETUP -#line 614 "src/maplexer.l" +#line 616 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; @@ -4370,7 +4367,7 @@ YY_RULE_SETUP YY_BREAK case 333: YY_RULE_SETUP -#line 623 "src/maplexer.l" +#line 625 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; @@ -4382,7 +4379,7 @@ YY_RULE_SETUP YY_BREAK case 334: YY_RULE_SETUP -#line 632 "src/maplexer.l" +#line 634 "src/maplexer.l" { msyystring_return_state = MS_STRING; msyystring_begin = msyytext[0]; @@ -4393,7 +4390,7 @@ YY_RULE_SETUP YY_BREAK case 335: YY_RULE_SETUP -#line 640 "src/maplexer.l" +#line 642 "src/maplexer.l" { if (msyystring_begin == msyytext[0]) { BEGIN(msyystring_begin_state); @@ -4422,7 +4419,7 @@ YY_RULE_SETUP YY_BREAK case 336: YY_RULE_SETUP -#line 666 "src/maplexer.l" +#line 668 "src/maplexer.l" { ++msyystring_size; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyystring_size, @@ -4438,7 +4435,7 @@ YY_RULE_SETUP case 337: /* rule 337 can match eol */ YY_RULE_SETUP -#line 678 "src/maplexer.l" +#line 680 "src/maplexer.l" { int old_size = msyystring_size; msyystring_size += msyyleng; @@ -4450,7 +4447,7 @@ YY_RULE_SETUP case 338: /* rule 338 can match eol */ YY_RULE_SETUP -#line 686 "src/maplexer.l" +#line 688 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; @@ -4479,7 +4476,7 @@ YY_RULE_SETUP YY_BREAK case 339: YY_RULE_SETUP -#line 712 "src/maplexer.l" +#line 714 "src/maplexer.l" { msyystring_return_state = MS_TOKEN_LITERAL_STRING; msyystring_begin = msyytext[0]; @@ -4490,7 +4487,7 @@ YY_RULE_SETUP YY_BREAK case 340: YY_RULE_SETUP -#line 720 "src/maplexer.l" +#line 722 "src/maplexer.l" { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); @@ -4501,12 +4498,12 @@ YY_RULE_SETUP case 341: /* rule 341 can match eol */ YY_RULE_SETUP -#line 727 "src/maplexer.l" +#line 729 "src/maplexer.l" { msyylineno++; } YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(CONFIG_FILE): -#line 729 "src/maplexer.l" +#line 731 "src/maplexer.l" { if( --include_stack_ptr < 0 ) return(EOF); /* end of main file */ @@ -4521,14 +4518,14 @@ case YY_STATE_EOF(CONFIG_FILE): case 342: /* rule 342 can match eol */ YY_RULE_SETUP -#line 740 "src/maplexer.l" +#line 742 "src/maplexer.l" { return(0); } YY_BREAK case 343: YY_RULE_SETUP -#line 744 "src/maplexer.l" +#line 746 "src/maplexer.l" { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); @@ -4538,15 +4535,15 @@ YY_RULE_SETUP YY_BREAK case 344: YY_RULE_SETUP -#line 750 "src/maplexer.l" +#line 752 "src/maplexer.l" { return(msyytext[0]); } YY_BREAK case 345: YY_RULE_SETUP -#line 751 "src/maplexer.l" +#line 753 "src/maplexer.l" ECHO; YY_BREAK -#line 4550 "src/maplexer.c" +#line 4546 "src/maplexer.c" case YY_STATE_EOF(EXPRESSION_STRING): case YY_STATE_EOF(INCLUDE): case YY_STATE_EOF(MSSTRING): @@ -4847,7 +4844,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1737 ) + if ( yy_current_state >= 1745 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -4875,11 +4872,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1737 ) + if ( yy_current_state >= 1745 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1736); + yy_is_jam = (yy_current_state == 1744); return yy_is_jam ? 0 : yy_current_state; } @@ -5555,7 +5552,7 @@ void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 751 "src/maplexer.l" +#line 753 "src/maplexer.l" /* diff --git a/src/maplexer.l b/src/maplexer.l index 8980475c8c..828425c891 100644 --- a/src/maplexer.l +++ b/src/maplexer.l @@ -539,31 +539,33 @@ char path[MS_MAXPATHLEN]; /* attribute binding - data cellsize */ return(MS_TOKEN_BINDING_DATA_CELLSIZE); } -\[[^\]]*\] { +\[(?:\]\]|[^\]])*\] { /* attribute binding - numeric (no quotes) */ msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); + msStringUnescape(msyystring_buffer, ']'); return(MS_TOKEN_BINDING_DOUBLE); } -\"\[[^\"]*\]\"|\'\[[^\']*\]\' { +\"\[(?:\"\"|[^\"])*\]\"|\'\[(?:\'\'|[^\'])*\]\' { /* attribute binding - string (single or double quotes) */ - msyytext+=2; - msyytext[msyyleng-2-2] = '\0'; + msyytext[msyyleng-2] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); - strcpy(msyystring_buffer, msyytext); + strcpy(msyystring_buffer, msyytext + 2); + msStringUnescape(msyystring_buffer, msyytext[0]); return(MS_TOKEN_BINDING_STRING); } -\`\[[^\`]*\]\` { +\`\[(?:\`\`|[^\`])*\]\` { /* attribute binding - time */ msyytext+=2; msyytext[msyyleng-2-2] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); + msStringUnescape(msyystring_buffer, '`'); return(MS_TOKEN_BINDING_TIME); } diff --git a/src/mapogcfiltercommon.cpp b/src/mapogcfiltercommon.cpp index 28d26bbda1..6e1d2dd971 100644 --- a/src/mapogcfiltercommon.cpp +++ b/src/mapogcfiltercommon.cpp @@ -34,6 +34,20 @@ #include +static std::string FLTEscapePropertyName(const char *pszStr, + char chEscapeChar) { + std::string ret; + for (; *pszStr; ++pszStr) { + if (*pszStr == chEscapeChar) { + ret += chEscapeChar; + ret += chEscapeChar; + } else { + ret += *pszStr; + } + } + return ret; +} + static std::string FLTGetIsLikeComparisonCommonExpression(FilterEncodingNode *psFilterNode) { /* From @@ -63,7 +77,7 @@ FLTGetIsLikeComparisonCommonExpression(FilterEncodingNode *psFilterNode) { std::string expr("(\"["); /* attribute */ - expr += psFilterNode->psLeftNode->pszValue; + expr += FLTEscapePropertyName(psFilterNode->psLeftNode->pszValue, '"'); /* #3521 */ if (bCaseInsensitive) @@ -177,7 +191,8 @@ FLTGetIsBetweenComparisonCommonExpresssion(FilterEncodingNode *psFilterNode, else expr += "(["; - expr += psFilterNode->psLeftNode->pszValue; + expr += FLTEscapePropertyName(psFilterNode->psLeftNode->pszValue, + bString ? '"' : ']'); if (bString) expr += "]\" "; @@ -268,7 +283,9 @@ FLTGetBinaryComparisonCommonExpression(FilterEncodingNode *psFilterNode, expr = "(\"["; else expr = "(["; - expr += psFilterNode->psLeftNode->pszValue; + + expr += FLTEscapePropertyName(psFilterNode->psLeftNode->pszValue, + bString ? '"' : ']'); if (bString) expr += "]\" "; @@ -562,13 +579,13 @@ FLTGetFeatureIdCommonExpression(FilterEncodingNode *psFilterNode, if (bString) { expr += "(\"["; - expr += pszAttribute; + expr += FLTEscapePropertyName(pszAttribute, '"'); expr += "]\" == \""; expr += pszId; expr += "\")"; } else { expr += "(["; - expr += pszAttribute; + expr += FLTEscapePropertyName(pszAttribute, ']'); expr += "] == "; expr += pszId; expr += ")"; diff --git a/src/mapogr.cpp b/src/mapogr.cpp index 97f8d42d5f..2c8c55f540 100644 --- a/src/mapogr.cpp +++ b/src/mapogr.cpp @@ -1981,7 +1981,7 @@ static char *msOGRGetToken(layerObj *layer, tokenListNodeObjPtr *node) { break; } case MS_TOKEN_BINDING_INTEGER: { - char *stresc = msOGRGetQuotedItem(layer, n->tokenval.bindval.item); + char *stresc = msLayerEscapePropertyName(layer, n->tokenval.bindval.item); nOutSize = strlen(stresc) + 20; out = (char *)msSmallMalloc(nOutSize); @@ -1989,15 +1989,15 @@ static char *msOGRGetToken(layerObj *layer, tokenListNodeObjPtr *node) { // Do not cast if the variable is of the appropriate type as it can // prevent using database indexes, such as for SQlite if (bIsNumeric) { - snprintf(out, nOutSize, "%s", stresc); + snprintf(out, nOutSize, "\"%s\"", stresc); } else { - snprintf(out, nOutSize, "CAST(%s AS integer)", stresc); + snprintf(out, nOutSize, "CAST(\"%s\" AS integer)", stresc); } msFree(stresc); break; } case MS_TOKEN_BINDING_STRING: { - char *stresc = msOGRGetQuotedItem(layer, n->tokenval.bindval.item); + char *stresc = msLayerEscapePropertyName(layer, n->tokenval.bindval.item); nOutSize = strlen(stresc) + 30; out = (char *)msSmallMalloc(nOutSize); @@ -2006,24 +2006,24 @@ static char *msOGRGetToken(layerObj *layer, tokenListNodeObjPtr *node) { // Do not cast if the variable is of the appropriate type as it can // prevent using database indexes, such as for SQlite if (bIsCharacter) { - snprintf(out, nOutSize, "%s", stresc); + snprintf(out, nOutSize, "\"%s\"", stresc); } else { - snprintf(out, nOutSize, "CAST(%s AS text)", stresc); + snprintf(out, nOutSize, "CAST(\"%s\" AS text)", stresc); } msFree(stresc); break; } case MS_TOKEN_BINDING_TIME: { // won't get here unless col is parsed as time and they are not - char *stresc = msOGRGetQuotedItem(layer, n->tokenval.bindval.item); + char *stresc = msLayerEscapePropertyName(layer, n->tokenval.bindval.item); nOutSize = strlen(stresc) + 10; out = (char *)msSmallMalloc(nOutSize); - snprintf(out, nOutSize, "%s", stresc); + snprintf(out, nOutSize, "\"%s\"", stresc); msFree(stresc); break; } case MS_TOKEN_BINDING_SHAPE: { - char *stresc = msOGRGetQuotedItem( + char *stresc = msLayerEscapePropertyName( layer, OGR_L_GetGeometryColumn(info->hLayer)); // which geom field?? nOutSize = strlen(stresc) + 10; out = (char *)msSmallMalloc(nOutSize); @@ -3600,8 +3600,11 @@ msOGRTranslatePartialInternal(layerObj *layer, const msExprNode *expr, case MS_TOKEN_BINDING_INTEGER: case MS_TOKEN_BINDING_STRING: case MS_TOKEN_BINDING_TIME: { - char *pszTmp = msOGRGetQuotedItem(layer, expr->m_osVal.c_str()); - std::string osRet(pszTmp); + char *pszTmp = msLayerEscapePropertyName(layer, expr->m_osVal.c_str()); + std::string osRet; + osRet += '"'; + osRet += pszTmp; + osRet += '"'; msFree(pszTmp); return osRet; } diff --git a/src/mapserver.h b/src/mapserver.h index d86245fe8b..6239f4e109 100644 --- a/src/mapserver.h +++ b/src/mapserver.h @@ -2895,6 +2895,7 @@ MS_DLL_EXPORT int msUTF8ToUniChar(const char *str, MS_DLL_EXPORT char *msStringEscape(const char *pszString); MS_DLL_EXPORT int msStringInArray(const char *pszString, char **array, int numelements); +void msStringUnescape(char *pszString, char chEscapeChar); typedef struct msStringBuffer msStringBuffer; MS_DLL_EXPORT msStringBuffer *msStringBufferAlloc(void); diff --git a/src/mapstring.cpp b/src/mapstring.cpp index 9f076148f6..14e3e45470 100644 --- a/src/mapstring.cpp +++ b/src/mapstring.cpp @@ -2528,3 +2528,24 @@ int msStringBufferAppend(msStringBuffer *sb, const char *pszAppendedString) { sb->length += nAppendLen; return MS_SUCCESS; } + +/************************************************************************/ +/* msStringUnescape() */ +/************************************************************************/ + +/** Modify in place pszString such that a sequence of two consecutive + * chEscapeChar is replaced by a single one. + * Does the reverse of FLTEscapePropertyName() + */ +void msStringUnescape(char *pszString, char chEscapeChar) { + char *pszDest = pszString; + for (; *pszString; ++pszString, ++pszDest) { + if (pszString[0] == chEscapeChar && pszString[1] == chEscapeChar) { + *pszDest = chEscapeChar; + ++pszString; + } else { + *pszDest = *pszString; + } + } + *pszDest = 0; +} From b23d85c90ca3760ac1c02e6ae08f017930144586 Mon Sep 17 00:00:00 2001 From: Jeff McKenna Date: Fri, 19 Sep 2025 14:20:15 -0300 Subject: [PATCH 41/53] update for 8.4.1 release --- CMakeLists.txt | 2 +- HISTORY.md | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 578081f005..f324dbd224 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,7 +17,7 @@ include(CheckCSourceCompiles) set (MapServer_VERSION_MAJOR 8) set (MapServer_VERSION_MINOR 4) -set (MapServer_VERSION_REVISION 0) +set (MapServer_VERSION_REVISION 1) set (MapServer_VERSION_SUFFIX "") # Set C++ version diff --git a/HISTORY.md b/HISTORY.md index 7d43b9ce54..8d0f072601 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -13,6 +13,15 @@ https://mapserver.org/development/changelog/ The online Migration Guide can be found at https://mapserver.org/MIGRATION_GUIDE.html +8.2.1 release (2025-09-19) +-------------------------- + +- security: Add missing column name escaping for WFS filters through OGR (#7349) + +- fix opacity for gradient legend symbol (#7255) + +see detailed changelog for other fixes + 8.4.0 release (2025-01-15) -------------------------- From 279f25cf39363053e51ac918f19e1b101406f34a Mon Sep 17 00:00:00 2001 From: Jeff McKenna Date: Fri, 19 Sep 2025 14:24:44 -0300 Subject: [PATCH 42/53] update history --- HISTORY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 8d0f072601..def087de53 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -13,7 +13,7 @@ https://mapserver.org/development/changelog/ The online Migration Guide can be found at https://mapserver.org/MIGRATION_GUIDE.html -8.2.1 release (2025-09-19) +8.4.1 release (2025-09-19) -------------------------- - security: Add missing column name escaping for WFS filters through OGR (#7349) From 8aee3abb724d80d5eab90d2a0d718e31b9756712 Mon Sep 17 00:00:00 2001 From: Jeff McKenna Date: Fri, 19 Sep 2025 14:26:46 -0300 Subject: [PATCH 43/53] update history --- HISTORY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index def087de53..8b836f3f37 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -16,7 +16,7 @@ The online Migration Guide can be found at https://mapserver.org/MIGRATION_GUIDE 8.4.1 release (2025-09-19) -------------------------- -- security: Add missing column name escaping for WFS filters through OGR (#7349) +- security: add missing column name escaping for WFS filters through OGR (#7349) - fix opacity for gradient legend symbol (#7255) From 0945d60948cb20a80bc26330e096894bd6ced5d7 Mon Sep 17 00:00:00 2001 From: Jeff McKenna Date: Fri, 19 Sep 2025 15:55:52 -0300 Subject: [PATCH 44/53] update for 8.4.1 release --- CITATION.cff | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index 232a577d18..f677f2b085 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,8 +1,8 @@ cff-version: 1.2.0 title: MapServer message: If you use this software, please cite it using the metadata from this file. -version: 8.4.0 -date-released: 2025-01-15 +version: 8.4.1 +date-released: 2025-09-19 abstract: MapServer is an Open Source platform for publishing spatial data and interactive mapping applications to the web. type: software authors: From fb61d7d4686c9ea785cc9698d52d1718d8461590 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 29 Sep 2025 22:12:03 +0200 Subject: [PATCH 45/53] [Backport branch-8-4] Fix(parser): Prevent crash with non-existent layer in REQUIRES (#7355) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix(parser): Prevent crash with non-existent layer in REQUIRES When a REQUIRES or LABELREQUIRES expression contains a reference to a layer that does not exist in the mapfile, the expression parser would treat it as an attribute binding. Since msEvalContext is called without a shape object, this would lead to a NULL pointer dereference and a crash when the parser tried to evaluate the binding. This patch adds a check after tokenizing the expression to ensure no attribute binding tokens are present. If any are found, it indicates a reference to a non-existent layer. An error is reported and the evaluation returns MS_FALSE, preventing the crash. Fix generated by gemini-2.5-pro * Add tests with non existant REQUIRES parameter triggering a failure --------- Co-authored-by: Māris Nartišs --- msautotest/query/context.map | 14 +++++++++++++ msautotest/query/expected/context_test004.png | Bin 0 -> 1060 bytes msautotest/query/expected/context_test005.png | Bin 0 -> 25117 bytes src/maputil.c | 19 ++++++++++++++++++ 4 files changed, 33 insertions(+) create mode 100644 msautotest/query/expected/context_test004.png create mode 100644 msautotest/query/expected/context_test005.png diff --git a/msautotest/query/context.map b/msautotest/query/context.map index 3cc1c8a988..ae67ba9982 100644 --- a/msautotest/query/context.map +++ b/msautotest/query/context.map @@ -6,6 +6,8 @@ # RUN_PARMS: context_test001.png [MAP2IMG] -m [MAPFILE] -l "bdry_counpy2" -o [RESULT] # RUN_PARMS: context_test002.png [MAP2IMG] -m [MAPFILE] -l "bdry_counpy2 indx_q100kpy4" -o [RESULT] # RUN_PARMS: context_test003.png [MAP2IMG] -m [MAPFILE] -l "indx_q100kpy4" -o [RESULT] +# RUN_PARMS: context_test004.png [MAP2IMG] -m [MAPFILE] -l "req_fail" -o [RESULT] +# RUN_PARMS: context_test005.png [MAP2IMG] -m [MAPFILE] -l "lreq_fail" -o [RESULT] # MAP NAME 'context' @@ -25,4 +27,16 @@ MAP REQUIRES '![bdry_counpy2]' INCLUDE 'include/indx_q100kpy4_shapefile.map' END + + LAYER + NAME 'req_fail' + REQUIRES '[non_existant]' + INCLUDE 'include/bdry_counpy2_shapefile.map' + END + + LAYER + NAME 'lreq_fail' + LABELREQUIRES '[non_existant]' + INCLUDE 'include/bdry_counpy2_shapefile.map' + END END diff --git a/msautotest/query/expected/context_test004.png b/msautotest/query/expected/context_test004.png new file mode 100644 index 0000000000000000000000000000000000000000..0f51863b074473cdcf113258891ed1774311d132 GIT binary patch literal 1060 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKNIvh+uk)*3dQyCbTUwgVZhE&XXd&Q8K!GPz$ zhEM8ugKn6+ZW4TQO2^^IA3lbP)Ch;RL`KOr))Wb`35lbe(J&ZI2SYM1u$x{HzEPAI SH4m8k89ZJ6T-G@yGywoMrYwB` literal 0 HcmV?d00001 diff --git a/msautotest/query/expected/context_test005.png b/msautotest/query/expected/context_test005.png new file mode 100644 index 0000000000000000000000000000000000000000..cf36e3b14cedea2b670998ad7ea06b18539deb7a GIT binary patch literal 25117 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 { + if (token->token == MS_TOKEN_BINDING_DOUBLE || + token->token == MS_TOKEN_BINDING_STRING || + token->token == MS_TOKEN_BINDING_TIME) { + msSetError(MS_PARSEERR, + "A non-existent layer is referenced in a LAYER REQUIRES or " + "LABELREQUIRES expression: %s", + "msEvalContext()", e.string); + msFreeExpression(&e); + return MS_FALSE; + } + } + p.shape = NULL; p.expr = &e; p.expr->curtoken = p.expr->tokens; /* reset */ From be67d5d12a425cd9561f695c843b54df11404a05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C4=81ris=20Narti=C5=A1s?= Date: Mon, 29 Sep 2025 17:17:25 +0300 Subject: [PATCH 46/53] Fix use-after-free error in msDrawRasterLayerLowOpenDataset (#7333) * Fix use-after-free error in msDrawRasterLayerLowOpenDataset * A test case for crash on printing raster debug info --- msautotest/wxs/wms_raster.map | 2 +- src/mapraster.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/msautotest/wxs/wms_raster.map b/msautotest/wxs/wms_raster.map index dfa30ecbbe..9fd8383a42 100644 --- a/msautotest/wxs/wms_raster.map +++ b/msautotest/wxs/wms_raster.map @@ -31,7 +31,7 @@ IMAGECOLOR 255 255 255 SHAPEPATH ./data SYMBOLSET etc/symbols.sym FONTSET etc/fonts.txt - +DEBUG 1 # # Start of web interface definition diff --git a/src/mapraster.c b/src/mapraster.c index f27d002a94..23a70c58ec 100644 --- a/src/mapraster.c +++ b/src/mapraster.c @@ -651,7 +651,6 @@ void *msDrawRasterLayerLowOpenDataset(mapObj *map, layerObj *layer, GDALOpenEx(*p_decrypted_path, GDAL_OF_RASTER | GDAL_OF_SHARED, (const char *const *)papszAllowedDrivers, (const char *const *)connectionoptions, NULL); - CSLDestroy(papszAllowedDrivers); CSLDestroy(connectionoptions); // Give a hint about which GDAL driver should be enabled, but only in @@ -678,6 +677,7 @@ void *msDrawRasterLayerLowOpenDataset(mapObj *map, layerObj *layer, } } } + CSLDestroy(papszAllowedDrivers); return hDS; } else { return GDALOpenShared(*p_decrypted_path, GA_ReadOnly); From ba7a6f18d7c7e1798599d919f4d30264c8cd6e3c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 1 Nov 2025 07:05:44 -0300 Subject: [PATCH 47/53] [Backport branch-8-4] WMS Client: Do not modify layer extent #7367 (#7373) * WMS Client: Do not modify layer extent * Improved error handling --------- Co-authored-by: Patrik Sylve --- msautotest/mspython/test_wms_client.py | 55 ++++++++++++ msautotest/mspython/wms_client.map | 51 +++++++++++ src/maphttp.c | 5 ++ src/maphttp.h | 1 + src/mapwmslayer.c | 119 ++++++++++++++----------- 5 files changed, 181 insertions(+), 50 deletions(-) create mode 100644 msautotest/mspython/test_wms_client.py create mode 100644 msautotest/mspython/wms_client.map diff --git a/msautotest/mspython/test_wms_client.py b/msautotest/mspython/test_wms_client.py new file mode 100644 index 0000000000..caf9f9c16b --- /dev/null +++ b/msautotest/mspython/test_wms_client.py @@ -0,0 +1,55 @@ +import os + +import pytest + +mapscript_available = False +try: + import mapscript + + mapscript_available = True +except ImportError: + pass + +pytestmark = [ + pytest.mark.skipif(not mapscript_available, reason="mapscript not available"), + pytest.mark.skipif( + "SUPPORTS=WMS_CLIENT" not in mapscript.msGetVersion(), + reason="WMS Client is not enabled", + ), +] + + +def get_relpath_to_this(filename): + return os.path.join(os.path.dirname(__file__), filename) + + +############################################################################### +# Test that WMS client GetMap request does not modify layer extent or projection + + +def test_wms_client_does_not_modify_layer(): + map = mapscript.mapObj(get_relpath_to_this("wms_client.map")) + + layerObj = map.getLayer(0) + assert layerObj.getExtent().minx == -180 + assert layerObj.getExtent().miny == -90 + assert layerObj.getExtent().maxx == 180 + assert layerObj.getExtent().maxy == 90 + assert layerObj.getProjection() == "+init=epsg:4326" + + # Do a GetMap request in EPSG:32633 + request = mapscript.OWSRequest() + mapscript.msIO_installStdoutToBuffer() + request.loadParamsFromURL( + "&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:32633&BBOX=920482.6044580448652,7662266.090040001087,1317920.914512843126,8079762.906353433616" + ) + status = map.OWSDispatch(request) + + assert status == 0 + + # Assert that layer extent and projection is not modified + assert layerObj.getExtent().minx == -180 + assert layerObj.getExtent().miny == -90 + assert layerObj.getExtent().maxx == 180 + assert layerObj.getExtent().maxy == 90 + assert layerObj.getProjection() == "+init=epsg:4326" diff --git a/msautotest/mspython/wms_client.map b/msautotest/mspython/wms_client.map new file mode 100644 index 0000000000..37c86ae36a --- /dev/null +++ b/msautotest/mspython/wms_client.map @@ -0,0 +1,51 @@ + + +MAP + NAME WMS_CLIENT_TEST_130 + STATUS ON + SIZE 400 300 + EXTENT -180 -90 180 90 + UNITS DD + PROJECTION + "init=epsg:4326" + END + IMAGECOLOR 255 255 255 + #SYMBOLSET etc/symbols.sym + #FONTSET etc/fonts.txt + + RESOLUTION 96 + IMAGETYPE png24 + + WEB + IMAGEPATH "/tmp/ms_tmp/" + IMAGEURL "/ms_tmp/" + METADATA + "ows_updatesequence" "123" + "wms_title" "Test WMS 1.3.0 client" + "wms_srs" "EPSG:4326" + "ows_enable_request" "*" + "wms_getmap_formatlist" "image/png,image/png; mode=24bit" + "ows_onlineresource" "http://localhost/wmsclient?" + END + END + + LAYER + NAME client + TYPE RASTER + STATUS ON + CONNECTION "https://demo.mapserver.org/cgi-bin/wms?" + CONNECTIONTYPE WMS + TEMPLATE "dummy" + EXTENT -180 -90 180 90 + METADATA + "wms_srs" "EPSG:4326 EPSG:32633" + "wms_name" "cities" + "wms_server_version" "1.3.0" + "wms_format" "image/png" + "wms_enable_request" "*" + END + PROJECTION + "init=epsg:4326" + END + END +END diff --git a/src/maphttp.c b/src/maphttp.c index ea736d18c4..7c85e7334b 100644 --- a/src/maphttp.c +++ b/src/maphttp.c @@ -127,6 +127,7 @@ void msHTTPInitRequestObj(httpRequestObj *pasReqInfo, int numRequests) { pasReqInfo[i].pszPostRequest = NULL; pasReqInfo[i].pszPostContentType = NULL; pasReqInfo[i].pszOutputFile = NULL; + pasReqInfo[i].pszEPSG = NULL; pasReqInfo[i].nLayerId = 0; pasReqInfo[i].nTimeout = 0; pasReqInfo[i].nMaxBytes = 0; @@ -174,6 +175,10 @@ void msHTTPFreeRequestObj(httpRequestObj *pasReqInfo, int numRequests) { free(pasReqInfo[i].pszOutputFile); pasReqInfo[i].pszOutputFile = NULL; + if (pasReqInfo[i].pszEPSG) + free(pasReqInfo[i].pszEPSG); + pasReqInfo[i].pszEPSG = NULL; + if (pasReqInfo[i].pszContentType) free(pasReqInfo[i].pszContentType); pasReqInfo[i].pszContentType = NULL; diff --git a/src/maphttp.h b/src/maphttp.h index 13292a7d4c..b44b7b5eac 100644 --- a/src/maphttp.h +++ b/src/maphttp.h @@ -47,6 +47,7 @@ typedef struct http_request_info { int nLayerId; char *pszGetUrl; char *pszOutputFile; + char *pszEPSG; int nTimeout; int nMaxBytes; rectObj bbox; diff --git a/src/mapwmslayer.c b/src/mapwmslayer.c index 6f3a094d2f..76a42f28a9 100644 --- a/src/mapwmslayer.c +++ b/src/mapwmslayer.c @@ -438,6 +438,7 @@ static int msBuildWMSLayerURL(mapObj *map, layerObj *lp, int nRequestType, *pszSrsParamName = "SRS", *pszLayer = NULL, *pszQueryLayers = NULL, *pszUseStrictAxisOrder; rectObj bbox; + projectionObj layerRequestProjection; int bbox_width = map->width, bbox_height = map->height; int nVersion = OWS_VERSION_NOTSET; int bUseStrictAxisOrder = MS_FALSE; /* this is the assumption up to 1.1.0 */ @@ -642,45 +643,11 @@ static int msBuildWMSLayerURL(mapObj *map, layerObj *lp, int nRequestType, bFlipAxisOrder = MS_TRUE; } - /* ------------------------------------------------------------------ - * Set layer SRS. - * ------------------------------------------------------------------ */ - /* No need to set lp->proj if it's already set to the right EPSG code */ - { - char *pszEPSGCodeFromLayer = NULL; - msOWSGetEPSGProj(&(lp->projection), NULL, "MO", MS_TRUE, - &pszEPSGCodeFromLayer); - if (pszEPSGCodeFromLayer == NULL || - strcasecmp(pszEPSG, pszEPSGCodeFromLayer) != 0) { - char *ows_srs = NULL; - msOWSGetEPSGProj(NULL, &(lp->metadata), "MO", MS_FALSE, &ows_srs); - /* no need to set lp->proj if it is already set and there is only - one item in the _srs metadata for this layer - we will assume - the projection block matches the _srs metadata (the search for ' ' - in ows_srs is a test to see if there are multiple EPSG: codes) */ - if (lp->projection.numargs == 0 || ows_srs == NULL || - (strchr(ows_srs, ' ') != NULL)) { - if (strncasecmp(pszEPSG, "EPSG:", 5) == 0) { - char szProj[20]; - snprintf(szProj, sizeof(szProj), "init=epsg:%s", pszEPSG + 5); - if (msLoadProjectionString(&(lp->projection), szProj) != 0) { - msFree(pszEPSGCodeFromLayer); - msFree(ows_srs); - free(pszEPSG); - return MS_FAILURE; - } - } else { - if (msLoadProjectionString(&(lp->projection), pszEPSG) != 0) { - msFree(pszEPSGCodeFromLayer); - msFree(ows_srs); - free(pszEPSG); - return MS_FAILURE; - } - } - } - msFree(ows_srs); - } - msFree(pszEPSGCodeFromLayer); + msInitProjection(&layerRequestProjection); + if (msLoadProjectionString(&layerRequestProjection, pszEPSG) != 0) { + free(pszEPSG); + msFreeProjection(&layerRequestProjection); + return MS_FAILURE; } /* ------------------------------------------------------------------ @@ -697,8 +664,8 @@ static int msBuildWMSLayerURL(mapObj *map, layerObj *lp, int nRequestType, /* -------------------------------------------------------------------- */ /* Reproject if needed. */ /* -------------------------------------------------------------------- */ - if (msProjectionsDiffer(&(map->projection), &(lp->projection))) { - msProjectRect(&(map->projection), &(lp->projection), &bbox); + if (msProjectionsDiffer(&(map->projection), &layerRequestProjection)) { + msProjectRect(&(map->projection), &layerRequestProjection, &bbox); /* -------------------------------------------------------------------- */ /* Sometimes our remote WMS only accepts square pixel */ @@ -755,7 +722,8 @@ static int msBuildWMSLayerURL(mapObj *map, layerObj *lp, int nRequestType, &ows_srs); if (ows_srs && strchr(ows_srs, ' ') == NULL && - msOWSGetLayerExtent(map, lp, "MO", &layer_rect) == MS_SUCCESS) { + msOWSGetLayerExtent(map, lp, "MO", &layer_rect) == MS_SUCCESS && + !msProjectionsDiffer(&(lp->projection), &layerRequestProjection)) { /* fulloverlap */ if (msRectContained(&bbox, &layer_rect)) { /* no changes */ @@ -787,9 +755,6 @@ static int msBuildWMSLayerURL(mapObj *map, layerObj *lp, int nRequestType, msFree(ows_srs); } - /* Set layer extent to wms bbox */ - lp->extent = bbox; - /* -------------------------------------------------------------------- */ /* Potentially return the bbox. */ /* -------------------------------------------------------------------- */ @@ -980,7 +945,7 @@ static int msBuildWMSLayerURL(mapObj *map, layerObj *lp, int nRequestType, } free(pszEPSG); - + msFreeProjection(&layerRequestProjection); return MS_SUCCESS; #else @@ -1038,6 +1003,8 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp, char *pszURL = NULL, *pszHTTPCookieData = NULL; const char *pszTmp; rectObj bbox = {0}; + projectionObj lyrRequestProjection; + const char *pszEPSG; int bbox_width = 0, bbox_height = 0; int nTimeout, bOkToMerge, bForceSeparateRequest, bCacheToDisk; wmsParamsObj sThisWMSParams; @@ -1049,8 +1016,7 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp, msInitWmsParamsObj(&sThisWMSParams); /* ------------------------------------------------------------------ - * Build the request URL, this will also set layer projection and - * compute BBOX in that projection. + * Build the request URL * ------------------------------------------------------------------ */ switch (nRequestType) { @@ -1081,12 +1047,31 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp, return MS_FAILURE; } + /* Load projection that we will request, it may differ from current layer + * projection */ + char *srsKeys[] = {"SRS", "CRS"}; + int i; + for (i = 0; i < 2; i++) { + pszEPSG = msLookupHashTable(sThisWMSParams.params, srsKeys[i]); + if (pszEPSG != NULL && strlen(pszEPSG) > 0) + break; + } + + msInitProjection(&lyrRequestProjection); + if (pszEPSG == NULL || msLoadProjectionStringEPSG(&lyrRequestProjection, + pszEPSG) != MS_SUCCESS) { + msFreeWmsParamsObj(&sThisWMSParams); + msFreeProjection(&lyrRequestProjection); + return MS_FAILURE; + } + /* ------------------------------------------------------------------ * Check if the request is empty, perhaps due to reprojection problems * or wms_extents restrictions. * ------------------------------------------------------------------ */ if ((nRequestType == WMS_GETMAP) && (bbox_width == 0 || bbox_height == 0)) { msFreeWmsParamsObj(&sThisWMSParams); + msFreeProjection(&lyrRequestProjection); return MS_SUCCESS; /* No overlap. */ } @@ -1119,10 +1104,10 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp, /* Reproject latlonboundingbox to the selected SRS for the layer and */ /* check if it overlaps the bbox that we calculated for the request */ - msProjectRect(&(map->latlon), &(lp->projection), &ext); + msProjectRect(&(map->latlon), &lyrRequestProjection, &ext); if (!msRectOverlap(&bbox, &ext)) { /* No overlap... nothing to do */ - + msFreeProjection(&lyrRequestProjection); msFreeWmsParamsObj(&sThisWMSParams); return MS_SUCCESS; /* No overlap. */ } @@ -1158,6 +1143,8 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp, msSetError(MS_WMSERR, "WEB.IMAGEPATH must be set to use WMS client connections.", "msPrepareWMSLayerRequest()"); + msFreeProjection(&lyrRequestProjection); + msFreeWmsParamsObj(&sThisWMSParams); return MS_FAILURE; } } @@ -1300,6 +1287,7 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp, pasReqInfo[(*numRequests)].width = bbox_width; pasReqInfo[(*numRequests)].height = bbox_height; pasReqInfo[(*numRequests)].debug = lp->debug; + pasReqInfo[(*numRequests)].pszEPSG = msStrdup(pszEPSG); if (msHTTPAuthProxySetup(&(map->web.metadata), &(lp->metadata), pasReqInfo, *numRequests, map, "MO") != MS_SUCCESS) @@ -1323,6 +1311,8 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp, msFreeWmsParamsObj(&sThisWMSParams); } + msFreeProjection(&lyrRequestProjection); + return MS_SUCCESS; #else @@ -1349,6 +1339,8 @@ int msDrawWMSLayerLow(int nLayerId, httpRequestObj *pasReqInfo, int numRequests, char szPath[MS_MAXPATHLEN]; int currenttype; int currentconnectiontype; + projectionObj currentprojectionobject; + rectObj currentextent; int numclasses; char *mem_filename = NULL; const char *pszTmp; @@ -1472,12 +1464,35 @@ int msDrawWMSLayerLow(int nLayerId, httpRequestObj *pasReqInfo, int numRequests, * Prepare layer for drawing, reprojecting the image received from the * server if needed... * ------------------------------------------------------------------ */ + + // Aassign requested projection temporarily to layer + currentprojectionobject = lp->projection; + msInitProjection(&(lp->projection)); + if (pasReqInfo[iReq].pszEPSG == NULL || + msLoadProjectionString(&(lp->projection), pasReqInfo[iReq].pszEPSG) != + MS_SUCCESS) { + msSetError( + MS_WMSERR, "WMS GetMap failed to load projection for layer '%s': %s.", + "msDrawWMSLayerLow()", (lp->name ? lp->name : "(null)"), + (pasReqInfo[iReq].pszEPSG ? pasReqInfo[iReq].pszEPSG : "(null)")); + + // Restore layer projection + msFreeProjection(&(lp->projection)); + lp->projection = currentprojectionobject; + if (!bIsEssential) + return MS_SUCCESS; + else + return MS_FAILURE; + } + /* keep the current type that will be restored at the end of this */ /* function. */ currenttype = lp->type; currentconnectiontype = lp->connectiontype; + currentextent = lp->extent; lp->type = MS_LAYER_RASTER; lp->connectiontype = MS_RASTER; + lp->extent = pasReqInfo[iReq].bbox; /* set the classes to 0 so that It won't do client side */ /* classification if an sld was set. */ @@ -1569,6 +1584,10 @@ int msDrawWMSLayerLow(int nLayerId, httpRequestObj *pasReqInfo, int numRequests, /* restore prveious type */ lp->type = currenttype; lp->connectiontype = currentconnectiontype; + lp->extent = currentextent; + + msFreeProjection(&(lp->projection)); + lp->projection = currentprojectionobject; /* restore previous numclasses */ lp->numclasses = numclasses; From 6956fc842bbfde5acab5b92c496cb19665113c80 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 1 Nov 2025 07:05:55 -0300 Subject: [PATCH 48/53] WMS Client: Validate style in wms_style metadata (#7374) Co-authored-by: Patrik Sylve --- .../wms_client_style_remote_exception.png | Bin 0 -> 6139 bytes .../wms_client_undefined_style_exception.xml | 6 ++++ msautotest/wxs/wms_client_130.map | 23 ++++++++++++++++ src/mapwms.cpp | 26 ++++++++++++++---- 4 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 msautotest/wxs/expected/wms_client_style_remote_exception.png create mode 100644 msautotest/wxs/expected/wms_client_undefined_style_exception.xml diff --git a/msautotest/wxs/expected/wms_client_style_remote_exception.png b/msautotest/wxs/expected/wms_client_style_remote_exception.png new file mode 100644 index 0000000000000000000000000000000000000000..fb1d11d86f95cdb08b86af9d74881be0f9d16841 GIT binary patch literal 6139 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 + + +msWMSLoadGetMapParams(): WMS server error. Style (undefined_style) not defined on layer. + + diff --git a/msautotest/wxs/wms_client_130.map b/msautotest/wxs/wms_client_130.map index 2c3e5ec54e..1a86eb32e0 100644 --- a/msautotest/wxs/wms_client_130.map +++ b/msautotest/wxs/wms_client_130.map @@ -11,6 +11,11 @@ # RUN_PARMS: wms_client_crs_32633.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:32633&BBOX=920482.6044580448652,7662266.090040001087,1317920.914512843126,8079762.906353433616" > [RESULT_DEMIME] # RUN_PARMS: wms_client_crs_32633.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:32633&BBOX=920482.6044580448652,7662266.090040001087,1317920.914512843126,8079762.906353433616" > [RESULT_DEMIME] # +# Request with STYLES. Note that the remote server does not publish any styles. +# RUN_PARMS: wms_client_undefined_style_exception.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=wms_style&STYLES=undefined_style&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180" > [RESULT_DEMIME] +# Tests that the request is valid, but resulting image contains error as 'named_style' is not defined in remote server. +# RUN_PARMS: wms_client_style_remote_exception.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=wms_style&STYLES=named_style&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180" > [RESULT_DEMIME] +# # GetFeatureInfo # RUN_PARMS: wms_client_130.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT] # RUN_PARMS: wms_client_130.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT] @@ -65,4 +70,22 @@ MAP "wms_enable_request" "*" END END + + LAYER + NAME wms_style + TYPE RASTER + STATUS ON + CONNECTION "https://demo.mapserver.org/cgi-bin/wms?" + CONNECTIONTYPE WMS + TEMPLATE "dummy" + EXTENT -180 -90 180 90 + METADATA + "wms_srs" "EPSG:4326 EPSG:32633" + "wms_name" "cities" + "wms_server_version" "1.3.0" + "wms_format" "image/png" + "wms_enable_request" "*" + "wms_style" "named_style" + END + END END diff --git a/src/mapwms.cpp b/src/mapwms.cpp index 82e77f6980..6bb6124ce1 100644 --- a/src/mapwms.cpp +++ b/src/mapwms.cpp @@ -1856,15 +1856,29 @@ this request. Check wms/ows_enable_request settings.", (lp->group && strcasecmp(lp->group, wmslayers[i].c_str()) == 0)) { bool found = false; - for (int k = 0; k < lp->numclasses; k++) { - if (lp->_class[k]->group && - strcasecmp(lp->_class[k]->group, tokens[i]) == 0) { - msFree(lp->classgroup); - lp->classgroup = msStrdup(tokens[i]); + +#ifdef USE_WMS_LYR + if (lp->connectiontype == MS_WMS) { + const char *pszWmsStyle = + msOWSLookupMetadata(&(lp->metadata), "MO", "style"); + if (pszWmsStyle != NULL && + strcasecmp(pszWmsStyle, tokens[i]) == 0) found = true; - break; + } +#endif // USE_WMS_LYR + + if (!found) { + for (int k = 0; k < lp->numclasses; k++) { + if (lp->_class[k]->group && + strcasecmp(lp->_class[k]->group, tokens[i]) == 0) { + msFree(lp->classgroup); + lp->classgroup = msStrdup(tokens[i]); + found = true; + break; + } } } + if (!found) { msSetErrorWithStatus(MS_WMSERR, MS_HTTP_400_BAD_REQUEST, "Style (%s) not defined on layer.", From 3b148629e15d553f1781e8c23bad809c3c34fbc6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 1 Nov 2025 07:06:05 -0300 Subject: [PATCH 49/53] Do the fontconfig detection on all platforms, not only MacOSX (#7375) Fixes mapcairo build on OpenBSD, when fontconfig isnt installed in the same prefix as cairo. /usr/local/include/cairo/cairo-ft.h:50:10: fatal error: 'fontconfig/fontconfig.h' file not found Co-authored-by: Landry Breuil --- cmake/FindCairo.cmake | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/cmake/FindCairo.cmake b/cmake/FindCairo.cmake index 33dfc1c2cc..b28d3b187b 100644 --- a/cmake/FindCairo.cmake +++ b/cmake/FindCairo.cmake @@ -38,14 +38,11 @@ FIND_PATH(CAIRO_INCLUDE_DIR PATH_SUFFIXES cairo ) -IF(APPLE) - #On Mountain Lion we need this for the XQuartz supplied version of cairo - PKG_CHECK_MODULES(PC_FONTCONFIG fontconfig) # FIXME: After we require CMake 2.8.2 we can pass QUIET to this call. - FIND_PATH(FC_INCLUDE_DIR - NAMES fontconfig/fontconfig.h - HINTS ${PC_FONTCONFIG_INCLUDEDIR} - ) -ENDIF(APPLE) +PKG_CHECK_MODULES(PC_FONTCONFIG fontconfig) # FIXME: After we require CMake 2.8.2 we can pass QUIET to this call. +FIND_PATH(FC_INCLUDE_DIR + NAMES fontconfig/fontconfig.h + HINTS ${PC_FONTCONFIG_INCLUDEDIR} +) FIND_LIBRARY(CAIRO_LIBRARY NAMES cairo From 133e5742175842cc6ab0e8ba634d15ba2866518d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 6 Nov 2025 10:29:57 -0400 Subject: [PATCH 50/53] Disable build isolation to not download setuptools dependency. (#7378) Co-authored-by: Bas Couwenberg --- src/mapscript/python/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mapscript/python/CMakeLists.txt b/src/mapscript/python/CMakeLists.txt index f0bc2cc8cf..8bfb39a868 100644 --- a/src/mapscript/python/CMakeLists.txt +++ b/src/mapscript/python/CMakeLists.txt @@ -140,7 +140,7 @@ install( endif() execute_process( - COMMAND ${Python_EXECUTABLE} -m pip install \${PYTHON_ROOT} \${PYTHON_PREFIX} . + COMMAND ${Python_EXECUTABLE} -m pip install --no-build-isolation \${PYTHON_ROOT} \${PYTHON_PREFIX} . WORKING_DIRECTORY ${MAPSCRIPT_WORKING_DIR} ) " From b1f169dc472fa753c596d4e662980bc25a7a3468 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 8 Nov 2025 08:03:18 -0400 Subject: [PATCH 51/53] add extra spece in construction of query (#7381) Co-authored-by: Michael D. Smith --- src/maporaclespatial.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maporaclespatial.c b/src/maporaclespatial.c index 150b337ac4..776aa837a0 100644 --- a/src/maporaclespatial.c +++ b/src/maporaclespatial.c @@ -1217,7 +1217,7 @@ static char *osAggrGetExtent(layerObj *layer, char *query_str, size_t tmpFromSize = sizeof(char) * (7 + strlen(geom_column_name) + strlen(table_name) + 1); char *tmpFrom = msSmallMalloc(tmpFromSize); - snprintf(tmpFrom, tmpFromSize, "%s FROM %s", geom_column_name, table_name); + snprintf(tmpFrom, tmpFromSize, " %s FROM %s", geom_column_name, table_name); query_str2 = msStringConcatenate(query_str2, tmpFrom); From 8be61080b64bd63f4abf41796f900d19ffe27172 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 9 Nov 2025 12:49:47 -0400 Subject: [PATCH 52/53] PostGIS: Escape geometry column name consistently (#7382) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jørgen Nystad --- src/mappostgis.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mappostgis.cpp b/src/mappostgis.cpp index af02a4fada..77b9c78bb6 100644 --- a/src/mappostgis.cpp +++ b/src/mappostgis.cpp @@ -1978,9 +1978,9 @@ static std::string msPostGISBuildSQLWhere(layerObj *layer, const rectObj *rect, return std::string(); } - std::string strRectOtherSRID = "ST_Intersects(ST_Transform("; + std::string strRectOtherSRID = "ST_Intersects(ST_Transform(\""; strRectOtherSRID += layerinfo->geomcolumn; - strRectOtherSRID += ','; + strRectOtherSRID += "\","; strRectOtherSRID += std::to_string(otherSRID); strRectOtherSRID += "),"; strRectOtherSRID += strBox; @@ -2009,9 +2009,9 @@ static std::string msPostGISBuildSQLWhere(layerObj *layer, const rectObj *rect, return std::string(); } - std::string strRectOtherSRID = "ST_Intersects("; + std::string strRectOtherSRID = "ST_Intersects(\""; strRectOtherSRID += layerinfo->geomcolumn; - strRectOtherSRID += ','; + strRectOtherSRID += "\","; strRectOtherSRID += strBox; strRectOtherSRID += ')'; @@ -3262,7 +3262,7 @@ static int msPostGISLayerGetExtent(layerObj *layer, rectObj *extent) { auto layerinfo = (msPostGISLayerInfo *)layer->layerinfo; const std::string strSQL(addTableNameAndFilterToSelectFrom( - layer, "SELECT ST_Extent(" + layerinfo->geomcolumn + ") FROM ")); + layer, "SELECT ST_Extent(\"" + layerinfo->geomcolumn + "\") FROM ")); if (layer->debug) { msDebug("msPostGISLayerGetExtent executing SQL: %s\n", strSQL.c_str()); From b687677e8b6deb15556042057d00cf431804c976 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 10 Nov 2025 19:17:18 -0400 Subject: [PATCH 53/53] [Backport branch-8-4] Fix query maps with MS_NORMAL and MS_HILITE styles with WFS layers (#7364) (#7383) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix query maps with MS_NORMAL and MS_HILITE styles with WFS layers (#7364) * Fix linting --------- Co-authored-by: Szekeres Tamás --- src/mapwfslayer.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/mapwfslayer.c b/src/mapwfslayer.c index a61a9c10b7..9095f2cd68 100644 --- a/src/mapwfslayer.c +++ b/src/mapwfslayer.c @@ -1100,6 +1100,11 @@ int msWFSLayerWhichShapes(layerObj *lp, rectObj rect, int isQuery) { return MS_FAILURE; } + if (psInfo->nStatus != asReqInfo[0].nStatus) { + /* For drawQuery, we may use a copy layer which needs to be updated */ + msWFSUpdateRequestInfo(lp, &(asReqInfo[0])); + } + /* Cleanup */ msHTTPFreeRequestObj(asReqInfo, numReq); }