From 5f070d065577fc55de04bacfaec1c66058282e6c Mon Sep 17 00:00:00 2001 From: Shay Carter Date: Tue, 12 Sep 2023 13:38:19 -0600 Subject: [PATCH] Commit of all v20 ufpy code: - code brought over from the following raytheon repos and directories: - awips2 repo: - awips2/pythonPackages - awips2/edexOsgi/com.raytheon.uf.common.alertviz/pythonPackages - awips2/edexOsgi/com.raytheon.uf.common.mpe/pythonPackages - awips2/edexOsgi/com.raytheon.uf.common.dataplugin.text/pythonPackages - awips2/edexOsgi/com.raytheon.uf.common.dataplugin.grid/pythonPackages - awips2/edexOsgi/com.raytheon.uf.common.activetable/pythonPackages - awips2/edexOsgi/com.raytheon.uf.common.management/pythonPackages - awips2/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/pythonPackages - awips2/edexOsgi/com.raytheon.uf.common.dataplugin.radar/pythonPackages - awips2/edexOsgi/com.raytheon.uf.common.site/pythonPackages - awips2-core repo: - awips2-core/common/com.raytheon.uf.common.auth/pythonPackages - awips2-core/common/com.raytheon.uf.common.message/pythonPackages - awips2-core/common/com.raytheon.uf.common.localization/pythonPackages - awips2-core/common/com.raytheon.uf.common.datastorage/pythonPackages - awips2-core/common/com.raytheon.uf.common.pointdata/pythonPackages - awips2-core/common/com.raythoen.uf.common.pypies/pythonPackages - awips2-core/common/com.raytheon.uf.common.dataaccess/pythonPackages - awips2-core/common/com.raytheon.uf.common.dataplugin.level/pythonPackages - awips2-core/common/com.raytheon.uf.common.serialization/pythonPackages - awips2-core/common/com.raytheon.uf.common.time/pythonPackages - awips2-core/common/com.raytheon.uf.common.dataplugin/pythonPackages - awips2-core/common/com.raytheon.uf.common.dataquery/pythonPackages - awips2-rpm repo: had to untar and unzip the thirft repo, then go into /lib/py and run `python setup.py build` and then copy in from the build/ subdirectory -foss/thrift-0.14.1/packaged/thrift-0.14.1/lib/py/build/lib.macosx-10.9-x86_64-cpython-38/thrift --- LICENSE | 30 - README | 6 + README.rst | 94 - VERSIONS | 6 + awips/RadarCommon.py | 141 -- awips/dataaccess/ModelSounding.py | 231 -- awips/gempak/GridDataRetriever.py | 128 -- awips/gempak/GridInfoRetriever.py | 145 -- awips/gempak/GridNavRetriever.py | 301 --- awips/gempak/StationDataRetriever.py | 144 -- awips/gempak/StationRetriever.py | 93 - awips/gempak/TimeRetriever.py | 76 - awips/gempak/ncepGribTables.py | 99 - awips/gempak/scrape.py | 106 - awips/tables.py | 2033 ----------------- awips/test/dafTests/testProfiler.py | 59 - docs/Makefile | 218 -- docs/make.bat | 263 --- docs/requirements.txt | 6 - docs/source/about.rst | 181 -- docs/source/api/CombinedTimeQuery.rst | 7 - docs/source/api/DataAccessLayer.rst | 7 - docs/source/api/DateTimeConverter.rst | 7 - docs/source/api/IDataRequest.rst | 7 - docs/source/api/IFPClient.rst | 7 - docs/source/api/ModelSounding.rst | 7 - docs/source/api/PyData.rst | 7 - docs/source/api/PyGeometryData.rst | 7 - docs/source/api/PyGridData.rst | 7 - docs/source/api/RadarCommon.rst | 7 - docs/source/api/ThriftClient.rst | 7 - docs/source/api/ThriftClientRouter.rst | 7 - docs/source/api/TimeUtil.rst | 7 - docs/source/api/index.rst | 22 - docs/source/conf.py | 303 --- docs/source/datatypes.rst | 129 -- docs/source/dev.rst | 654 ------ docs/source/examples/index.rst | 11 - docs/source/gridparms.rst | 1456 ------------ docs/source/index.rst | 72 - docs/source/notebook_gen_sphinxext.py | 77 - .../adapters/GridDataHistoryAdapter.py | 26 - dynamicserialize/dstypes/__init__.py | 4 +- dynamicserialize/dstypes/com/__init__.py | 2 +- .../com/raytheon/uf/common/__init__.py | 17 +- .../raytheon/uf/common/auth/user/__init__.py | 1 + .../dataaccess/impl/DefaultDataRequest.py | 2 +- .../impl/DefaultNotificationFilter.py | 2 +- .../raytheon/uf/common/dataplugin/__init__.py | 8 +- .../dataplugin/gfe/db/objects/GFERecord.py | 4 +- .../dataplugin/gfe/db/objects/ParmID.py | 4 +- .../uf/common/dataplugin/level/Level.py | 16 +- .../uf/common/dataplugin/level/MasterLevel.py | 4 +- .../dataquery/requests/RequestConstraint.py | 14 +- .../datastorage/records/AbstractDataRecord.py | 78 - .../com/raytheon/uf/common/time/DataTime.py | 25 +- dynamicserialize/dstypes/java/util/EnumSet.py | 4 +- environment.yml | 28 - examples/Template.ipynb | 322 --- examples/images/GOES_CIRA_night_preview.png | Bin 273708 -> 0 bytes examples/images/GOES_CIRA_preview.png | Bin 374993 -> 0 bytes .../images/colored_surface_temp_preview.png | Bin 275899 -> 0 bytes .../forecast_model_vert_sounding_preview.png | Bin 167806 -> 0 bytes examples/images/grids_and_cartopy_preview.png | Bin 195485 -> 0 bytes examples/images/map_resources_preview.png | Bin 429898 -> 0 bytes examples/images/metars_preview.png | Bin 257911 -> 0 bytes examples/images/model_sounding_preview.png | Bin 119948 -> 0 bytes examples/images/regional_obs_preview.png | Bin 162435 -> 0 bytes .../upper_air_bufr_sounding_preview.png | Bin 78723 -> 0 bytes examples/images/warnings_preview.png | Bin 233580 -> 0 bytes examples/md/GISOperations.md | 82 - examples/md/GetSatelliteIR.md | 49 - examples/md/GetStates.md | 69 - .../Colored_Surface_Temperature_Plot.ipynb | 399 ---- examples/notebooks/Colorized_Grid_Data.ipynb | 400 ---- .../Forecast_Model_Vertical_Sounding.ipynb | 617 ----- .../notebooks/GOES_CIRA_Product_Writer.ipynb | 625 ----- .../Grid_Levels_and_Parameters.ipynb | 1141 --------- .../METAR_Station_Plot_with_MetPy.ipynb | 527 ----- .../Map_Resources_and_Topography.ipynb | 721 ------ examples/notebooks/Model_Sounding_Data.ipynb | 1593 ------------- examples/notebooks/NEXRAD_Level3_Radar.ipynb | 608 ----- ...ecip_Accumulation-Region_Of_Interest.ipynb | 322 --- .../notebooks/Regional_Surface_Obs_Plot.ipynb | 922 -------- examples/notebooks/Satellite_Imagery.ipynb | 772 ------- .../notebooks/Upper_Air_BUFR_Soundings.ipynb | 517 ----- .../Watch_Warning_and_Advisory_Plotting.ipynb | 696 ------ prep.sh | 53 - pypies/pypies.cfg | 96 + pypies/pypies/IDataStore.py | 82 + pypies/pypies/LockManager.py | 113 + pypies/pypies/MkDirLockManager.py | 306 +++ pypies/pypies/__init__.py | 122 + pypies/pypies/config/__init__.py | 33 + .../config/pypiesConfigurationManager.py | 69 + pypies/pypies/handlers.py | 147 ++ pypies/pypies/impl/DataStoreFactory.py | 140 ++ pypies/pypies/impl/H5pyDataStore.py | 1129 +++++++++ pypies/pypies/impl/HDF5OpManager.py | 130 ++ pypies/pypies/impl/__init__.py | 35 + pypies/pypies/logging/StatsThread.py | 206 ++ pypies/pypies/logging/logConfig.py | 92 + pypies/pypies/logging/logProcess.py | 149 ++ pypies/pypies/logging/testStatOutput.py | 33 + pypies/pypies/test/H5pyTiming.py | 63 + pypies/pypies/test/Netcdf4Timing.py | 71 + pypies/pypies/test/TablesTiming.py | 68 + pypies/pypies/test/TimingInterface.py | 67 + pypies/pypies/test/checkPointdata.py | 124 + pypies/pypies/test/selectionTiming.py | 68 + pypies/pypies/test/timingTest.py | 115 + pypies/testCorruptedFile.py | 64 + pypies/testCustomJavaDeserialization.py | 38 + pypies/testDataStore.py | 148 ++ pypies/testDeserializingJava.py | 42 + pypies/testSerializingPython.py | 47 + pypies/testSpecificSerialization.py | 61 + pythonPackages.ecl | 0 requirements.txt | 4 - rpm/component.spec | 113 - rpm/patch.diff | 13 - setup.cfg | 8 - setup.py | 32 - thrift/ThriftStreamSerializer.class | Bin 1667 -> 0 bytes thrift/protocol/fastbinary.c | 1219 ---------- {awips => ufpy}/AlertVizHandler.py | 0 {awips => ufpy}/ConfigFileUtil.py | 0 {awips => ufpy}/DateTimeConverter.py | 0 {awips => ufpy}/NotificationMessage.py | 2 +- {awips => ufpy}/QpidSubscriber.py | 0 {awips => ufpy}/ThriftClient.py | 0 {awips => ufpy}/TimeUtil.py | 0 {awips => ufpy}/UsageArgumentParser.py | 0 {awips => ufpy}/UsageOptionParser.py | 0 {awips => ufpy}/__init__.py | 2 +- .../dataaccess/CombinedTimeQuery.py | 4 +- {awips => ufpy}/dataaccess/DataAccessLayer.py | 227 +- .../dataaccess/DataNotificationLayer.py | 14 +- {awips => ufpy}/dataaccess/DataQueue.py | 4 +- {awips => ufpy}/dataaccess/PyData.py | 2 +- {awips => ufpy}/dataaccess/PyGeometryData.py | 4 +- .../dataaccess/PyGeometryNotification.py | 2 +- {awips => ufpy}/dataaccess/PyGridData.py | 4 +- .../dataaccess/PyGridNotification.py | 2 +- {awips => ufpy}/dataaccess/PyNotification.py | 6 +- .../dataaccess/SoundingsSupport.py | 4 +- .../dataaccess/ThriftClientRouter.py | 6 +- {awips => ufpy}/dataaccess/__init__.py | 2 +- {awips => ufpy}/gfe/IFPClient.py | 11 +- {awips => ufpy}/gfe/__init__.py | 2 +- {awips => ufpy}/ignite_password.py | 0 .../localization/LocalizationFileManager.py | 2 +- .../localization/LocalizationUtil.py | 0 {awips => ufpy}/localization/__init__.py | 4 +- {awips => ufpy}/qpidingest.py | 0 {awips => ufpy}/test/Record.py | 0 {awips => ufpy}/test/Test | 4 +- {awips => ufpy}/test/__init__.py | 2 +- {awips => ufpy}/test/dafTests/__init__.py | 2 +- .../test/dafTests/baseBufrMosTestCase.py | 2 +- .../test/dafTests/baseDafTestCase.py | 4 +- .../test/dafTests/baseRadarTestCase.py | 4 +- {awips => ufpy}/test/dafTests/params.py | 0 {awips => ufpy}/test/dafTests/testAcars.py | 2 +- {awips => ufpy}/test/dafTests/testAirep.py | 2 +- .../test/dafTests/testBinLightning.py | 6 +- .../test/dafTests/testBufrMosAvn.py | 0 .../test/dafTests/testBufrMosEta.py | 0 .../test/dafTests/testBufrMosGfs.py | 0 .../test/dafTests/testBufrMosHpc.py | 0 .../test/dafTests/testBufrMosLamp.py | 0 .../test/dafTests/testBufrMosMrf.py | 0 {awips => ufpy}/test/dafTests/testBufrUa.py | 2 +- {awips => ufpy}/test/dafTests/testClimate.py | 4 +- .../test/dafTests/testCombinedTimeQuery.py | 4 +- .../test/dafTests/testCommonObsSpatial.py | 2 +- {awips => ufpy}/test/dafTests/testDataTime.py | 0 {awips => ufpy}/test/dafTests/testFfmp.py | 2 +- {awips => ufpy}/test/dafTests/testGfe.py | 2 +- .../test/dafTests/testGfeEditArea.py | 4 +- {awips => ufpy}/test/dafTests/testGrid.py | 4 +- {awips => ufpy}/test/dafTests/testHydro.py | 4 +- .../test/dafTests/testLdadMesonet.py | 2 +- {awips => ufpy}/test/dafTests/testMaps.py | 4 +- .../test/dafTests/testModelSounding.py | 2 +- {awips => ufpy}/test/dafTests/testObs.py | 2 +- {awips => ufpy}/test/dafTests/testPirep.py | 2 +- .../test/dafTests/testPracticeWarning.py | 0 .../test/dafTests/testRadarGraphics.py | 2 +- .../test/dafTests/testRadarGrid.py | 4 +- .../test/dafTests/testRadarSpatial.py | 2 +- .../test/dafTests/testRequestConstraint.py | 0 .../test/dafTests/testSatellite.py | 2 +- {awips => ufpy}/test/dafTests/testSfcObs.py | 2 +- {awips => ufpy}/test/dafTests/testTopo.py | 4 +- {awips => ufpy}/test/dafTests/testWarning.py | 2 +- {awips => ufpy}/test/localization/__init__.py | 2 +- .../test/localization/smallTestImage.png | Bin {awips => ufpy}/test/localization/testLF.py | 0 .../testLocalizationFileManager.py | 2 +- .../test/localization/testLocalizationRest.py | 0 {awips => ufpy}/test/testQpidTimeToLive.py | 2 +- 202 files changed, 4059 insertions(+), 19433 deletions(-) delete mode 100644 LICENSE create mode 100644 README delete mode 100644 README.rst create mode 100644 VERSIONS delete mode 100644 awips/RadarCommon.py delete mode 100644 awips/dataaccess/ModelSounding.py delete mode 100644 awips/gempak/GridDataRetriever.py delete mode 100644 awips/gempak/GridInfoRetriever.py delete mode 100644 awips/gempak/GridNavRetriever.py delete mode 100644 awips/gempak/StationDataRetriever.py delete mode 100644 awips/gempak/StationRetriever.py delete mode 100644 awips/gempak/TimeRetriever.py delete mode 100755 awips/gempak/ncepGribTables.py delete mode 100755 awips/gempak/scrape.py delete mode 100644 awips/tables.py delete mode 100644 awips/test/dafTests/testProfiler.py delete mode 100644 docs/Makefile delete mode 100644 docs/make.bat delete mode 100644 docs/requirements.txt delete mode 100644 docs/source/about.rst delete mode 100644 docs/source/api/CombinedTimeQuery.rst delete mode 100644 docs/source/api/DataAccessLayer.rst delete mode 100644 docs/source/api/DateTimeConverter.rst delete mode 100644 docs/source/api/IDataRequest.rst delete mode 100644 docs/source/api/IFPClient.rst delete mode 100644 docs/source/api/ModelSounding.rst delete mode 100644 docs/source/api/PyData.rst delete mode 100644 docs/source/api/PyGeometryData.rst delete mode 100644 docs/source/api/PyGridData.rst delete mode 100644 docs/source/api/RadarCommon.rst delete mode 100644 docs/source/api/ThriftClient.rst delete mode 100644 docs/source/api/ThriftClientRouter.rst delete mode 100644 docs/source/api/TimeUtil.rst delete mode 100644 docs/source/api/index.rst delete mode 100644 docs/source/conf.py delete mode 100644 docs/source/datatypes.rst delete mode 100644 docs/source/dev.rst delete mode 100644 docs/source/examples/index.rst delete mode 100644 docs/source/gridparms.rst delete mode 100644 docs/source/index.rst delete mode 100644 docs/source/notebook_gen_sphinxext.py delete mode 100644 dynamicserialize/adapters/GridDataHistoryAdapter.py delete mode 100644 dynamicserialize/dstypes/com/raytheon/uf/common/datastorage/records/AbstractDataRecord.py delete mode 100644 environment.yml delete mode 100644 examples/Template.ipynb delete mode 100644 examples/images/GOES_CIRA_night_preview.png delete mode 100644 examples/images/GOES_CIRA_preview.png delete mode 100644 examples/images/colored_surface_temp_preview.png delete mode 100644 examples/images/forecast_model_vert_sounding_preview.png delete mode 100644 examples/images/grids_and_cartopy_preview.png delete mode 100644 examples/images/map_resources_preview.png delete mode 100644 examples/images/metars_preview.png delete mode 100644 examples/images/model_sounding_preview.png delete mode 100644 examples/images/regional_obs_preview.png delete mode 100644 examples/images/upper_air_bufr_sounding_preview.png delete mode 100644 examples/images/warnings_preview.png delete mode 100644 examples/md/GISOperations.md delete mode 100644 examples/md/GetSatelliteIR.md delete mode 100644 examples/md/GetStates.md delete mode 100644 examples/notebooks/Colored_Surface_Temperature_Plot.ipynb delete mode 100644 examples/notebooks/Colorized_Grid_Data.ipynb delete mode 100644 examples/notebooks/Forecast_Model_Vertical_Sounding.ipynb delete mode 100644 examples/notebooks/GOES_CIRA_Product_Writer.ipynb delete mode 100644 examples/notebooks/Grid_Levels_and_Parameters.ipynb delete mode 100644 examples/notebooks/METAR_Station_Plot_with_MetPy.ipynb delete mode 100644 examples/notebooks/Map_Resources_and_Topography.ipynb delete mode 100644 examples/notebooks/Model_Sounding_Data.ipynb delete mode 100644 examples/notebooks/NEXRAD_Level3_Radar.ipynb delete mode 100644 examples/notebooks/Precip_Accumulation-Region_Of_Interest.ipynb delete mode 100644 examples/notebooks/Regional_Surface_Obs_Plot.ipynb delete mode 100644 examples/notebooks/Satellite_Imagery.ipynb delete mode 100644 examples/notebooks/Upper_Air_BUFR_Soundings.ipynb delete mode 100644 examples/notebooks/Watch_Warning_and_Advisory_Plotting.ipynb delete mode 100755 prep.sh create mode 100644 pypies/pypies.cfg create mode 100644 pypies/pypies/IDataStore.py create mode 100644 pypies/pypies/LockManager.py create mode 100644 pypies/pypies/MkDirLockManager.py create mode 100644 pypies/pypies/__init__.py create mode 100644 pypies/pypies/config/__init__.py create mode 100644 pypies/pypies/config/pypiesConfigurationManager.py create mode 100644 pypies/pypies/handlers.py create mode 100644 pypies/pypies/impl/DataStoreFactory.py create mode 100644 pypies/pypies/impl/H5pyDataStore.py create mode 100644 pypies/pypies/impl/HDF5OpManager.py create mode 100644 pypies/pypies/impl/__init__.py create mode 100644 pypies/pypies/logging/StatsThread.py create mode 100644 pypies/pypies/logging/logConfig.py create mode 100644 pypies/pypies/logging/logProcess.py create mode 100644 pypies/pypies/logging/testStatOutput.py create mode 100644 pypies/pypies/test/H5pyTiming.py create mode 100644 pypies/pypies/test/Netcdf4Timing.py create mode 100644 pypies/pypies/test/TablesTiming.py create mode 100644 pypies/pypies/test/TimingInterface.py create mode 100644 pypies/pypies/test/checkPointdata.py create mode 100644 pypies/pypies/test/selectionTiming.py create mode 100644 pypies/pypies/test/timingTest.py create mode 100644 pypies/testCorruptedFile.py create mode 100644 pypies/testCustomJavaDeserialization.py create mode 100644 pypies/testDataStore.py create mode 100644 pypies/testDeserializingJava.py create mode 100644 pypies/testSerializingPython.py create mode 100644 pypies/testSpecificSerialization.py create mode 100644 pythonPackages.ecl delete mode 100644 requirements.txt delete mode 100644 rpm/component.spec delete mode 100644 rpm/patch.diff delete mode 100644 setup.cfg delete mode 100644 setup.py delete mode 100644 thrift/ThriftStreamSerializer.class delete mode 100644 thrift/protocol/fastbinary.c rename {awips => ufpy}/AlertVizHandler.py (100%) rename {awips => ufpy}/ConfigFileUtil.py (100%) rename {awips => ufpy}/DateTimeConverter.py (100%) rename {awips => ufpy}/NotificationMessage.py (98%) rename {awips => ufpy}/QpidSubscriber.py (100%) rename {awips => ufpy}/ThriftClient.py (100%) rename {awips => ufpy}/TimeUtil.py (100%) rename {awips => ufpy}/UsageArgumentParser.py (100%) rename {awips => ufpy}/UsageOptionParser.py (100%) rename {awips => ufpy}/__init__.py (97%) rename {awips => ufpy}/dataaccess/CombinedTimeQuery.py (98%) rename {awips => ufpy}/dataaccess/DataAccessLayer.py (52%) rename {awips => ufpy}/dataaccess/DataNotificationLayer.py (91%) rename {awips => ufpy}/dataaccess/DataQueue.py (98%) rename {awips => ufpy}/dataaccess/PyData.py (97%) rename {awips => ufpy}/dataaccess/PyGeometryData.py (97%) rename {awips => ufpy}/dataaccess/PyGeometryNotification.py (97%) rename {awips => ufpy}/dataaccess/PyGridData.py (97%) rename {awips => ufpy}/dataaccess/PyGridNotification.py (97%) rename {awips => ufpy}/dataaccess/PyNotification.py (95%) rename {awips => ufpy}/dataaccess/SoundingsSupport.py (99%) rename {awips => ufpy}/dataaccess/ThriftClientRouter.py (98%) rename {awips => ufpy}/dataaccess/__init__.py (99%) rename {awips => ufpy}/gfe/IFPClient.py (96%) rename {awips => ufpy}/gfe/__init__.py (96%) rename {awips => ufpy}/ignite_password.py (100%) rename {awips => ufpy}/localization/LocalizationFileManager.py (99%) rename {awips => ufpy}/localization/LocalizationUtil.py (100%) rename {awips => ufpy}/localization/__init__.py (94%) rename {awips => ufpy}/qpidingest.py (100%) rename {awips => ufpy}/test/Record.py (100%) rename {awips => ufpy}/test/Test (97%) rename {awips => ufpy}/test/__init__.py (96%) rename {awips => ufpy}/test/dafTests/__init__.py (95%) rename {awips => ufpy}/test/dafTests/baseBufrMosTestCase.py (97%) rename {awips => ufpy}/test/dafTests/baseDafTestCase.py (98%) rename {awips => ufpy}/test/dafTests/baseRadarTestCase.py (98%) rename {awips => ufpy}/test/dafTests/params.py (100%) rename {awips => ufpy}/test/dafTests/testAcars.py (97%) rename {awips => ufpy}/test/dafTests/testAirep.py (99%) rename {awips => ufpy}/test/dafTests/testBinLightning.py (98%) rename {awips => ufpy}/test/dafTests/testBufrMosAvn.py (100%) rename {awips => ufpy}/test/dafTests/testBufrMosEta.py (100%) rename {awips => ufpy}/test/dafTests/testBufrMosGfs.py (100%) rename {awips => ufpy}/test/dafTests/testBufrMosHpc.py (100%) rename {awips => ufpy}/test/dafTests/testBufrMosLamp.py (100%) rename {awips => ufpy}/test/dafTests/testBufrMosMrf.py (100%) rename {awips => ufpy}/test/dafTests/testBufrUa.py (99%) rename {awips => ufpy}/test/dafTests/testClimate.py (99%) rename {awips => ufpy}/test/dafTests/testCombinedTimeQuery.py (95%) rename {awips => ufpy}/test/dafTests/testCommonObsSpatial.py (99%) rename {awips => ufpy}/test/dafTests/testDataTime.py (100%) rename {awips => ufpy}/test/dafTests/testFfmp.py (99%) rename {awips => ufpy}/test/dafTests/testGfe.py (99%) rename {awips => ufpy}/test/dafTests/testGfeEditArea.py (98%) rename {awips => ufpy}/test/dafTests/testGrid.py (99%) rename {awips => ufpy}/test/dafTests/testHydro.py (98%) rename {awips => ufpy}/test/dafTests/testLdadMesonet.py (98%) rename {awips => ufpy}/test/dafTests/testMaps.py (98%) rename {awips => ufpy}/test/dafTests/testModelSounding.py (99%) rename {awips => ufpy}/test/dafTests/testObs.py (99%) rename {awips => ufpy}/test/dafTests/testPirep.py (98%) rename {awips => ufpy}/test/dafTests/testPracticeWarning.py (100%) rename {awips => ufpy}/test/dafTests/testRadarGraphics.py (98%) rename {awips => ufpy}/test/dafTests/testRadarGrid.py (97%) rename {awips => ufpy}/test/dafTests/testRadarSpatial.py (99%) rename {awips => ufpy}/test/dafTests/testRequestConstraint.py (100%) rename {awips => ufpy}/test/dafTests/testSatellite.py (99%) rename {awips => ufpy}/test/dafTests/testSfcObs.py (99%) rename {awips => ufpy}/test/dafTests/testTopo.py (97%) rename {awips => ufpy}/test/dafTests/testWarning.py (99%) rename {awips => ufpy}/test/localization/__init__.py (94%) rename {awips => ufpy}/test/localization/smallTestImage.png (100%) rename {awips => ufpy}/test/localization/testLF.py (100%) rename {awips => ufpy}/test/localization/testLocalizationFileManager.py (98%) rename {awips => ufpy}/test/localization/testLocalizationRest.py (100%) rename {awips => ufpy}/test/testQpidTimeToLive.py (98%) diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 2c68773..0000000 --- a/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -Copyright (c) 2017, Unidata Python AWIPS Developers. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * Neither the name of the MetPy Developers nor the names of any - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README b/README new file mode 100644 index 0000000..add3c38 --- /dev/null +++ b/README @@ -0,0 +1,6 @@ +The python packages dir exists solely for pure python packages. +NO JAVA/JEP CODE ALLOWED. + +Each dir under this directory should be able to be copied to an installed python's +site-packages dir and function correctly, being able to be imported and used +as needed. \ No newline at end of file diff --git a/README.rst b/README.rst deleted file mode 100644 index 3e7859a..0000000 --- a/README.rst +++ /dev/null @@ -1,94 +0,0 @@ -AWIPS Python Data Access Framework -================================== - -|License| |PyPI| |Conda| |CondaDownloads| |circleci| |Travis| |LatestDocs| - -|Codacy| |Scrutinizer| |CodeClimate| |PRWelcome| - -.. |License| image:: https://img.shields.io/pypi/l/python-awips.svg - :target: https://pypi.python.org/pypi/python-awips/ - :alt: License - -.. |PyPI| image:: https://img.shields.io/pypi/v/python-awips.svg - :target: https://pypi.python.org/pypi/python-awips/ - :alt: PyPI Package - -.. |PyPIDownloads| image:: https://img.shields.io/pypi/dm/python-awips.svg - :target: https://pypi.python.org/pypi/python-awips/ - :alt: PyPI Downloads - -.. |LatestDocs| image:: https://readthedocs.org/projects/pip/badge/?version=latest - :target: http://python-awips.readthedocs.org/en/latest/ - :alt: Latest Doc Build Status - -.. |Travis| image:: https://travis-ci.org/Unidata/python-awips.svg?branch=main - :target: https://travis-ci.org/Unidata/python-awips - :alt: Travis Build Status - -.. |Codacy| image:: https://api.codacy.com/project/badge/Grade/e281f05c69164779814cad93eb3585cc - :target: https://www.codacy.com/app/mjames/python-awips - :alt: Codacy issues - -.. |CodeClimate| image:: https://codeclimate.com/github/Unidata/python-awips/badges/gpa.svg - :target: https://codeclimate.com/github/Unidata/python-awips - :alt: Code Climate - -.. |Scrutinizer| image:: https://scrutinizer-ci.com/g/Unidata/python-awips/badges/quality-score.png?b=main - :target: https://scrutinizer-ci.com/g/Unidata/python-awips/?branch=main) - :alt: Scrutinizer Code Quality - -.. |Conda| image:: https://anaconda.org/conda-forge/python-awips/badges/version.svg - :target: https://anaconda.org/conda-forge/python-awips - :alt: Conda Package - -.. |PRWelcome| - image:: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=round-square - :target: https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github - :alt: PRs Welcome - -.. |circleci| - image:: https://img.shields.io/circleci/project/github/conda-forge/python-awips-feedstock/master.svg?label=noarch - :target: https://circleci.com/gh/conda-forge/python-awips-feedstock - :alt: circleci - -.. |CondaDownloads| - image:: https://img.shields.io/conda/dn/conda-forge/python-awips.svg - :target: https://anaconda.org/conda-forge/python-awips - :alt: Conda Downloads - - -About ------ - -The python-awips package provides a data access framework for requesting grid and geometry datasets from an AWIPS `EDEX `_ server. AWIPS and python-awips packages are released and maintained by UCAR's `Unidata Program Center `_ in Boulder, Colorado. - -Install -------- - -- pip install python-awips - - or - -- conda install -c conda-forge python-awips - -Conda Environment ------------------ - -- git clone https://github.com/Unidata/python-awips.git -- cd python-awips -- conda env create -f environment.yml -- conda activate python3-awips -- jupyter notebook examples - - -Documentation -------------- - -* http://unidata.github.io/python-awips/ -* http://nbviewer.jupyter.org/github/Unidata/python-awips/tree/main/examples/notebooks - - -License -------- - -Unidata AWIPS source code and binaries (RPMs) are considered to be in the public domain, meaning there are no restrictions on any download, modification, or distribution in any form (original or modified). The Python AWIPS package contains no proprietery content and is therefore not subject to export controls as stated in the Master Rights licensing file and source code headers. diff --git a/VERSIONS b/VERSIONS new file mode 100644 index 0000000..bac0cfd --- /dev/null +++ b/VERSIONS @@ -0,0 +1,6 @@ +This file contains a listing of the versions of every applicable package. +This file SHOULD be updated whenever a newer version of a particular package is checked +in. + +dynamicserialize = RAYTHEON-OWNED (AWIPS II) +ufpy = RAYTHEON-OWNED (AWIPS II) diff --git a/awips/RadarCommon.py b/awips/RadarCommon.py deleted file mode 100644 index 8c66c99..0000000 --- a/awips/RadarCommon.py +++ /dev/null @@ -1,141 +0,0 @@ -# -# Common methods for the a2gtrad and a2advrad scripts. -# -# -# -# SOFTWARE HISTORY -# -# Date Ticket# Engineer Description -# ------------ ---------- ----------- -------------------------- -# 08/13/2014 3393 nabowle Initial creation to contain common -# code for a2*radStub scripts. -# 03/15/2015 mjames@ucar Edited/added to awips package as RadarCommon -# -# - - -def get_datetime_str(record): - """ - Get the datetime string for a record. - - Args: - record: the record to get data for. - - Returns: - datetime string. - """ - return str(record.getDataTime())[0:19].replace(" ", "_") + ".0" - - -def get_data_type(azdat): - """ - Get the radar file type (radial or raster). - - Args: - azdat: Boolean. - - Returns: - Radial or raster. - """ - if azdat: - return "radial" - return "raster" - - -def get_hdf5_data(idra): - rdat = [] - azdat = [] - depVals = [] - threshVals = [] - if idra: - for item in idra: - if item.getName() == "Data": - rdat = item - elif item.getName() == "Angles": - azdat = item - # dattyp = "radial" - elif item.getName() == "DependentValues": - depVals = item.getShortData() - elif item.getName() == "Thresholds": - threshVals = item.getShortData() - - return rdat, azdat, depVals, threshVals - - -def get_header(record, headerFormat, xLen, yLen, azdat, description): - # Encode dimensions, time, mapping, description, tilt, and VCP - mytime = get_datetime_str(record) - dattyp = get_data_type(azdat) - - if headerFormat: - msg = str(xLen) + " " + str(yLen) + " " + mytime + " " + \ - dattyp + " " + str(record.getLatitude()) + " " + \ - str(record.getLongitude()) + " " + \ - str(record.getElevation()) + " " + \ - str(record.getElevationNumber()) + " " + \ - description + " " + str(record.getTrueElevationAngle()) + " " + \ - str(record.getVolumeCoveragePattern()) + "\n" - else: - msg = str(xLen) + " " + str(yLen) + " " + mytime + " " + \ - dattyp + " " + description + " " + \ - str(record.getTrueElevationAngle()) + " " + \ - str(record.getVolumeCoveragePattern()) + "\n" - - return msg - - -def encode_thresh_vals(threshVals): - spec = [".", "TH", "ND", "RF", "BI", "GC", "IC", "GR", "WS", "DS", - "RA", "HR", "BD", "HA", "UK"] - nnn = len(threshVals) - j = 0 - msg = "" - while j < nnn: - lo = threshVals[j] % 256 - hi = threshVals[j] / 256 - msg += " " - j += 1 - if hi < 0: - if lo > 14: - msg += "." - else: - msg += spec[lo] - continue - if hi % 16 >= 8: - msg += ">" - elif hi % 8 >= 4: - msg += "<" - if hi % 4 >= 2: - msg += "+" - elif hi % 2 >= 1: - msg += "-" - if hi >= 64: - msg += "%.2f" % (lo*0.01) - elif hi % 64 >= 32: - msg += "%.2f" % (lo*0.05) - elif hi % 32 >= 16: - msg += "%.1f" % (lo*0.1) - else: - msg += str(lo) - msg += "\n" - return msg - - -def encode_dep_vals(depVals): - nnn = len(depVals) - j = 0 - msg = [] - while j < nnn: - msg.append(str(depVals[j])) - j += 1 - return msg - - -def encode_radial(azVals): - azValsLen = len(azVals) - j = 0 - msg = [] - while j < azValsLen: - msg.append(azVals[j]) - j += 1 - return msg diff --git a/awips/dataaccess/ModelSounding.py b/awips/dataaccess/ModelSounding.py deleted file mode 100644 index 3c5904f..0000000 --- a/awips/dataaccess/ModelSounding.py +++ /dev/null @@ -1,231 +0,0 @@ -# -# Classes for retrieving soundings based on gridded data from the Data Access -# Framework -# -# -# -# SOFTWARE HISTORY -# -# Date Ticket# Engineer Description -# ------------ ---------- ----------- -------------------------- -# 06/24/15 #4480 dgilling Initial Creation. -# - -from awips.dataaccess import DataAccessLayer -from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.level import Level -from shapely.geometry import Point - - -def getSounding(modelName, weatherElements, levels, samplePoint, timeRange=None): - """ - Performs a series of Data Access Framework requests to retrieve a sounding object - based on the specified request parameters. - - Args: - modelName: the grid model datasetid to use as the basis of the sounding. - weatherElements: a list of parameters to return in the sounding. - levels: a list of levels to sample the given weather elements at - samplePoint: a lat/lon pair to perform the sampling of data at. - timeRange: (optional) a list of times, or a TimeRange to specify - which forecast hours to use. If not specified, will default to all forecast hours. - - Returns: - A _SoundingCube instance, which acts a 3-tiered dictionary, keyed - by DataTime, then by level and finally by weather element. If no - data is available for the given request parameters, None is returned. - - """ - - (locationNames, parameters, levels, envelope, timeRange) = \ - __sanitizeInputs(modelName, weatherElements, levels, samplePoint, timeRange) - - requestArgs = {'datatype': 'grid', 'locationNames': locationNames, - 'parameters': parameters, 'levels': levels, 'envelope': envelope} - - req = DataAccessLayer.newDataRequest(**requestArgs) - response = DataAccessLayer.getGeometryData(req, timeRange) - soundingObject = _SoundingCube(response) - - return soundingObject - - -def changeEDEXHost(host): - """ - Changes the EDEX host the Data Access Framework is communicating with. - - Args: - host: the EDEX host to connect to - """ - - if host: - DataAccessLayer.changeEDEXHost(str(host)) - - -def __sanitizeInputs(modelName, weatherElements, levels, samplePoint, timeRange): - locationNames = [str(modelName)] - parameters = __buildStringList(weatherElements) - levels = __buildStringList(levels) - envelope = Point(samplePoint) - return locationNames, parameters, levels, envelope, timeRange - - -def __buildStringList(param): - if __notStringIter(param): - return [str(item) for item in param] - else: - return [str(param)] - - -def __notStringIter(iterable): - if not isinstance(iterable, str): - try: - iter(iterable) - return True - except TypeError: - return False - - -class _SoundingCube(object): - """ - The top-level sounding object returned when calling ModelSounding.getSounding. - - This object acts as a 3-tiered dict which is keyed by time then level - then parameter name. Calling times() will return all valid keys into this - object. - """ - - def __init__(self, geometryDataObjects): - self._dataDict = {} - self._sortedTimes = [] - if geometryDataObjects: - for geometryData in geometryDataObjects: - dataTime = geometryData.getDataTime() - level = geometryData.getLevel() - for parameter in geometryData.getParameters(): - self.__addItem(parameter, dataTime, level, geometryData.getNumber(parameter)) - - def __addItem(self, parameter, dataTime, level, value): - timeLayer = self._dataDict.get(dataTime, _SoundingTimeLayer(dataTime)) - self._dataDict[dataTime] = timeLayer - timeLayer._addItem(parameter, level, value) - if dataTime not in self._sortedTimes: - self._sortedTimes.append(dataTime) - self._sortedTimes.sort() - - def __getitem__(self, key): - return self._dataDict[key] - - def __len__(self): - return len(self._dataDict) - - def times(self): - """ - Returns the valid times for this sounding. - - Returns: - A list containing the valid DataTimes for this sounding in order. - """ - return self._sortedTimes - - -class _SoundingTimeLayer(object): - """ - The second-level sounding object returned when calling ModelSounding.getSounding. - - This object acts as a 2-tiered dict which is keyed by level then parameter - name. Calling levels() will return all valid keys into this - object. Calling time() will return the DataTime for this particular layer. - """ - - def __init__(self, dataTime): - self._dataTime = dataTime - self._dataDict = {} - - def _addItem(self, parameter, level, value): - asString = str(level) - levelLayer = self._dataDict.get(asString, _SoundingTimeAndLevelLayer(self._dataTime, asString)) - levelLayer._addItem(parameter, value) - self._dataDict[asString] = levelLayer - - def __getitem__(self, key): - asString = str(key) - if asString in self._dataDict: - return self._dataDict[asString] - else: - raise KeyError("Level " + str(key) + " is not a valid level for this sounding.") - - def __len__(self): - return len(self._dataDict) - - def time(self): - """ - Returns the DataTime for this sounding cube layer. - - Returns: - The DataTime for this sounding layer. - """ - return self._dataTime - - def levels(self): - """ - Returns the valid levels for this sounding. - - Returns: - A list containing the valid levels for this sounding in order of - closest to surface to highest from surface. - """ - sortedLevels = [Level(level) for level in list(self._dataDict.keys())] - sortedLevels.sort() - return [str(level) for level in sortedLevels] - - -class _SoundingTimeAndLevelLayer(object): - """ - The bottom-level sounding object returned when calling ModelSounding.getSounding. - - This object acts as a dict which is keyed by parameter name. Calling - parameters() will return all valid keys into this object. Calling time() - will return the DataTime for this particular layer. Calling level() will - return the level for this layer. - """ - - def __init__(self, time, level): - self._time = time - self._level = level - self._parameters = {} - - def _addItem(self, parameter, value): - self._parameters[parameter] = value - - def __getitem__(self, key): - return self._parameters[key] - - def __len__(self): - return len(self._parameters) - - def level(self): - """ - Returns the level for this sounding cube layer. - - Returns: - The level for this sounding layer. - """ - return self._level - - def parameters(self): - """ - Returns the valid parameters for this sounding. - - Returns: - A list containing the valid parameter names. - """ - return list(self._parameters.keys()) - - def time(self): - """ - Returns the DataTime for this sounding cube layer. - - Returns: - The DataTime for this sounding layer. - """ - return self._time diff --git a/awips/gempak/GridDataRetriever.py b/awips/gempak/GridDataRetriever.py deleted file mode 100644 index 5525899..0000000 --- a/awips/gempak/GridDataRetriever.py +++ /dev/null @@ -1,128 +0,0 @@ -import os -import numpy -from datetime import datetime -from awips import ThriftClient -from dynamicserialize.dstypes.gov.noaa.nws.ncep.common.dataplugin.gempak.request import GetGridDataRequest - - -class GridDataRetriever: - - def __init__(self, server, pluginName, modelId, cycle, forecast, level1, level2, vcoord, param, nnx, nny): - self.pluginName = pluginName - self.modelId = modelId - self.cycle = cycle - self.forecast = forecast - self.level1 = level1 - self.level2 = level2 - self.vcoord = vcoord - self.param = param - self.nx = nnx - self.ny = nny - self.host = os.getenv("DEFAULT_HOST", server) - self.port = os.getenv("DEFAULT_PORT", "9581") - self.client = ThriftClient.ThriftClient(self.host, self.port) - - def getData(self): - """ Sends ThriftClient request and writes out received files.""" - req = GetGridDataRequest() - - req.setPluginName(self.pluginName) - req.setModelId(self.modelId) - - dt = datetime.strptime(self.cycle, '%y%m%d/%H%M') - ct = datetime.strftime(dt, '%Y-%m-%d %H:%M:%S') - req.setReftime(ct) - req.setFcstsec(self.forecast) - - if self.level1 == '-1': - f1 = -999999.0 - else: - f1 = float(self.level1) - - if self.level2 == '-1': - f2 = -999999.0 - else: - f2 = float(self.level2) - - vcoord = self.vcoord - if vcoord == 'SGMA': - if f1 >= 0.0: - f1 = f1 / 10000 - if f2 >= 0.0: - f2 = f2 / 10000 - elif vcoord == 'DPTH': - if f1 >= 0.0: - f1 = f1 / 100.0 - if f2 >= 0.0: - f2 = f2 / 100.0 - elif vcoord == 'POTV': - if f1 >= 0.0: - f1 = f1 / 1000.0 - if f2 >= 0.0: - f2 = f2 / 1000.0 - - req.setLevel1(str(f1)) - req.setLevel2(str(f2)) - req.setVcoord(vcoord) - - req.setParm(self.param) - - resp = self.client.sendRequest(req) - - # Get the dimensions of the grid - kx = int(self.nx) - ky = int(self.ny) - kxky = kx * ky - - # Put the data into a NUMPY array - grid = numpy.asarray(resp.getFloatData()) - - # All grids need to be flipped from a GEMPAK point of view - # Reshape the array into 2D - grid = numpy.reshape(grid, (ky, kx)) - # Flip the array in the up-down direction - grid = numpy.flipud(grid) - # Reshape the array back into 1D - grid = numpy.reshape(grid, kxky) - - return [replacemissing(x) for x in grid] - - -def getgriddata(server, table, model, cycle, forecast, level1, - level2, vcoord, param, nnx, nny): - gir = GridDataRetriever(server, table, model, cycle, forecast, - level1, level2, vcoord, param, nnx, nny) - return gir.getData() - - -def getheader(server, table, model, cycle, forecast, level1, - level2, vcoord, param, nnx, nny): - idata = [] - idata.append(0) - idata.append(0) - return idata - - -def replacemissing(x): - if x == -999999.0: - return -9999.0 - return x - - -# This is the standard boilerplate that runs this script as a main -if __name__ == '__main__': - # Run Test - srv = 'edex-cloud.unidata.ucar.edu' - tbl = 'grid' - mdl = 'GFS20' - cyc = '131227/0000' - fcs = '43200' - lv1 = '500' - lv2 = '-1' - vcd = 'PRES' - prm = 'HGHT' - nx = '720' - ny = '361' - - print(getheader(srv, tbl, mdl, cyc, fcs, lv1, lv2, vcd, prm, nx, ny)) - print(getgriddata(srv, tbl, mdl, cyc, fcs, lv1, lv2, vcd, prm, nx, ny)) diff --git a/awips/gempak/GridInfoRetriever.py b/awips/gempak/GridInfoRetriever.py deleted file mode 100644 index 8fc5f80..0000000 --- a/awips/gempak/GridInfoRetriever.py +++ /dev/null @@ -1,145 +0,0 @@ -import os -import sys -from datetime import datetime -from operator import itemgetter -from awips import ThriftClient -from dynamicserialize.dstypes.gov.noaa.nws.ncep.common.dataplugin.gempak.request import GetGridInfoRequest - - -class GridInfoRetriever: - - def __init__(self, server, pluginName, modelId, cycle=None, forecast=None): - self.pluginName = pluginName - self.modelId = modelId - self.cycle = cycle - self.forecast = forecast - self.host = os.getenv("DEFAULT_HOST", server) - self.port = os.getenv("DEFAULT_PORT", "9581") - self.client = ThriftClient.ThriftClient(self.host, self.port) - - def getInfo(self): - import sys - """ Sends ThriftClient request and writes out received files.""" - req = GetGridInfoRequest() - req.setPluginName(self.pluginName) - req.setModelId(self.modelId) - - req.setReftime(self.cycle) - if len(self.cycle) > 2: - dt = datetime.strptime(self.cycle, '%y%m%d/%H%M') - ct = datetime.strftime(dt, '%Y-%m-%d %H:%M:%S') - req.setReftime(ct) - - req.setFcstsec(self.forecast) - resp = self.client.sendRequest(req) - - # Take care of bytestring encodings in python3 - for i, rec in enumerate(resp): - resp[i] = { - key.decode() if isinstance(key, bytes) else key: - val.decode() if isinstance(val, bytes) else val - for key, val in rec.items() - } - - sortresp = sorted(sorted(resp, key=itemgetter("reftime"), reverse=True), key=itemgetter("fcstsec")) - - grids = [] - - count = 0 - for record in sortresp: - s = '{:<12}'.format(record['param']) - - if sys.byteorder == 'little': - parm1 = (ord(s[3]) << 24) + (ord(s[2]) << 16) + (ord(s[1]) << 8) + ord(s[0]) - parm2 = (ord(s[7]) << 24) + (ord(s[6]) << 16) + (ord(s[5]) << 8) + ord(s[4]) - parm3 = (ord(s[11]) << 24) + (ord(s[10]) << 16) + (ord(s[9]) << 8) + ord(s[8]) - else: - parm1 = (ord(s[0]) << 24) + (ord(s[1]) << 16) + (ord(s[2]) << 8) + ord(s[3]) - parm2 = (ord(s[4]) << 24) + (ord(s[5]) << 16) + (ord(s[6]) << 8) + ord(s[7]) - parm3 = (ord(s[8]) << 24) + (ord(s[9]) << 16) + (ord(s[10]) << 8) + ord(s[11]) - - dt = datetime.strptime(record['reftime'], '%Y-%m-%d %H:%M:%S.%f') - dattim = dt.month * 100000000 + dt.day * 1000000 + (dt.year%100) * 10000 + dt.hour * 100 + dt.minute - fcsth = (int(record['fcstsec']) / 60) / 60 - fcstm = (int(record['fcstsec']) / 60) % 60 - fcst = 100000 + fcsth * 100 + fcstm - - lv1 = float(record['level1']) - if lv1 == -999999.0: - lv1 = -1.0 - lv2 = float(record['level2']) - if lv2 == -999999.0: - lv2 = -1.0 - - vcd = record['vcoord'] - if vcd == 'NONE': - ivcd = 0 - elif vcd == 'PRES': - ivcd = 1 - elif vcd == 'THTA': - ivcd = 2 - elif vcd == 'HGHT': - ivcd = 3 - elif vcd == 'SGMA': - ivcd = 4 - if lv1 >= 0.0: - lv1 = lv1 * 10000.0 - if lv2 >= 0.0: - lv2 = lv2 * 10000.0 - elif vcd == 'DPTH': - ivcd = 5 - if lv1 >= 0.0: - lv1 = lv1 * 100.0 - if lv2 >= 0.0: - lv2 = lv2 * 100.0 - elif vcd == 'HYBL': - ivcd = 6 - else: - v = '{:<4}'.format(vcd) - if sys.byteorder == 'little': - ivcd = (ord(v[3]) << 24) + (ord(v[2]) << 16) + (ord(v[1]) << 8) + ord(v[0]) - else: - ivcd = (ord(v[0]) << 24) + (ord(v[1]) << 16) + (ord(v[2]) << 8) + ord(v[3]) - if vcd == 'POTV': - if lv1 >= 0.0: - lv1 = lv1 * 1000.0 - if lv2 >= 0.0: - lv2 = lv2 * 1000.0 - grids.append(9999) - grids.append(dattim) - grids.append(fcst) - grids.append(0) - grids.append(0) - grids.append(int(lv1)) - grids.append(int(lv2)) - grids.append(ivcd) - grids.append(parm1) - grids.append(parm2) - grids.append(parm3) - count += 1 - if count > 29998: - break - - return grids - - -def getinfo(server, table, model, cycle, forecast): - gir = GridInfoRetriever(server, table, model, cycle, forecast) - return gir.getInfo() - - -def getrow(server, table, model, cycle, forecast): - idata = [] - idata.append(9999) - idata.append(1) - return idata - - -# This is the standard boilerplate that runs this script as a main -if __name__ == '__main__': - # Run Test - srv = 'edex-cloud.unidata.ucar.edu' - tbl = 'grid' - mdl = 'NAM40' - print(getrow(srv, tbl, mdl)) - print(getinfo(srv, tbl, mdl)) diff --git a/awips/gempak/GridNavRetriever.py b/awips/gempak/GridNavRetriever.py deleted file mode 100644 index 43c7f5a..0000000 --- a/awips/gempak/GridNavRetriever.py +++ /dev/null @@ -1,301 +0,0 @@ -import os -import math -from awips import ThriftClient -from dynamicserialize.dstypes.gov.noaa.nws.ncep.common.dataplugin.gempak.request import GetGridNavRequest -from ctypes import * - -EARTH_RADIUS = 6371200.0 -DEG_TO_RAD = math.pi / 180.0 -RAD_TO_DEG = 180.0 / math.pi -TWOPI = math.pi * 2.0 -HALFPI = math.pi / 2.0 -PI4TH = math.pi / 4.0 -PI3RD = math.pi / 3.0 - - -def createPolar(nsflag, clon, lat1, lon1, dx, dy, unit, nx, ny): - clonr = clon * DEG_TO_RAD - latr = lat1 * DEG_TO_RAD - lonr = lon1 * DEG_TO_RAD - if nsflag == 'N': - x1 = EARTH_RADIUS * math.tan(PI4TH - latr/2.0) * math.sin(lonr-clonr) - y1 = -1 * EARTH_RADIUS * math.tan(PI4TH - latr/2.0) * math.cos(lonr-clonr) - else: - x1 = EARTH_RADIUS * math.tan(PI4TH + latr/2.0) * math.sin(lonr-clonr) - y1 = EARTH_RADIUS * math.tan(PI4TH + latr/2.0) * math.cos(lonr-clonr) - - if unit == 'm': - tdx = dx / (1 + math.sin(PI3RD)) - tdy = dy / (1 + math.sin(PI3RD)) - else: - tdx = (dx*1000.0) / (1 + math.sin(PI3RD)) - tdy = (dy*1000.0) / (1 + math.sin(PI3RD)) - - x2 = x1 + tdx * (nx-1) - y2 = y1 + tdy * (ny-1) - xll = min(x1, x2) - yll = min(y1, y2) - xur = max(x1, x2) - yur = max(y1, y2) - - if nsflag == 'N': - latll = (HALFPI - 2*math.atan2(math.hypot(xll, yll), EARTH_RADIUS)) * RAD_TO_DEG - rtemp = clonr + math.atan2(xll, -yll) - else: - latll = -1 * (HALFPI - 2*math.atan2(math.hypot(xll, yll), EARTH_RADIUS)) * RAD_TO_DEG - rtemp = clonr + math.atan2(xll, yll) - - if rtemp > math.pi: - lonll = (rtemp-TWOPI) * RAD_TO_DEG - elif rtemp < -math.pi: - lonll = (rtemp+TWOPI) * RAD_TO_DEG - else: - lonll = rtemp * RAD_TO_DEG - - if nsflag == 'N': - latur = (HALFPI - 2*math.atan2(math.hypot(xur, yur), EARTH_RADIUS)) * RAD_TO_DEG - rtemp = clonr + math.atan2(xur, -yur) - else: - latur = -1 * (HALFPI - 2*math.atan2(math.hypot(xur, yur), EARTH_RADIUS)) * RAD_TO_DEG - rtemp = clonr + math.atan2(xur, yur) - - if rtemp > math.pi: - lonur = (rtemp-TWOPI) * RAD_TO_DEG - elif rtemp < -math.pi: - lonur = (rtemp+TWOPI) * RAD_TO_DEG - else: - lonur = rtemp * RAD_TO_DEG - - return [latll, lonll, latur, lonur] - - -def createConic(nsflag, clon, lat1, lon1, dx, dy, unit, nx, ny, ang1, ang3): - clonr = clon * DEG_TO_RAD - latr = lat1 * DEG_TO_RAD - lonr = lon1 * DEG_TO_RAD - - angle1 = HALFPI - (math.fabs(ang1) * DEG_TO_RAD) - angle2 = HALFPI - (math.fabs(ang3) * DEG_TO_RAD) - - if ang1 == ang3: - cc = math.cos(angle1) - else: - cc = (math.log(math.sin(angle2)) - math.log(math.sin(angle1))) \ - / (math.log(math.tan(angle2/2.0)) - math.log(math.tan(angle1/2.0))) - - er = EARTH_RADIUS / cc - - if nsflag == 'N': - x1 = er * math.pow(math.tan((HALFPI-latr)/2.0), cc) * math.sin(cc*(lonr-clonr)) - y1 = -1.0 * er * math.pow(math.tan((HALFPI-latr)/2.0), cc) * math.cos(cc*(lonr-clonr)) - else: - x1 = er * math.pow(math.tan((HALFPI+latr)/2.0), cc) * math.sin(cc*(lonr-clonr)) - y1 = er * math.pow(math.tan((HALFPI+latr)/2.0), cc) * math.cos(cc*(lonr-clonr)) - - alpha = math.pow(math.tan(angle1/2.0), cc) / math.sin(angle1) - - if unit == 'm': - x2 = x1 + (nx-1) * alpha * dx - y2 = y1 + (ny-1) * alpha * dy - else: - x2 = x1 + (nx-1) * alpha * (dx*1000.0) - y2 = y1 + (ny-1) * alpha * (dy*1000.0) - - xll = min(x1, x2) - yll = min(y1, y2) - xur = max(x1, x2) - yur = max(y1, y2) - - if nsflag == 'N': - latll = (HALFPI - 2.0 * math.atan(math.pow(math.hypot(xll, yll)/er, (1/cc)))) * RAD_TO_DEG - rtemp = math.atan2(xll, -yll) * (1/cc) + clonr - else: - latll = (-1.0 * (HALFPI - 2.0 * math.atan(math.pow(math.hypot(xll, yll)/er, (1/cc))))) * RAD_TO_DEG - rtemp = math.atan2(xll, yll) * (1/cc) + clonr - - if rtemp > math.pi: - lonll = (rtemp-TWOPI) * RAD_TO_DEG - elif rtemp < -math.pi: - lonll = (rtemp+TWOPI) * RAD_TO_DEG - else: - lonll = rtemp * RAD_TO_DEG - - if nsflag == 'N': - latur = (HALFPI - 2.0 * math.atan(math.pow(math.hypot(xur, yur)/er, (1/cc)))) * RAD_TO_DEG - rtemp = math.atan2(xur, -yur) * (1/cc) + clonr - else: - latur = (-1.0 * (HALFPI - 2.0 * math.atan(math.pow(math.hypot(xur, yur)/er, (1/cc))))) * RAD_TO_DEG - rtemp = math.atan2(xur, yur) * (1/cc) + clonr - - if rtemp > math.pi: - lonur = (rtemp-TWOPI) * RAD_TO_DEG - elif rtemp < -math.pi: - lonur = (rtemp+TWOPI) * RAD_TO_DEG - else: - lonur = rtemp * RAD_TO_DEG - - return [latll, lonll, latur, lonur] - - -class StringConverter(Union): - _fields_ = [("char", c_char*4), ("int", c_int), ("float", c_float)] - - -class GridNavRetriever: - - def __init__(self, server, pluginName, modelId, arrayLen): - self.pluginName = pluginName - self.modelId = modelId - self.arrayLen = arrayLen - self.host = os.getenv("DEFAULT_HOST", server) - self.port = os.getenv("DEFAULT_PORT", "9581") - self.client = ThriftClient.ThriftClient(self.host, self.port) - - def getNavBlk(self): - """ Sends ThriftClient request and writes out received files.""" - req = GetGridNavRequest() - req.setPluginName(self.pluginName) - req.setModelId(self.modelId) - resp = self.client.sendRequest(req) - - for i, rec in enumerate(resp): - resp[i] = { - key.decode() if isinstance(key, bytes) else key: - val.decode() if isinstance(val, bytes) else val - for key, val in rec.items() - } - - nav = [] - - for record in resp: - unit = record['spacingunit'] - sk = record['spatialkey'] - skarr = sk.split('/') - - nx = float(skarr[1]) - ny = float(skarr[2]) - dx = float(skarr[3]) - dy = float(skarr[4]) - - sc = StringConverter() - if record['projtype'] == 'LatLon': - sc.char = 'CED ' - gemproj = 2.0 - ang1 = 0.0 - ang2 = 0.0 - ang3 = 0.0 - - lllat = float(record['lowerleftlat']) - lllon = float(record['lowerleftlon']) - urlat = lllat + (dy * (ny-1)) - urlon = lllon + (dx * (nx-1)) - if lllon > 180: - lllon -= 360.0 - if urlon > 180: - urlon -= 360.0 - - if record['projtype'] == 'Polar Stereographic': - sc.char = 'STR ' - gemproj = 2.0 - if float(record['standard_parallel_1']) < 0.0: - ang1 = -90.0 - nsflag = 'S' - else: - ang1 = 90.0 - nsflag = 'N' - ang2 = float(record['central_meridian']) - ang3 = 0.0 - - lat1 = float(record['lowerleftlat']) - lon1 = float(record['lowerleftlon']) - coords = createPolar(nsflag, ang2, lat1, lon1, dx, dy, unit, nx, ny) - lllat = coords[0] - lllon = coords[1] - urlat = coords[2] - urlon = coords[3] - - if record['projtype'] == 'Lambert Conformal': - sc.char = 'LCC ' - gemproj = 2.0 - - ang1 = float(skarr[7]) - ang2 = float(record['central_meridian']) - ang3 = float(skarr[8]) - if ang1 < 0.0: - nsflag = 'S' - else: - nsflag = 'N' - - lat1 = float(record['lowerleftlat']) - lon1 = float(record['lowerleftlon']) - coords = createConic(nsflag, ang2, lat1, lon1, dx, dy, unit, nx, ny, ang1, ang3) - lllat = coords[0] - lllon = coords[1] - urlat = coords[2] - urlon = coords[3] - - # Fill up the output array of floats - nav.append(gemproj) - nav.append(sc.float) - nav.append(1.0) - nav.append(1.0) - nav.append(nx) - nav.append(ny) - nav.append(lllat) - nav.append(lllon) - nav.append(urlat) - nav.append(urlon) - nav.append(ang1) - nav.append(ang2) - nav.append(ang3) - - for i in range(13, int(self.arrayLen)): - nav.append(0.0) - return nav - - def getAnlBlk(self): - anl = [] - # Type - anl.append(2.0) - # Delta - anl.append(1.0) - # Extend area - anl.append(0.0) - anl.append(0.0) - anl.append(0.0) - anl.append(0.0) - # Grid area - anl.append(-90.0) - anl.append(-180.0) - anl.append(90.0) - anl.append(180.0) - # Data area - anl.append(-90.0) - anl.append(-180.0) - anl.append(90.0) - anl.append(180.0) - for i in range(18, int(self.arrayLen)): - anl.append(0.0) - return anl - - -def getnavb(server, table, model, arrlen): - gnr = GridNavRetriever(server, table, model, arrlen) - return gnr.getNavBlk() - - -def getanlb(server, table, model, arrlen): - gnr = GridNavRetriever(server, table, model, arrlen) - return gnr.getAnlBlk() - - -# This is the standard boilerplate that runs this script as a main -if __name__ == '__main__': - # Run Test - srv = 'edex-cloud.unidata.ucar.edu' - tbl = 'grid_info' - mdl = 'NAM40' - navlen = '256' - print(getnavb(srv, tbl, mdl, navlen)) - anllen = '128' - print(getanlb(srv, tbl, mdl, anllen)) diff --git a/awips/gempak/StationDataRetriever.py b/awips/gempak/StationDataRetriever.py deleted file mode 100644 index 97b4d01..0000000 --- a/awips/gempak/StationDataRetriever.py +++ /dev/null @@ -1,144 +0,0 @@ -import os -from datetime import datetime -from awips import ThriftClient -from dynamicserialize.dstypes.com.raytheon.uf.common.time import DataTime -from dynamicserialize.dstypes.com.raytheon.uf.common.time import TimeRange -from dynamicserialize.dstypes.gov.noaa.nws.ncep.common.dataplugin.gempak.request import StationDataRequest - - -class StationDataRetriever: - """ Retrieves all data for a requested station and time """ - - def __init__(self, server, pluginName, stationId, refTime, parmList, partNumber): - self.pluginName = pluginName - self.stationId = stationId - self.refTime = refTime - self.parmList = parmList - self.partNumber = partNumber - self.host = os.getenv("DEFAULT_HOST", server) - self.port = os.getenv("DEFAULT_PORT", "9581") - self.client = ThriftClient.ThriftClient(self.host, self.port) - - def getStationData(self): - """ Sends ThriftClient request and writes out received files.""" - dtime = datetime.strptime(self.refTime, "%y%m%d/%H%M") - trange = TimeRange() - trange.setStart(dtime) - trange.setEnd(dtime) - dataTime = DataTime(refTime=dtime, validPeriod=trange) - req = StationDataRequest() - req.setPluginName(self.pluginName) - req.setStationId(self.stationId) - req.setRefTime(dataTime) - req.setParmList(self.parmList) - req.setPartNumber(self.partNumber) - resp = self.client.sendRequest(req) - - for i, rec in enumerate(resp): - resp[i] = { - key.decode() if isinstance(key, bytes) else key: - val.decode() if isinstance(val, bytes) else val - for key, val in rec.items() - } - - return resp - - -def getstationdata(server, table, stationId, refTime, parmList, partNumber): - sr = StationDataRetriever(server, table, stationId, refTime, parmList, partNumber) - lcldict = sr.getStationData() - - rdata = [] - - for substr in parmList.split(','): - if substr in lcldict: - rdata.append(lcldict[substr]) - else: - rdata.append(-9999.00) - - return rdata - - -def getleveldata(server, table, stationId, refTime, parmList, partNumber): - sr = StationDataRetriever(server, table, stationId, refTime, parmList, partNumber) - lcldict = sr.getStationData() - - numset = [1] - for substr in parmList.split(','): - if substr in lcldict: - pnum = len(lcldict[substr]) - 1 - while pnum >= 0: - if lcldict[substr][pnum] != -9999.00: - break - pnum = pnum - 1 - numset.append(pnum) - - rdata = [] - - for jj in range(max(numset)): - for substr in parmList.split(','): - if substr in lcldict: - if lcldict[substr][jj] == -9999998.0: - rdata.append(-9999.0) - else: - rdata.append(lcldict[substr][jj]) - else: - rdata.append(-9999.0) - - return rdata - - -def getstationtext(server, table, stationId, refTime, parmList, partNumber): - sr = StationDataRetriever(server, table, stationId, refTime, parmList, partNumber) - lcldict = sr.getStationData() - - if parmList in lcldict: - return lcldict[parmList] - else: - return ' ' - - -def getheader(server, table, stationId, refTime, parmList, partNumber): - idata = [] - idata.append(0) - return idata - - -# This is the standard boilerplate that runs this script as a main -if __name__ == '__main__': - # Run Test - srv = 'edex-cloud.unidata.ucar.edu' - key = '-' - print('OBS - METAR') - tbl = 'obs' - stn = 'KLGA' - time = '130823/1700' - parm = 'seaLevelPress,temperature,dewpoint,windSpeed,windDir' - part = '0' - print(getheader(srv, tbl, stn, time, parm, part)) - print(getstationdata(srv, tbl, stn, time, parm, part)) - parm = 'rawMETAR' - print(getstationtext(srv, tbl, stn, time, parm, part)) - print('SFCOBS - SYNOP') - tbl = 'sfcobs' - stn = '72403' - time = '130823/1800' - parm = 'seaLevelPress,temperature,dewpoint,windSpeed,windDir' - part = '0' - print(getheader(srv, tbl, stn, time, parm, part)) - print(getstationdata(srv, tbl, stn, time, parm, part)) - parm = 'rawReport' - print(getstationtext(srv, tbl, stn, time, parm, part)) - print('UAIR') - tbl = 'bufrua' - stn = '72469' - time = '130823/1200' - parm = 'prMan,htMan,tpMan,tdMan,wdMan,wsMan' - part = '2020' - print(getleveldata(srv, tbl, stn, time, parm, part)) - parm = 'prSigT,tpSigT,tdSigT' - part = '2022' - print(getleveldata(srv, tbl, stn, time, parm, part)) - parm = 'htSigW,wsSigW,wdSigW' - part = '2021' - print(getleveldata(srv, tbl, stn, time, parm, part)) diff --git a/awips/gempak/StationRetriever.py b/awips/gempak/StationRetriever.py deleted file mode 100644 index b18d1c2..0000000 --- a/awips/gempak/StationRetriever.py +++ /dev/null @@ -1,93 +0,0 @@ -import os -import sys -from awips import ThriftClient -from dynamicserialize.dstypes.gov.noaa.nws.ncep.common.dataplugin.gempak.request import GetStationsRequest - - -class StationRetriever: - """ Retrieves all requested stations """ - - def __init__(self, server, pluginName): - self.pluginName = pluginName - self.outdir = os.getcwd() - self.host = os.getenv("DEFAULT_HOST", server) - self.port = os.getenv("DEFAULT_PORT", "9581") - self.client = ThriftClient.ThriftClient(self.host, self.port) - - def getStations(self): - """ Sends ThriftClient request and writes out received files.""" - req = GetStationsRequest() - req.setPluginName(self.pluginName) - resp = self.client.sendRequest(req) - - for i, rec in enumerate(resp): - resp[i] = { - key.decode() if isinstance(key, bytes) else key: - val.decode() if isinstance(val, bytes) else val - for key, val in rec.items() - } - - stns = [] - for item in resp: - stationstr = '{:<8}'.format(item.getStationId()) - - if sys.byteorder == 'little': - stnid = (ord(stationstr[3]) << 24) + (ord(stationstr[2]) << 16) + \ - (ord(stationstr[1]) << 8) + ord(stationstr[0]) - stnid2 = (ord(stationstr[7]) << 24) + (ord(stationstr[6]) << 16) + \ - (ord(stationstr[5]) << 8) + ord(stationstr[4]) - else: - stnid = (ord(stationstr[0]) << 24) + (ord(stationstr[1]) << 16) + \ - (ord(stationstr[2]) << 8) + ord(stationstr[3]) - stnid2 = (ord(stationstr[4]) << 24) + (ord(stationstr[5]) << 16) + \ - (ord(stationstr[6]) << 8) + ord(stationstr[7]) - - if item.getState() is None: - stationstr = ' ' - else: - stationstr = '{:<4}'.format(item.getState()) - - if sys.byteorder == 'little': - state = (ord(stationstr[3]) << 24) + (ord(stationstr[2]) << 16) \ - + (ord(stationstr[1]) << 8) + ord(stationstr[0]) - else: - state = (ord(stationstr[0]) << 24) + (ord(stationstr[1]) << 16) \ - + (ord(stationstr[2]) << 8) + ord(stationstr[3]) - - stationstr = '{:<4}'.format(item.getCountry()) - if sys.byteorder == 'little': - cntry = (ord(stationstr[3]) << 24) + (ord(stationstr[2]) << 16) \ - + (ord(stationstr[1]) << 8) + ord(stationstr[0]) - else: - cntry = (ord(stationstr[0]) << 24) + (ord(stationstr[1]) << 16) \ - + (ord(stationstr[2]) << 8) + ord(stationstr[3]) - - stns.append(9999) - stns.append(stnid) - stns.append(item.getWmoIndex()) - stns.append(int(item.getLatitude()*100)) - stns.append(int(item.getLongitude()*100)) - stns.append(int(item.getElevation())) - stns.append(state) - stns.append(cntry) - stns.append(stnid2) - stns.append(0) - return stns - - -def getstations(server, table, key, dummy, dummy2): - sr = StationRetriever(server, table) - return sr.getStations() - - -# This is the standard boilerplate that runs this script as a main -if __name__ == '__main__': - # Run Test - srv = 'edex-cloud.unidata.ucar.edu' - key = '-' - print('OBS - METAR') - tbl = 'obs' - print(getstations(srv, tbl, key)) - print('SFCOBS - SYNOP') - tbl = 'sfcobs' - print(getstations(srv, tbl, key)) diff --git a/awips/gempak/TimeRetriever.py b/awips/gempak/TimeRetriever.py deleted file mode 100644 index 0df50cd..0000000 --- a/awips/gempak/TimeRetriever.py +++ /dev/null @@ -1,76 +0,0 @@ -import os -from datetime import datetime -from awips import ThriftClient -from dynamicserialize.dstypes.java.util import GregorianCalendar -from dynamicserialize.dstypes.gov.noaa.nws.ncep.common.dataplugin.gempak.request import GetTimesRequest - - -class TimeRetriever: - """ Retrieves all requested times""" - - def __init__(self, server, pluginName, timeField): - self.pluginName = pluginName - self.timeField = timeField - self.outdir = os.getcwd() - self.host = os.getenv("DEFAULT_HOST", server) - self.port = os.getenv("DEFAULT_PORT", "9581") - self.client = ThriftClient.ThriftClient(self.host, self.port) - - def getTimes(self): - """ Sends ThriftClient request and writes out received files.""" - req = GetTimesRequest() - req.setPluginName(self.pluginName) - req.setTimeField(self.timeField) - resp = self.client.sendRequest(req) - - for i, rec in enumerate(resp): - resp[i] = { - key.decode() if isinstance(key, bytes) else key: - val.decode() if isinstance(val, bytes) else val - for key, val in rec.items() - } - - timelist = [] - for item in resp.getTimes(): - if isinstance(item, GregorianCalendar): - tstamp = item.getTimeInMillis() - else: - tstamp = item.getTime() - time = datetime.utcfromtimestamp(tstamp/1000) - timelist.append(time) - - timelist.sort(reverse=True) - - times = [] - for time in timelist: - times.append(9999) - times.append((time.year % 100) * 10000 + (time.month * 100) + time.day) - times.append((time.hour * 100) + time.minute) - - # GEMPAK can only handle up to 200 times, which is 600 elements - # in this array -- [9999, DATE, TIME] -- repeated - return times[0:600] - - -def gettimes(server, table, key, dummy, dummy2): - tr = TimeRetriever(server, table, key) - return tr.getTimes() - - -# This is the standard boilerplate that runs this script as a main -if __name__ == '__main__': - srv = 'edex-cloud.unidata.ucar.edu' - print('OBS - METAR') - tbl = 'obs' - key = 'refHour' - print(gettimes(srv, tbl, key)) - - print('SFCOBS - SYNOP') - tbl = 'sfcobs' - key = 'refHour' - print(gettimes(srv, tbl, key)) - - print('BUFRUA') - tbl = 'bufrua' - key = 'dataTime.refTime' - print(gettimes(srv, tbl, key)) diff --git a/awips/gempak/ncepGribTables.py b/awips/gempak/ncepGribTables.py deleted file mode 100755 index 9423513..0000000 --- a/awips/gempak/ncepGribTables.py +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env python -# Parse html tables from a given URL and output CSV. -# Note: To install a missing python module foo do "easy_install foo" -# (or the new way is "pip install foo" but you might have to do -# "easy_install pip" first) - -from BeautifulSoup import BeautifulSoup -import scrape -import urllib.request, urllib.error, urllib.parse -import html.entities -import re -import sys -import unicodedata - - -# from http://stackoverflow.com/questions/1197981/convert-html-entities -def asciify2(s): - matches = re.findall("&#\d+;", s) - if len(matches) > 0: - hits = set(matches) - for hit in hits: - name = hit[2:-1] - try: - entnum = int(name) - s = s.replace(hit, chr(entnum)) - except ValueError: - pass - - matches = re.findall("&\w+;", s) - hits = set(matches) - amp = "&" - if amp in hits: - hits.remove(amp) - for hit in hits: - name = hit[1:-1] - if name in html.entities.name2codepoint: - s = s.replace(hit, "") - s = s.replace(amp, "&") - return s - - -def opensoup(url): - request = urllib.request.Request(url) - request.add_header("User-Agent", "Mozilla/5.0") - # To mimic a real browser's user-agent string more exactly, if necessary: - # Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) - # Gecko/20080418 Ubuntu/7.10 (gutsy) Firefox/2.0.0.14 - pagefile = urllib.request.urlopen(request) - soup = BeautifulSoup(pagefile) - pagefile.close() - return soup - - -def asciify(s): - return unicodedata.normalize('NFKD', s).encode('ascii', 'ignore') - - -# remove extra whitespace, including stripping leading and trailing whitespace. -def condense(s): - s = re.sub(r"\s+", " ", s, re.DOTALL) - return s.strip() - - -def stripurl(s): - s = re.sub(r"\]*\>[^\<]*\<\/span\>", "", s) - s = re.sub(r"\&\#160\;", " ", s) - return condense(re.sub(r"\<[^\>]*\>", " ", s)) - - -# this gets rid of tags and condenses whitespace -def striptags(s): - s = re.sub(r"\]*\>[^\<]*\<\/span\>", "", s) - s = re.sub(r"\&\#160\;", " ", s) - return condense(s) - - -def getUrlArgs(parseUrl): - return re.search('grib2_table4-2-(\d+)-(\d+).shtml', parseUrl).groups() - - -if len(sys.argv) == 1: - print("Usage: ", sys.argv[0], " url [n]") - print(" (where n indicates which html table to parse)") - exit(1) - -url = sys.argv[1] -soup = opensoup(url) -tables = soup.findAll("table") - -for table in tables: - for r in table.findAll('tr'): - rl = [] - for c in r.findAll(re.compile('td|th')): - rl.append(striptags(c.renderContents())) - if len(rl) > 1 and "href" in rl[1]: - print('! ' + stripurl(rl[1])) - scrapeUrl = 'http://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_table4-2-' + \ - getUrlArgs(rl[1])[0] + "-" + getUrlArgs(rl[1])[1] + '.shtml' - scrape.run(scrapeUrl) diff --git a/awips/gempak/scrape.py b/awips/gempak/scrape.py deleted file mode 100755 index 06989f4..0000000 --- a/awips/gempak/scrape.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python -# Parse html tables from a given URL and output CSV. -# Note: To install a missing python module foo do "easy_install foo" -# (or the new way is "pip install foo" but you might have to do -# "easy_install pip" first) - -from BeautifulSoup import BeautifulSoup -import urllib.request, urllib.error, urllib.parse -import html.entities -import re -import sys -import unicodedata - - -# from http://stackoverflow.com/questions/1197981/convert-html-entities -def asciify2(s): - matches = re.findall("&#\d+;", s) - if len(matches) > 0: - hits = set(matches) - for hit in hits: - name = hit[2:-1] - try: - entnum = int(name) - s = s.replace(hit, chr(entnum)) - except ValueError: - pass - - matches = re.findall("&\w+;", s) - hits = set(matches) - amp = "&" - if amp in hits: - hits.remove(amp) - for hit in hits: - name = hit[1:-1] - if name in html.entities.name2codepoint: - s = s.replace(hit, "") - s = s.replace(amp, "&") - return s - - -def opensoup(url): - request = urllib.request.Request(url) - request.add_header("User-Agent", "Mozilla/5.0") - # To mimic a real browser's user-agent string more exactly, if necessary: - # Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.14) - # Gecko/20080418 Ubuntu/7.10 (gutsy) Firefox/2.0.0.14 - pagefile = urllib.request.urlopen(request) - soup = BeautifulSoup(pagefile) - pagefile.close() - return soup - - -def asciify(s): - return unicodedata.normalize('NFKD', s).encode('ascii', 'ignore') - - -# remove extra whitespace, including stripping leading and trailing whitespace. -def condense(s): - s = re.sub(r"\s+", " ", s, re.DOTALL) - return s.strip() - - -# this gets rid of tags and condenses whitespace -def striptags(s): - s = re.sub(r"\]*\>[^\<]*\<\/span\>", "", s) - s = re.sub(r"\&\#160\;", " ", s) - return condense(re.sub(r"\<[^\>]*\>", " ", s)) - - -if len(sys.argv) == 1: # called with no arguments - print("Usage: ", sys.argv[0], " url [n]") - print(" (where n indicates which html table to parse)") - exit(1) - - -def getUrlArgs(parseUrl): - return re.search('grib2_table4-2-(\d+)-(\d+).shtml', parseUrl).groups() - - -def run(url): - soup = opensoup(url) - tables = soup.findAll("table") - for table in tables: - ct = 0 - for r in table.findAll('tr'): - rl = [] - for c in r.findAll(re.compile('td|th')): - rl.append(striptags(c.renderContents())) - if ct > 0: - rl[0] = getUrlArgs(url)[0].zfill(3) + " " + \ - getUrlArgs(url)[1].zfill(3) + " " + rl[0].zfill(3) + " 000" - if len(rl) > 1: - if "Reserved" in rl[1]: - rl[0] = '!' + rl[0] - if "See Table" in rl[2] or "Code table" in rl[2]: - rl[2] = "cat" - rl[1] = rl[1][:32].ljust(32) - rl[2] = rl[2].ljust(20) - rl[3] = rl[3].ljust(12) + " 0 -9999.00" - if ct: - print(" ".join(rl)) - ct += 1 - - -if __name__ == '__main__': - run(sys.argv[1]) diff --git a/awips/tables.py b/awips/tables.py deleted file mode 100644 index 100875f..0000000 --- a/awips/tables.py +++ /dev/null @@ -1,2033 +0,0 @@ - -class Item(object): - def __init__(self, *initial_data, **kwargs): - for dictionary in initial_data: - for key in dictionary: - setattr(self, key, dictionary[key]) - for key in kwargs: - setattr(self, key, kwargs[key]) - - -#class GenerateNexradTable(object): -# import numpy as np -# import json -# # find this file locally and confirm location -# filename = '~/awips2-builds/edexOsgi/com.raytheon.edex.plugin.radar/utility/common_static/base/radarInfoSimple.txt' -# data = np.genfromtxt( -# filename, -# delimiter=",", -# autostrip=True, -# skip_header=0, -# names=True, -# dtype=None) -# -# for x in data: -# defn = Item(dict(zip(data.dtype.names, x))) -# prod = dict(zip(data.dtype.names, x)) -# nexrad[defn.id] = prod -# -# return json.dumps(nexrad, indent=1) - - -profiler = { - "74997" : { - "profilerId": "ASTC1", - "latitude": 46.16, - "longitude": -123.88, - "elevation": 3, - "profilerName": "Astoria OR"}, - "74996" : { - "profilerId": "BGDC1", - "latitude": 38.32, - "longitude": -123.07, - "elevation": 13, - "profilerName": "Bodega Bay CA"}, - "74995" : { - "profilerId": "FKSC1", - "latitude": 47.97, - "longitude": -124.40, - "elevation": 92, - "profilerName": "Forks WA"}, - "74998" : { - "profilerId": "ACVC1", - "latitude": 40.97, - "longitude": -124.11, - "elevation": 56, - "profilerName": "McKinleyville CA"}, - "74994" : { - "profilerId": "OTHC1", - "latitude": 43.42, - "longitude": -124.24, - "elevation": 5, - "profilerName": "North Bend OR"}, - "74993" : { - "profilerId": "PTSC1", - "latitude": 36.30, - "longitude": -121.89, - "elevation": 11, - "profilerName": "Point Sur CA"}, - "74992" : { - "profilerId": "SBAC1", - "latitude": 34.43, - "longitude": -119.85, - "elevation": 4, - "profilerName": "Santa Barbara CA"}, - "74991" : { - "profilerId": "PVLC1", - "latitude": 40.18, - "longitude": -104.73, - "elevation": 1503, - "profilerName": "Platteville CO"}, - "74990" : { - "profilerId": "TDEC1", - "latitude": 45.55, - "longitude": -122.39, - "elevation": 12, - "profilerName": "Troutdale OR"}, - "74989" : { - "profilerId": "CCOC1", - "latitude": 39.70, - "longitude": -121.91, - "elevation": 42, - "profilerName": "Chico CA"} -} - -nexrad = { - "2": { - "layer": 0, - "name": "NEXRAD Unit Status Msg", - "res": 0.0, - "mnemo": "GSM", - "range": 0, - "lvls": 0, - "id": 2, - "unit": "" - }, - "3": { - "layer": 0, - "name": "Product Request Resp", - "res": 0.0, - "mnemo": "PRR", - "range": 0, - "lvls": 0, - "id": 3, - "unit": "" - }, - "8": { - "layer": 0, - "name": "Product List", - "res": 0.0, - "mnemo": "PTL", - "range": 0, - "lvls": 0, - "id": 8, - "unit": "" - }, - "12": { - "layer": 0, - "name": "Command Parameter Msg", - "res": 0.0, - "mnemo": "CPM", - "range": 0, - "lvls": 0, - "id": 12, - "unit": "" - }, - "14": { - "layer": 0, - "name": "Command Control Msg", - "res": 0.0, - "mnemo": "CCM", - "range": 0, - "lvls": 0, - "id": 14, - "unit": "" - }, - "16": { - "layer": 0, - "name": "Reflectivity", - "res": 1.0, - "mnemo": "Z", - "range": 230, - "lvls": 8, - "id": 16, - "unit": "dBZ" - }, - "17": { - "layer": 0, - "name": "Reflectivity", - "res": 2.0, - "mnemo": "Z", - "range": 460, - "lvls": 8, - "id": 17, - "unit": "dBZ" - }, - "18": { - "layer": 0, - "name": "Reflectivity", - "res": 4.0, - "mnemo": "Z", - "range": 460, - "lvls": 8, - "id": 18, - "unit": "dBZ" - }, - "19": { - "layer": 0, - "name": "Reflectivity", - "res": 1.0, - "mnemo": "Z", - "range": 230, - "lvls": 16, - "id": 19, - "unit": "dBZ" - }, - "20": { - "layer": 0, - "name": "Reflectivity", - "res": 2.0, - "mnemo": "Z", - "range": 460, - "lvls": 16, - "id": 20, - "unit": "dBZ" - }, - "21": { - "layer": 0, - "name": "Reflectivity", - "res": 4.0, - "mnemo": "Z", - "range": 460, - "lvls": 16, - "id": 21, - "unit": "dBZ" - }, - "22": { - "layer": 0, - "name": "Velocity", - "res": 0.25, - "mnemo": "V", - "ctable": ['NWS8bitVel', -100., 1.], - "scale": [-100, 100], - "range": 60, - "lvls": 8, - "id": 22, - "unit": "kts" - }, - "23": { - "layer": 0, - "name": "Velocity", - "ctable": ['NWS8bitVel', -100., 1.], - "scale": [-100, 100], - "res": 0.5, - "mnemo": "V", - "range": 115, - "lvls": 8, - "id": 23, - "unit": "kts" - }, - "24": { - "layer": 0, - "name": "Velocity", - "ctable": ['NWS8bitVel', -100., 1.], - "scale": [-100, 100], - "res": 1.0, - "mnemo": "V", - "range": 230, - "lvls": 8, - "id": 24, - "unit": "kts" - }, - "25": { - "layer": 0, - "name": "Velocity", - "ctable": ['NWS8bitVel', -100., 1.], - "scale": [-100, 100], - "res": 0.25, - "mnemo": "V", - "range": 60, - "lvls": 16, - "id": 25, - "unit": "kts" - }, - "26": { - "layer": 0, - "name": "Velocity", - "ctable": ['NWS8bitVel', -100., 1.], - "scale": [-100, 100], - "res": 0.5, - "mnemo": "V", - "range": 115, - "lvls": 16, - "id": 26, - "unit": "kts" - }, - "27": { - "layer": 0, - "name": "Velocity", - "ctable": ['NWS8bitVel', -100., 1.], - "scale": [-100, 100], - "res": 1.0, - "mnemo": "V", - "range": 230, - "lvls": 16, - "id": 27, - "unit": "kts" - }, - "28": { - "layer": 0, - "name": "Spectrum Width", - "res": 0.25, - "mnemo": "SW", - "range": 60, - "lvls": 8, - "id": 28, - "unit": "kts" - }, - "29": { - "layer": 0, - "name": "Spectrum Width", - "res": 0.5, - "mnemo": "SW", - "range": 115, - "lvls": 8, - "id": 29, - "unit": "kts" - }, - "30": { - "layer": 0, - "name": "Spectrum Width", - "res": 1.0, - "mnemo": "SW", - "range": 230, - "lvls": 8, - "id": 30, - "unit": "kts" - }, - "31": { - "layer": 0, - "name": "User Select Precip", - "res": 2.0, - "mnemo": "USP", - "range": 460, - "lvls": 16, - "id": 31, - "unit": "in" - }, - "32": { - "layer": 0, - "name": "Digital Hybrid Scan Refl", - "res": 1.0, - "mnemo": "DHR", - "ctable": ['NWSStormClearReflectivity', -20., 0.5], - "scale": [-32.0, 94.5], - "range": 230, - "lvls": 256, - "id": 32, - "unit": "dBZ/10" - }, - "33": { - "layer": 0, - "name": "Hybrid Scan Reflectivity", - "res": 1.0, - "mnemo": "HSR", - "range": 230, - "lvls": 16, - "id": 33, - "unit": "dBZ" - }, - "34": { - "layer": 0, - "name": "Clutter Filter Control", - "res": 1.0, - "mnemo": "CFC", - "range": 230, - "lvls": 8, - "id": 34, - "unit": "" - }, - "35": { - "layer": 0, - "name": "Composite Refl", - "res": 1.0, - "mnemo": "CZ", - "range": 230, - "lvls": 8, - "id": 35, - "unit": "dBZ" - }, - "36": { - "layer": 0, - "name": "Composite Refl", - "res": 4.0, - "mnemo": "CZ", - "range": 460, - "lvls": 8, - "id": 36, - "unit": "dBZ" - }, - "37": { - "layer": 0, - "name": "Composite Refl", - "res": 1.0, - "mnemo": "CZ", - "range": 230, - "lvls": 16, - "id": 37, - "unit": "dBZ" - }, - "38": { - "layer": 0, - "name": "Composite Refl", - "res": 4.0, - "mnemo": "CZ", - "range": 460, - "lvls": 16, - "id": 38, - "unit": "dBZ" - }, - "41": { - "layer": 0, - "name": "Echo Tops", - "res": 4.0, - "mnemo": "ET", - "range": 230, - "lvls": 16, - "id": 41, - "unit": "ft*1000" - }, - "43": { - "layer": 0, - "name": "Svr Wx Analysis - Ref", - "res": 1.0, - "mnemo": "SWR", - "range": 230, - "lvls": 16, - "id": 43, - "unit": "" - }, - "44": { - "layer": 0, - "name": "Svr Wx Analysis - Vel", - "res": 0.25, - "mnemo": "SWV", - "range": 230, - "lvls": 16, - "id": 44, - "unit": "" - }, - "45": { - "layer": 0, - "name": "Svr Wx Analysis - SW", - "res": 0.25, - "mnemo": "SWW", - "range": 230, - "lvls": 8, - "id": 45, - "unit": "" - }, - "46": { - "layer": 0, - "name": "Svr Wx Analysis - Shear", - "res": 0.5, - "mnemo": "SWS", - "range": 230, - "lvls": 16, - "id": 46, - "unit": "" - }, - "47": { - "layer": 0, - "name": "Severe Wx Prob", - "res": 4.0, - "mnemo": "SWP", - "range": 230, - "lvls": 0, - "id": 47, - "unit": "" - }, - "48": { - "layer": 0, - "name": "VAD Wind Profile", - "res": 0.0, - "mnemo": "VWP", - "range": 0, - "lvls": 8, - "id": 48, - "unit": "kts" - }, - "50": { - "layer": 0, - "name": "Ref X-Sect", - "res": 1.0, - "mnemo": "RCS", - "range": 230, - "lvls": 16, - "id": 50, - "unit": "dBZ" - }, - "51": { - "layer": 0, - "name": "Vel X-Sect", - "res": 0.5, - "mnemo": "VCS", - "range": 230, - "lvls": 16, - "id": 51, - "unit": "kts" - }, - "55": { - "layer": 0, - "name": "Storm Rel Vel Region", - "res": 0.5, - "mnemo": "SRR", - "range": 230, - "lvls": 16, - "id": 55, - "unit": "kts" - }, - "56": { - "layer": 0, - "name": "Storm Rel Velocity", - "ctable": ['NWS8bitVel', -100., 1.], - "scale": [-100, 100], - "res": 1.0, - "mnemo": "SRM", - "range": 230, - "lvls": 16, - "id": 56, - "unit": "kts" - }, - "57": { - "layer": 0, - "name": "Vert Integ Liq", - "res": 4.0, - "mnemo": "VIL", - "range": 230, - "lvls": 16, - "id": 57, - "unit": "kg/m\u00b2" - }, - "58": { - "layer": 0, - "name": "Storm Track", - "res": 0.0, - "mnemo": "STI", - "range": 345, - "lvls": 0, - "id": 58, - "unit": "" - }, - "59": { - "layer": 0, - "name": "Hail Index", - "res": 0.0, - "mnemo": "HI", - "range": 230, - "lvls": 0, - "id": 59, - "unit": "" - }, - "60": { - "layer": 0, - "name": "Legacy Meso", - "res": 0.0, - "mnemo": "M", - "range": 230, - "lvls": 0, - "id": 60, - "unit": "" - }, - "61": { - "layer": 0, - "name": "Tornadic Vortex Sig", - "res": 0.0, - "mnemo": "TVS", - "range": 230, - "lvls": 0, - "id": 61, - "unit": "" - }, - "62": { - "layer": 0, - "name": "Storm Structure", - "res": 0.0, - "mnemo": "SS", - "range": 460, - "lvls": 0, - "id": 62, - "unit": "" - }, - "65": { - "layer": 1, - "name": "Layer 1 Max Refl", - "res": 4.0, - "mnemo": "LRM", - "range": 460, - "lvls": 8, - "id": 65, - "unit": "dBZ" - }, - "66": { - "layer": 2, - "name": "Lyr 2 Comp Ref Max", - "res": 4.0, - "mnemo": "LRM", - "range": 460, - "lvls": 8, - "id": 66, - "unit": "dBZ" - }, - "67": { - "layer": 1, - "name": "Lyr 1 Comp Ref Max", - "res": 4.0, - "mnemo": "APR", - "range": 460, - "lvls": 8, - "id": 67, - "unit": "dBZ" - }, - "74": { - "layer": 0, - "name": "Radar Coded Message", - "res": 0.0, - "mnemo": "RCM", - "range": 460, - "lvls": 0, - "id": 74, - "unit": "" - }, - "75": { - "layer": 0, - "name": "Free Text Message", - "res": 0.0, - "mnemo": "FTM", - "range": 0, - "lvls": 0, - "id": 75, - "unit": "" - }, - "77": { - "layer": 0, - "name": "PUP Text Message", - "res": 0.0, - "mnemo": "PTM", - "range": 0, - "lvls": 0, - "id": 77, - "unit": "" - }, - "78": { - "layer": 0, - "name": "One Hour Precip", - "res": 2.0, - "mnemo": "OHP", - "range": 460, - "lvls": 16, - "id": 78, - "unit": "in" - }, - "79": { - "layer": 0, - "name": "Three Hour Precip", - "res": 2.0, - "mnemo": "THP", - "range": 460, - "lvls": 16, - "id": 79, - "unit": "in" - }, - "80": { - "layer": 0, - "name": "Storm Total Precip", - "res": 2.0, - "mnemo": "STP", - "range": 460, - "lvls": 16, - "id": 80, - "unit": "in" - }, - "81": { - "layer": 0, - "name": "Digital Precip Array", - "res": 4.0, - "mnemo": "DPA", - "range": 230, - "lvls": 256, - "id": 81, - "unit": "" - }, - "82": { - "layer": 0, - "name": "Supplemental Precip Data", - "res": 40.0, - "mnemo": "SPD", - "range": 230, - "lvls": 8, - "id": 82, - "unit": "" - }, - "83": { - "layer": 0, - "name": "Intermediate Radar Message", - "res": 0.0, - "mnemo": "IRM", - "range": 0, - "lvls": 0, - "id": 83, - "unit": "" - }, - "84": { - "layer": 0, - "name": "Velocity Azimuth Disp", - "res": 0.0, - "mnemo": "VAD", - "range": 0, - "lvls": 8, - "id": 84, - "unit": "dBZ" - }, - "85": { - "layer": 0, - "name": "Ref X-Sect", - "res": 1.0, - "mnemo": "RCS", - "range": 230, - "lvls": 8, - "id": 85, - "unit": "dBZ" - }, - "86": { - "layer": 0, - "name": "Vel X-Sect", - "res": 0.5, - "mnemo": "VCS", - "range": 230, - "lvls": 8, - "id": 86, - "unit": "kts" - }, - "87": { - "layer": 0, - "name": "Combined Shear", - "res": 2.0, - "mnemo": "CS", - "range": 230, - "lvls": 16, - "id": 87, - "unit": "" - }, - "90": { - "layer": 3, - "name": "Lyr 3 Comp Ref Max", - "res": 4.0, - "mnemo": "LRM", - "range": 460, - "lvls": 8, - "id": 90, - "unit": "dBZ" - }, - "93": { - "layer": 0, - "name": "ITWS Digital Velocity", - "res": 1.0, - "mnemo": "DBV", - "range": 115, - "lvls": 256, - "id": 93, - "unit": "(m/s)/10" - }, - "94": { - "layer": 0, - "name": "Reflectivity", - "res": 1.0, - "mnemo": "Z", - "range": 460, - "ctable": ['NWSStormClearReflectivity', -20., 0.5], - "scale": [-32.0, 94.5], - "lvls": 256, - "id": 94, - "unit": "dBZ/10" - }, - "95": { - "layer": 0, - "name": "Comp Refl Edited for AP", - "res": 1.0, - "mnemo": "CZE", - "range": 230, - "lvls": 8, - "id": 95, - "unit": "dBZ" - }, - "96": { - "layer": 0, - "name": "Comp Refl Edited for AP", - "res": 4.0, - "mnemo": "CZE", - "range": 460, - "lvls": 8, - "id": 96, - "unit": "dBZ" - }, - "97": { - "layer": 0, - "name": "Comp Refl Edited for AP", - "res": 1.0, - "mnemo": "CZE", - "range": 230, - "lvls": 16, - "id": 97, - "unit": "dBZ" - }, - "98": { - "layer": 0, - "name": "Comp Refl Edited for AP", - "res": 4.0, - "mnemo": "CZE", - "range": 460, - "lvls": 16, - "id": 98, - "unit": "dBZ" - }, - "99": { - "layer": 0, - "name": "Velocity", - "res": 0.25, - "mnemo": "V", - "range": 300, - "ctable": ['NWS8bitVel', -100., 1.], - "scale": [-100, 100], - "lvls": 256, - "id": 99, - "unit": "(m/s)/10" - }, - "100": { - "layer": 0, - "name": "VAD Site Adapt Params", - "res": 0.0, - "mnemo": "VSDT", - "range": 0, - "lvls": 0, - "id": 100, - "unit": "" - }, - "101": { - "layer": 0, - "name": "Storm Track Alpha block", - "res": 0.0, - "mnemo": "STIT", - "range": 0, - "lvls": 0, - "id": 101, - "unit": "" - }, - "102": { - "layer": 0, - "name": "Hail Index Alpha block", - "res": 0.0, - "mnemo": "HIT", - "range": 0, - "lvls": 0, - "id": 102, - "unit": "" - }, - "103": { - "layer": 0, - "name": "Mesocyclone Alpha block", - "res": 0.0, - "mnemo": "MT", - "range": 0, - "lvls": 0, - "id": 103, - "unit": "" - }, - "104": { - "layer": 0, - "name": "TVS Alpha block", - "res": 0.0, - "mnemo": "TVST", - "range": 0, - "lvls": 0, - "id": 104, - "unit": "" - }, - "105": { - "layer": 0, - "name": "Combined Shear Params", - "res": 0.0, - "mnemo": "CST", - "range": 0, - "lvls": 0, - "id": 105, - "unit": "" - }, - "107": { - "layer": 0, - "name": "1hr Rainfall Params", - "res": 0.0, - "mnemo": "OHPT", - "range": 0, - "lvls": 0, - "id": 107, - "unit": "" - }, - "108": { - "layer": 0, - "name": "3hr Rainfall Params", - "res": 0.0, - "mnemo": "THPT", - "range": 0, - "lvls": 0, - "id": 108, - "unit": "" - }, - "109": { - "layer": 0, - "name": "Storm Total Params", - "res": 0.0, - "mnemo": "STPT", - "range": 0, - "lvls": 0, - "id": 109, - "unit": "" - }, - "132": { - "layer": 0, - "name": "Clutter Likelihood Refl", - "res": 1.0, - "mnemo": "CLR", - "range": 230, - "lvls": 16, - "id": 132, - "unit": "%" - }, - "133": { - "layer": 0, - "name": "Clutter Likelihood Dopp", - "res": 1.0, - "mnemo": "CLD", - "range": 230, - "lvls": 16, - "id": 133, - "unit": "%" - }, - "134": { - "layer": 0, - "name": "Digital Vert Integ Liq", - "res": 1.0, - "mnemo": "DVL", - "range": 460, - "lvls": 256, - "id": 134, - "unit": "kg/m\u00b2" - }, - "135": { - "layer": 0, - "name": "Enhanced Echo Tops", - "res": 1.0, - "mnemo": "EET", - "ctable": ['NWSEnhancedEchoTops', 2, 1], - "scale": [0, 255], - "range": 460, - "lvls": 256, - "id": 135, - "unit": "ft*1000" - }, - "136": { - "layer": 0, - "name": "SuperOb", - "res": 4.0, - "mnemo": "SO", - "range": 0, - "lvls": 256, - "id": 136, - "unit": "" - }, - "137": { - "layer": 9, - "name": "User Selectable Lyr Refl", - "res": 1.0, - "mnemo": "ULR", - "range": 230, - "lvls": 16, - "id": 137, - "unit": "dBZ" - }, - "138": { - "layer": 0, - "name": "Storm Total Precip", - "res": 2.0, - "mnemo": "STP", - "ctable": ['NWSStormClearReflectivity', -100., 1.], - "scale": [0, 10], - "range": 460, - "lvls": 256, - "id": 138, - "unit": "in/100" - }, - "139": { - "layer": 0, - "name": "Rapid Update Mesocyclone", - "res": 0.0, - "mnemo": "MRU", - "range": 230, - "lvls": 0, - "id": 139, - "unit": "" - }, - "140": { - "layer": 0, - "name": "Gust Front MIGFA", - "res": 0.0, - "mnemo": "GFM", - "range": 230, - "lvls": 0, - "id": 140, - "unit": "" - }, - "141": { - "layer": 0, - "name": "Mesocyclone", - "res": 0.0, - "mnemo": "MD", - "range": 230, - "lvls": 0, - "id": 141, - "unit": "" - }, - "143": { - "layer": 0, - "name": "TVS Rapid Update", - "res": 0.0, - "mnemo": "TRU", - "range": 230, - "lvls": 0, - "id": 143, - "unit": "" - }, - "144": { - "layer": 0, - "name": "1-Hour Snow-Water Equiv", - "res": 1.0, - "mnemo": "OSW", - "range": 230, - "lvls": 16, - "id": 144, - "unit": "in" - }, - "145": { - "layer": 0, - "name": "1-Hour Snow Depth", - "res": 1.0, - "mnemo": "OSD", - "range": 230, - "lvls": 16, - "id": 145, - "unit": "in" - }, - "146": { - "layer": 0, - "name": "Storm Tot Snow-Water Equiv", - "res": 1.0, - "mnemo": "SSW", - "range": 230, - "lvls": 16, - "id": 146, - "unit": "in" - }, - "147": { - "layer": 0, - "name": "Storm Tot Snow Depth", - "res": 1.0, - "mnemo": "SSD", - "range": 230, - "lvls": 16, - "id": 147, - "unit": "in" - }, - "149": { - "layer": 0, - "name": "Digital Mesocyclone Data", - "res": 0.0, - "mnemo": "DMD", - "range": 230, - "lvls": 0, - "id": 149, - "unit": "" - }, - "150": { - "layer": 0, - "name": "User Sel Snow-Water Equiv", - "res": 1.0, - "mnemo": "USW", - "range": 230, - "lvls": 16, - "id": 150, - "unit": "in" - }, - "151": { - "layer": 0, - "name": "User Sel Snow Depth", - "res": 1.0, - "mnemo": "USD", - "range": 230, - "lvls": 16, - "id": 151, - "unit": "in" - }, - "152": { - "layer": 0, - "name": "RPG System Status", - "res": 0.0, - "mnemo": "RSS", - "range": 0, - "lvls": 0, - "id": 152, - "unit": "" - }, - "153": { - "layer": 0, - "name": "Reflectivity", - "res": 0.25, - "mnemo": "HZ", - "range": 460, - "lvls": 256, - "id": 153, - "unit": "dBZ/10" - }, - "154": { - "layer": 0, - "name": "Velocity", - "res": 0.25, - "mnemo": "HV", - "range": 300, - "lvls": 256, - "id": 154, - "unit": "(m/s)/10" - }, - "155": { - "layer": 0, - "name": "Spec Width", - "res": 0.25, - "mnemo": "HSW", - "range": 300, - "lvls": 256, - "id": 155, - "unit": "(m/s)/10" - }, - "158": { - "layer": 0, - "name": "Diff Reflectivity", - "res": 1.0, - "mnemo": "ZDR", - "range": 230, - "ctable": ['NWSStormClearReflectivity', -4.0, 5.0], - "lvls": 16, - "id": 158, - "unit": "dB" - }, - "159": { - "layer": 0, - "name": "Diff Reflectivity", - "res": 0.25, - "mnemo": "ZDR", - "range": 300, - "ctable": ['NWSStormClearReflectivity', -4.0, 5.0], - "lvls": 256, - "id": 159, - "unit": "dB" - }, - "160": { - "layer": 0, - "name": "Correlation Coeff", - "res": 1.0, - "mnemo": "CC", - "range": 230, - "lvls": 16, - "id": 160, - "unit": "" - }, - "161": { - "layer": 0, - "name": "Correlation Coeff", - "res": 0.25, - "mnemo": "CC", - "range": 300, - "lvls": 256, - "id": 161, - "unit": "" - }, - "162": { - "layer": 0, - "name": "Specific Diff Phase", - "res": 1.0, - "mnemo": "KDP", - "range": 230, - "lvls": 16, - "id": 162, - "unit": "deg/km" - }, - "163": { - "layer": 0, - "name": "Specific Diff Phase", - "res": 0.25, - "mnemo": "KDP", - "range": 300, - "lvls": 256, - "id": 163, - "unit": "deg/km" - }, - "164": { - "layer": 0, - "name": "Hydrometeor Class", - "res": 1.0, - "mnemo": "HC", - "range": 230, - "lvls": 16, - "id": 164, - "unit": "" - }, - "165": { - "layer": 0, - "name": "Hydrometeor Class", - "res": 0.25, - "mnemo": "HC", - "range": 300, - "lvls": 256, - "id": 165, - "unit": "/10" - }, - "166": { - "layer": 0, - "name": "Melting Layer", - "res": 0.0, - "mnemo": "ML", - "range": 230, - "lvls": 0, - "id": 166, - "unit": "" - }, - "167": { - "layer": 0, - "name": "Raw CC", - "res": 0.25, - "mnemo": "SDC", - "range": 300, - "lvls": 256, - "id": 167, - "unit": "" - }, - "168": { - "layer": 0, - "name": "Raw PHIDP", - "res": 0.25, - "mnemo": "SDP", - "range": 300, - "lvls": 256, - "id": 168, - "unit": "deg" - }, - "169": { - "layer": 0, - "name": "One Hour Accum", - "res": 2.0, - "mnemo": "OHA", - "ctable": ['NWSStormClearReflectivity', -100., 1.], - "scale": [0, 10], - "range": 230, - "lvls": 16, - "id": 169, - "unit": "in" - }, - "170": { - "layer": 0, - "name": "One Hour Unbiased Accum", - "res": 0.25, - "mnemo": "DAA", - "ctable": ['NWSStormClearReflectivity', -100., 1.], - "scale": [0, 10], - "range": 230, - "lvls": 256, - "id": 170, - "unit": "in/100" - }, - "171": { - "layer": 0, - "name": "Storm Total Accum", - "res": 2.0, - "mnemo": "STA", - "ctable": ['NWSStormClearReflectivity', -100., 1.], - "scale": [0, 30], - "range": 230, - "lvls": 16, - "id": 171, - "unit": "in" - }, - "172": { - "layer": 0, - "name": "Storm Total Accum", - "res": 0.25, - "mnemo": "STA", - "ctable": ['NWSStormClearReflectivity', -100., 1.], - "scale": [0, 30], - "range": 230, - "lvls": 256, - "id": 172, - "unit": "in/100" - }, - "173": { - "layer": 0, - "name": "User Select Accum", - "res": 0.25, - "mnemo": "DUA", - "ctable": ['NWSStormClearReflectivity', -100., 1.], - "scale": [0, 30], - "range": 230, - "lvls": 256, - "id": 173, - "unit": "in/100" - }, - "174": { - "layer": 0, - "name": "One Hour Diff", - "res": 0.25, - "mnemo": "DOD", - "range": 230, - "lvls": 256, - "id": 174, - "unit": "in/100" - }, - "175": { - "layer": 0, - "name": "Storm Total Diff", - "res": 0.25, - "mnemo": "DSD", - "range": 230, - "lvls": 256, - "id": 175, - "unit": "in/100" - }, - "176": { - "layer": 0, - "name": "Digital Inst Precip Rate", - "res": 0.25, - "mnemo": "DPR", - "ctable": ['NWS8bitVel', -100., 1.], - "scale": [0, 16], - "range": 230, - "lvls": 65536, - "id": 176, - "unit": "in/h" - }, - "177": { - "layer": 0, - "name": "Hybrid Hydrometeor Class", - "res": 0.25, - "mnemo": "HHC", - "range": 230, - "lvls": 256, - "id": 177, - "unit": "/10" - }, - "180": { - "layer": 0, - "name": "Reflectivity", - "res": 0.15, - "mnemo": "Z", - "range": 90, - "lvls": 256, - "id": 180, - "unit": "dBZ/10" - }, - "181": { - "layer": 0, - "name": "Reflectivity", - "res": 0.15, - "mnemo": "Z", - "range": 90, - "lvls": 16, - "id": 181, - "unit": "dBZ" - }, - "182": { - "layer": 0, - "name": "Velocity", - "res": 0.15, - "mnemo": "V", - "range": 90, - "lvls": 256, - "id": 182, - "unit": "(m/s)/10" - }, - "183": { - "layer": 0, - "name": "Velocity", - "res": 0.15, - "mnemo": "V", - "range": 90, - "lvls": 16, - "id": 183, - "unit": "kts" - }, - "184": { - "layer": 0, - "name": "Spec Width", - "res": 0.15, - "mnemo": "SW", - "range": 90, - "lvls": 256, - "id": 184, - "unit": "(m/s)/10" - }, - "185": { - "layer": 0, - "name": "Spectrum Width", - "res": 0.15, - "mnemo": "SW", - "range": 90, - "lvls": 8, - "id": 185, - "unit": "kts" - }, - "186": { - "layer": 0, - "name": "Long Range Refl", - "res": 0.3, - "mnemo": "Z", - "range": 460, - "lvls": 256, - "id": 186, - "unit": "dBZ/10" - }, - "187": { - "layer": 0, - "name": "Long Range Refl", - "res": 0.3, - "mnemo": "Z", - "range": 460, - "lvls": 16, - "id": 187, - "unit": "dBZ" - }, - "196": { - "layer": 0, - "name": "Microburst AMDA", - "res": 0.0, - "mnemo": "MBA", - "range": 50, - "lvls": 0, - "id": 196, - "unit": "" - }, - "202": { - "layer": 0, - "name": "Shift Change Checklist", - "res": 0.0, - "mnemo": "SCC", - "range": 0, - "lvls": 0, - "id": 202, - "unit": "" - }, - "550": { - "layer": 0, - "name": "Reflectivity", - "res": 0.926, - "mnemo": "Z", - "range": 111, - "lvls": 8, - "id": 550, - "unit": "dBZ" - }, - "300": { - "layer": 0, - "name": "Level II Reflectivity", - "res": 1.0, - "mnemo": "Z", - "range": 460, - "lvls": 256, - "id": 300, - "unit": "dBZ/10" - }, - "301": { - "layer": 0, - "name": "Level II Velocity", - "res": 0.25, - "mnemo": "V", - "range": 230, - "lvls": 256, - "id": 301, - "unit": "kts" - }, - "500": { - "layer": 0, - "name": "Reflectivity", - "res": 0.463, - "mnemo": "Z", - "range": 463, - "lvls": 8, - "id": 500, - "unit": "dBZ" - } -} - -# -# Dictionary that maps VTEC codes to headlines -# Modified from com.raytheon.uf.edex.activetable/utility/common_static/base/vtec/VTECTable.py -# Colornames from: -# 1) https://www.weather.gov/bro/mapcolors -# 2) https://digital.weather.gov/staticpages/definitions.php -# 3) https://www.w3schools.com/colors/colors_names.asp -# -vtec = { - 'AF.W' : {'phen': 'AF', - 'sig': 'W', - 'color': 'gray', - 'hdln': 'Ashfall Warning'}, - 'AF.Y' : {'phen': 'AF', - 'sig': 'Y', - 'color': 'gray', - 'hdln': 'Ashfall Advisory'}, - 'AQ.Y' : {'phen': 'AQ', - 'sig': 'Y', - 'color': 'gray', - 'hdln': 'Air Quality Alert'}, - 'AS.O' : {'phen': 'AS', - 'sig': 'O', - 'color': 'gray', - 'hdln': 'Air Stagnation Outlook'}, - 'AS.Y' : {'phen': 'AS', - 'sig': 'Y', - 'color': 'gray', - 'hdln': 'Air Stagnation Advisory'}, - 'BH.S' : {'phen': 'BH', - 'sig': 'S', - 'color': 'turquoise', - 'hdln': 'Beach Hazards Statement'}, - 'BW.Y' : {'phen': 'BW', - 'sig': 'Y', - 'color': 'thistle', - 'hdln': 'Brisk Wind Advisory'}, - 'BZ.A' : {'phen' : 'BZ', - 'sig' : 'A', - 'color': 'greenyellow', - 'hdln' : 'Blizzard Watch'}, - 'BZ.W' : {'phen' : 'BZ', - 'sig' : 'W', - 'color': 'orangered', - 'hdln' : 'Blizzard Warning'}, - 'CF.A' : {'phen': 'CF', - 'sig': 'A', - 'color': 'mediumaquamarine', - 'hdln': 'Coastal Flood Watch'}, - 'CF.W' : {'phen': 'CF', - 'sig': 'W', - 'color': 'forestgreen', - 'hdln': 'Coastal Flood Warning'}, - 'CF.Y' : {'phen': 'CF', - 'sig': 'Y', - 'color': 'lawngreen', - 'hdln': 'Coastal Flood Advisory'}, - 'CF.S' : {'phen': 'CF', - 'sig': 'S', - 'color': 'olivedrab', - 'hdln': 'Coastal Flood Statement'}, - 'DS.W' : {'phen': 'DS', - 'sig': 'W', - 'color': 'bisque', - 'hdln': 'Dust Storm Warning'}, - 'DS.Y' : {'phen': 'DS', - 'sig': 'Y', - 'color': 'darkkhaki', - 'hdln': 'Dust Advisory'}, - 'DU.Y' : {'phen': 'DU', - 'sig': 'Y', - 'color': 'darkkhaki', - 'hdln': 'Blowing Dust Advisory'}, - 'EC.A' : {'phen': 'EC', - 'sig': 'A', - 'color': 'blue', - 'hdln': 'Extreme Cold Watch'}, - 'EC.W' : {'phen': 'EC', - 'sig': 'W', - 'color': 'blue', - 'hdln': 'Extreme Cold Warning'}, - 'EH.A' : {'phen': 'EH', - 'sig': 'A', - 'color': 'maroon', - 'hdln': 'Excessive Heat Watch'}, - 'EH.W' : {'phen': 'EH', - 'sig': 'W', - 'color': 'mediumvioletred', - 'hdln': 'Excessive Heat Warning'}, - 'EW.W' : {'phen': 'EW', - 'sig': 'W', - 'color': 'deeppink', - 'hdln': 'Excessive Wind Warning'}, - 'FA.A' : {'phen': 'FA', - 'sig': 'A', - 'color': 'seagreen', - 'hdln': 'Flood Watch'}, - 'FA.W' : {'phen': 'FA', - 'sig': 'W', - 'color': 'seagreen', - 'hdln': 'Areal Flood Warning'}, - 'FA.Y' : {'phen': 'FA', - 'sig': 'Y', - 'color': 'seagreen', - 'hdln': 'Areal Flood Advisory'}, - 'FF.A' : {'phen': 'FF', - 'sig': 'A', - 'color': 'limegreen', - 'hdln': 'Flash Flood Watch'}, - 'FF.S' : {'phen': 'FF', - 'sig': 'S', - 'color': 'yellowgreen', - 'hdln': 'Flash Flood Statement'}, - 'FF.W' : {'phen': 'FF', - 'sig': 'W', - 'color': 'darkred', - 'hdln': 'Flash Flood Warning'}, - 'FG.Y' : {'phen': 'FG', - 'sig': 'Y', - 'color': 'slategray', - 'hdln': 'Dense Fog Advisory'}, - 'FL.A' : {'phen': 'FL', - 'sig': 'A', - 'color': 'seagreen', - 'hdln': 'Flood Watch'}, - 'FL.W' : {'phen': 'FL', - 'sig': 'W', - 'color': 'green', - 'hdln': 'Flood Warning'}, - 'HY.S' : {'phen': 'FL', - 'sig': 'S', - 'color': '#00ff7f', - 'hdln': 'Hydrological Statement'}, - 'FL.S' : {'phen': 'FL', - 'sig': 'S', - 'color': '#00ff7f', - 'hdln': 'Flood Statement'}, - 'FL.Y' : {'phen': 'FL', - 'sig': 'Y', - 'color': '#00ff7f', - 'hdln': 'Flood Advisory'}, - 'FR.Y' : {'phen': 'FR', - 'sig': 'Y', - 'color': 'cornflowerblue', - 'hdln': 'Frost Advisory'}, - 'FW.A' : {'phen': 'FW', - 'sig': 'A', - 'color': 'navajowhite', - 'hdln': 'Fire Weather Watch'}, - 'FW.W' : {'phen': 'FW', - 'sig': 'W', - 'color': 'deeppink', - 'hdln': 'Red Flag Warning'}, - 'FZ.A' : {'phen': 'FZ', - 'sig': 'A', - 'color': 'royalblue', - 'hdln': 'Freeze Watch'}, - 'FZ.W' : {'phen': 'FZ', - 'sig': 'W', - 'color': 'cyan', - 'hdln': 'Freeze Warning'}, - 'GL.A' : {'phen': 'GL', - 'sig': 'A', - 'color': 'pink', - 'hdln': 'Gale Watch'}, - 'GL.W' : {'phen': 'GL', - 'sig': 'W', - 'color': '#dda0dd', - 'hdln': 'Gale Warning'}, - 'HF.A' : {'phen': 'HF', - 'sig': 'A', - 'color': 'darkorchid', - 'hdln': 'Hurricane Force Wind Watch'}, - 'HF.W' : {'phen': 'HF', - 'sig': 'W', - 'color': '#cd5c5c', - 'hdln': 'Hurricane Force Wind Warning'}, - 'HT.Y' : {'phen': 'HT', - 'sig': 'Y', - 'color': '#ff7f4e', - 'hdln': 'Heat Advisory'}, - 'HU.A' : {'phen': 'HU', - 'sig': 'A', - 'color': '#ff00ff', - 'hdln': 'Hurricane Watch'}, - 'HU.S' : {'phen': 'HU', - 'sig': 'S', - 'color': 'yellow', - 'hdln': 'Hurricane Statement'}, - 'HU.W' : {'phen': 'HU', - 'sig': 'W', - 'color': '#dc143c', - 'hdln': 'Hurricane Warning'}, - 'HW.A' : {'phen': 'HW', - 'sig': 'A', - 'color': 'darkgoldenrod', - 'hdln': 'High Wind Watch'}, - 'HW.W' : {'phen': 'HW', - 'sig': 'W', - 'color': 'goldenrod', - 'hdln': 'High Wind Warning'}, - 'HZ.A' : {'phen': 'HZ', - 'sig': 'A', - 'color': 'royalblue', - 'hdln': 'Hard Freeze Watch'}, - 'HZ.W' : {'phen': 'HZ', - 'sig': 'W', - 'color': 'blue', - 'hdln': 'Hard Freeze Warning'}, - 'IS.W' : {'phen': 'IS', - 'sig': 'W', - 'color': 'darkmagenta', - 'hdln': 'Ice Storm Warning'}, - 'LE.A' : {'phen': 'LE', - 'sig': 'A', - 'color': 'LightSkyBlue', - 'hdln': 'Lake Effect Snow Watch'}, - 'LE.W' : {'phen': 'LE', - 'sig': 'W', - 'color': 'DarkCyan', - 'hdln': 'Lake Effect Snow Warning'}, - 'LE.Y' : {'phen': 'LE', - 'sig': 'Y', - 'color': 'MediumTurquoise', - 'hdln': 'Lake Effect Snow Advisory'}, - 'LO.Y' : {'phen': 'LO', - 'sig': 'Y', - 'color': 'maroon', - 'hdln': 'Low Water Advisory'}, - 'LS.A' : {'phen': 'LS', - 'sig': 'A', - 'color': 'MediumAquaMarine', - 'hdln': 'Lakeshore Flood Watch'}, - 'LS.S' : {'phen': 'LS', - 'sig': 'S', - 'color': 'lawngreen', - 'hdln': 'Lakeshore Flood Statement'}, - 'LS.W' : {'phen': 'LS', - 'sig': 'W', - 'color': 'forestgreen', - 'hdln': 'Lakeshore Flood Warning'}, - 'LS.Y' : {'phen': 'LS', - 'sig': 'Y', - 'color': 'lawngreen', - 'hdln': 'Lakeshore Flood Advisory'}, - 'LW.Y' : {'phen': 'LW', - 'sig': 'Y', - 'color': 'tan', - 'hdln': 'Lake Wind Advisory'}, - 'MA.A' : {'phen': 'MA', - 'sig': 'A', - 'color': 'peachpuff', - 'hdln': 'Special Marine Advisory'}, - 'MA.S' : {'phen': 'MA', - 'sig': 'S', - 'color': 'peachpuff', - 'hdln': 'Special Marine Statement'}, - 'MA.W' : {'phen': 'MA', - 'sig': 'W', - 'color': 'palevioletred', - 'hdln': 'Special Marine Warning'}, - 'MF.Y' : {'phen': 'MF', - 'sig': 'Y', - 'color': 'slategray', - 'hdln': 'Dense Fog Advisory'}, # Marine Fog - 'MH.W' : {'phen': 'MH', - 'sig': 'W', - 'color': 'darkgray', - 'hdln': 'Ashfall Warning'}, # Marine Ashfall - 'MH.Y' : {'phen': 'MH', - 'sig': 'Y', - 'color': 'dimgray', - 'hdln': 'Ashfall Advisory'}, # Marine Ashfall - 'MS.Y' : {'phen': 'MS', - 'sig': 'Y', - 'color': 'khaki', - 'hdln': 'Dense Smoke Advisory'}, # Marine Smoke - 'RB.Y' : {'phen': 'RB', - 'sig': 'Y', - 'color': 'thistle', - 'hdln': 'Small Craft Advisory for rough bar'}, - 'RP.S' : {'phen': 'RP', - 'sig' : 'S', - 'color': 'turquoise', - 'hdln': 'High Rip Current Risk'}, - 'SC.Y' : {'phen': 'SC', - 'sig': 'Y', - 'color': 'thistle', - 'hdln': 'Small Craft Advisory'}, - 'SE.A' : {'phen': 'SE', - 'sig': 'A', - 'color': 'darkslateblue', - 'hdln': 'Hazardous Seas Watch'}, - 'SE.W' : {'phen': 'SE', - 'sig': 'W', - 'color': 'thistle', - 'hdln': 'Hazardous Seas Warning'}, - 'SI.Y' : {'phen': 'SI', - 'sig': 'Y', - 'color': 'thistle', - 'hdln': 'Small Craft Advisory for winds'}, - 'SM.Y' : {'phen': 'SM', - 'sig': 'Y', - 'color': 'khaki', - 'hdln': 'Dense Smoke Advisory'}, - 'SQ.W' : {'phen': 'SQ', - 'sig': 'W', - 'color': '#EF2B1C', - 'hdln': 'Snow Squall Warning'}, - 'SR.A' : {'phen': 'SR', - 'sig': 'A', - 'color': 'violet', - 'hdln': 'Storm Watch'}, - 'SR.W' : {'phen': 'SR', - 'sig': 'W', - 'color': 'darkorchid', - 'hdln': 'Storm Warning'}, - 'SS.A' : {'phen': 'SS', - 'sig': 'A', - 'color': '#DB7FF7', - 'hdln': 'Storm Surge Watch'}, - 'SS.W' : {'phen': 'SS', - 'sig': 'W', - 'color': '#B524F7', - 'hdln': 'Storm Surge Warning'}, - 'SU.W' : {'phen': 'SU', - 'sig': 'W', - 'color': 'forestgreen', - 'hdln': 'High Surf Warning'}, - 'SU.Y' : {'phen': 'SU', - 'sig': 'Y', - 'color': 'mediumorchid', - 'hdln': 'High Surf Advisory'}, - 'SV.A' : {'phen': 'SV', - 'sig': 'A', - 'color': 'palevioletred', - 'hdln': 'Severe Thunderstorm Watch'}, - 'SV.S' : {'phen': 'SV', - 'sig': 'S', - 'color': 'aqua', - 'hdln': 'Severe Weather Statement'}, - 'SV.W' : {'phen': 'SV', - 'sig': 'W', - 'color': 'orange', - 'hdln': 'Severe Thunderstorm Warning'}, - 'SW.Y' : {'phen': 'SW', - 'sig': 'Y', - 'color': 'thistle', - 'hdln': 'Small Craft Advisory for hazardous seas'}, - 'TO.A' : {'phen': 'TO', - 'sig': 'A', - 'color': 'yellow', - 'hdln': 'Tornado Watch'}, - 'TO.W' : {'phen': 'TO', - 'sig': 'W', - 'color': 'red', - 'hdln': 'Tornado Warning'}, - 'TR.A' : {'phen': 'TR', - 'sig': 'A', - 'color': '#f08080', - 'hdln': 'Tropical Storm Watch'}, - 'TR.W' : {'phen': 'TR', - 'sig': 'W', - 'color': '#b22222', - 'hdln': 'Tropical Storm Warning'}, - 'TS.A' : {'phen': 'TS', - 'sig': 'A', - 'color': 'fuchsia', - 'hdln': 'Tsunami Watch'}, - 'TS.W' : {'phen': 'TS', - 'sig': 'W', - 'color': '#FD6347', - 'hdln': 'Tsunami Warning'}, - 'TS.Y' : {'phen': 'TS', - 'sig': 'Y', - 'color': 'chocolate', - 'hdln': 'Tsunami Advisory'}, - 'TY.A' : {'phen': 'TY', - 'sig': 'A', - 'color': 'fuchsia', - 'hdln': 'Typhoon Watch'}, - 'TY.W' : {'phen': 'TY', - 'sig': 'W', - 'color': '#FD6347', - 'hdln': 'Typhoon Warning'}, - 'UP.A' : {'phen': 'UP', - 'sig': 'A', - 'color': 'RosyBrown', - 'hdln': 'Heavy Freezing Spray Watch'}, - 'UP.W' : {'phen': 'UP', - 'sig': 'W', - 'color': '#00C0FF', - 'hdln': 'Heavy Freezing Spray Warning'}, - 'UP.Y' : {'phen': 'UP', - 'sig': 'Y', - 'color': '#00C0FF', - 'hdln': 'Freezing Spray Advisory'}, - 'WC.A' : {'phen': 'WC', - 'sig': 'A', - 'color': 'cadetblue', - 'hdln': 'Wind Chill Watch'}, - 'WC.W' : {'phen': 'WC', - 'sig': 'W', - 'color': 'lightsteelblue', - 'hdln': 'Wind Chill Warning'}, - 'WC.Y' : {'phen': 'WC', - 'sig': 'Y', - 'color': 'paleturquoise', - 'hdln': 'Wind Chill Advisory'}, - 'WI.Y' : {'phen': 'WI', - 'sig': 'Y', - 'color': 'tan', - 'hdln': 'Wind Advisory'}, - 'WS.A' : {'phen': 'WS', - 'sig': 'A', - 'color': '#4682b4', - 'hdln': 'Winter Storm Watch'}, - 'WS.W' : {'phen': 'WS', - 'sig': 'W', - 'color': 'hotpink', - 'hdln': 'Winter Storm Warning'}, - 'WW.Y' : {'phen': 'WW', - 'sig': 'Y', - 'color': '#7b68ee', - 'hdln': 'Winter Weather Advisory'}, - 'ZF.Y' : {'phen': 'ZF', - 'sig': 'Y', - 'color': 'teal', - 'hdln': 'Freezing Fog Advisory'}, - 'ZR.Y' : {'phen': 'ZR', - 'sig': 'Y', - 'color': 'orchid', - 'hdln': 'Freezing Rain Advisory'}, - } - -# -# Upgrade Hazards Dictionary - upgradeHazardsDict is a dictionary of -# phen/sig combinations defining upgrades. Each key is the proposed hazard. -# The associated list are the hazards which are upgraded by the -# proposed hazard. -# - -upgradeHazardsDict = { -'WC.W': ['WC.A', 'WC.Y'], -'WC.Y': ['WC.A'], -'BZ.W': ['WS.W', 'LE.W', 'ZR.Y', 'LE.Y', 'WW.Y', - 'BZ.A', 'WS.A', 'LE.A'], -'IS.W': ['WS.W', 'LE.W', 'ZR.Y', 'LE.Y', 'WW.Y', - 'BZ.A', 'WS.A', 'LE.A'], -'LE.W': ['ZR.Y', 'LE.Y', 'WW.Y', - 'BZ.A', 'WS.A', 'LE.A'], -'WS.W': ['ZR.Y', 'LE.Y', 'WW.Y', - 'BZ.A', 'WS.A', 'LE.A'], -'ZR.Y': ['BZ.A', 'WS.A', 'LE.A'], -'LE.Y': ['BZ.A', 'WS.A', 'LE.A'], -'WW.Y': ['BZ.A', 'WS.A', 'LE.A'], -'EH.W': ['EH.A', 'HT.Y'], -'HT.Y': ['EH.A'], -'FZ.W': ['FZ.A', 'FR.Y', 'HZ.A'], -'HZ.W': ['FZ.A', 'FR.Y', 'HZ.A'], -'FR.Y': ['FZ.A', 'HZ.A'], -'HW.W': ['DU.Y', 'LW.Y', 'WI.Y', 'HW.A'], -'DS.W': ['DU.Y', 'LW.Y', 'WI.Y', 'HW.A'], -'WI.Y': ['HW.A'], -'EC.W': ['EC.A'], -'FW.W': ['FW.A'], -'CF.W': ['CF.A', 'CF.Y'], -'CF.Y': ['CF.A'], -'LS.W': ['LS.A', 'LS.Y'], -'LS.Y': ['LS.A'], -'BW.Y': ['GL.A', 'SR.A', 'HF.A', 'SE.A'], -'RB.Y': ['GL.A', 'SR.A', 'HF.A', 'SE.A'], -'SC.Y': ['GL.A', 'SR.A', 'HF.A', 'SE.A'], -'SI.Y': ['GL.A', 'SR.A', 'HF.A', 'SE.A'], -'SW.Y': ['SE.A'], -'UP.Y': ['UP.A'], -'HF.W': ['SR.W', 'GL.W', 'SC.Y', 'SW.Y', 'BW.Y', 'SI.Y', 'RB.Y', 'GL.A', 'SR.A', 'HF.A', 'SE.A'], -'SR.W': ['GL.W', 'SC.Y', 'SW.Y', 'BW.Y', 'SI.Y', 'RB.Y', 'GL.A', 'SR.A', 'HF.A', 'SE.A'], -'GL.W': ['SC.Y', 'SW.Y', 'BW.Y', 'SI.Y', 'RB.Y', 'GL.A', 'SR.A', 'HF.A', 'SE.A'], -'SE.W': ['SC.Y', 'RB.Y', 'GL.A', 'SR.A', 'HF.A', 'SE.A'], -'UP.W': ['UP.Y', 'UP.A'], -'SU.W': ['SU.Y'], -'SS.W': ['SS.A'], -'HU.W': ['HU.A', 'TR.W', 'TR.A'], -'HU.A': ['TR.A'], -'TR.W': ['TR.A', 'HU.A', 'TY.A'], -'TY.W': ['TY.A', 'TR.W', 'TR.A'], -'TY.A': ['TR.A'], -'AF.W': ['AF.Y'], -'MH.W': ['MH.Y'], - } - -# -# When passed a phen/sig for both the current hazard and the proposed hazard, -# checkForUpgrade returns a 1 if the proposed hazard is an upgrade, otherwise 0 -# - -def checkForUpgrade(pPhen, pSig, cPhen, cSig): - proposed = pPhen + "." + pSig - current = cPhen + "." + cSig - if proposed in upgradeHazardsDict: - if current in upgradeHazardsDict[proposed]: - return 1 - else: - return 0 - else: - return 0 - -# -# Downgrade Hazards Dictionary - downgradeHazardsDict is a dictionary of -# phen/sig combinations defining downgrades. Each key is the proposed hazard. -# The associated list are the hazards which are downgraded by the -# proposed hazard. -# - -downgradeHazardsDict = { -'ZR.Y': ['BZ.W', 'LE.W', 'IS.W', 'WS.W'], -'LE.Y': ['BZ.W', 'LE.W', 'IS.W', 'WS.W'], -'WW.Y': ['BZ.W', 'LE.W', 'IS.W', 'WS.W'], -'WC.Y': ['WC.W'], -'WS.W': ['BZ.W', 'IS.W'], -'LE.W': ['BZ.W', 'IS.W'], -'DU.Y': ['DS.W', 'HW.W'], -'LW.Y': ['DS.W', 'HW.W', 'WI.Y'], -'WI.Y': ['DS.W', 'HW.W'], -'HT.Y': ['EH.W'], -'FR.Y': ['FZ.W', 'HZ.W'], -'TR.W': ['HU.W', 'TY.W'], -'UP.Y': ['UP.W'], -'SR.W': ['HF.W'], -'GL.W': ['HF.W', 'SR.W'], -'SC.Y': ['HF.W', 'SR.W', 'GL.W', 'SE.W'], -'SW.Y': ['SE.W'], -'RB.Y': ['HF.W', 'SR.W', 'GL.W', 'SE.W'], -'SU.Y': ['SU.W'], -'BW.Y': ['HF.W', 'SR.W', 'GL.W'], -'SI.Y': ['HF.W', 'SR.W', 'GL.W'], -'LS.Y': ['LS.W'], -'CF.Y': ['CF.W'], -'AF.Y': ['AF.W'], -'MH.Y': ['MH.W'], -} - -# -# When passed a phen/sig for both the current hazard and the proposed hazard, -# checkForDowngrade returns a 1 if the proposed hazard is an downgrade, otherwise 0 -# - -def checkForDowngrade(pPhen, pSig, cPhen, cSig): - proposed = pPhen + "." + pSig - current = cPhen + "." + cSig - if proposed in downgradeHazardsDict: - if current in downgradeHazardsDict[proposed]: - return 1 - else: - return 0 - else: - return 0 diff --git a/awips/test/dafTests/testProfiler.py b/awips/test/dafTests/testProfiler.py deleted file mode 100644 index c412c1c..0000000 --- a/awips/test/dafTests/testProfiler.py +++ /dev/null @@ -1,59 +0,0 @@ -# -# Test DAF support for profiler data -# -# SOFTWARE HISTORY -# -# Date Ticket# Engineer Description -# ------------ ---------- ----------- -------------------------- -# 01/19/16 4795 mapeters Initial Creation. -# 04/11/16 5548 tgurney Cleanup -# 04/18/16 5548 tgurney More cleanup -# -# - -from __future__ import print_function -from awips.dataaccess import DataAccessLayer as DAL - -from awips.test.dafTests import baseDafTestCase - - -class ProfilerTestCase(baseDafTestCase.DafTestCase): - """Test DAF support for profiler data""" - - datatype = "profiler" - - def testGetAvailableParameters(self): - req = DAL.newDataRequest(self.datatype) - self.runParametersTest(req) - - def testGetAvailableLocations(self): - req = DAL.newDataRequest(self.datatype) - self.runLocationsTest(req) - - def testGetAvailableTimes(self): - req = DAL.newDataRequest(self.datatype) - self.runTimesTest(req) - - def testGetGeometryData(self): - req = DAL.newDataRequest(self.datatype) - req.setParameters("temperature", "pressure", "uComponent", "vComponent") - - print("Testing getGeometryData()") - - geomData = DAL.getGeometryData(req) - self.assertIsNotNone(geomData) - print("Number of geometry records: " + str(len(geomData))) - print("Sample geometry data:") - for record in geomData[:self.sampleDataLimit]: - print("level:", record.getLevel(), end="") - # One dimensional parameters are reported on the 0.0UNKNOWN level. - # 2D parameters are reported on MB levels from pressure. - if record.getLevel() == "0.0UNKNOWN": - print(" temperature=" + record.getString("temperature") + record.getUnit("temperature"), end="") - print(" pressure=" + record.getString("pressure") + record.getUnit("pressure"), end="") - else: - print(" uComponent=" + record.getString("uComponent") + record.getUnit("uComponent"), end="") - print(" vComponent=" + record.getString("vComponent") + record.getUnit("vComponent"), end="") - print(" geometry:", record.getGeometry()) - - print("getGeometryData() complete\n\n") diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 8a7dac0..0000000 --- a/docs/Makefile +++ /dev/null @@ -1,218 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = build -NBCONVERT = ipython nbconvert - -# User-friendly check for sphinx-build -ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) -$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) -endif - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source - -.PHONY: help -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " applehelp to make an Apple Help Book" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " xml to make Docutils-native XML files" - @echo " pseudoxml to make pseudoxml-XML files for display purposes" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - @echo " coverage to run coverage check of the documentation (if enabled)" - -.PHONY: clean -clean: - rm -rf $(BUILDDIR)/* source/examples/generated/* - -.PHONY: html -html: - make clean - $(SPHINXBUILD) -vb html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -.PHONY: dirhtml -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -.PHONY: singlehtml -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -.PHONY: pickle -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -.PHONY: json -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -.PHONY: htmlhelp -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -.PHONY: qthelp -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/python-awips.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/python-awips.qhc" - -.PHONY: applehelp -applehelp: - $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp - @echo - @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." - @echo "N.B. You won't be able to view it unless you put it in" \ - "~/Library/Documentation/Help or install it in your application" \ - "bundle." - -.PHONY: devhelp -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/python-awips" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/python-awips" - @echo "# devhelp" - -.PHONY: epub -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -.PHONY: latex -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -.PHONY: latexpdf -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -.PHONY: latexpdfja -latexpdfja: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through platex and dvipdfmx..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -.PHONY: text -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -.PHONY: man -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -.PHONY: texinfo -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -.PHONY: info -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -.PHONY: gettext -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -.PHONY: changes -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -.PHONY: linkcheck -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -.PHONY: doctest -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." - -.PHONY: coverage -coverage: - $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage - @echo "Testing of coverage in the sources finished, look at the " \ - "results in $(BUILDDIR)/coverage/python.txt." - -.PHONY: xml -xml: - $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml - @echo - @echo "Build finished. The XML files are in $(BUILDDIR)/xml." - -.PHONY: pseudoxml -pseudoxml: - $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml - @echo - @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index f0361d4..0000000 --- a/docs/make.bat +++ /dev/null @@ -1,263 +0,0 @@ -@ECHO OFF - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set BUILDDIR=build -set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source -set I18NSPHINXOPTS=%SPHINXOPTS% source -if NOT "%PAPER%" == "" ( - set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% - set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% -) - -if "%1" == "" goto help - -if "%1" == "help" ( - :help - echo.Please use `make ^` where ^ is one of - echo. html to make standalone HTML files - echo. dirhtml to make HTML files named index.html in directories - echo. singlehtml to make a single large HTML file - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. devhelp to make HTML files and a Devhelp project - echo. epub to make an epub - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. text to make text files - echo. man to make manual pages - echo. texinfo to make Texinfo files - echo. gettext to make PO message catalogs - echo. changes to make an overview over all changed/added/deprecated items - echo. xml to make Docutils-native XML files - echo. pseudoxml to make pseudoxml-XML files for display purposes - echo. linkcheck to check all external links for integrity - echo. doctest to run all doctests embedded in the documentation if enabled - echo. coverage to run coverage check of the documentation if enabled - goto end -) - -if "%1" == "clean" ( - for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i - del /q /s %BUILDDIR%\* - goto end -) - - -REM Check if sphinx-build is available and fallback to Python version if any -%SPHINXBUILD% 1>NUL 2>NUL -if errorlevel 9009 goto sphinx_python -goto sphinx_ok - -:sphinx_python - -set SPHINXBUILD=python -m sphinx.__init__ -%SPHINXBUILD% 2> nul -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -:sphinx_ok - - -if "%1" == "html" ( - %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/html. - goto end -) - -if "%1" == "dirhtml" ( - %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. - goto end -) - -if "%1" == "singlehtml" ( - %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. - goto end -) - -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in %BUILDDIR%/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in %BUILDDIR%/qthelp, like this: - echo.^> qcollectiongenerator %BUILDDIR%\qthelp\python-awips.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile %BUILDDIR%\qthelp\python-awips.ghc - goto end -) - -if "%1" == "devhelp" ( - %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. - goto end -) - -if "%1" == "epub" ( - %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub file is in %BUILDDIR%/epub. - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdf" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf - cd %~dp0 - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdfja" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf-ja - cd %~dp0 - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "text" ( - %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The text files are in %BUILDDIR%/text. - goto end -) - -if "%1" == "man" ( - %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The manual pages are in %BUILDDIR%/man. - goto end -) - -if "%1" == "texinfo" ( - %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. - goto end -) - -if "%1" == "gettext" ( - %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The message catalogs are in %BUILDDIR%/locale. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes - if errorlevel 1 exit /b 1 - echo. - echo.The overview file is in %BUILDDIR%/changes. - goto end -) - -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck - if errorlevel 1 exit /b 1 - echo. - echo.Link check complete; look for any errors in the above output ^ -or in %BUILDDIR%/linkcheck/output.txt. - goto end -) - -if "%1" == "doctest" ( - %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest - if errorlevel 1 exit /b 1 - echo. - echo.Testing of doctests in the sources finished, look at the ^ -results in %BUILDDIR%/doctest/output.txt. - goto end -) - -if "%1" == "coverage" ( - %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage - if errorlevel 1 exit /b 1 - echo. - echo.Testing of coverage in the sources finished, look at the ^ -results in %BUILDDIR%/coverage/python.txt. - goto end -) - -if "%1" == "xml" ( - %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The XML files are in %BUILDDIR%/xml. - goto end -) - -if "%1" == "pseudoxml" ( - %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. - goto end -) - -:end diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index cc19438..0000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -sphinx>=1.3 -nbconvert>=4.1 -enum34 -jupyter -shapely -numpy diff --git a/docs/source/about.rst b/docs/source/about.rst deleted file mode 100644 index 226cd32..0000000 --- a/docs/source/about.rst +++ /dev/null @@ -1,181 +0,0 @@ -=================== -About Unidata AWIPS -=================== - -AWIPS is a weather forecasting display and analysis package -developed by the National Weather Service and Raytheon. AWIPS is a -Java application consisting of a data-rendering client (CAVE, which runs -on Red Hat/CentOS Linux and Mac OS X) and a backend data server (EDEX, -which runs only on Linux) - -AWIPS takes a unified approach to data ingest, and most data types -follow a standard path through the system. At a high level, data flow -describes the path taken by a piece of data from its source to its -display by a client system. This path starts with data requested and -stored by an `LDM <#ldm>`_ client and includes the decoding of the data -and storing of decoded data in a form readable and displayable by the -end user. - -The AWIPS ingest and request processes are a highly distributed -system, and the messaging broken `Qpid <#qpid>`_ is used for -inter-process communication. - -.. figure:: http://www.unidata.ucar.edu/software/awips2/images/awips2_coms.png - :align: center - :alt: image - - image - -License -------- - -The AWIPS software package released by the Unidata Program Center is considered to -be in the public domain since it is released without proprietary code. As such, export -controls do not apply.  Any person is free to download, modify, distribute, or share -Unidata AWIPS in any form. Entities who modify or re-distribute Unidata AWIPS -software are encouraged to conduct their own FOSS/COTS entitlement/license review -to ensure that they remain compatible with the associated terms (see -FOSS_COTS_License.pdf at `https://github.com/Unidata/awips2 `_). - - -About AWIPS ------------ - -The primary AWIPS application for data ingest, processing, and -storage is the Environmental Data EXchange (**EDEX**) server; the -primary AWIPS application for visualization/data manipulation is the -Common AWIPS Visualization Environment (**CAVE**) client, which is -typically installed on a workstation separate from other AWIPS -components. - -In addition to programs developed specifically for AWIPS, AWIPS uses -several commercial off-the-shelf (COTS) and Free or Open Source software -(FOSS) products to assist in its operation. The following components, -working together and communicating, compose the entire AWIPS system. - -EDEX ----- - -The main server for AWIPS. Qpid sends alerts to EDEX when data stored -by the LDM is ready for processing. These Qpid messages include file -header information which allows EDEX to determine the appropriate data -decoder to use. The default ingest server (simply named ingest) handles -all data ingest other than grib messages, which are processed by a -separate ingestGrib server. After decoding, EDEX writes metadata to the -database via Postgres and saves the processed data in HDF5 via PyPIES. A -third EDEX server, request, feeds requested data to CAVE clients. EDEX -ingest and request servers are started and stopped with the commands -``edex start`` and ``edex stop``, which runs the system script -``/etc/rc.d/init.d/edex_camel`` - -CAVE ----- - -Common AWIPS Visualization Environment. The data rendering and -visualization tool for AWIPS. CAVE contains of a number of different -data display configurations called perspectives. Perspectives used in -operational forecasting environments include **D2D** (Display -Two-Dimensional), **GFE** (Graphical Forecast Editor), and **NCP** -(National Centers Perspective). CAVE is started with the command -``/awips2/cave/cave.sh`` or ``cave.sh`` - -.. figure:: http://www.unidata.ucar.edu/software/awips2/images/Unidata_AWIPS2_CAVE.png - :align: center - :alt: CAVE - - CAVE - -Alertviz --------- - -**Alertviz** is a modernized version of an AWIPS I application, designed -to present various notifications, error messages, and alarms to the user -(forecaster). AlertViz can be executed either independently or from CAVE -itself. In the Unidata CAVE client, Alertviz is run within CAVE and is -not required to be run separately. The toolbar is also **hidden from -view** and is accessed by right-click on the desktop taskbar icon. - -LDM ---- - -`http://www.unidata.ucar.edu/software/ldm/ `_ - -The **LDM** (Local Data Manager), developed and supported by Unidata, is -a suite of client and server programs designed for data distribution, -and is the fundamental component comprising the Unidata Internet Data -Distribution (IDD) system. In AWIPS, the LDM provides data feeds for -grids, surface observations, upper-air profiles, satellite and radar -imagery and various other meteorological datasets. The LDM writes data -directly to file and alerts EDEX via Qpid when a file is available for -processing. The LDM is started and stopped with the commands -``edex start`` and ``edex stop``, which runs the commands -``service edex_ldm start`` and ``service edex_ldm stop`` - -edexBridge ----------- - -edexBridge, invoked in the LDM configuration file -``/awips2/ldm/etc/ldmd.conf``, is used by the LDM to post "data -available" messaged to Qpid, which alerts the EDEX Ingest server that a -file is ready for processing. - -Qpid ----- - -`http://qpid.apache.org `_ - -**Apache Qpid**, the Queue Processor Interface Daemon, is the messaging -system used by AWIPS to facilitate communication between services. -When the LDM receives a data file to be processed, it employs -**edexBridge** to send EDEX ingest servers a message via Qpid. When EDEX -has finished decoding the file, it sends CAVE a message via Qpid that -data are available for display or further processing. Qpid is started -and stopped by ``edex start`` and ``edex stop``, and is controlled by -the system script ``/etc/rc.d/init.d/qpidd`` - -PostgreSQL ----------- - -`http://www.postgresql.org `_ - -**PostgreSQL**, known simply as Postgres, is a relational database -management system (DBMS) which handles the storage and retrieval of -metadata, database tables and some decoded data. The storage and reading -of EDEX metadata is handled by the Postgres DBMS. Users may query the -metadata tables by using the termainal-based front-end for Postgres -called **psql**. Postgres is started and stopped by ``edex start`` and -``edex stop``, and is controlled by the system script -``/etc/rc.d/init.d/edex_postgres`` - -HDF5 ----- - -`http://www.hdfgroup.org/HDF5/ `_ - -**Hierarchical Data Format (v.5)** is -the primary data storage format used by AWIPS for processed grids, -satellite and radar imagery and other products. Similar to netCDF, -developed and supported by Unidata, HDF5 supports multiple types of data -within a single file. For example, a single HDF5 file of radar data may -contain multiple volume scans of base reflectivity and base velocity as -well as derived products such as composite reflectivity. The file may -also contain data from multiple radars. HDF5 is stored in -``/awips2/edex/data/hdf5/`` - -PyPIES (httpd-pypies) ---------------------- - -**PyPIES**, Python Process Isolated Enhanced Storage, was created for -AWIPS to isolate the management of HDF5 Processed Data Storage from -the EDEX processes. PyPIES manages access, i.e., reads and writes, of -data in the HDF5 files. In a sense, PyPIES provides functionality -similar to a DBMS (i.e PostgreSQL for metadata); all data being written -to an HDF5 file is sent to PyPIES, and requests for data stored in HDF5 -are processed by PyPIES. - -PyPIES is implemented in two parts: 1. The PyPIES manager is a Python -application that runs as part of an Apache HTTP server, and handles -requests to store and retrieve data. 2. The PyPIES logger is a Python -process that coordinates logging. PyPIES is started and stopped by -``edex start`` and ``edex stop``, and is controlled by the system script -``/etc/rc.d/init.d/https-pypies`` diff --git a/docs/source/api/CombinedTimeQuery.rst b/docs/source/api/CombinedTimeQuery.rst deleted file mode 100644 index 8a33c80..0000000 --- a/docs/source/api/CombinedTimeQuery.rst +++ /dev/null @@ -1,7 +0,0 @@ -================= -CombinedTimeQuery -================= - -.. automodule:: awips.dataaccess.CombinedTimeQuery - :members: - :undoc-members: diff --git a/docs/source/api/DataAccessLayer.rst b/docs/source/api/DataAccessLayer.rst deleted file mode 100644 index e000038..0000000 --- a/docs/source/api/DataAccessLayer.rst +++ /dev/null @@ -1,7 +0,0 @@ -=============== -DataAccessLayer -=============== - -.. automodule:: awips.dataaccess.DataAccessLayer - :members: - :undoc-members: diff --git a/docs/source/api/DateTimeConverter.rst b/docs/source/api/DateTimeConverter.rst deleted file mode 100644 index 75949fc..0000000 --- a/docs/source/api/DateTimeConverter.rst +++ /dev/null @@ -1,7 +0,0 @@ -================= -DateTimeConverter -================= - -.. automodule:: awips.DateTimeConverter - :members: - :undoc-members: diff --git a/docs/source/api/IDataRequest.rst b/docs/source/api/IDataRequest.rst deleted file mode 100644 index d818819..0000000 --- a/docs/source/api/IDataRequest.rst +++ /dev/null @@ -1,7 +0,0 @@ -=============================== -IDataRequest (newDataRequest()) -=============================== - -.. autoclass:: awips.dataaccess.IDataRequest - :members: - :special-members: diff --git a/docs/source/api/IFPClient.rst b/docs/source/api/IFPClient.rst deleted file mode 100644 index 14c94f5..0000000 --- a/docs/source/api/IFPClient.rst +++ /dev/null @@ -1,7 +0,0 @@ -========= -IFPClient -========= - -.. automodule:: awips.gfe.IFPClient - :members: - :undoc-members: diff --git a/docs/source/api/ModelSounding.rst b/docs/source/api/ModelSounding.rst deleted file mode 100644 index cc99f64..0000000 --- a/docs/source/api/ModelSounding.rst +++ /dev/null @@ -1,7 +0,0 @@ -============= -ModelSounding -============= - -.. automodule:: awips.dataaccess.ModelSounding - :members: - :undoc-members: diff --git a/docs/source/api/PyData.rst b/docs/source/api/PyData.rst deleted file mode 100644 index 4097955..0000000 --- a/docs/source/api/PyData.rst +++ /dev/null @@ -1,7 +0,0 @@ -====================== -PyData -====================== - -.. automodule:: awips.dataaccess.PyData - :members: - :undoc-members: diff --git a/docs/source/api/PyGeometryData.rst b/docs/source/api/PyGeometryData.rst deleted file mode 100644 index 24ac092..0000000 --- a/docs/source/api/PyGeometryData.rst +++ /dev/null @@ -1,7 +0,0 @@ -====================== -PyGeometryData -====================== - -.. automodule:: awips.dataaccess.PyGeometryData - :members: - :undoc-members: diff --git a/docs/source/api/PyGridData.rst b/docs/source/api/PyGridData.rst deleted file mode 100644 index 860e7b9..0000000 --- a/docs/source/api/PyGridData.rst +++ /dev/null @@ -1,7 +0,0 @@ -====================== -PyGridData -====================== - -.. automodule:: awips.dataaccess.PyGridData - :members: - :undoc-members: diff --git a/docs/source/api/RadarCommon.rst b/docs/source/api/RadarCommon.rst deleted file mode 100644 index 4d0509e..0000000 --- a/docs/source/api/RadarCommon.rst +++ /dev/null @@ -1,7 +0,0 @@ -====================== -RadarCommon -====================== - -.. automodule:: awips.RadarCommon - :members: - :undoc-members: diff --git a/docs/source/api/ThriftClient.rst b/docs/source/api/ThriftClient.rst deleted file mode 100644 index 72cfb1d..0000000 --- a/docs/source/api/ThriftClient.rst +++ /dev/null @@ -1,7 +0,0 @@ -====================== -ThriftClient -====================== - -.. automodule:: awips.ThriftClient - :members: - :undoc-members: diff --git a/docs/source/api/ThriftClientRouter.rst b/docs/source/api/ThriftClientRouter.rst deleted file mode 100644 index d65f137..0000000 --- a/docs/source/api/ThriftClientRouter.rst +++ /dev/null @@ -1,7 +0,0 @@ -====================== -ThriftClientRouter -====================== - -.. automodule:: awips.dataaccess.ThriftClientRouter - :members: - :undoc-members: diff --git a/docs/source/api/TimeUtil.rst b/docs/source/api/TimeUtil.rst deleted file mode 100644 index d583e2a..0000000 --- a/docs/source/api/TimeUtil.rst +++ /dev/null @@ -1,7 +0,0 @@ -====================== -TimeUtil -====================== - -.. automodule:: awips.TimeUtil - :members: - :undoc-members: diff --git a/docs/source/api/index.rst b/docs/source/api/index.rst deleted file mode 100644 index abca2d1..0000000 --- a/docs/source/api/index.rst +++ /dev/null @@ -1,22 +0,0 @@ -################# -API Documentation -################# - -.. toctree:: - :maxdepth: 2 - - DataAccessLayer - IDataRequest - PyData - PyGridData - PyGeometryData - ModelSounding - ThriftClientRouter - ThriftClient - TimeUtil - RadarCommon - IFPClient - DateTimeConverter - CombinedTimeQuery - -* :ref:`genindex` diff --git a/docs/source/conf.py b/docs/source/conf.py deleted file mode 100644 index 62ad35c..0000000 --- a/docs/source/conf.py +++ /dev/null @@ -1,303 +0,0 @@ -# -*- coding: utf-8 -*- -# -# python-awips documentation build configuration file, created by -# sphinx-quickstart on Tue Mar 15 15:59:23 2016. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys -import os - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ------------------------------------------------ - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -sys.path.insert(0, os.path.abspath('.')) -sys.path.insert(0, os.path.abspath('../..')) - -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.intersphinx', - 'sphinx.ext.viewcode', - 'sphinx.ext.autosectionlabel', - 'notebook_gen_sphinxext' -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The encoding of source files. -#source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = 'python-awips' -copyright = '2018, Unidata' -author = 'Unidata' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = '18.1.7' -# The full version, including alpha/beta/rc tags. - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = [] - -# The reST default role (used for this markup: `text`) to use for all -# documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - -# If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -#html_theme = 'alabaster' -html_theme = 'sphinx_rtd_theme' -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -#html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# The name of an image file (relative to this directory) to use as a favicon of -# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# Add any extra paths that contain custom files (such as robots.txt or -# .htaccess) here, relative to this directory. These files are copied -# directly to the root of the documentation. -#html_extra_path = [] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -#html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_domain_indices = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None - -# Language to be used for generating the HTML full-text search index. -# Sphinx supports the following languages: -# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' -# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' -#html_search_language = 'en' - -# A dictionary with options for the search language support, empty by default. -# Now only 'ja' uses this config value -#html_search_options = {'type': 'default'} - -# The name of a javascript file (relative to the configuration directory) that -# implements a search results scorer. If empty, the default will be used. -#html_search_scorer = 'scorer.js' - -# Output file base name for HTML help builder. -htmlhelp_basename = 'python-awipsdoc' - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', - -# Latex figure (float) alignment -#'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, 'python-awips.tex', 'python-awips Documentation', - 'Unidata', 'manual'), -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'python-awips', 'python-awips Documentation', - [author], 1) -] - -# If true, show URL addresses after external links. -#man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, 'python-awips', 'python-awips Documentation', - author, 'python-awips', 'One line description of project.', - 'Miscellaneous'), -] - -# Documents to append as an appendix to all manuals. -#texinfo_appendices = [] - -# If false, no module index is generated. -#texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' - -# If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False - -# Set up mapping for other projects' docs -intersphinx_mapping = { - 'matplotlib': ('http://matplotlib.org/', None), - 'numpy': ('http://docs.scipy.org/doc/numpy/', None), - 'scipy': ('http://docs.scipy.org/doc/scipy/reference/', None), - 'pint': ('http://pint.readthedocs.org/en/stable/', None), - 'python': ('http://docs.python.org', None) - } diff --git a/docs/source/datatypes.rst b/docs/source/datatypes.rst deleted file mode 100644 index 6ffd8b7..0000000 --- a/docs/source/datatypes.rst +++ /dev/null @@ -1,129 +0,0 @@ -==================== -Available Data Types -==================== - -.. _awips.dataaccess.DataAccessLayer.getGeometryData(request, times=[]): api/DataAccessLayer.html#awips.dataaccess.DataAccessLayer.getGeometryData - -.. _awips.dataaccess.DataAccessLayer.getGridData(request, times=[]): api/DataAccessLayer.html#awips.dataaccess.DataAccessLayer.getGridData - -.. _RadarCommon.get_hdf5_data(idra): api/RadarCommon.html - - - -satellite ---------- - -- 2-D NumPy Array -- returned by: `awips.dataaccess.DataAccessLayer.getGridData(request, times=[])`_ -- example:: - - # Contrust a full satellite product tree - DataAccessLayer.changeEDEXHost("edex-cloud.unidata.ucar.edu) - request = DataAccessLayer.newDataRequest("satellite") - creatingEntities = DataAccessLayer.getIdentifierValues(request, "creatingEntity") - for entity in creatingEntities: - print(entity) - request = DataAccessLayer.newDataRequest("satellite") - request.addIdentifier("creatingEntity", entity) - availableSectors = DataAccessLayer.getAvailableLocationNames(request) - availableSectors.sort() - for sector in availableSectors: - print(" - " + sector) - request.setLocationNames(sector) - availableProducts = DataAccessLayer.getAvailableParameters(request) - availableProducts.sort() - for product in availableProducts: - print(" - " + product) - ---- - -binlightning ------------- - -- Shapely Point:: - - POINT (-65.65293884277344 -16.94915580749512) - -- returned by: `awips.dataaccess.DataAccessLayer.getGeometryData(request, times=[])`_ -- example (GLM):: - - request = DataAccessLayer.newDataRequest("binlightning") - request.addIdentifier("source", "GLMgr") - request.setParameters("intensity") - times = DataAccessLayer.getAvailableTimes(request) - response = DataAccessLayer.getGeometryData(request, times[-10:-1]) - for ob in response: - geom = ob.getGeometry() - ---- - - -grid ----- - -- 2-D NumPy Array -- returned by: `awips.dataaccess.DataAccessLayer.getGridData(request, times=[])`_ -- example:: - - request = DataAccessLayer.newDataRequest() - request.setDatatype("grid") - request.setLocationNames("RAP13") - request.setParameters("T") - request.setLevels("2.0FHAG") - cycles = DataAccessLayer.getAvailableTimes(request, True) - times = DataAccessLayer.getAvailableTimes(request) - fcstRun = DataAccessLayer.getForecastRun(cycles[-1], times) - response = DataAccessLayer.getGridData(request, [fcstRun[-1]]) - for grid in response: - data = grid.getRawData() - lons, lats = grid.getLatLonCoords() - - ---- - -warning -------- - -- Shapely MultiPolygon, Polygon:: - - MULTIPOLYGON ((-92.092348410 46.782322971, ..., -92.092348410 46.782322971), - (-90.948581075 46.992865960, ..., -90.948581075 46.992865960), - ... - (-92.274543999 46.652773000, ..., -92.280511999 46.656933000), - (-92.285491999 46.660741000, ..., -92.285491999 46.660741000)) - -- returned by: `awips.dataaccess.DataAccessLayer.getGeometryData(request, times=[])`_ -- example:: - - request = DataAccessLayer.newDataRequest() - request.setDatatype("warning") - request.setParameters('phensig') - times = DataAccessLayer.getAvailableTimes(request) - response = DataAccessLayer.getGeometryData(request, times[-50:-1]) - for ob in response: - poly = ob.getGeometry() - site = ob.getLocationName() - pd = ob.getDataTime().getValidPeriod() - ref = ob.getDataTime().getRefTime() - - ---- - -radar ------ - -- 2-D NumPy Array -- returned by: `awips.dataaccess.DataAccessLayer.getGridData(request, times=[])`_ -- also returned by: `RadarCommon.get_hdf5_data(idra)`_ -- example:: - - request = DataAccessLayer.newDataRequest("radar") - request.setLocationNames("kmhx") - request.setParameters("Digital Hybrid Scan Refl") - availableLevels = DataAccessLayer.getAvailableLevels(request) - times = DataAccessLayer.getAvailableTimes(request) - response = DataAccessLayer.getGridData(request, [times[-1]]) - for image in response: - data = image.getRawData() - lons, lats = image.getLatLonCoords() - diff --git a/docs/source/dev.rst b/docs/source/dev.rst deleted file mode 100644 index e01cd5a..0000000 --- a/docs/source/dev.rst +++ /dev/null @@ -1,654 +0,0 @@ - -Development Guide -================= - -The Data Access Framework allows developers to retrieve different types -of data without having dependencies on those types of data. It provides -a single, unified data type that can be customized by individual -implementing plug-ins to provide full functionality pertinent to each -data type. - -Writing a New Factory ---------------------- - -Factories will most often be written in a dataplugin, but should always -be written in a common plug-in. This will allow for clean dependencies -from both CAVE and EDEX. - -A new plug-in’s data access class must implement IDataFactory. For ease -of use, abstract classes have been created to combine similar methods. -Data factories do not have to implement both types of data (grid and -geometry). They can if they choose, but if they choose not to, they -should do the following: - -:: - - throw new UnsupportedOutputTypeException(request.getDatatype(), "grid"); - -This lets the code know that grid type is not supported for this data -factory. Depending on where the data is coming from, helpers have been -written to make writing a new data type factory easier. For example, -PluginDataObjects can use AbstractDataPluginFactory as a start and not -have to create everything from scratch. - -Each data type is allowed to implement retrieval in any manner that is -felt necessary. The power of the framework means that the code -retrieving data does not have to know anything of the underlying -retrieval methods, only that it is getting data in a certain manner. To -see some examples of ways to retrieve data, reference -**SatelliteGridFactory** and **RadarGridFactory**. - -Methods required for implementation: - -**public DataTime[] getAvailableTimes(IDataRequest request)** - -- This method returns an array of DataTime objects corresponding to - what times are available for the data being retrieved, based on the - parameters and identifiers being passed in. - -**public DataTime[] getAvailableTimes(IDataRequest request, BinOffset -binOffset)** - -- This method returns available times as above, only with a bin offset - applied. - -Note: Both of the preceding methods can throw TimeAgnosticDataException -exceptions if times do not apply to the data type. - -**public IGridData[] getGridData(IDataRequest request, -DataTime...times)** - -- This method returns IGridData objects (an array) based on the request - and times to request for. There can be multiple times or a single - time. - -**public IGridData[] getGridData(IDataRequest request, TimeRange -range)** - -- Similar to the preceding method, this returns IGridData objects based - on a range of times. - -**public IGeometryData[] getGeometryData(IDataRequest request, DataTime -times)** - -- This method returns IGeometryData objects based on a request and - times. - -**public IGeometryData[] getGeometryData(IDataRequest request, TimeRange -range)** - -- Like the preceding method, this method returns IGeometryData objects - based on a range of times. - -**public String[] getAvailableLocationNames(IDataRequest request)** - -- This method returns location names that match the request. If this - does not apply to the data type, an IncompatibleRequestException - should be thrown. - -Registering the Factory with the Framework ------------------------------------------- - -The following needs to be added in a spring file in the plug-in that -contains the new factory: - -:: - - - - - - - -This takes the RadarGridFactory and registers it with the registry and -allows it to be used any time the code makes a request for the data type -“radar.” - -Retrieving Data Using the Factory ---------------------------------- - -For ease of use and more diverse use, there are multiple interfaces into -the Data Access Layer. Currently, there is a Python implementation and a -Java implementation, which have very similar method calls and work in a -similar manner. Plug-ins that want to use the data access framework to -retrieve data should include **com.raytheon.uf.common.dataaccess** as a -Required Bundle in their MANIFEST.MF. - -To retrieve data using the Python interface : - -:: - - from awips.dataaccess import DataAccessLayer - req = DataAccessLayer.newDataRequest() - req.setDatatype("grid") - req.setParameters("T") - req.setLevels("2FHAG") - req.addIdentifier("info.datasetId", "GFS40") - times = DataAccessLayer.getAvailableTimes(req) - data = DataAccessLayer.getGridData(req, times) - -To retrieve data using the Java interface : - -:: - - IDataRequest req = DataAccessLayer.newDataRequest(); - req.setDatatype("grid"); - req.setParameters("T"); - req.setLevels("2FHAG"); - req.addIdentifier("info.datasetId", "GFS40"); - DataTime[] times = DataAccessLayer.getAvailableTimes(req) - IData data = DataAccessLayer.getGridData(req, times); - -**newDataRequest()** - -- This creates a new data request. Most often this is a - DefaultDataRequest, but saves for future implentations as well. - -**setDatatype(String)** - -- This is the data type being retrieved. This can be found as the value - that is registered when creating the new factory (See section above - **Registering the Factory with the Framework** [radar in that case]). - -**setParameters(String...)** - -- This can differ depending on data type. It is most often used as a - main difference between products. - -**setLevels(String...)** - -- This is often used to identify the same products on different - mathematical angles, heights, levels, etc. - -**addIdentifier(String, String)** - -- This differs based on data type, but is often used for more - fine-tuned querying. - -Both methods return a similar set of data and can be manipulated by -their respective languages. See DataAccessLayer.py and -DataAccessLayer.java for more methods that can be called to retrieve -data and different parts of the data. Because each data type has -different parameters, levels, and identifiers, it is best to see the -actual data type for the available options. If it is undocumented, then -the best way to identify what parameters are to be used is to reference -the code. - -Development Background ----------------------- - -In support of Hazard Services Raytheon Technical Services is building a -generic data access framework that can be called via JAVA or Python. The -data access framework code can be found within the AWIPS Baseline in - -:: - - com.raytheon.uf.common.dataaccess - -As of 2016, plugins have been written for grid, radar, satellite, Hydro -(SHEF), point data (METAR, SYNOP, Profiler, ACARS, AIREP, PIREP), maps -data, and other data types. The Factories for each can be found in the -following packages (you may need to look at the development baseline to -see these): - -:: - - com.raytheon.uf.common.dataplugin.grid.dataaccess - com.raytheon.uf.common.dataplugin.radar.dataaccess - com.raytheon.uf.common.dataplugin.satellite.dataaccess - com.raytheon.uf.common.dataplugin.binlightning.dataaccess - com.raytheon.uf.common.dataplugin.sfc.dataaccess - com.raytheon.uf.common.dataplugin.sfcobs.dataaccess - com.raytheon.uf.common.dataplugin.acars.dataaccess - com.raytheon.uf.common.dataplugin.ffmp.dataaccess - com.raytheon.uf.common.dataplugin.bufrua.dataaccess - com.raytheon.uf.common.dataplugin.profiler.dataaccess - com.raytheon.uf.common.dataplugin.moddelsounding.dataaccess - com.raytheon.uf.common.dataplugin.ldadmesonet.dataaccess - com.raytheon.uf.common.dataplugin.binlightning.dataaccess - com.raytheon.uf.common.dataplugin.gfe.dataaccess - com.raytheon.uf.common.hydro.dataaccess - com.raytheon.uf.common.pointdata.dataaccess - com.raytheon.uf.common.dataplugin.maps.dataaccess - -Additional data types may be added in the future. To determine what -datatypes are supported display the "type hierarchy" associated with the -classes - -**AbstractGridDataPluginFactory**, - -**AbstractGeometryDatabaseFactory**, and - -**AbstractGeometryTimeAgnosticDatabaseFactory**. - -The following content was taken from the design review document which is -attached and modified slightly. - -Design/Implementation ---------------------- - -The Data Access Framework is designed to provide a consistent interface -for requesting and using geospatial data within CAVE or EDEX. Examples -of geospatial data are grids, satellite, radar, metars, maps, river gage -heights, FFMP basin data, airmets, etc. To allow for convenient use of -geospatial data, the framework will support two types of requests: grids -and geometries (points, polygons, etc). The framework will also hide -implementation details of specific data types from users, making it -easier to use data without worrying about how the data objects are -structured or retrieved. - -A suggested mapping of some current data types to one of the two -supported data requests is listed below. This list is not definitive and -can be expanded. If a developer can dream up an interpretation of the -data in the other supported request type, that support can be added. - -Grids - -- Grib -- Satellite -- Radar -- GFE - -Geometries - -- Map (states, counties, zones, etc) -- Hydro DB (IHFS) -- Obs (metar) -- FFMP -- Hazard -- Warning -- CCFP -- Airmet - -The framework is designed around the concept of each data type plugin -contributing the necessary code for the framework to support its data. -For example, the satellite plugin provides a factory class for -interacting with the framework and registers itself as being compatible -with the Data Access Framework. This concept is similar to how EDEX in -AWIPS expects a plugin developer to provide a decoder class and -record class and register them, but then automatically manages the rest -of the ingest process including routing, storing, and alerting on new -data. This style of plugin architecture effectively enables the -framework to expand its capabilities to more data types without having -to alter the framework code itself. This will enable software developers -to incrementally add support for more data types as time allows, and -allow the framework to expand to new data types as they become -available. - -The Data Access Framework will not break any existing functionality or -APIs, and there are no plans to retrofit existing cosde to use the new -API at this time. Ideally code will be retrofitted in the future to -improve ease of maintainability. The plugin pecific code that hooks into -the framework will make use of existing APIs such as **IDataStore** and -**IServerRequest** to complete the requests. - -The Data Access Framework can be understood as three parts: - -- How users of the framework retrieve and use the data -- How plugin developers contribute support for new data types -- How the framework works when it receives a request - -How users of the framework retrieve and use the data ----------------------------------------------------- - -When a user of the framework wishes to request data, they must -instantiate a request object and set some of the values on that request. -Two request interfaces will be supported, for detailed methods see -section "Detailed Code" below. - -**IDataRequest** - -**IGridRequest** extends **IDataRequest** - -**IGeometryRequest** extends **IDataRequest** - -For the request interfaces, default implementations of -**DefaultGridRequest** and **DefaultGeometryRequest** will be provided -to handle most cases. However, the use of interfaces allows for custom -special cases in the future. If necessary, the developer of a plugin can -write their own custom request implementation to handle a special case. - -After the request object has been prepared, the user will pass it to the -Data Access Layer to receive a data object in return. See the "Detailed -Code" section below for detailed methods of the Data Access Layer. The -Data Access Layer will return one of two data interfaces. - -**IData** - -**IGridData** extends **IData** - -**IGeometryData** extends **IData** - -For the data interfaces, the use of interfaces effectively hides the -implementation details of specific data types from the user of the -framework. For example, the user receives an **IGridData** and knows the -data time, grid geometry, parameter, and level, but does not know that -the data is actually a **GFEGridData** vs **D2DGridData** vs -**SatelliteGridData**. This enables users of the framework to write -generic code that can support multiple data types. - -For python users of the framework, the interfaces will be very similar -with a few key distinctions. Geometries will be represented by python -geometries from the open source Shapely project. For grids, the python -**IGridData** will have a method for requesting the raw data as a numpy -array, and the Data Access Layer will have methods for requesting the -latitude coordinates and the longitude coordinates of grids as numpy -arrays. The python requests and data objects will be pure python and not -JEP PyJObjects that wrap Java objects. A future goal of the Data Access -Framework is to provide support to python local apps and therefore -enable requests of data outside of CAVE and EDEX to go through the same -familiar interfaces. This goal is out of scope for this project but by -making the request and returned data objects pure python it will not be -a huge undertaking to add this support in the future. - -How plugin developers contribute support for new datatypes ----------------------------------------------------------- - -When a developer wishes to add support for another data type to the -framework, they must implement one or both of the factory interfaces -within a common plugin. Two factory interfaces will be supported, for -detailed methods see below. - -**IDataFactory** - -**IGridFactory** extends **IDataFactory** - -**IGeometryFactory** extends **IDataFactory** - -For some data types, it may be desired to add support for both types of -requests. For example, the developer of grid data may want to provide -support for both grid requests and geometry requests. In this case the -developer would write two separate classes where one implements -**IGridFactory** and the other implements **IGeometryFactory**. -Furthermore, factories could be stacked on top of one another by having -factory implementations call into the Data Access Layer. - -For example, a custom factory keyed to "derived" could be written for -derived parameters, and the implementation of that factory may then call -into the Data Access Layer to retrieve “grid” data. In this example the -raw data would be retrieved through the **GridDataFactory** while the -derived factory then applies the calculations before returning the data. - -Implementations do not need to support all methods on the interfaces or -all values on the request objects. For example, a developer writing the -**MapGeometryFactory** does not need to support **getAvailableTimes()** -because map data such as US counties is time agnostic. In this case the -method should throw **UnsupportedOperationException** and the javadoc -will indicate this. - -Another example would be the developer writing **ObsGeometryFactory** -can ignore the Level field of the **IDataRequest** as there are not -different levels of metar data, it is all at the surface. It is up to -the factory writer to determine which methods and fields to support and -which to ignore, but the factory writer should always code the factory -with the user requesting data in mind. If a user of the framework could -reasonably expect certain behavior from the framework based on the -request, the factory writer should implement support for that behavior. - -Abstract factories will be provided and can be extended to reduce the -amount of code a factory developer has to write to complete some common -actions that will be used by multiple factories. The factory should be -capable of working within either CAVE or EDEX, therefore all of its -server specific actions (e.g. database queries) should go through the -Request/Handler API by using **IServerRequests**. CAVE can then send the -**IServerRequests** to EDEX with **ThriftClient** while EDEX can use the -**ServerRequestRouter** to process the **IServerRequests**, making the -code compatible regardless of which JVM it is running inside. - -Once the factory code is written, it must be registered with the -framework as an available factory. This will be done through spring xml -in a common plugin, with the xml file inside the res/spring folder of -the plugin. Registering the factory will identify the datatype name that -must match what users would use as the datatype on the **IDataRequest**, -e.g. the word "satellite". Registering the factory also indicates to the -framework what request types are supported, i.e. grid vs geometry or -both. - -An example of the spring xml for a satellite factory is provided below: - -:: - - - - - - - - - -How the framework works when it receives a request --------------------------------------------------- - -**IDataRequest** requires a datatype to be set on every request. The -framework will have a registry of existing factories for each data type -(grid and geometry). When the Data Access Layer methods are called, it -will first lookup in the registry for the factory that corresponds to -the datatype on the **IDataRequest**. If no corresponding factory is -found, it will throw an exception with a useful error message that -indicates there is no current support for that datatype request. If a -factory is found, it will delegate the processing of the request to the -factory. The factory will receive the request and process it, returning -the result back to the Data Access Layer which then returns it to the -caller. - -By going through the Data Access Layer, the user is able to retrieve the -data and use it without understanding which factory was used, how the -factory retrieved the data, or what implementation of data was returned. -This effectively frees the framework and users of the framework from any -dependencies on any particular data types. Since these dependencies are -avoided, the specific **IDataFactory** and **IData** implementations can -be altered in the future if necessary and the code making use of the -framework will not need to be changed as long as the interfaces continue -to be met. - -Essentially, the Data Access Framework is a service that provides data -in a consistent way, with the service capabilities being expanded by -plugin developers who write support for more data types. Note that the -framework itself is useless without plugins contributing and registering -**IDataFactories**. Once the framework is coded, developers will need to -be tasked to add the factories necessary to support the needed data -types. - -Request interfaces ------------------- - -Requests and returned data interfaces will exist in both Java and -Python. The Java interfaces are listed below and the Python interfaces -will match the Java interfaces except where noted. Factories will only -be written in Java. - -**IDataRequest** - -- **void setDatatype(String datatype)** - the datatype name and - also the key to which factory will be used. Frequently pluginName - such as radar, satellite, gfe, ffmp, etc - -- **void addIdentifier(String key, Object value)** - an identifier the - factory can use to determine which data to return, e.g. for grib data - key "modelName" and value “GFS40” - -- **void setParameters(String... params)** - -- **void setLevels(Level... levels)** - -- **String getDatatype()** - -- **Map getIdentifiers()** - -- **String[] getParameters()** - -- **Level[] getLevels()** - -- Python Differences - -- **Levels** will be represented as **Strings** - -**IGridRequest extends IDataRequest** - -- **void setStorageRequest(Request request)** - a datastorage request - that allows for slab, line, and point requests for faster performance - and less data retrieval - -- **Request getStorageRequest()** - -- Python Differences - -- No support for storage requests - -**IGeometryRequest extends IDataRequest** - -- **void setEnvelope(Envelope env)** - a bounding box envelope to limit - the data that is searched through and returned. Not all factories may - support this. - -- **setLocationNames(String... locationNames)** - a convenience of - requesting data by names such as ICAOs, airports, stationIDs, etc - -- **Envelope getEnvelope()** - -- **String[] getLocationNames()** - -- Python Differences - -- Envelope methods will use a **shapely.geometry.Polygon** instead of - **Envelopes** (shapely has no concept of envelopes and considers them - as rectangular polygons) - -Data Interfaces -~~~~~~~~~~~~~~~ - -**IData** - -- **Object getAttribute(String key)** - **getAttribute** provides a way - to get at attributes of the data that the interface does not provide, - allowing the user to get more info about the data without adding - dependencies on the specific data type plugin - -- **DataTime getDataTime()** - some data may return null (e.g. maps) - -- **Level getLevel()** - some data may return null - -- Python Differences - -- **Levels** will be represented by **Strings** - -**IGridData extends IData** - -- **String getParameter()** - -- **GridGeometry2D getGridGeometry()** - -- **Unit getUnit()** - some data may return null - -- **DataDestination populateData(DataDestination destination)** - How - the user gets the raw data by passing in a **DataDestination** such - as **FloatArrayWrapper** or **ByteBufferWrapper**. This allows the - user to specify the way the raw data of the grid should be structured - in memory. - -- **DataDestination populateData(DataDestination destination, Unit - unit)** - Same as the above method but also attempts to convert the - raw data to the specified unit when populating the - **DataDestination**. - -- Python Differences - -- **Units** will be represented by **Strings** - -- **populateData()** methods will not exist, instead there will be - a **getRawData()** method that returns a numpy array in the native - type of the data - -**IGeometryData extends IData** - -- **Geometry getGeometry()** - -- **Set getParameters()** - Gets the list of parameters included in - this data - -- **String getString(String param)** - Gets the value of the parameter - as a String - -- **Number getNumber(String param)** - Gets the value of the parameter - as a Number - -- **Unit getUnit(String param)** - Gets the unit of the parameter, - may be null - -- **Type getType(String param)** - Returns an enum of the raw type of - the parameter, such as Float, Int, or String - -- **String getLocationName()** - Returns the location name of the piece - of data, typically to correlate if the request was made with - locationNames. May be null. - -- Python Differences - -- **Geometry** will be **shapely.geometry.Geometry** - -- **getNumber()** will return the python native number of the data - -- **Units** will be represented by **Strings** - -- **getType()** will return the python type object - -**DataAccessLayer** (in implementation, these methods delegate -processing to factories) - -- **DataTime[] getAvailableTimes(IDataRequest request)** - -- **DataTime[] getAvailableTimes(IDataRequest request, BinOffset - binOffset)** - -- **IData[] getData(IDataRequest request, DataTime... times)** - -- **IData[] getData(IDataRequest request, TimeRange timeRange)** - -- **GridGeometry2D getGridGeometry(IGridRequest request)** - -- **String[] getAvailableLocationNames(IGeometryRequest request)** - -- Python Differences - -- No support for **BinOffset** - -- **getGridGeometry(IGridRequest)** will be replaced by - **getLatCoords(IGridRequest)** and **getLonCoords(IGridRequest)** - that will return numpy arrays of the lat or lon of every grid - cell - -Factory Interfaces (Java only) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -- **IDataFactory** - -- **DataTime[] getAvailableTimes(R request)** - queries the - database and returns the times that match the request. Some factories - may not support this (e.g. maps). - -- **DataTime[] getAvailableTimes(R request, BinOffset binOffset)** - - queries the database with a bin offset and returns the times that - match the request. Some factories may not support this. - -- **D[] getData(R request, DataTime... times)** - Gets the data that - matches the request at the specified times. - -- **D[] getData(R request, TimeRange timeRange)** - Gets the data that - matches the request and is within the time range. - -**IGridDataFactory extends IDataFactory** - -- **GridGeometry2D** **getGeometry(IGridRequest request)** - Returns - the grid geometry of the data that matches the request BEFORE making - the request. Useful for then making slab or line requests for subsets - of the data. Does not support moving grids, but moving grids don’t - make subset requests either. - -**IGeometryDataFactory extends IDataFactory** - -- **getAvailableLocationNames(IGeometryRequest request)** - Convenience - method to retrieve available location names that match a request. Not - all factories may support this. - diff --git a/docs/source/examples/index.rst b/docs/source/examples/index.rst deleted file mode 100644 index 6c9ba8f..0000000 --- a/docs/source/examples/index.rst +++ /dev/null @@ -1,11 +0,0 @@ -.. _examples-index: - -###################### -Data Plotting Examples -###################### - -.. toctree:: - :maxdepth: 1 - :glob: - - generated/* diff --git a/docs/source/gridparms.rst b/docs/source/gridparms.rst deleted file mode 100644 index ef48a3a..0000000 --- a/docs/source/gridparms.rst +++ /dev/null @@ -1,1456 +0,0 @@ -Grid Parameters -=============== - -================================== =============================================================================================================================================================== ==================================== -Abbreviation Description Units -================================== =============================================================================================================================================================== ==================================== -WSPD 10 Metre neutral wind speed over waves m/s -WDRT 10 Metre Wind Direction Over Waves Degree -ARI12H1000YR 12H Average Recurrance Interval Accumulation 1000 Year in\*1000 -ARI12H100YR 12H Average Recurrance Interval Accumulation 100 Year in\*1000 -ARI12H10YR 12H Average Recurrance Interval Accumulation 10 Year in\*1000 -ARI12H1YR 12H Average Recurrance Interval Accumulation 1 Year in\*1000 -ARI12H200YR 12H Average Recurrance Interval Accumulation 200 Year in\*1000 -ARI12H25YR 12H Average Recurrance Interval Accumulation 25 Year in\*1000 -ARI12H2YR 12H Average Recurrance Interval Accumulation 2 Year in\*1000 -ARI12H500YR 12H Average Recurrance Interval Accumulation 500 Year in\*1000 -ARI12H50YR 12H Average Recurrance Interval Accumulation 50 Year in\*1000 -ARI12H5YR 12H Average Recurrance Interval Accumulation 5 Year in\*1000 -PRP12H 12 hour Precipitation Accumulation Return Period year -GaugeInfIndex12H 12 hour QPE Gauge Influence Index -FFG12 12-hr flash flood guidance mm -FFR12 12-hr flash flood runoff values mm -EchoTop18 18 dBZ Echo Top km -ARI1H1000YR 1H Average Recurrance Interval Accumulation 1000 Year in\*1000 -ARI1H100YR 1H Average Recurrance Interval Accumulation 100 Year in\*1000 -ARI1H10YR 1H Average Recurrance Interval Accumulation 10 Year in\*1000 -ARI1H1YR 1H Average Recurrance Interval Accumulation 1 Year in\*1000 -ARI1H200YR 1H Average Recurrance Interval Accumulation 200 Year in\*1000 -ARI1H25YR 1H Average Recurrance Interval Accumulation 25 Year in\*1000 -ARI1H2YR 1H Average Recurrance Interval Accumulation 2 Year in\*1000 -ARI1H500YR 1H Average Recurrance Interval Accumulation 500 Year in\*1000 -ARI1H50YR 1H Average Recurrance Interval Accumulation 50 Year in\*1000 -ARI1H5YR 1H Average Recurrance Interval Accumulation 5 Year in\*1000 -PRP01H 1 hour Precipitation Accumulation Return Period year -GaugeInfIndex01H 1 hour QPE Gauge Influence Index -QPEFFG01H 1 hour QPE-to-FFG Ratio % -FFG01 1-hr flash flood guidance mm -FFR01 1-hr flash flood runoff values mm -QPE01 1-hr Quantitative Precip Estimate mm -QPE01_ACR 1-hr Quantitative Precip Estimate mm -QPE01_ALR 1-hr Quantitative Precip Estimate mm -QPE01_FWR 1-hr Quantitative Precip Estimate mm -QPE01_KRF 1-hr Quantitative Precip Estimate mm -QPE01_MSR 1-hr Quantitative Precip Estimate mm -QPE01_ORN 1-hr Quantitative Precip Estimate mm -QPE01_PTR 1-hr Quantitative Precip Estimate mm -QPE01_RHA 1-hr Quantitative Precip Estimate mm -QPE01_RSA 1-hr Quantitative Precip Estimate mm -QPE01_STR 1-hr Quantitative Precip Estimate mm -QPE01_TAR 1-hr Quantitative Precip Estimate mm -QPE01_TIR 1-hr Quantitative Precip Estimate mm -QPE01_TUA 1-hr Quantitative Precip Estimate mm -EVEC1 1st Vector Component of Electric Field V\*m^1 -BVEC1 1st Vector Component of Magnetic Field T -VEL1 1st Vector Component of Velocity (Coordinate system dependent) m\*s^1 -TCSRG20 20% Tropical Cyclone Storm Surge Exceedance m -ARI24H1000YR 24H Average Recurrance Interval Accumulation 1000 Year in\*1000 -ARI24H100YR 24H Average Recurrance Interval Accumulation 100 Year in\*1000 -ARI24H10YR 24H Average Recurrance Interval Accumulation 10 Year in\*1000 -ARI24H1YR 24H Average Recurrance Interval Accumulation 1 Year in\*1000 -ARI24H200YR 24H Average Recurrance Interval Accumulation 200 Year in\*1000 -ARI24H25YR 24H Average Recurrance Interval Accumulation 25 Year in\*1000 -ARI24H2YR 24H Average Recurrance Interval Accumulation 2 Year in\*1000 -ARI24H500YR 24H Average Recurrance Interval Accumulation 500 Year in\*1000 -ARI24H50YR 24H Average Recurrance Interval Accumulation 50 Year in\*1000 -ARI24H5YR 24H Average Recurrance Interval Accumulation 5 Year in\*1000 -PRP24H 24 hour Precipitation Accumulation Return Period year -GaugeInfIndex24H 24 hour QPE Gauge Influence Index -FFG24 24-hr flash flood guidance mm -FFR24 24-hr flash flood runoff values mm -QPE24 24-hr Quantitative Precip Estimate mm -QPE24_ACR 24-hr Quantitative Precip Estimate mm -QPE24_ALR 24-hr Quantitative Precip Estimate mm -QPE24_FWR 24-hr Quantitative Precip Estimate mm -QPE24_KRF 24-hr Quantitative Precip Estimate mm -QPE24_MSR 24-hr Quantitative Precip Estimate mm -QPE24_ORN 24-hr Quantitative Precip Estimate mm -QPE24_PTR 24-hr Quantitative Precip Estimate mm -QPE24_RHA 24-hr Quantitative Precip Estimate mm -QPE24_RSA 24-hr Quantitative Precip Estimate mm -QPE24_STR 24-hr Quantitative Precip Estimate mm -QPE24_TAR 24-hr Quantitative Precip Estimate mm -QPE24_TIR 24-hr Quantitative Precip Estimate mm -QPE24_TUA 24-hr Quantitative Precip Estimate mm -QPF24 24-hr Quantitative Precip Forecast mm -QPF24_ACR 24-hr Quantitative Precip Forecast mm -QPF24_ALR 205 24-hr Quantitative Precip Forecast mm -QPF24_FWR 24-hr Quantitative Precip Forecast mm -QPF24_KRF 24-hr Quantitative Precip Forecast mm -QPF24_MSR 24-hr Quantitative Precip Forecast mm -QPF24_ORN 24-hr Quantitative Precip Forecast mm -QPF24_PTR 24-hr Quantitative Precip Forecast mm -QPF24_RHA 24-hr Quantitative Precip Forecast mm -QPF24_RSA 24-hr Quantitative Precip Forecast mm -QPF24_STR 24-hr Quantitative Precip Forecast mm -QPF24_TAR 24-hr Quantitative Precip Forecast mm -QPF24_TIR 24-hr Quantitative Precip Forecast mm -QPF24_TUA 24-hr Quantitative Precip Forecast mm -ARI2H1000YR 2H Average Recurrance Interval Accumulation 1000 Year in\*1000 -ARI2H100YR 2H Average Recurrance Interval Accumulation 100 Year in\*1000 -ARI2H10YR 2H Average Recurrance Interval Accumulation 10 Year in\*1000 -ARI2H1YR 2H Average Recurrance Interval Accumulation 1 Year in\*1000 -ARI2H200YR 2H Average Recurrance Interval Accumulation 200 Year in\*1000 -ARI2H25YR 2H Average Recurrance Interval Accumulation 25 Year in\*1000 -ARI2H2YR 2H Average Recurrance Interval Accumulation 2 Year in\*1000 -ARI2H500YR 2H Average Recurrance Interval Accumulation 500 Year in\*1000 -ARI2H50YR 2H Average Recurrance Interval Accumulation 50 Year in\*1000 -ARI2H5YR 2H Average Recurrance Interval Accumulation 5 Year in\*1000 -EVEC2 2nd Vector Component of Electric Field V\*m^1 -BVEC2 2nd Vector Component of Magnetic Field T -VEL2 2nd Vector Component of Velocity (Coordinate system dependent) m\*s^1 -EchoTop30 30 dBZ Echo Top km -ARI30M1000YR 30M Average Recurrance Interval Accumulation 1000 Year in\*1000 -ARI30M100YR 30M Average Recurrance Interval Accumulation 100 Year in\*1000 -ARI30M10YR 30M Average Recurrance Interval Accumulation 10 Year in\*1000 -ARI30M1YR 30M Average Recurrance Interval Accumulation 1 Year in\*1000 -ARI30M200YR 30M Average Recurrance Interval Accumulation 200 Year in\*1000 -ARI30M25YR 30M Average Recurrance Interval Accumulation 25 Year in\*1000 -ARI30M2YR 30M Average Recurrance Interval Accumulation 2 Year in\*1000 -ARI30M500YR 30M Average Recurrance Interval Accumulation 500 Year in\*1000 -ARI30M50YR 30M Average Recurrance Interval Accumulation 50 Year in\*1000 -ARI30M5YR 30M Average Recurrance Interval Accumulation 5 Year in\*1000 -PRP30min 30 min Precipitation Accumulation Return Period year -TCSRG30 30% Tropical Cyclone Storm Surge Exceedance m -SALIN 3-D Salinity -WTMPC 3-D Temperature ℃ -ARI3H1000YR 3H Average Recurrance Interval Accumulation 1000 Year in\*1000 -ARI3H100YR 3H Average Recurrance Interval Accumulation 100 Year in\*1000 -ARI3H10YR 3H Average Recurrance Interval Accumulation 10 Year in\*1000 -ARI3H1YR 3H Average Recurrance Interval Accumulation 1 Year in\*1000 -ARI3H200YR 3H Average Recurrance Interval Accumulation 200 Year in\*1000 -ARI3H25YR 3H Average Recurrance Interval Accumulation 25 Year in\*1000 -ARI3H2YR 3H Average Recurrance Interval Accumulation 2 Year in\*1000 -ARI3H500YR 3H Average Recurrance Interval Accumulation 500 Year in\*1000 -ARI3H50YR 3H Average Recurrance Interval Accumulation 50 Year in\*1000 -ARI3H5YR 3H Average Recurrance Interval Accumulation 5 Year in\*1000 -PRP03H 3 hour Precipitation Accumulation Return Period year -GaugeInfIndex03H 3 hour QPE Gauge Influence Index -QPEFFG03H 3 hour QPE-to-FFG Ratio % -FFG03 3-hr flash flood guidance mm -FFR03 3-hr flash flood runoff values mm -TSLSA 3-hr pressure tendency (Std. Atmos. Reduction) Pa/s -EVEC3 3rd Vector Component of Electric Field V\*m^1 -BVEC3 3rd Vector Component of Magnetic Field T -VEL3 3rd Vector Component of Velocity (Coordinate system dependent) m\*s^1 -TCSRG40 40% Tropical Cyclone Storm Surge Exceedance m -GaugeInfIndex48H 48 hour QPE Gauge Influence Index -EchoTop50 50 dBZ Echo Top km -TCSRG50 50% Tropical Cyclone Storm Surge Exceedance m -5WAVA 5-wave geopotential height anomaly gpm -5WAVA 5-Wave Geopotential Height Anomaly gpm -5WAVH 5-wave geopotential height gpm -5WAVH 5-Wave Geopotential Height gpm -EchoTop60 60 dBZ Echo Top km -TCSRG60 60% Tropical Cyclone Storm Surge Exceedance m -ARI6H1000YR 6H Average Recurrance Interval Accumulation 1000 Year in\*1000 -ARI6H100YR 6H Average Recurrance Interval Accumulation 100 Year in\*1000 -ARI6H10YR 6H Average Recurrance Interval Accumulation 10 Year in\*1000 -ARI6H1YR 6H Average Recurrance Interval Accumulation 1 Year in\*1000 -ARI6H200YR 6H Average Recurrance Interval Accumulation 200 Year in\*1000 -ARI6H25YR 6H Average Recurrance Interval Accumulation 25 Year in\*1000 -ARI6H2YR 6H Average Recurrance Interval Accumulation 2 Year in\*1000 -ARI6H500YR 6H Average Recurrance Interval Accumulation 500 Year in\*1000 -ARI6H50YR 6H Average Recurrance Interval Accumulation 50 Year in\*1000 -ARI6H5YR 6H Average Recurrance Interval Accumulation 5 Year in\*1000 -PRP06H 6 hour Precipitation Accumulation Return Period year -GaugeInfIndex06H 6 hour QPE Gauge Influence Index -QPEFFG06H 6 hour QPE-to-FFG Ratio % -FFG06 6-hr flash flood guidance mm -FFR06 6-hr flash flood runoff values mm -QPE06 6-hr Quantitative Precip Estimate mm -QPE06_ACR 6-hr Quantitative Precip Estimate mm -QPE06_ALR 6-hr Quantitative Precip Estimate mm -QPE06_FWR 6-hr Quantitative Precip Estimate mm -QPE06_KRF 6-hr Quantitative Precip Estimate mm -QPE06_MSR 6-hr Quantitative Precip Estimate mm -QPE06_ORN 6-hr Quantitative Precip Estimate mm -QPE06_PTR 6-hr Quantitative Precip Estimate mm -QPE06_RHA 6-hr Quantitative Precip Estimate mm -QPE06_RSA 6-hr Quantitative Precip Estimate mm -QPE06_STR 6-hr Quantitative Precip Estimate mm -QPE06_TAR 6-hr Quantitative Precip Estimate mm -QPE06_TIR 6-hr Quantitative Precip Estimate mm -QPE06_TUA 6-hr Quantitative Precip Estimate mm -QPF06 6-hr Quantitative Precip Forecast mm -QPF06_ACR 6-hr Quantitative Precip Forecast mm -QPF06_ALR 6-hr Quantitative Precip Forecast mm -QPF06_FWR 6-hr Quantitative Precip Forecast mm -QPF06_KRF 6-hr Quantitative Precip Forecast mm -QPF06_MSR 6-hr Quantitative Precip Forecast mm -QPF06_ORN 6-hr Quantitative Precip Forecast mm -QPF06_PTR 6-hr Quantitative Precip Forecast mm -QPF06_RHA 6-hr Quantitative Precip Forecast mm -QPF06_RSA 6-hr Quantitative Precip Forecast mm -QPF06_STR 6-hr Quantitative Precip Forecast mm -QPF06_TAR 6-hr Quantitative Precip Forecast mm -QPF06_TIR 6-hr Quantitative Precip Forecast mm -QPF06_TUA 6-hr Quantitative Precip Forecast mm -TCSRG70 70% Tropical Cyclone Storm Surge Exceedance m -GaugeInfIndex72H 72 hour QPE Gauge Influence Index -TCSRG80 80% Tropical Cyclone Storm Surge Exceedance m -TCSRG90 90% Tropical Cyclone Storm Surge Exceedance m -ABSD Absolute divergence s^-1 -ABSH Absolute Humidity kg m-3 -AH Absolute humidity kg/m^3 -ABSV Absolute vorticity s^-1 -ASD Accumulated Snow Depth m -ACOND Aerodynamic conductance m/s -AETYP Aerosol type (Code table 4.205) -AC137 Air concentration of Caesium 137 Bq/m^3 -AI131 Air concentration of Iodine 131 Bq/m^3 -ARADP Air concentration of radioactive pollutant Bq/m^3 -ALBDO Albedo % -ACWVH Altimeter corrected wave height m -ALRRC Altimeter Range Relative Correction -ASET Altimeter setting Pa -AWVH Altimeter wave height m -ALTMSL Altitude above mean sea level m -ANCConvectiveOutlook ANC Convective Outlook -ANCFinalForecast ANC Final Forecast dBZ -AOSGSO Angle Of Sub-Grid Scale Orography Rad -ASGSO Anisotropy Of Sub-Grid Scale Orography Numeric -APTMP Apparent Temperature K -ARBTXT Arbitrary text string CCITTIA5 -ASHFL Assimilative Heat Flux W/m^2 -AMIXL Asymptotic mixing length scale m -ATMDIV Atmospheric Divergence s^-1 -AVSFT Average surface skin temperature K -BARET Bare soil surface skin temperature K -BKENG Barotropic Kinectic Energy J/kg -UBARO Barotropic U velocity m/s -UBARO Barotropic U Velocity m/s -VBARO Barotropic V velocity m/s -VBARO Barotropic V Velocity m/s -BGRUN Baseflow-groundwater runoff mm -BASRV Base radial velocity m/s -BASR Base reflectivity dB -BASSW Base spectrum width m/s -4LFTX Best (4-layer) lifted index K -4LFTX Best (4 layer) Lifted Index K -BLI Best lifted index (to 500 mb) K -BMIXL Blackadars mixing length scale m -BLST Bottom layer soil temperature K -NONE Bottom of Ocean Isothermal Layer m -OBIL Bottom of Ocean Isothermal Layer m -NONE Bottom of Ocean Mixed Layer (m) m -OBML Bottom of Ocean Mixed Layer (m) m -BCBL Boundary layer cloud bottom level -BCBL Boundary Layer Cloud Bottom Level -BCLY Boundary Layer Cloud Layer -BCY Boundary layer cloud layer -BCY Boundary Layer Cloud Layer -BCTL Boundary layer cloud top level -BCTL Boundary Layer Cloud Top Level -BLYSP Boundary layer dissipation W/m^2 -BrightBandBottomHeight Bright Band Bottom Height m -BrightBandTopHeight Bright Band Top Height m -BRTMP Brightness temperature K -CAIIRAD CaII-K Radiance W\*s\*r^1\*m^2 -CCOND Canopy conductance m/s -EVCW Canopy water evaporation W/m^2 -CONVP Categorical Convection categorical -CFRZR Categorical Freezing Rain -CFRZR Categorical Freezing Rain Code table 4.222 -CFRZR Categorical Freezing Rain non-dim -CFRZR Categorical freezing rain (See Code table 4.222) -CFRZR Categorical Freezing Rain (yes=1; no=0) -CFRZR Categorical Freezing Rain (yes=1; no=0) non-dim -CICEP Categorical Ice Pellets -CICEP Categorical Ice Pellets Code table 4.222 -CICEP Categorical Ice Pellets non-dim -CICEP Categorical ice pellets (See Code table 4.222) -CICEP Categorical Ice Pellets (yes=1; no=0) -CICEP Categorical Ice Pellets (yes=1; no=0) non-dim -CLGTN Categorical Lightning categorical -OZCAT Categorical Ozone Concentration Non-Dim -OZCAT Categorical Ozone Concentration -CRAIN Categorical Rain Code table 4.222 -CRAIN Categorical Rain -CRAIN Categorical Rain non-dim -CRAIN Categorical rain (See Code table 4.222) -CRAIN Categorical Rain (yes=1; no=0) -CRAIN Categorical Rain (yes=1; no=0) non-dim -SVRTS Categorical Servre Thunderstorm -SVRTS Categorical Severe Thunderstorm -CSNOW Categorical Snow Code table 4.222 -CSNOW Categorical Snow -CSNOW Categorical Snow non-dim -CSNOW Categorical snow (See Code table 4.222) -CSNOW Categorical Snow (yes=1; no=0) -CSNOW Categorical Snow (yes=1; no=0) non-dim -CTSTM Categorical Thunderstorm (1-yes, 0-no) categorical -TSTMC Categorical Thunderstorm (1-yes, 0-no) categorical -CCEIL Ceiling m -LightningDensity15min CG Lightning Density (15 min.) Flashes/km^2/min -LightningDensity1min CG Lightning Density (1 min.) Flashes/km^2/min -LightningDensity30min CG Lightning Density (30 min.) Flashes/km^2/min -LightningDensity5min CG Lightning Density (5 min.) Flashes/km^2/min -LightningProbabilityNext30min CG Lightning Probability (0-30 min.) % -CAT Clear Air Turbulence (CAT) % -CAT Clear Air Turbulence(CAT) % -CSDLF Clear Sky Downward Long Wave Flux W/m^2 -CSDSF Clear sky downward solar flux W/m^2 -CSULF Clear Sky Upward Long Wave Flux W/m^2 -CSUSF Clear Sky Upward Solar Flux W/m^2 -CDUVB Clear sky UV-B downward solar flux W/m^2 -CAMT Cloud amount % -CBL Cloud Base Level -CBASE Cloud base m -CEIL Cloud Ceiling -CLG Cloud ceiling -CLG Cloud Ceiling -CloudCover Cloud Cover K -CFNLF Cloud Forcing Net Long Wave Flux W/m^2 -CFNSF Cloud Forcing Net Solar Flux W/m^2 -CDCIMR Cloud Ice Mixing Ratio kg/kg -CICE Cloud ice mm -CLOUDM Cloud mask (Code table 4.217) -CLWMR Cloud Mixing Ratio kg kg-1 -CLWMR Cloud mixing ratio kg/kg -CTOPHQI Cloud top height quality indicator (Code table 4.219) -CTOP Cloud top m -heightCTHGT Cloud top m -CTYP Cloud type (Code table 4.203) -CWAT Cloud water mm -CWORK Cloud work function J/kg -CWORK Cloud Work Function J/kg -CDWW Coefficient of Drag With Waves -CISOILW Column-Integrated Soil Water mm -REFC Composite reflectivity dB -MergedReflectivityQCComposite Composite Reflectivity dBZ -HeightCompositeReflectivity Composite Reflectivity Height m -MergedReflectivityQComposite Composite Reflectivity Mosaic dBZ -EF25M Cond 25% pcpn smy fractile past 24 hrs mm -EF50M Cond 50% pcpn smy fractile past 24 hrs mm -TCOND Condensate kg kg-1 -CONDE Condensate kg/kg -CONDP Condensation Pressure of Parcali Lifted From Indicate Surface Pa -CONDP Condensation Pressure of Parcal Lifted From Indicate Surface Pa -CPPAF Conditional percent precipitation amount fractile for an overall period (Encoded as an accumulation) mm -CICEL Confidence - Ceiling -CIFLT Confidence - Flight Category -CIVIS Confidence - Visibility -CONTB Contrail base m -CONTB Contrail Base m -CONTE Contrail engine type (Code table 4.211) -CONTET Contrail Engine Type See Table 4.211 -CONTI Contrail intensity (Code table 4.210) -CONTI Contrail Intensity See Table 4.210 -CONTT Contrail top m -CONTT Contrail Top m -CONUSMergedReflectivity CONUS Merged Reflectivity dBZ -CONUSPlusMergedReflectivity CONUS-Plus Merged Reflectivity dBZ -CONVP Convection Potential -CAPE Convective available potential energy J/kg -CCBL Convective cloud bottom level -CCBL Convective Cloud Bottom Level -CCLY Convective Cloud -CCY Convective cloud -CCY Convective Cloud -CDCON Convective cloud cover % -CUEFI Convective Cloud Efficiency -CUEFI Convective Cloud Efficiency non-dim -CUEFI Convective cloud efficiency Proportion -MFLUX Convective Cloud Mass Flux Pa/s -CCTL Convective cloud top level -CCTL Convective Cloud Top Level -CNVDEMF Convective detrainment mass flux mm/s -CNVDMF Convective downdraft mass flux mm/s -CNGWDV Convective Gravity wave drag meridional acceleration m/s^2 -CNGWDU Convective Gravity wave drag zonal acceleration m/s^2 -CIN Convective inhibition J/kg -CNVV Convective meridional momentum mixing acceleration m/s^2 -ACPCP Convective Precipitation kg m-2 -ACPCP Convective precipitation mm -ACPCPN Convective precipitation (nearest grid point) kg/m2 -ACPCPN Convective precipitation (nearest grid point) mm -CPRAT Convective Precipitation Rate kg m-2 s-1 -CPRAT Convective Precipitation Rate kg\*m^-2\*s^-1 -CPRAT Convective precipitation rate mm / s -CPRAT Convective Precipitation Rate mm / s -CSRATE Convective Snowfall Rate m s-1 -CSRATE Convective Snowfall Rate m/s -CSRWE Convective Snowfall Rate Water Equivalent kg m-2s-1 -CSRWE Convective Snowfall Rate Water Equivalent mm/s -SNOC Convective snow mm -CNVUMF Convective updraft mass flux mm/s -CWP Convective Water Precipitation kg m-2 -CWP Convective Water Precipitation mm -CWDI Convective Weather Detection Index -CNVU Convective zonal momentum mixing acceleration m/s^2 -SNO C Convect Snow kg m-2 -NTRNFLUX Cosmic Ray Neutron Flux h^1 -COVTZ Covariance between izonal component of the wind and temperature. Defined as [uT]-[u][T], where "[]" indicates the mean over the indicated time span. K\*m/s -COVMM Covariance between meridional and meridional components of the wind. Defined as [vv]-[v][v], where "[]" indicates the mean over the indicated time span. m^2/s^2 -COVMZ Covariance between Meridional and Zonal Components of the wind. m^2/s^2 -COVTM Covariance between meridional component of the wind and temperature. Defined as [vT]-[v][T], where "[]" indicates the mean over the indicated time span. K\*m/s -COVQM Covariance between specific humidity and meridional components of the wind. Defined as [vq]-[v][q], where "[]" indicates the mean over the indicated time span. kg/kg\*m/s -COVQQ Covariance between specific humidity and specific humidy. Defined as [qq]-[q][q], where "[]" indicates the mean over the indicated time span. kg/kg\*kg/kg -COVQVV Covariance between specific humidity and vertical components of the wind. Defined as [Ωq]-[Ω][q], where "[]" indicates the mean over the indicated time span. kg/kg\*Pa/s -COVQZ Covariance between specific humidity and zonal components of the wind. Defined as [uq]-[u][q], where "[]" indicates the mean over the indicated time span. kg/kg\*m/s -COVPSPS Covariance between surface pressure and surface pressure. Defined as [Psfc]-[Psfc][Psfc], where "[]" indicates the mean over the indicated time span. Pa\*Pa -COVTM Covariance between Temperature and Meridional Components of the wind. K\*m/s -COVTT Covariance between temperature and temperature. Defined as [TT]-[T][T], where "[]" indicates the mean over the indicated time span. K\*K -COVTW Covariance between temperature and vertical component of the wind. Defined as [wT]-[w][T], where "[]" indicates the mean over the indicated time span. K\*m/s -COVTVV Covariance between temperature and vertical components of the wind. Defined as [ΩT]-[Ω][T], where "[]" indicates the mean over the indicated time span. K\*Pa/s -COVTZ Covariance between Temperature and Zonal Components of the wind. K\*m/s -COVVVVV Covariance between vertical and vertical components of the wind. Defined as [ΩΩ]-[Ω][Ω], where "[]" indicates the mean over the indicated time span. Pa^2/s^2 -COVMZ Covariance between zonal and meridional components of the wind. Defined as [uv]-[u][v], where "[]" indicates the mean over the indicated time span. m^2/s^2 -COVZZ Covariance between zonal and zonal components of the wind. Defined as [uu]-[u][u], where "[]" indicates the mean over the indicated time span. m^2/s^2 -CrestMaxStreamflow CREST Maximum Streamflow (m^3)\*(s^-1) -CrestMaxUStreamflow CREST Maximum Unit Streamflow (m^3)\*(s^-1)\*(km^-2) -CrestSoilMoisture CREST Soil Moisture % -CRTFRQ Critical Frequency Hz -CB Cumulonimbus Base m -CBHE Cumulonimbus Horizontal Exten % -CT Cumulonimbus Top m -DIRC Current direction Degree true -SPC Current speed m/s -DCBL Deep convective cloud bottom level -DCBL Deep Convective Cloud Bottom Level -DCCBL Deep Convective Cloud Bottom Level -DCCTL Deep Convective Cloud Top Level -DCTL Deep convective cloud top level -DCTL Deep Convective Cloud Top Level -CNVHR Deep Convective Heating rate K/s -CNVMR Deep Convective Moistening Rate kg kg-1 s-1 -CNVMR Deep Convective Moistening Rate kg/kg\*s -DALT Density altitude m -DEN Density kg/m^3 -DBLL Depth Below Land surface m -DPBLW Depth below land surface m -DBSL Depth Below Sea Level m -DPMSL Depth below sea level m -REFZI Derived radar reflectivity backscatter from ice mm^6/m^3 -REFZI Derived radar reflectivity backscatter from ice mm^6\*m^-3 -REFZC Derived radar reflectivity backscatter from parameterized convection mm^6/m^3 -REFZC Derived radar reflectivity backscatter from parameterized convection mm^6\*m^-3 -REFZR Derived radar reflectivity backscatter from rain mm^6/m^3 -REFZR Derived radar reflectivity backscatter from rain mm^6\*m^-3 -REFD Derived radar reflectivity dB -DEVMSL Deviation of sea level from mean m -DEPR Dew point depression or deficit K -DPT Dew point temperature K -DIREC Direct Evaporation Cease(Soil Moisture) kg/m^3 -SMDRY Direct evaporation cease (soil moisture) Proportion -EVBS Direct evaporation from bare soil W/m^2 -DIRWWW Directional Width of The Wind Waves -Degree true Direction Degrees true DIRDEGTRU -WWSDIR Direction of combined wind waves and swell Degree -DICED Direction of ice drift Degree true -SWDIR Direction of swell waves Degree -WVDIR Direction of wind waves Degree -DSKDAY Disk Intensity Day J\*m^2\*s^1 -DSKINT Disk Intensity j\*m^2\*s^1 -DSKNGT Disk Intensity Night J\*m^2\*s^1 -DLWRF Downward Long-Wave Rad. Flux W/m^2 -DLWRF Downward long-wave radiation flux W/m^2 - Downward Long-W/m^2 DLWRF -DSWRF Downward Short-Wave Rad. Flux W/m^2 -DSWRF Downward short-wave radiation flux W/m^2 - Downward Short-W/m^2 DSWRF -DTRF Downward Total radiation Flux W/m^2 -DWUVR Downward UV Radiation W/m^2 -CD Drag Coefficient -CD Drag coefficient Numeric -ELON East Longitude (0 - 360) deg -ELON East Longitude (0 - 360) degrees -ELONN East Longitude (nearest neighbor) (0 - 360) degrees -RETOP Echo Top m -RADT Effective radiative skin temperature K -ETOT Electric Field Magnitude V\*m^1 -ELCDEN Electron Density m^3 -DIFEFLUX Electron Flux (Differential) (m^2\*s\*sr\*eV)^1 -INTEFLUX Electron Flux (Integral) (m^2\*s\*sr)^1 -ELECTMP Electron Temperature K -ELSCT Elevation of snow covered terrain (Code table 4.216) -EHELX Energy helicity index Numeric -EATM Entire atmosphere (considered as a single layer) -EA Entire Atmosphere -EATM Entire Atmosphere -NONE Entire Atmosphere -EOCN Entire ocean (considered as a single layer) -EOCN Entire Ocean -NONE Entire Ocean -EHLT Equilibrium level -EHLT Equilibrium Level -REFZC Equivalent radar reflectivity factor for parameterized convection m m6 m-3 -REFZR Equivalent radar reflectivity factor for rain m m6 m-3 -REFZI Equivalent radar reflectivity factor for snow m m6 m-3 -ESTPC Estimated precipitation mm -ESTUWIND Estimated u component of wind m/s -ESTVWIND Estimated v component of wind m/s -ELYR Eta Level Eta value -ETAL Eta Level Eta value -EUVRAD EUV Radiance W\*s\*r^1\*m^2 -EVP Evaporation kg m-2 -EVP Evaporation mm - Evaporation - Precipitation cm/day EMNP -EMNP Evaporation - Precipitation cm/day -EMNP Evaporation - Precipitation cm per day -EVAPT Evapotranspiration kg^-2\*s^-1 -SFEXC Exchange coefficient kg\*m^-2\*s^-1 -SFEXC Exchange coefficient mm \* s -ETCWL Extra Tropical Storm Surge Combined Surge and Tide m -ETSRG Extra Tropical Storm Surge m -F107 F10.7 W\*m^2\*H\*z^1 -FLDCP Field Capacity fraction -FIREDI Fire Detection Indicator (Code Table 4.223) -FIREODT Fire Outlook Due to Dry Thunderstorm index(see GRIB 2 code table 4.224) -FIREOLK Fire Outlook index (see GRIB 2 code table 4.224) -FFG Flash flood guidance (Encoded as an accumulation over a floating subinterval of time between the reference time and valid time) mm -FFRUN Flash flood runoff (Encoded as an accumulation over a floating subinterval of time) mm -FLGHT Flight Category -QREC Flood plain recharge mm -ModelHeight0C Freezing Level Height m -FRZR Freezing Rain kg/m2 -FRZR Freezing Rain mm -FPRATE Freezing Rain Precipitation Rate kg m-2s-1 -FPRATE Freezing Rain Precipitation Rate mm/s -FREQ Frequency s^-1 -FRICV Frictional velocity m/s -FRICV Frictional Velocity m/s -FRICV Friction Velocity m/s -FROZR Frozen Rain kg/m2 -FROZR Frozen Rain mm -GHT Geometrical height m -DBSS Geometric Depth Below Sea Surface m -DIST Geometric height m -GPA Geopotential height anomaly gpm -GH Geopotential height gpm -HGT Geopotential height gpm -HGTN Geopotential Height (nearest grid point) gpm -GP Geopotential m^2/s^2 -GRAD Global radiation flux W/m^2 -GRAUP Graupel (snow pellets) kg/kg -GRLE Grauple kg kg-1 -GSGSO Gravity Of Sub-Grid Scale Orography W/m^2 -GWDV Gravity wave drag meridional acceleration m/s^2 -GWDU Gravity wave drag zonal acceleration m/s^2 -GCBL Grid scale cloud bottom level -GCBL Grid Scale Cloud Bottom Level -GSCBL Grid Scale Cloud Bottom Level -GCTL Grid scale cloud top level -GCTL Grid Scale Cloud Top Level -GSCTL Grid Scale Cloud Top Level -GC137 Ground deposition of Caesium 137 Bq/m^2 -GI131 Ground deposition of Iodine 131 Bq/m^2 -GRADP Ground deposition of radioactive Bq/m^2 -GFLUX Ground heat flux W/m^2 -SFC Ground or Water Surface -GWREC Groundwater recharge mm -HAIL Hail m -HAILPROB Hail probability % -HINDEX Haines Index Numeric -SIGHAL Hall Conductivity S\*m^1 -HARAD H-Alpha Radiance W\*s\*r^1\*m^2 -HFLUX Heat Flux W/m^2 -HTX Heat index K -DIFIFLUX Heavy Ion Flux (Differential) ((m^2\*s\*sr\*eV)/nuc)^1 -INTIFLUX Heavy Ion Flux (iIntegral) (m^2\*s\*sr)^1 -HGTAG Height above ground (see Note 1) m -H50Above0C Height of 50 dBZ Echo Above 0C km -H50AboveM20C Height of 50 dBZ Echo Above -20C km -H60Above0C Height of 60 dBZ Echo Above 0C km -H60AboveM20C Height of 60 dBZ Echo Above -20C km -HELCOR Heliospheric Radiance W\*s\*r^1\*m^2 -ABSRB HF Absorption dB -ABSFRQ HF Absorption Frequency Hz -HPRIMF h'F m -HCBL High cloud bottom level -HCBL High Cloud Bottom Level -HCDC High cloud cover % -HCL High cloud layer -HCL High Cloud Layer -HCLY High Cloud Layer -HCTL High cloud top level -HCTL High Cloud Top Level -HSCLW Highest top level of supercooled liquid water layer -HSCLW Highest Top Level of Supercooled Liquid Water Layer -HTSLW Highest Top Level of Supercooled Liquid Water Layer -HTFL Highest tropospheric freezing level -HTFL Highest Tropospheric Freezing Level -HighLayerCompositeReflectivity High Layer Composite Reflectivity (24-60 kft) dBZ -HAVNI High-Level aviation interest -HRCONO High risk convective outlook categorical -MCONV Horizontal Moisture Convergence kg kg-1 s-1 -HMC Horizontal moisture convergence kg/kg\*s -MCONV Horizontal Moisture Divergence kg kg-1 s-1 -MCONV Horizontal Moisture Divergence kg\*kg^-1\*s^-1 -MCONV Horizontal moisture divergence kg/kg\*s -MCONV Horizontal Moisture Divergence kg/kg\*s -MFLX Horizontal momentum flux N/m^2 -MFLX Horizontal Momentum Flux N \* m-2 -MFLX Horizontal Momentum Flux N/m^2 -CompositeReflectivityMaxHourly Hourly Composite Reflectivity Maximum dBZ -MAXDVV Hourly Maximum of Downward Vertical Vorticity in the lowest 400hPa m/s -MAXREF Hourly Maximum of Simulated Reflectivity at 1 km AGL dB -MXUPHL Hourly Maximum of Updraft Helicity over Layer 2-5 km AGL m^2/s^2 -MXUPHL Hourly Maximum of Updraft Helicity over Layer 2km to 5 km AGL m^2/s^2 -MAXUVV Hourly Maximum of Upward Vertical Vorticity in the lowest 400hPa m/s -MIXR Humidity Mixing Ratio kg kg-1 -MIXR Humidity mixing ratio kg/kg -RCQ Humidity parameterin canopy conductance Fraction -RCQ Humidity parameter in canopy conductance Proportion -HYBL Hybrid Level -HCBB ICAO Height at Cumulonimbus Bas m -HCBT ICAO Height at Cumulonimbus To m -HECBB ICAO Height at Embedded Cumulonimbus Bas m -HECBT ICAO Height at Embedded Cumulonimbus To m -ICAHT ICAO Standard Atmosphere Reference Height m -ICEC Ice cover Proportion -ICED Ice divergence s^-1 -FICE Ice fraction of total condensate -FICE Ice fraction of total condensate non-dim -FICE Ice fraction of total condensate Proportion -surface Ice-free water ICWAT -ICWAT Ice-free water surface % -ICEG Ice growth rate m/s -IPRATE Ice Pellets Precipitation Rate kg m-2s-1 -IPRATE Ice Pellets Precipitation Rate mm/s -ICE T Ice Temperature K -ICETK Ice thickness m -ICMR Ice Water Mixing Ratio kg kg-1 -ICMR Ice water mixing ratio kg/kg -ICIB Icing base m -ICIB Icing Base m -ICIP Icing % -ICIP Icing Potential % -TIPD Icing Potential non-dim -ICPRB Icing probability non-dim -ICI Icing See Table 4.207 - Icing Severity ICI -ICSEV Icing severity non-dim -ICIT Icing top m -ICIT Icing Top m -CTP In-Cloud Turbulence % -IRBand4 Infrared Imagery K -INSTRR Instantaneous rain rate mm / s -LIPMF Integrated column particulate matter (fine) log10(mg \* m^-3) -LIPMF Integrated column particulate matter (fine) log10(mm\*g/m^3) -ILIQW Integrated Liquid Water kg m-2 -ILW Integrated liquid water mm -TSI Integrated Solar Irradiance W\*m^2 -INTFD Interface Depths m -IMFTSW Inverse Mean Frequency of The Total Swell s -IMFWW Inverse Mean Frequency of The Wind Waves s -IMWF Inverse Mean Wave Frequency s -IONDEN Ion Density m^3 -IDRL Ionospheric D-region level -IERL Ionospheric E-region level -IF1RL Ionospheric F1-region level -IF2RL Ionospheric F2-region level -IONTMP Ion Temperature K -THEL Isentropic (theta) level K -ISBL Isobaric Surface Pa -TMPL Isothermal Level K -KX K index K -KENG Kinetic Energy J/kg -MELBRNE KNES1 1 -KOX KO index K -BENINX Kurtosis of The Sea Surface Elevation Due to Waves -LAND Land cover (0=sea, 1=land) Proportion -LANDN Land-sea coverage (nearest neighbor) [land=1,sea=0] -LSPA Land Surface Precipitation Accumulation mm -LANDU Land use (Code table 4.212) -LAPR Lapse rate K/m -LRGHR Large Scale Condensate Heating rate K/s -LRGMR Large scale moistening rate kg/kg/s -NCPCP Large-Scale Precipitation (non-convective) kg m-2 -NCPCP Large scale precipitation (non-convective) mm -LSPRATE Large Scale Precipitation Rate kg m-2s-1 -LSPRATE Large Scale Precipitation Rate mm/s -LSSRATE Large Scale Snowfall Rate m s-1 -LSSRATE Large Scale Snowfall Rate m/s -LSSRWE Large Scale Snowfall Rate Water Equivalent kg m-2s-1 -LSSRWE Large Scale Snowfall Rate Water Equivalent mm/s -SNO L Large-Scale Snow kg m-2 -SNOL Large scale snow mm -LSWP Large Scale Water Precipitation (Non-Convective) kg m-2 -LSWP Large Scale Water Precipitation (Non-Convective) mm -LHTFL Latent heat net flux W/m^2 -NLAT Latitude (-90 to +90) deg -NLAT Latitude (-90 to +90) degrees -NLATN Latitude (nearest neighbor) (-90 to +90) degrees -LAPP Latitude of Presure Point degrees -LAUV Latitude of U Wind Component of Velocity degrees -LAVV Latitude of V Wind Component of Velocity degrees -NONE Layer Between Two Depths Below Ocean Surface -OLYR Layer between two depths below ocean surface -OLYR Layer Between Two Depths Below Ocean Surface -LBTHL Layer Between Two Hybrid Levels -NONE Layer Between Two Hybrid Levels -LMBSR Layer-maximum base reflectivity dB -LOS Layer Ocean Surface and 26C Ocean Isothermal Level -NONE Layer Ocean Surface and 26C Ocean Isothermal Level -LAYTH Layer Thickness m -LAI Leaf Area Index -PDLY Level at Specified Pressure Difference from Ground to Level Pa -SPDL Level at Specified Pressure Difference from Ground to Level Pa -0DEG level of 0C Isotherm -ADCL Level of Adiabatic Condensation Lifted from the Surface -CTL Level of Cloud Tops -LTNG Lightning -LTNG Lightning non-dim -LMBINT Limb Intensity J\*m^2\*s^1 -ARAIN Liquid precipitation (rainfall) kg/m2 -ARAIN Liquid precipitation (rainfall) mm -LSOIL Liquid soil moisture content (non-frozen) mm -LIQVSM Liquid Volumetric Soil Moisture (Non-Frozen) m^3/m^3 -SOILL Liquid volumetric soil moisture (non-frozen) Proportion -LOPP Longitude of Presure Point degrees -LOUV Longitude of U Wind Component of Velocity degrees -LOVV Longitude of V Wind Component of Velocity degrees -LWAVR Long wave radiation flux W/m^2 -LWHR Long-Wave Radiative Heating Rate K/s -LCBL Low cloud bottom level -LCBL Low Cloud Bottom Level -LCDC Low cloud cover % -LCLY Low Cloud Layer -LCY Low cloud layer -LCY Low Cloud Layer -LCTL Low cloud top level -LCTL Low Cloud Top Level -LLSM Lower layer soil moisture kg/m^3 -LBSLW Lowest Bottom Level of Supercooled Liquid Water Layer -LSCLW Lowest bottom level of supercooled liquid water layer -LSCLW Lowest Bottom Level of Supercooled Liquid Water Layer -LLTW Lowest level of the wet bulb zero -LLTW Lowest Level of the Wet Bulb Zero -LWBZ Lowest Level of the Wet Bulb Zero -WBZ Lowest Level of the Wet Bulb Zero -LowLayerCompositeReflectivity Low Layer Composite Reflectivity (0-24 kft) dBZ -LAVNI Low-Level aviation interest -MergedAzShear02kmAGL Low-Level Azimuthal Shear (0-2km AGL) 1/s -LLCompositeReflectivity Low-Level Composite Reflectivity dBZ -HeightLLCompositeReflectivity Low-Level Composite Reflectivity Height m -RotationTrackLL120min Low-Level Rotation Tracks 0-2km AGL (120 min. accum.) 1/s -RotationTrackLL1440min Low-Level Rotation Tracks 0-2km AGL (1440 min. accum.) 1/s -RotationTrackLL240min Low-Level Rotation Tracks 0-2km AGL (240 min. accum.) 1/s -RotationTrackLL30min Low-Level Rotation Tracks 0-2km AGL (30 min. accum.) 1/s -RotationTrackLL360min Low-Level Rotation Tracks 0-2km AGL (360 min. accum.) 1/s -RotationTrackLL60min Low-Level Rotation Tracks 0-2km AGL (60 min. accum.) 1/s -BTOT Magnetic Field Magnitude T -MTHA Main thermocline anomaly m -MTHD Main thermocline depth m -LMH Mass Point Model Surface -MAXAH Maximum absolute humidity kg/m^3 -MAXAH Maximum Absolute Humidity kg m-3 -MACAT Maximum Cloud Air Turbulence Potential mm -REFC Maximum/Composite radar reflectivity dB -MTHE Maximum equivalent potential temperature level -MTHE Maximum Equivalent Potential Temperature level -MESH Maximum Estimated Size of Hail (MESH) mm -MAIP Maximum Icing Potential mm -MAXWH Maximum Individual Wave Height m -PRPMax Maximum Precipitation Return Period year -QPEFFGMax Maximum QPE-to-FFG Ratio % -MAXRH Maximum relative humidity % -MAXRH Maximum Relative Humidity % -MXSALB Maximum snow albedo % -MXSALB Maximum Snow Albedo % -MXSALB Maximum Snow Albedo\* % -QMAX Maximum specific humidity at 2m kg/kg -TMAX Maximum temperature K -MWSL Maximum Wind Level -MAXWS Maximum wind speed m/s -MACTP Max in-Cloud Turbulence Potential mm -MECAT Mean Cloud Air Turbulence Potential mm -MEI Mean Icing Potential mm -MECTP Mean in-Cloud Turbulence Potential mm -MWSPER Mean period of combined wind waves and swell s -SWPER Mean period of swell waves s -WVPER Mean period of wind waves s -MSL Mean Sea Level Pa -M2SPW Mean square slope of waves -MZPTSW Mean Zero-Crossing Period of The Total Swell s -MZPWW Mean Zero-Crossing Period of The Wind Waves s -MZWPER Mean Zero-Crossing Wave Period s -MCDC Medium cloud cover % -MergedBaseReflectivityQC Merged Base Reflectivity dBZ -MergedReflectivityAtLowestAltitude Merged Reflectivity At Lowest Altitude (RALA) dBZ -VGWD Meridional flux of gravity wave stress N/m^2 -V-GWD Meridional Flux of Gravity Wave Stress N/m^2 -MESHTrack120min MESH Tracks (120 min. accum.) mm -MESHTrack1440min MESH Tracks (1440 min. accum.) mm -MESHTrack240min MESH Tracks (240 min. accum.) mm -MESHTrack30min MESH Tracks (30 min. accum.) mm -MESHTrack360min MESH Tracks (360 min. accum.) mm -MESHTrack60min MESH Tracks (60 min. accum.) mm -MCBL Middle cloud bottom level -MCBL Middle Cloud Bottom Level -MCLY Middle Cloud Layer -MCY Middle cloud layer -MCY Middle Cloud Layer -MCTL Middle cloud top level -MCTL Middle Cloud Top Level -MergedAzShear36kmAGL Mid-Level Azimuthal Shear (3-6km AGL) 1/s -RotationTrackML120min Mid-Level Rotation Tracks 3-6km AGL (120 min. accum.) 1/s -RotationTrackML1440min Mid-Level Rotation Tracks 3-6km AGL (1440 min. accum.) 1/s -RotationTrackML240min Mid-Level Rotation Tracks 3-6km AGL (240 min. accum.) 1/s -RotationTrackML30min Mid-Level Rotation Tracks 3-6km AGL (30 min. accum.) 1/s -RotationTrackML360min Mid-Level Rotation Tracks 3-6km AGL (360 min. accum.) 1/s -RotationTrackML60min Mid-Level Rotation Tracks 3-6km AGL (60 min. accum.) 1/s -RSMIN Minimal stomatal resistance s/m -DEPMN Minimum dew point depression K -MINRH Minimum Relative Humidity % -QMIN Minimum specific humidity at 2m kg/kg -TMIN Minimum temperature K -Entire Atmosphere Missing200 200 -MIXHT mixed layer depth m -MIXHT Mixed Layer Depth m -MIXL Mixed Layer Depth m -MLYNO Model Layer number (From bottom up) -MTHT Model terrain height m -MRCONO Moderate risk convective outlook categorical -MSTAV Moisture availability % -UFLX Momentum flux, u component N/m^2 -VFLX Momentum flux, v component N/m^2 -MNTSF Montgomery stream function m^2/s^2 -MSLET MSLP (Eta model reduction) Pa -MSLPM MSLP (MAPS System Reduction) Pa -NLGSP Natural Log of Surface Pressure ln(kPa) -NBDSF Near IR Beam Downward Solar Flux W/m^2 -NBSALB Near IR, Black Sky Albedo % -NDDSF Near IR Diffuse Downward Solar Flux W/m^2 -NWSALB Near IR, White Sky Albedo % -AOHFLX Net Air-Ocean Heat Flux W/m^2 -NLWRCS Net Long-Wave Radiation Flux, Clear Sky W/m^2 -NLWRS Net long wave radiation flux (surface) W/m^2 -NLWRT Net long wave radiation flux (top of atmosphere) W/m^2 -NLWRF Net Long-Wave Radiation Flux W/m^2 -NSWRFCS Net Short-Wave Radiation Flux, Clear Sky W/m^2 -NSWRS Net short-wave radiation flux (surface) W/m^2 -NSWRT Net short-wave radiation flux (top of atmosphere) W/m^2 -NSWRF Net Short Wave Radiation Flux W/m^2 -NTAT Nominal Top of the Atmosphere -CDLYR Non-convective cloud cover % -CDLYR Non-Convective Cloud Cover % - non-dim CD -NWSTR Normalised Waves Stress -NDVI Normalized Difference Vegetation Index -NCIP Number concentration for ice particles -NCIP Number concentration for ice particles non-dim -MIXLY Number of mixed layers next to surface integer -NPIXU Number Of Pixels Used Numeric -RLYRS Number of soil layers in root zone non-dim -RLYRS Number of soil layers in root zone Numeric -RLYRS Number of soil layers in root zone -OHC Ocean Heat Content J/m^2 -OITL Ocean Isotherm Level (1/10 deg C) C -NONE Ocean Isotherm Level 1/10 ℃ -OITL Ocean Isotherm Level 1/10 ℃ -NONE Ocean Mixed Layer -OML Ocean Mixed Layer -P2OMLT Ocean Mixed Layer Potential Density (Reference 2000m) kg/m^3 -OMLU Ocean Mixed Layer U Velocity m/s -OMLV Ocean Mixed Layer V Velocity m/s -ELEV Ocean Surface Elevation Relative to Geoid m -OMGALF Omega (Dp/Dt) divide by density K -EWATR Open water evaporation (standing water) W/m^2 -OSD Ordered Sequence of Data -OSEQ Ordered Sequence of Data -OZCON Ozone Concentration (PPB) PPB -OZMAX1 Ozone Daily Max from 1-hour Average ppbV -OZMAX8 Ozone Daily Max from 8-hour Average ppbV -O3MR Ozone Mixing Ratio kg \* kg^-1 -O3MR Ozone mixing ratio kg/kg -O3MR Ozone Mixing Ratio kg/kg -POZO Ozone production from col ozone term kg/kg/s -POZT Ozone production from temperature term kg/kg/s -POZ Ozone production kg/kg/s -TOZ Ozone tendency kg/kg/s -VDFOZ Ozone vertical diffusion kg/kg/s -SIGPAR Parallel Conductivity S\*m^1 -PRATMP Parallel Temperature K -PLI Parcel lifted index (to 500 mb) K -PLSMDEN Particle Number Density m^3 -PMTC Particulate matter (coarse) mg \* m^-3 -PMTC Particulate matter (coarse) mm\*g/m^3 -LPMTF Particulate matter (fine) log10(mg \* m^-3) -LPMTF Particulate matter (fine) log10(mm\*g/m^3) -PMTF Particulate matter (fine) mg \* m^-3 -PMTF Particulate matter (fine) mm\*g/m^3 -PPERTS Peak Period of The Total Swell s -PPERWW Peak Period of The Wind Waves s -PWPER Peak Wave Period s -SIGPED Pedersen Conductivity S\*m^1 -CPOFP Percent frozen precipitation % -PCTP1 Percent pcpn in 1st 6-h sub-period of 24 hr period % -PCTP2 Percent pcpn in 2nd 6-h sub-period of 24 hr period % -PCTP3 Percent pcpn in 3rd 6-h sub-period of 24 hr period % -PCTP4 Percent pcpn in 4th 6-h sub-period of 24 hr period % -PPSUB Percent precipitation in a sub-period of an overall period (Encoded as per cent accumulation over the sub-period) % -PMAXWH Period of Maximum Individual Wave Height s -PRPTMP Perpendicular Temperature K -PHOTAR Photosynthetically Active Radiation W/m^2 -PIXST Pixel scene type (Code table 4.218) -BLD Planetary Boundary Layer -HPBL Planetary boundary layer height m -HPBL Planetary Boundary Layer Height m -PLBL Planetary Boundary Layer -PBLR Planetary boundary layer regime (Code table 4.209) -PBLREG Planetary Boundary Layer Regime See Table 4.209 -CNWAT Plant canopy surface water mm -PDMAX1 PM 2.5 Daily Max from 1-hour Average ug/m^3 -PDMAX24 PM 2.5 Daily Max from 24-hour Average ug/m^3 -PEVAP Potential Evaporation kg m-2 -PEVAP Potential evaporation mm -PEVAP Potential Evaporation mm -PEVPR Potential Evaporation Rage W/m^2 -PEVPR Potential evaporation rate W/m^2 -PEVPR Potential Evaporation Rate W m-2 -THZ0 Potential temperature at top of viscous sublayer K -POT Potential temperature K -POT Potential temperature (theta) K -PV Potential vorticity K \*m^-2 \*kg^-1 \*s^-1 -PV Potential vorticity K \*m^-2\* kg^-1 \*s^-1 -PVL Potential Vorticity K \* m^2/kg^1\*s^1 -PVORT Potential vorticity K \* m^2 \* kg^-1\* s^-1 -PVMWW Potential Vorticity (Mass-Weighted) m/s -PWC Precipitable water category (Code table 4.202) -PWCAT Precipitable Water Category See Table 4.202 -P WAT Precipitable Water kg m-2 -PWAT Precipitable water mm -PRCP Precipitation mm -PRATE Precipitation Rate kg m-2 s-1 -PRATE Precipitation rate mm / s -PTYPE Precipitation type (Code table 4.201) -PTYPE Precipitation Type See Table 4.201 -PR Precip rate mm/hr -(See note 3) Predominant Weather Numeric -PWTHER Predominant Weather Numeric (See note 3) -PALT Pressure altitude m -PRESA Pressure anomaly Pa -PCBB Pressure at Cumulonimbus Bas Pa -PCBT Pressure at Cumulonimbus To Pa -PECBB Pressure at Embedded Cumulonimbus Bas Pa -PECBT Pressure at Embedded Cumulonimbus To Pa -PRESDEV Pressure deviation from ground to level Pa -PRESD Pressure deviation from mean sea level Pa -PRESN Pressure (nearest grid point) Pa -PLPL Pressure of level from which parcel was lifted Pa -PLPL Pressure of most parcel with highest theta-e in lowest 300 mb Pa -P Pressure Pa -PRES Pressure Pa -PRES Pressure Pa -PRMSL Pressure reduced to MSL Pa -PTEND Pressure tendency Pa/s -DIRPW Primary wave direction Degree -PERPW Primary wave mean period s -POP Probability of 0.01 inches of precipitation % -POP Probability of 0.01 inch of precipitation (POP) % -PROCON Probability of Convection % -PPFFG Probability of Excessive Rain % -CPOZP Probability of Freezing Precipitation % -PFREZPREC Probability of Freezing Precipitation % -CPOFP Probability of Frozen Precipitation % -PFROZPREC Probability of Frozen Precipitation % -PPFFG Probability of precipitation exceeding flash flood guidance values % -POSH Probability of Severe Hail (POSH) % -WarmRainProbability Probability of Warm Rain % -CWR Probability of Wetting Rain, exceeding in 0.10" in a given time period % -PTAN Prob of Temperature above normal % -PTBN Prob of Temperature below normal % -PTNN Prob of Temperature near normal % -PPAN Prob of Total Precipitation above normal % -PPBN Prob of Total Precipitation below normal % -PPNN Prob of Total Precipitation near normal % -PROTDEN Proton Density m^3 -DIFPFLUX Proton Flux (Differential) (m^2\*s\*sr\*eV)^1 -INTPFLUX Proton Flux (Integral) (m^2\*s\*sr)^1 -PROTTMP Proton Temperature K -EPOT Pseudo-adiabatic potential temperature or equivalent potential temperature K -MountainMapperQPE12H QPE - Mountain Mapper (12 hr. accum.) mm -MountainMapperQPE01H QPE - Mountain Mapper (1 hr. accum.) mm -MountainMapperQPE24H QPE - Mountain Mapper (24 hr. accum.) mm -MountainMapperQPE03H QPE - Mountain Mapper (3 hr. accum.) mm -MountainMapperQPE48H QPE - Mountain Mapper (48 hr. accum.) mm -MountainMapperQPE06H QPE - Mountain Mapper (6 hr. accum.) mm -MountainMapperQPE72H QPE - Mountain Mapper (72 hr. accum.) mm -GaugeOnlyQPE12H QPE - Radar Gauge Only (12 hr. accum.) mm -GaugeOnlyQPE01H QPE - Radar Gauge Only (1 hr. accum.) mm -GaugeOnlyQPE24H QPE - Radar Gauge Only (24 hr. accum.) mm -GaugeOnlyQPE03H QPE - Radar Gauge Only (3 hr. accum.) mm -GaugeOnlyQPE48H QPE - Radar Gauge Only (48 hr. accum.) mm -GaugeOnlyQPE06H QPE - Radar Gauge Only (6 hr. accum.) mm -GaugeOnlyQPE72H QPE - Radar Gauge Only (72 hr. accum.) mm -RadarOnlyQPE12H QPE - Radar Only (12 hr. accum.) mm -RadarOnlyQPE01H QPE - Radar Only (1 hr. accum.) mm -RadarOnlyQPE24H QPE - Radar Only (24 hr. accum.) mm -RadarOnlyQPE03H QPE - Radar Only (3 hr. accum.) mm -RadarOnlyQPE48H QPE - Radar Only (48 hr. accum.) mm -RadarOnlyQPE06H QPE - Radar Only (6 hr. accum.) mm -RadarOnlyQPE72H QPE - Radar Only (72 hr. accum.) mm -GaugeCorrQPE12H QPE - Radar with Gauge Bias Correction (12 hr. accum.) mm -GaugeCorrQPE01H QPE - Radar with Gauge Bias Correction (1 hr. accum.) mm -GaugeCorrQPE24H QPE - Radar with Gauge Bias Correction (24 hr. accum.) mm -GaugeCorrQPE03H QPE - Radar with Gauge Bias Correction (3 hr. accum.) mm -GaugeCorrQPE48H QPE - Radar with Gauge Bias Correction (48 hr. accum.) mm -GaugeCorrQPE06H QPE - Radar with Gauge Bias Correction (6 hr. accum.) mm -GaugeCorrQPE72H QPE - Radar with Gauge Bias Correction (72 hr. accum.) mm -PrecipRate Radar Precipitation Rate (SPR) mm/hr -RadarQualityIndex Radar Quality Index (RQI) -RDSP1 Radar spectra (1) -RDSP2 Radar spectra (2) -RDSP3 Radar spectra (3) -RDLNUM Radial number (2pi/lambda) m-1 -SWRAD Radiance (with respect to wave length) W \* m^-3 \*sr^-1 -LWRAD Radiance (with respect to wave number) W \* m^-1 \*sr^-1 -EPSR Radiative emissivity -EPSR Radiative emissivity mm -FRAIN Rain fraction of total cloud water Proportion -FRAIN Rain Fraction of Total Liquid Water -FRAIN Rain Fraction of Total Liquid Water non-dim -FRAIN Rain Fraction of Total Liquid Water Proportion -RWMR Rain Mixing Ratio kg kg-1 -RWMR Rain mixing ratio kg/kg -RPRATE Rain Precipitation Rate kg m-2s-1 -RPRATE Rain Precipitation Rate mm/s -RDRIP Rate of water dropping from canopy to ground unknown -ground Rate of water dropping from canopy to RDRIP -MergedReflectivityComposite Raw Composite Reflectivity Mosaic dBZ -MergedBaseReflectivity Raw Merged Base Reflectivity dBZ -RFL06 Reflectance in 0.6 Micron Channel % -RFL08 Reflectance in 0.8 Micron Channel % -RFL16 Reflectance in 1.6 Micron Channel % -RFL39 Reflectance in 3.9 Micron Channel % -Reflectivity0C Reflectivity at 0C dBZ -ReflectivityM10C Reflectivity at -10C dBZ -ReflectivityM15C Reflectivity at -15C dBZ -REFD Reflectivity at 1 km AGL dB -ReflectivityM20C Reflectivity at -20C dBZ -ReflectivityM5C Reflectivity at -5C dBZ -ReflectivityAtLowestAltitude Reflectivity At Lowest Altitude (RALA) dBZ -REFD Reflectivity dB -RAZA Relative Azimuth Angle Degree -RELD Relative divergence s^-1 -REV Relative Error Variance -RH Relative humidity % -R H Relative Humidity % -RHPW Relative Humidity with Respect to Precipitable Water % -RELV Relative vorticity s^-1 -RSSC Remotely sensed snow cover (Code table 4.215) -RI Richardson number Numeric -RI Richardson Number Numeric -FRIME Rime Factor -RIME Rime Factor non-dim -RIME Rime factor Numeric -RIME Rime Factor Numeric -RIME Rime Factor -SFCRH Roughness length for heat m -SALTY Salinity kg/kg -SLTFL Salt Flux mm\*s -SATD Saturation deficit Pa -SAT D Saturation Deficit Pa -SATOSM Saturation Of Soil Moisture kg/m^3 -SCALB Scaled albedo Numeric -SCBT Scaled brightness temperature Numeric -SCCTP Scaled cloud top pressure Numeric -SCLI Scaled lifted index Numeric -SCPW Scaled precipitable water Numeric -SCRAD Scaled radiance Numeric -SCST Scaled skin temperature Numeric -SCESTUWIND Scatterometer Estimated U Wind Component m/s -SCESTVWIND Scatterometer Estimated V Wind Component m/s -SCINT Scintillation Numeric -SEAB Sea Bottom -SeamlessHSR Seamless Hybrid Scan Reflectivity (SHSR) dBZ -SeamlessHSRHeight Seamless Hybrid Scan Reflectivity (SHSR) Height km -SSHG Sea Surface Height Relative to Geoid m -DIRSW Secondary wave direction Degree -PERSW Secondary wave mean periods s -s Seconds prior to initial reference time (defined in Section 1) TSEC -TSEC Seconds prior to initial reference time s -TSEC Seconds Prior To Initial Reference Time s -SHTFL Sensible heat net flux W/m^2 -SHI Severe Hail Index (SHI) -SCBL Shallow convective cloud bottom level -SCBL Shallow Convective Cloud Bottom Level -SCCBT Shallow Convective Cloud Bottom Level -SCCTL Shallow Convective Cloud Top Level -SCTL Shallow convective cloud top level -SCTL Shallow Convective Cloud Top Level -SHAHR Shallow Convective Heating rate K/s -SHAMR Shallow Convective Moistening Rate kg kg-1 s-1 -SHAMR Shallow Convective Moistening Rate kg/kg\*s -SWAVR Short wave radiation flux W/m^2 -SGCVV Sigma coordinate vertical velocity s^-1 -SIGL Sigma Level -SHAILPRO Significant Hail probability % -SIGHAILPROB Significant Hail probability % -HTSGW Significant height of combined wind waves and swell m -SWELL Significant height of swell waves m -WVHGT Significant height of wind waves (m) m -SIGTRNDPROB Significant Tornado probability % -STORPROB Significant Tornado probability % -SIGWINDPROB Significant Wind probability % -SWINDPRO Significant Wind probability % - Silt loam -SBC123 Simulated Brightness Counts for GOES 12, Channel 3 Byte -SBC124 Simulated Brightness Counts for GOES 12, Channel 4 Byte -SBTA1610 Simulated Brightness Temperature for ABI GOES-16, Band-10 K -SBTA1611 Simulated Brightness Temperature for ABI GOES-16, Band-11 K -SBTA1612 Simulated Brightness Temperature for ABI GOES-16, Band-12 K -SBTA1613 Simulated Brightness Temperature for ABI GOES-16, Band-13 K -SBTA1614 Simulated Brightness Temperature for ABI GOES-16, Band-14 K -SBTA1615 Simulated Brightness Temperature for ABI GOES-16, Band-15 K -SBTA1616 Simulated Brightness Temperature for ABI GOES-16, Band-16 K -SBTA167 Simulated Brightness Temperature for ABI GOES-16, Band-7 K -SBTA168 Simulated Brightness Temperature for ABI GOES-16, Band-8 K -SBTA169 Simulated Brightness Temperature for ABI GOES-16, Band-9 K -SBTA1710 Simulated Brightness Temperature for ABI GOES-17, Band-10 K -SBTA1711 Simulated Brightness Temperature for ABI GOES-17, Band-11 K -SBTA1712 Simulated Brightness Temperature for ABI GOES-17, Band-12 K -SBTA1713 Simulated Brightness Temperature for ABI GOES-17, Band-13 K -SBTA1714 Simulated Brightness Temperature for ABI GOES-17, Band-14 K -SBTA1715 Simulated Brightness Temperature for ABI GOES-17, Band-15 K -SBTA1716 Simulated Brightness Temperature for ABI GOES-17, Band-16 K -SBTA177 Simulated Brightness Temperature for ABI GOES-17, Band-7 K -SBTA178 Simulated Brightness Temperature for ABI GOES-17, Band-8 K -SBTA179 Simulated Brightness Temperature for ABI GOES-17, Band-9 K -AMSRE10 Simulated Brightness Temperature for AMSRE on Aqua, Channel 10 K -AMSRE11 Simulated Brightness Temperature for AMSRE on Aqua, Channel 11 K -AMSRE12 Simulated Brightness Temperature for AMSRE on Aqua, Channel 12 K -AMSRE9 Simulated Brightness Temperature for AMSRE on Aqua, Channel 9 K -SBT112 Simulated Brightness Temperature for GOES 11, Channel 2 K -SBT113 Simulated Brightness Temperature for GOES 11, Channel 3 K -SBT114 Simulated Brightness Temperature for GOES 11, Channel 4 K -SBT115 Simulated Brightness Temperature for GOES 11, Channel 5 K -SBT122 Simulated Brightness Temperature for GOES 12, Channel 2 K -SBT123 Simulated Brightness Temperature for GOES 12, Channel 3 K -SBT124 Simulated Brightness Temperature for GOES 12, Channel 4 K -SBT125 Simulated Brightness Temperature for GOES 12, Channel 5 K -SBT124 Simulated Brightness Temperature for GOES E Infrared K -SBT123 Simulated Brightness Temperature for GOES E Water Vapor K -SBT114 Simulated Brightness Temperature for GOES W Infrared K -SBT113 Simulated Brightness Temperature for GOES W Water Vapor K -SRFA161 Simulated Reflectance Factor for ABI GOES-16, Band-1 -SRFA162 Simulated Reflectance Factor for ABI GOES-16, Band-2 -SRFA163 Simulated Reflectance Factor for ABI GOES-16, Band-3 -SRFA164 Simulated Reflectance Factor for ABI GOES-16, Band-4 -SRFA165 Simulated Reflectance Factor for ABI GOES-16, Band-5 -SRFA166 Simulated Reflectance Factor for ABI GOES-16, Band-6 -SRFA171 Simulated Reflectance Factor for ABI GOES-17, Band-1 -SRFA172 Simulated Reflectance Factor for ABI GOES-17, Band-2 -SRFA173 Simulated Reflectance Factor for ABI GOES-17, Band-3 -SRFA174 Simulated Reflectance Factor for ABI GOES-17, Band-4 -SRFA175 Simulated Reflectance Factor for ABI GOES-17, Band-5 -SRFA176 Simulated Reflectance Factor for ABI GOES-17, Band-6 -SKTMP Skin Temperature K -SRCONO Slight risk convective outlook categorical -SSGSO Slope Of Sub-Grid Scale Orography Numeric -SNOAG Snow age day -SNOAG Snow Age day -SALBD Snow Albedo % -SCE Snow Cover by elevation (snow=0-252,neither=253,clouds=254) dm -SCP Snow Cover % -SC Snow Cover (snow=250,clouds=100,neither=50) -SNOWC Snow cover % -SNOWC Snow Cover % -SDEN Snow Density kg m-3 -SDEN Snow Density kg/m^3 -SNOD Snow depth m -SNO D Snow Depth m -SDWE Snow Depth Water Equivalent kg m-2 -SDWE Snow Depth Water Equivalent mm -SEVAP Snow Evaporation kg m-2 -SEVAP Snow Evaporation mm -SRWEQ Snowfall Rate Water Equivalent kg m-2 s-1 -SRWEQ Snowfall rate water equivalent mm / s -SNFALB Snow free albedo % -SNFALB Snow-Free Albedo % -SNO M Snow Melt kg m-2 -SNOM Snow melt mm -SNMR Snow Mixing Ratio kg kg-1 -SNMR Snow mixing ratio kg/kg -SNOHF Snow phase change heat flux W/m^2 -SNOHF Snow Phase Change Heat Flux W/m^2 -SPRATE Snow Precipitation Rate kg m-2s-1 -SPRATE Snow Precipitation Rate mm/s -SNOWT Snow temperature, depth-avg K -SNOT Snow temperature K -SNO T Snow temperature K -SNOT Snow Temperature K -SCE Snow water equivalent cm -SWEPN Snow water equivalent percent of normal % -SOILM Soil moisture content mm -SOILM Soil Moisture kg/m^3 -RCSOL Soil moisture parameter in canopy conductance Fraction -RCSOL Soil moisture parameter in canopy conductance Proportion -SOILP Soil Porosity m^3/m^3 -POROS Soil porosity Proportion -TSOIL Soil temperature K -SOTYP Soil type index -EUVIRR Solar EUV Irradiance W\*m^2 -RCS Solar parameter in canopy conductance Fraction -RCS Solar parameter in canopy conductance Proportion -SP Solar photosphere -SWHR Solar Radiative Heating Rate K/s -SOLRF Solar Radio Emissions W\*m^2\*Hz^1 -SPECIRR Solar Spectral Irradiance W\*m^2\*n\*m^1 -XLONG Solar X-ray Flux (XRS Long) W\*m^2 -XSHRT Solar X-ray Flux (XRS Short) W\*m^2 -SOLZA Solar Zenith Angle Degree -AMSL Specific Altitude Above Mean Sea Level m -QZ0 Specific humidity at top of viscous sublayer kg/kg -SPF H Specific Humidity kg kg-1 -SPFH Specific humidity kg/kg -HTGL Specified Height Level Above Ground m -SRCS Specified radius from the center of the Sun m -DWWW Spectal directional width of the wind waves -SPFTR Spectral Peakedness Factor s^-1 -SICED Speed of ice drift m/s -SPRDF Spread F m -HSTDV Standard deviation of height m -SDSGSO Standard Deviation Of Sub-Grid Scale Orography m -TSD1D Standard Dev. of IR Temp. over 1x1 deg. area K -HLCY Storm relative helicity J/kg -SSRUN Storm surface runoff mm -SURGE Storm Surge m -STPA Storm total precip accum mm -STRM Stream function m^2/s -SBSNO Sublimation (evaporation from snow) W m-2 -SBSNO Sublimation (evaporation from snow) W/m^2 -SUN Sunshine duration (ECMWF proposal, not WMO approved) s -SUNSD Sunshine Duration s -SUNS SunShine Numeric -SIPD Supercooled Large Droplet Icing mm -SIPD Supercooled Large Droplet (SLD) Icing See Table 4.207See Note (1) -SLDP Supercooled Large Droplet (SLD) Probabilitysee note 1 % -SLDP Supercooled Large Droplet (SLD) Probability % -SuperLayerCompositeReflectivity Super Layer Composite Reflectivity (33-60 kft) dBZ -AKHS Surface exchange coefficients for T and Q divided by delta z m/s -AKMS Surface exchange coefficients for U and V divided by delta z m/s -LFTX Surface Lifted Index K -SLI Surface lifted index K -PrecipType Surface Precipitation Type (SPT) -SFCR Surface roughness m -SSST Surface Salinity Trend psu per day -SLTYP Surface Slope Type Index -ModelSurfaceTemperature Surface Temperature C -SSTT Surface Temperature Trend degree per day -SSTOR Surface water storage mm -Surge Surge Height m -SX Sweat index Numeric -TMPA Temperature anomaly K -T Temperature K -TMP Temperature K -TMPSWP Temperature K -RCT Temperature parameter in canopy conductance Fraction -RCT Temperature parameter in canopy conductance Proportion -TTDIA Temperature Tendency By All Physics K/s -TTRAD Temperature tendency by all radiation K\*s^-1 -TTRAD Temperature tendency by all radiation K/s -TTPHY Temperature Tendency By Non-radiation Physics K/s -WTEND Tendency of vertical velocity m/s^2 - The Associated Legendre Functions of the first kind are defined by -MASK Thematic Mask Numeric -THICK Thickness m -TSC Thunderstorm coverage (Code table 4.204) -TSMT Thunderstorm maximum tops m -TSTM Thunderstorm probability % -TSTM Thunderstorm Probability % -TACONCP Time-integrated air concentration of caesium pollutant Bq\*s/m^3 -TACONIP Time-integrated air concentration of iodine pollutant Bq\*s/m^3 -TACONRDP Time-integrated air concentration of radioactive pollutant Bq\*s/m^3 -PTOR Tornado probability % -TORPROB Tornado probability % -TRNDPROB Tornado probability % -TCDC Total cloud cover % -TCOLI Total column-integrated cloud ice mm -TCOLI Total Column-Integrated Cloud Ice mm -TCOLW Total column-integrated cloud water mm -TCOLW Total Column-Integrated Cloud Water mm -TCOLC Total column-integrated condensate mm -TCOLC Total Column-Integrated Condensate mm -TCOLM Total column-integrated melting ice kg m-2 -TCOLM Total column-integrated melting ice mm -TCIOZ Total Column Integrated Ozone Dobson -TCOLR Total Column Integrated Rain kg m-2 -TCOLR Total column integrated rain mm -TCOLR Total Column Integrated Rain mm -TCOLS Total Column Integrated Snow kg m-2 -TCOLS Total column integrated snow mm -TCOLS Total Column Integrated Snow mm -TCLSW Total column-integrated supercooled liquid water kg m-2 -TCLSW Total column-integrated supercooled liquid water mm -TCIWV Total Column Integrated Water Vapour kg m-2 -TCIWV Total Column Integrated Water Vapour mm -TCOLG Total Column Integrate Graupel kg/m^2 -TCWAT Total Column Water (Vertically integrated total water (vapour+cloud water/ice) kg m-2 -TCWAT Total Column Water(Vertically integrated total water (vapour+cloud water/ice) mm -TCOND Total Condensate kg \* kg^-1 -TCOND Total condensate kg/kg -TCOND Total Condensate kg/kg -THFLX Total Downward Heat Flux at Surface W/m^2 -TIPD Total Icing Potential Diagnostic non-dim -TIPD Total Icing Potential Diagnostic -TOZNE Total ozone Dobson -A PCP Total Precipitation kg m-2 -APCP Total precipitation mm -APCPN Total precipitation (nearest grid point) kg/m2 -APCPN Total precipitation (nearest grid point) mm -TPRATE Total Precipitation Rate kg m-2s-1 -TPRATE Total Precipitation Rate mm/s -PRSIGSV Total Probability of Extreme Severe Thunderstorms (Days 2,3) % -PRSIGSVR Total Probability of Extreme Severe Thunderstorms (Days 2,3) % -PRSVR Total Probability of Severe Thunderstorms (Days 2,3) % -ASNOW Total Snowfall m -TOTSN Total snowfall m -TSRATE Total Snowfall Rate m s-1 -TSRATE Total Snowfall Rate m/s -TSRWE Total Snowfall Rate Water Equivalent kg m-2s-1 -TSRWE Total Snowfall Rate Water Equivalent mm/s -TSNOW Total Snow kg/m2 -TSNOW Total Snow mm -TSNOWP Total Snow Precipitation kg m-2 -TSNOWP Total Snow Precipitation mm -TTX Total totals index K -TWATP Total Water Precipitation kg m-2 -TWATP Total Water Precipitation mm -TTHDP Transient thermocline depth m -TRANSO Transpiration Stree-Onset(Soil Moisture) kg/m^3 -SMREF Transpiration stress-onset (soil moisture) Proportion -TRANS Transpiration W/m^2 -TCHP Tropical Cyclone Heat Potential J/m^2\*K -TRO Tropopause -TRBBS Turbulence base m -TURBB Turbulence Base m -TURB Turbulence (Code table 4.208) -TPFI Turbulence Potential Forecast Index -TURB Turbulence See Table 4.208 -TRBTP Turbulence top m -TURBT Turbulence Top m -TKE Turbulent Kinetic Energy J kg-1 -TKE Turbulent kinetic energy J/kg -UOGRD u-component of current cm/s -UOGRD u-component of current m/s -MAXUW U Component of Hourly Maximum 10m Wind Speed m/s -UICE u-component of ice drift m/s -UGUST u-component of wind gust m/s -UGRD u-component of wind m/s -USTM U-component storm motion m/s -USTM U-Component Storm Motion m/s -USSD U-component Surface Stokes Drift m/s -UVI Ultra Violet Index J/m^2 -UPHL Updraft Helicity in Layer 2-5 km AGL m^2/s^2 -UPHL Updraft Helicity m^2/s^2 -ULSM Upper layer soil moisture kg/m^3 -ULST Upper layer soil temperature K -ULWRF Upward Long-Wave Rad. Flux W/m^2 -ULWRF Upward long-wave radiation flux W/m^2 - Upward Long-W/m^2 ULWRF -USWRF Upward Short-Wave Rad. Flux W/m^2 -USWRF Upward short-wave radiation flux W/m^2 - Upward Short-W/m^2 USWRF -UTRF Upward Total radiation Flux W/m^2 -DUVB UV-B downward solar flux W/m^2 -UVI UV Index J/m^2 -UVIUCS UV Index (Under Clear Sky) Numeric -VAPP Vapor pressure Pa -VAPP Vapor Pressure Pa -VOGRD v-component of current cm/s -VOGRD v-component of current m/s -MAXVW V Component of Hourly Maximum 10m Wind Speed m/s -VICE v-component of ice drift m/s -UGUST v-component of wind gust m/s -VGRD v-component of wind m/s -VSTM V-component storm motion m/s -VSTM V-Component Storm Motion m/s -VSSD V-component Surface Stokes Drift m/s -VEGT Vegetation canopy temperature K -VGTYP Vegetation Type Integer 0-13 -VEG Vegetation % -SPEED Velocity Magnitude (Speed) m\*s^1 -LMV Velocity Point Model Surface -VPOT Velocity potential m^2/s -VRATE Ventilation Rate m^2/s -VDFHR Vertical Diffusion Heating rate K/s -VDFVA Vertical Diffusion Meridional Acceleration m/s^2 -VDFMR Vertical Diffusion Moistening Rate kg/kg\*s -VDFUA Vertical Diffusion Zonal Acceleration m/s^2 -VEDH Vertical Eddy Diffusivity Heat exchange m^2/s -VTEC Vertical Electron Content m^2 -VII Vertically Integrated Ice (VII) kg/m^2 -VILIQ Vertically-integrated liquid kg/m^2 -MRMSVILDensity Vertically Integrated Liquid (VIL) Density g/m^3 -MRMSVIL Vertically Integrated Liquid (VIL) kg/m^2 -VIL Vertically Integrated Liquid (VIL) kg/m^2 -VWSH Vertical speed shear s^-1 -VWSH Vertical speed sheer s^-1 -VUCSH Vertical u-component shear s^-1 -VVCSH Vertical v-component shear s^-1 -DZDT Vertical velocity geometric m/s -VVEL Vertical velocity pressure Pa/s -VPTMP Virtual potential temperature K -VTMP Virtual temperature K -VIS Visibility m -VBDSF Visible Beam Downward Solar Flux W/m^2 -SBSALB Visible, Black Sky Albedo % -VDDSF Visible Diffuse Downward Solar Flux W/m^2 -Visible Visible Imagery -SWSALB Visible, White Sky Albedo % -VASH Volcanic ash (Code table 4.206) -VAFTD Volcanic Ash Forecast Transport and Dispersion log10(kg/m^3) -VOLASH Volcanic Ash See Table 4.206 -VOLDEC Volumetric Direct Evaporation Cease(Soil Moisture) m^3/m^3 -VSOSM Volumetric Saturation Of Soil Moisture m^3/m^3 -SOILW Volumetric soil moisture content Proportion -VSOILM Volumetric Soil Moisture m^3/m^3 -VOLTSO Volumetric Transpiration Stree-Onset(Soil Moisture) m^3/m^3 -VWILTM Volumetric Wilting Moisture m^3/m^3 -WCINC Water condensate added by precip assimilation mm -WCCONV Water Condensate Flux Convergance (Vertical Int) mm -WCVFLX Water Condensate Meridional Flux (Vertical Int) mm -WCUFLX Water Condensate Zonal Flux (Vertical Int) mm -WEASD Water Equivalent of Accumulated Snow Depth kg m-2 -WEASD Water equivalent of accumulated snow depth mm -WATR Water runoff mm -TEMPWTR Water temperature K -WVINC Water vapor added by precip assimilation mm -WVCONV Water Vapor Flux Convergance (Vertical Int) mm -WaterVapor Water Vapor Imagery K -WVVFLX Water Vapor Meridional Flux (Vertical Int) mm -WVUFLX Water Vapor Zonal Flux (Vertical Int) mm -WDIRW Wave Directional Width -WESP Wave Engery Spectrum s/m^2 -WVSP1 Wave spectra (1) -WVSP2 Wave spectra (2) -WVSP3 Wave spectra (3) -WSTP Wave Steepness -WSTR Wave Stress N/m^2 -wxType Weather -ModelWetbulbTemperature Wet Bulb Temperature C -WHTCOR White Light Coronagraph Radiance W\*s\*r^1\*m^2 -WHTRAD White Light Radiance W\*s\*r^1\*m^2 -WILT Wilting Point kg/m^3 -WILT Wilting point Proportion -WCI Wind chill factor K -WDIR Wind direction (from which blowing) deg -WMIXE Wind mixing energy J -WINDPROB Wind probability % -WINDPROB Wind Probability % -WGS Wind speed gust m/s -PWS Wind speed m/s -WIND Wind speed m/s -HGT X X-gradient of Height m^-1 -LPS X X-gradient of Log Pressure m^-1 -XRAYRAD X-Ray Radiance W\*s\*r^1\*m^2 -HGT Y Y-gradient of Height m^-1 -LPS Y Y-gradient of Log Pressure m^-1 -UGWD Zonal flux of gravity wave stress N/m^2 -U-GWD Zonal Flux of Gravity Wave Stress N/m^2 -================================== =============================================================================================================================================================== ==================================== - diff --git a/docs/source/index.rst b/docs/source/index.rst deleted file mode 100644 index 1e4b800..0000000 --- a/docs/source/index.rst +++ /dev/null @@ -1,72 +0,0 @@ -================================== -Python AWIPS Data Access Framework -================================== - -The python-awips package provides a data access framework for requesting meteorological and geographic datasets from an `EDEX `_ server. - -`AWIPS `_ is a weather display and analysis package developed by the National Weather Service for operational forecasting. UCAR's `Unidata Program Center `_ supports a non-operational open-source release of the AWIPS software (`EDEX `_, `CAVE `_, and `python-awips `_). - -.. _Jupyter Notebook: http://nbviewer.jupyter.org/github/Unidata/python-awips/tree/master/examples/notebooks - - -Pre-requisite Software ----------------------- - -In order to effictively use python-awips you'll need to have these installed already: - - python3 - - conda - - git *(for the source code and examples installation)* - -Package-Only Install --------------------- - -If you already work with Python, you might just be interested in how to install the python-awips pacakge. -The package can be installed with either of the two well known package managers: **pip** and **conda**. - -Pip Install -~~~~~~~~~~~ - -:: - - pip install python-awips - - -Conda Install -~~~~~~~~~~~~~ - -:: - - conda install -c conda-forge python-awips - - - -Source Code with Examples Install ---------------------------------- - -Below are instructions on how to install the source code of python-awips, with all included example notebooks. This will create a new conda environment called ``python3-awips`` and start up a browser for the jupyter notebook examples. - -:: - - git clone https://github.com/Unidata/python-awips.git - cd python-awips - conda env create -f environment.yml - conda activate python3-awips - python setup.py install --force - jupyter notebook examples - - -Questions -- Contact Us! ------------------------- - -Please feel free to reach out to us at our support email at **support-awips@unidata.ucar.edu** - -.. toctree:: - :maxdepth: 2 - :hidden: - - api/index - datatypes - examples/index - dev - gridparms - about diff --git a/docs/source/notebook_gen_sphinxext.py b/docs/source/notebook_gen_sphinxext.py deleted file mode 100644 index 59beae3..0000000 --- a/docs/source/notebook_gen_sphinxext.py +++ /dev/null @@ -1,77 +0,0 @@ -# -# Generation of RST from notebooks -# -import glob -import os -import os.path -import warnings - -warnings.simplefilter('ignore') - -from nbconvert.exporters import rst - -def setup(app): - setup.app = app - setup.config = app.config - setup.confdir = app.confdir - - app.connect('builder-inited', generate_rst) - - return dict( - version='0.1', - parallel_read_safe=True, - parallel_write_safe=True - ) - -notebook_source_dir = '../../examples/notebooks' -generated_source_dir = 'examples/generated' - - -def nb_to_rst(nb_path): - """convert notebook to restructured text""" - exporter = rst.RSTExporter() - out, resources = exporter.from_file(open(nb_path)) - basename = os.path.splitext(os.path.basename(nb_path))[0] - imgdir = basename + '_files' - img_prefix = os.path.join(imgdir, basename + '_') - resources['metadata']['basename'] = basename - resources['metadata']['name'] = basename.replace('_', ' ') - resources['metadata']['imgdir'] = imgdir - base_url = ('http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/' - 'examples/notebooks/') - out_lines = ['`Notebook <%s>`_' % (base_url + os.path.basename(nb_path))] - for line in out.split('\n'): - if line.startswith('.. image:: '): - line = line.replace('output_', img_prefix) - out_lines.append(line) - out = '\n'.join(out_lines) - - return out, resources - - -def write_nb(dest, output, resources): - if not os.path.exists(dest): - os.makedirs(dest) - rst_file = os.path.join(dest, - resources['metadata']['basename'] + resources['output_extension']) - name = resources['metadata']['name'] - with open(rst_file, 'w') as rst: - header = '=' * len(name) - rst.write(header + '\n') - rst.write(name + '\n') - rst.write(header + '\n') - rst.write(output) - - imgdir = os.path.join(dest, resources['metadata']['imgdir']) - if not os.path.exists(imgdir): - os.makedirs(imgdir) - basename = resources['metadata']['basename'] - for filename in resources['outputs']: - img_file = os.path.join(imgdir, filename.replace('output_', basename + '_')) - with open(img_file, 'wb') as img: - img.write(resources['outputs'][filename]) - - -def generate_rst(app): - for fname in glob.glob(os.path.join(app.srcdir, notebook_source_dir, '*.ipynb')): - write_nb(os.path.join(app.srcdir, generated_source_dir), *nb_to_rst(fname)) diff --git a/dynamicserialize/adapters/GridDataHistoryAdapter.py b/dynamicserialize/adapters/GridDataHistoryAdapter.py deleted file mode 100644 index 50c231c..0000000 --- a/dynamicserialize/adapters/GridDataHistoryAdapter.py +++ /dev/null @@ -1,26 +0,0 @@ -# -# Adapter for com.raytheon.uf.common.dataplugin.gfe.GridDataHistory -# -# TODO: REWRITE THIS ADAPTER when serialization/deserialization of this -# class has been finalized. -# -# -# SOFTWARE HISTORY -# -# Date Ticket# Engineer Description -# ------------ ---------- ----------- -------------------------- -# 03/29/11 dgilling Initial Creation. -# - -from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.gfe import GridDataHistory - -ClassAdapter = 'com.raytheon.uf.common.dataplugin.gfe.GridDataHistory' - - -def serialize(context, history): - context.writeString(history.getCodedString()) - - -def deserialize(context): - result = GridDataHistory(context.readString()) - return result diff --git a/dynamicserialize/dstypes/__init__.py b/dynamicserialize/dstypes/__init__.py index 8a203a7..576e730 100644 --- a/dynamicserialize/dstypes/__init__.py +++ b/dynamicserialize/dstypes/__init__.py @@ -21,9 +21,7 @@ # File auto-generated by PythonFileGenerator __all__ = [ - 'com', - 'gov', - 'java' + 'com' ] diff --git a/dynamicserialize/dstypes/com/__init__.py b/dynamicserialize/dstypes/com/__init__.py index 8513e3c..7d96ff4 100644 --- a/dynamicserialize/dstypes/com/__init__.py +++ b/dynamicserialize/dstypes/com/__init__.py @@ -21,7 +21,7 @@ # File auto-generated by PythonFileGenerator __all__ = [ - 'raytheon', + 'raytheon' ] diff --git a/dynamicserialize/dstypes/com/raytheon/uf/common/__init__.py b/dynamicserialize/dstypes/com/raytheon/uf/common/__init__.py index 3d508dc..7a7bc68 100644 --- a/dynamicserialize/dstypes/com/raytheon/uf/common/__init__.py +++ b/dynamicserialize/dstypes/com/raytheon/uf/common/__init__.py @@ -21,22 +21,7 @@ # File auto-generated by PythonFileGenerator __all__ = [ - 'activetable', - 'alertviz', - 'auth', - 'dataaccess', - 'dataplugin', - 'dataquery', - 'datastorage', - 'localization', - 'management', - 'message', - 'mpe', - 'pointdata', - 'pypies', - 'serialization', - 'site', - 'time' + 'dataquery' ] diff --git a/dynamicserialize/dstypes/com/raytheon/uf/common/auth/user/__init__.py b/dynamicserialize/dstypes/com/raytheon/uf/common/auth/user/__init__.py index 95995ff..79458d2 100644 --- a/dynamicserialize/dstypes/com/raytheon/uf/common/auth/user/__init__.py +++ b/dynamicserialize/dstypes/com/raytheon/uf/common/auth/user/__init__.py @@ -21,6 +21,7 @@ # File auto-generated by PythonFileGenerator __all__ = [ + 'AuthenticationData', 'User', 'UserId' ] diff --git a/dynamicserialize/dstypes/com/raytheon/uf/common/dataaccess/impl/DefaultDataRequest.py b/dynamicserialize/dstypes/com/raytheon/uf/common/dataaccess/impl/DefaultDataRequest.py index 95be69e..1808170 100644 --- a/dynamicserialize/dstypes/com/raytheon/uf/common/dataaccess/impl/DefaultDataRequest.py +++ b/dynamicserialize/dstypes/com/raytheon/uf/common/dataaccess/impl/DefaultDataRequest.py @@ -31,7 +31,7 @@ # -from awips.dataaccess import IDataRequest +from ufpy.dataaccess import IDataRequest from dynamicserialize.dstypes.org.locationtech.jts.geom import Envelope from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.level import Level diff --git a/dynamicserialize/dstypes/com/raytheon/uf/common/dataaccess/impl/DefaultNotificationFilter.py b/dynamicserialize/dstypes/com/raytheon/uf/common/dataaccess/impl/DefaultNotificationFilter.py index b7fe0eb..6d931c4 100644 --- a/dynamicserialize/dstypes/com/raytheon/uf/common/dataaccess/impl/DefaultNotificationFilter.py +++ b/dynamicserialize/dstypes/com/raytheon/uf/common/dataaccess/impl/DefaultNotificationFilter.py @@ -31,7 +31,7 @@ # -from awips.dataaccess import INotificationFilter +from ufpy.dataaccess import INotificationFilter import sys class DefaultNotificationFilter(INotificationFilter): diff --git a/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/__init__.py b/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/__init__.py index 1700ce6..bb8538a 100644 --- a/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/__init__.py +++ b/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/__init__.py @@ -21,14 +21,8 @@ # File auto-generated by PythonFileGenerator __all__ = [ - 'events', - 'gfe', - 'grid', - 'level', 'message', - 'persist', - 'radar', - 'text' + 'persist' ] diff --git a/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/gfe/db/objects/GFERecord.py b/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/gfe/db/objects/GFERecord.py index 1ca1cd8..16453be 100644 --- a/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/gfe/db/objects/GFERecord.py +++ b/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/gfe/db/objects/GFERecord.py @@ -39,12 +39,12 @@ class GFERecord(PersistableDataObject): self.dataTime = None self.parmId = None if timeRange is not None: - if isinstance(timeRange, TimeRange): + if type(timeRange) is TimeRange: self.dataTime = DataTime(refTime=timeRange.getStart(), validPeriod=timeRange) else: raise TypeError("Invalid TimeRange object specified.") if parmId is not None: - if isinstance(parmId, ParmID.ParmID): + if type(parmId) is ParmID.ParmID: self.parmId = parmId self.parmName = parmId.getParmName() self.parmLevel = parmId.getParmLevel() diff --git a/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/gfe/db/objects/ParmID.py b/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/gfe/db/objects/ParmID.py index 1d91003..e479aad 100644 --- a/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/gfe/db/objects/ParmID.py +++ b/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/gfe/db/objects/ParmID.py @@ -36,9 +36,9 @@ class ParmID(object): if (parmIdentifier is not None) and (dbId is not None): self.parmName = parmIdentifier - if isinstance(dbId, DatabaseID): + if type(dbId) is DatabaseID: self.dbId = dbId - elif isinstance(dbId, str): + elif type(dbId) is str: self.dbId = DatabaseID(dbId) else: raise TypeError("Invalid database ID specified.") diff --git a/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/level/Level.py b/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/level/Level.py index 5ae6273..594822d 100644 --- a/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/level/Level.py +++ b/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/level/Level.py @@ -31,7 +31,7 @@ # 06/29/15 4480 dgilling Implement __hash__, __eq__, # __str__ and rich comparison operators. # 02/17/22 8608 mapeters Subclass PersistableDataObject -# 08/31/23 srcarter@ucar From MJ - replace type with isinstance +# # import numpy @@ -71,15 +71,17 @@ class Level(PersistableDataObject): return hashCode def __eq__(self, other): - if isinstance(self, type(other)): + if type(self) != type(other): + return False + else: return (self.masterLevel, self.levelonevalue, self.leveltwovalue) == \ (other.masterLevel, other.levelonevalue, other.leveltwovalue) - return False + def __ne__(self, other): return not self.__eq__(other) def __lt__(self, other): - if not isinstance(self, type(other)): + if type(self) != type(other): return NotImplemented elif self.masterLevel.getName() != other.masterLevel.getName(): return NotImplemented @@ -111,7 +113,7 @@ class Level(PersistableDataObject): return False def __le__(self, other): - if not isinstance(self, type(other)): + if type(self) != type(other): return NotImplemented elif self.masterLevel.getName() != other.masterLevel.getName(): return NotImplemented @@ -119,7 +121,7 @@ class Level(PersistableDataObject): return self.__lt__(other) or self.__eq__(other) def __gt__(self, other): - if not isinstance(self, type(other)): + if type(self) != type(other): return NotImplemented elif self.masterLevel.getName() != other.masterLevel.getName(): return NotImplemented @@ -151,7 +153,7 @@ class Level(PersistableDataObject): return False def __ge__(self, other): - if not isinstance(self, type(other)): + if type(self) != type(other): return NotImplemented elif self.masterLevel.getName() != other.masterLevel.getName(): return NotImplemented diff --git a/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/level/MasterLevel.py b/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/level/MasterLevel.py index 84516ac..caa50e7 100644 --- a/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/level/MasterLevel.py +++ b/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/level/MasterLevel.py @@ -30,7 +30,7 @@ # 06/29/15 4480 dgilling Implement __hash__, __eq__ # and __str__. # 02/17/22 8608 mapeters Subclass PersistableDataObject -# 08/31/23 srcarter@ucar From MJ - replace type with isinstance +# # from dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.persist import PersistableDataObject @@ -49,7 +49,7 @@ class MasterLevel(PersistableDataObject): return hash(self.name) def __eq__(self, other): - if not isinstance(self, type(other)): + if type(self) != type(other): return False else: return self.name == other.name diff --git a/dynamicserialize/dstypes/com/raytheon/uf/common/dataquery/requests/RequestConstraint.py b/dynamicserialize/dstypes/com/raytheon/uf/common/dataquery/requests/RequestConstraint.py index 6e228e5..be67109 100644 --- a/dynamicserialize/dstypes/com/raytheon/uf/common/dataquery/requests/RequestConstraint.py +++ b/dynamicserialize/dstypes/com/raytheon/uf/common/dataquery/requests/RequestConstraint.py @@ -27,11 +27,11 @@ # Jun 27, 2016 5725 tgurney Add NOT IN # Jul 22, 2016 2416 tgurney Add evaluate() # Jun 26, 2019 7888 tgurney Python 3 fixes -# Aug 31, 2023 srcarter@ucar Small formatting and logic changes +# # import re -from dynamicserialize.dstypes.com.raytheon.uf.common.time import DataTime +from ...time import DataTime class RequestConstraint(object): @@ -212,7 +212,7 @@ class RequestConstraint(object): return self._evalValue.match(value) is not None def _evalIsNull(self, value): - return value is None or value == 'null' + return value is None or 'null' == value # DAF-specific stuff begins here ########################################## @@ -228,11 +228,11 @@ class RequestConstraint(object): @staticmethod def _stringify(value): - if isinstance(value, (int, bool, float)): + if type(value) in {int, bool, float}: return str(value) - elif isinstance(value, str): + elif type(value) is str: return value - elif isinstance(value, bytes): + elif type(value) is bytes: return value.decode() else: # Collections are not allowed; they are handled separately. @@ -249,7 +249,7 @@ class RequestConstraint(object): except TypeError: raise TypeError("value for IN / NOT IN constraint must be an iterable") stringValue = ', '.join(cls._stringify(item) for item in iterator) - if not stringValue: + if len(stringValue) == 0: raise ValueError('cannot use IN / NOT IN with empty collection') obj = cls() obj.setConstraintType(constraintType) diff --git a/dynamicserialize/dstypes/com/raytheon/uf/common/datastorage/records/AbstractDataRecord.py b/dynamicserialize/dstypes/com/raytheon/uf/common/datastorage/records/AbstractDataRecord.py deleted file mode 100644 index fd450a3..0000000 --- a/dynamicserialize/dstypes/com/raytheon/uf/common/datastorage/records/AbstractDataRecord.py +++ /dev/null @@ -1,78 +0,0 @@ - -from six import with_metaclass -import abc - - -class AbstractDataRecord(with_metaclass(abc.ABCMeta, object)): - - def __init__(self): - self.name = None - self.dimension = None - self.sizes = None - self.maxSizes = None - self.props = None - self.minIndex = None - self.group = None - self.dataAttributes = None - self.fillValue = None - self.maxChunkSize = None - - def getName(self): - return self.name - - def setName(self, name): - self.name = name - - def getDimension(self): - return self.dimension - - def setDimension(self, dimension): - self.dimension = dimension - - def getSizes(self): - return self.sizes - - def setSizes(self, sizes): - self.sizes = sizes - - def getMaxSizes(self): - return self.maxSizes - - def setMaxSizes(self, maxSizes): - self.maxSizes = maxSizes - - def getProps(self): - return self.props - - def setProps(self, props): - self.props = props - - def getMinIndex(self): - return self.minIndex - - def setMinIndex(self, minIndex): - self.minIndex = minIndex - - def getGroup(self): - return self.group - - def setGroup(self, group): - self.group = group - - def getDataAttributes(self): - return self.dataAttributes - - def setDataAttributes(self, dataAttributes): - self.dataAttributes = dataAttributes - - def getFillValue(self): - return self.fillValue - - def setFillValue(self, fillValue): - self.fillValue = fillValue - - def getMaxChunkSize(self): - return self.maxChunkSize - - def setMaxChunkSize(self, maxChunkSize): - self.maxChunkSize = maxChunkSize diff --git a/dynamicserialize/dstypes/com/raytheon/uf/common/time/DataTime.py b/dynamicserialize/dstypes/com/raytheon/uf/common/time/DataTime.py index 70eb10e..4b401e7 100644 --- a/dynamicserialize/dstypes/com/raytheon/uf/common/time/DataTime.py +++ b/dynamicserialize/dstypes/com/raytheon/uf/common/time/DataTime.py @@ -39,7 +39,6 @@ # plus misc cleanup # 09/13/19 7888 tgurney Python 3 division fixes # 11/18/19 7881 tgurney Fix __hash__ -# 08/31/23 srcarter@ucar Small formatting fixes to match MJ's changes import calendar @@ -60,8 +59,12 @@ _TIME = r'(\d{2}:\d{2}:\d{2})' _MILLIS = '(?:\.(\d{1,3})(?:\d{1,4})?)?' REFTIME_PATTERN_STR = _DATE + '[ _]' + _TIME + _MILLIS FORECAST_PATTERN_STR = r'(?:[ _]\((\d+)(?::(\d{1,2}))?\))?' -VALID_PERIOD_PATTERN_STR = r'(?:\[' + REFTIME_PATTERN_STR + '--' + REFTIME_PATTERN_STR + r'\])?' -STR_PATTERN = re.compile(REFTIME_PATTERN_STR + FORECAST_PATTERN_STR + VALID_PERIOD_PATTERN_STR) +VALID_PERIOD_PATTERN_STR = r'(?:\[' + REFTIME_PATTERN_STR + \ + '--' + REFTIME_PATTERN_STR + r'\])?' +STR_PATTERN = re.compile( + REFTIME_PATTERN_STR + + FORECAST_PATTERN_STR + + VALID_PERIOD_PATTERN_STR) class DataTime(object): @@ -85,14 +88,18 @@ class DataTime(object): self.fcstTime = 0 self.refTime = refTime if validPeriod is not None and not isinstance(validPeriod, TimeRange): - raise ValueError("Invalid validPeriod object specified for DataTime.") + raise ValueError( + "Invalid validPeriod object specified for DataTime.") self.validPeriod = validPeriod - self.utilityFlags = EnumSet('com.raytheon.uf.common.time.DataTime$FLAG') + self.utilityFlags = EnumSet( + 'com.raytheon.uf.common.time.DataTime$FLAG') self.levelValue = numpy.float64(-1.0) if self.refTime is not None: if isinstance(self.refTime, datetime.datetime): - self.refTime = int(calendar.timegm(self.refTime.utctimetuple()) * 1000) + self.refTime = int( + calendar.timegm( + self.refTime.utctimetuple()) * 1000) elif isinstance(self.refTime, time.struct_time): self.refTime = int(calendar.timegm(self.refTime) * 1000) elif hasattr(self.refTime, 'getTime'): @@ -117,7 +124,8 @@ class DataTime(object): fcstTimeMin = groups[4] periodStart = groups[5], groups[6], (groups[7] or 0) periodEnd = groups[8], groups[9], (groups[10] or 0) - self.refTime = self._getTimeAsEpochMillis(rDate, rTime, rMillis) + self.refTime = self._getTimeAsEpochMillis( + rDate, rTime, rMillis) if fcstTimeHr is not None: self.fcstTime = int(fcstTimeHr) * 3600 @@ -126,7 +134,8 @@ class DataTime(object): if periodStart[0] is not None: self.validPeriod = TimeRange() - periodStartTime = self._getTimeAsEpochMillis(*periodStart) + periodStartTime = self._getTimeAsEpochMillis( + *periodStart) self.validPeriod.setStart(periodStartTime // 1000) periodEndTime = self._getTimeAsEpochMillis(*periodEnd) self.validPeriod.setEnd(periodEndTime // 1000) diff --git a/dynamicserialize/dstypes/java/util/EnumSet.py b/dynamicserialize/dstypes/java/util/EnumSet.py index 44b8a60..e6af671 100644 --- a/dynamicserialize/dstypes/java/util/EnumSet.py +++ b/dynamicserialize/dstypes/java/util/EnumSet.py @@ -37,10 +37,10 @@ # values to your EnumSet. ## -import collections.abc +import collections -class EnumSet(collections.abc.MutableSet): +class EnumSet(collections.MutableSet): def __init__(self, enumClassName, iterable=[]): self.__enumClassName = enumClassName diff --git a/environment.yml b/environment.yml deleted file mode 100644 index 9d19248..0000000 --- a/environment.yml +++ /dev/null @@ -1,28 +0,0 @@ - name: python3-awips - channels: - - https://conda.anaconda.org/conda-forge - dependencies: - - python=3 - - numpy - - nomkl - - matplotlib - - cartopy - - jupyter - - netcdf4 - - owslib - - metpy - - pint - - h5py - - sphinx>=1.3 - - sphinx_rtd_theme - - nbconvert>=4.1 - - siphon - - xarray - - ffmpeg - - pytest - - shapely - - six - - pip - - jupyter_contrib_nbextensions - - python-awips - diff --git a/examples/Template.ipynb b/examples/Template.ipynb deleted file mode 100644 index fc3d581..0000000 --- a/examples/Template.ipynb +++ /dev/null @@ -1,322 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "
\n", - "\n", - "
\n", - "\"Unidata\n", - "
\n", - "\n", - "# YOUR NOTEBOOK TITLE\n", - "**Python-AWIPS Tutorial Notebook**\n", - "\n", - "
\n", - "
\n", - "\n", - "---\n", - "\n", - "Be sure to commit a small example output image from your code and link to it HERE (in the source), or link to an external image (logo, etc.) via URL. Remove this line after! Provide a brief `alt` text as well to benefit those with image display issues or potentially making use of screen readers.\n", - "
\"[image
\n", - "\n", - "\n", - "# Objectives\n", - "\n", - "* Use this section to \"tag\" the key interactions with your notebook, restate in plain language your notebooks overall goal\n", - "* Supplement with brief description of the skills/tools that will be highlighted or smaller objectives that will be completed\n", - "* Generate numbers for function inputs with [NumPy](https://numpy.org/doc/stable/)\n", - "* Calculate $y = f(x) = sin(x)$ with [NumPy](https://numpy.org/doc/stable/) (don't forget math text!)\n", - "* Demonstrate visualizing this with [Matplotlib](https://matplotlib.org/)\n", - "\n", - "---" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "toc": true - }, - "source": [ - "

Table of Contents

\n", - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Imports\n", - "We will begin by importing the important packages to be used throughout! Instructors, generally keep your imports to before your objectives unless there is an important takeaway from what you're importing or the way you're doing it. Give a brief description if necessary in more introductory notebooks." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Top\n", - "\n", - "---" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Your first objective\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Begin your learning narrative here with your first individual learning objective. Be sure to use markdown cells to guide your notebook, and explain your larger and more complicated objectives in plain language as necessary. Keep code comments to a minimum, but include them if they clearly help explain a quick decision or syntax quirk. Of course, if you find yourself needing more and more and more markdown as you go, you may need to trim down or split up your notebook!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**NOTICE** copy this cell (after removing this text from source) to include at the end of any new sections you illustrate for a clear visual break and offer a path to the start of the notebook. You can use the markdown `---` separator to clearly separate your sections.\n", - "\n", - "Top\n", - "\n", - "---" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Objective number two\n", - "\n", - "Continue into your next objective, again defined by what unique piece of information you want your student to take away, or what pieces of code you want them to be able to take advantage of." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x = np.linspace(0, 2*np.pi, 5)\n", - "x" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Highlight boxes can be useful!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "Tip: My Tip\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "Tip: My Warning\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "Tip: My Error\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "Tip: My Success\n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "y = np.sin(x)\n", - "y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Don't forget, in markdown cells\n", - "#### you have access to\n", - "##### further subsection headings\n", - "\n", - "to help break up the organization of your sections as necessary. Don't let them get too long, however!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "labels = [f'{val / np.pi} $\\pi$' for val in x]\n", - "\n", - "plt.plot(x, y)\n", - "plt.scatter(x, y)\n", - "plt.xticks(x, labels);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Top\n", - "\n", - "---" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Objective, the third\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x_10 = np.linspace(0, 2*np.pi, 10)\n", - "y_10 = np.sin(x_10)\n", - "\n", - "x_100 = np.linspace(0, 2*np.pi, 100)\n", - "y_100 = np.sin(x_100)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.plot(x_10, y_10, label=\"x=10\")\n", - "plt.plot(x_100, y_100, label=\"x=100\")\n", - "plt.xticks(x, labels)\n", - "plt.legend();" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "and so on, and so forth! Don't forget to follow your narrative, and by the end feel free to sneak in some (not so scary!) previews or natural extensions to your notebook pointing the learner where they might go next. And of course, thank you!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Top\n", - "\n", - "---" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## See Also\n", - "\n", - "Finally, reserve a small space at the end for any citations/references, links to external resources (e.g. other websites, courses, activities), or suggestions for potentially 2-3 of our other notebooks that may complement or make for a logical prequel/sequel to your notebook. We will have direction for this on the website as well, but keep this in mind here at the end!\n", - "\n", - "### Related Notebooks\n", - "\n", - "Other notebooks that have similar content or ideas\n", - "- [notebook 1](link)\n", - "- [notebook 2](link)\n", - "\n", - "### Additional Documention\n", - "\n", - "Add documention links and/or supporting scientific information" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Top\n", - "\n", - "---" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.5" - }, - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": true, - "sideBar": true, - "skip_h1_title": true, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": true, - "toc_position": {}, - "toc_section_display": true, - "toc_window_display": true - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/images/GOES_CIRA_night_preview.png b/examples/images/GOES_CIRA_night_preview.png deleted file mode 100644 index cff059b562f2bf0a22ddb7afbbe7ed13808584d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273708 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

)vbKnfBMigf*UGQqowYad+^yHs(*={I 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

v z1VUg~DNNnKZPqa?izSq!j^y3-xA5cCUHF<$5J*y~l$ys!Q3qR~(KkGT)2uQ&J5Igc zVt8bLRMIA&HW|qHeCG4_vUd!&UAzksI;`KcfqYLtD_4!6>l&p}g)oe`ndw($||~ z?NEwqo^d6KbRNsL86528z=2~JhKZd^v;F$(N#<4pK4S;>vihP+NaQly{m-AGT2_no z1;KN%F!@^I8=ZN*(&gW=KE=ryiSLK>_wAQ%8 zz&>-5h1mwS9-@nw*@Ys-g(Bl;&(USIDJ^=u@QMQUMVE4EhD;_;xuvrySkD{n-$WAv z%ZQN(M)D!!6_XfsUkU`e7Gn}JoYN>ZV!TkJ*wX2aBc6LnmirD>Ia5xMG-LdB4KH+X zgu{?Az;j=511sHQ92qTR>hSt&bA0ci8pGWd*KA8OJzZkeif+=GH2Y7?v3fW|F)DD; znutOak+KE*$0VUJsf8(`z~PHs-{IwpH}PkszvX4AH?d_{FjtMaWJ{g{rxfsM2}bk4 z$$&yqvNG>d$eIjhb^6jF&%Sas2aZm2d`7bOTtrffu{5>QUd(p^kZ4rdvO2?ju}*hN z5J`=Ze8^N)=S_+C@LR##_^9_mE?L;gZ`kigVlKDb+ks%RqVd`@{|La_wYTw4@(Yi< z#!;v?KZ<($vwg#t) zQKPIniMmeD$OeYjU&Qc+i>S;`kjiyaUz}y)_`{q%cptiH(XK7BB!1$xo7kx=rk$i& zEuFWZUOH4wWAmlgbJ_D=N2ZWt-byhE6t-MM_V^@QE`KgajpKXnp;{c_${U|gBBe7k zI?vfd6YPA(PGqce_Dq>a@4Sua(~6f~D^7FS^WH*bZhTqpbSX?L!Nt#f1ydGS zeYgF9fwh}>>WkmVxg(D(qhgq^-=r_gkr zu7TCK%__~s88qFXTAaeP66l6Sp??LH`EfXL0!$OGxZ-E7BSYD7s+PBDCrG4nT=S~8 z@{Cu%l13$s*A6i(oj8n$gmT$26A6+T3mHW;Ds$NGM&?A3AX;imb!c7^bWM;>n2^dN zy*kxmjdDHew8;dzhza8JyKmoV<9Vv>Dnz`j%qC-HFBQoMAynIU?b?;ZvE&cipWx=^ zKhYQVus&RafyvF*4~V^(e8wa)votH^PH~`G6i&ONwF~G%2O%+a9Zl#UA*uW5Mo7~I zLlcTKEhUzrtHqs2;yZ29g&v$n4a2sTL!9fPX@cv$XHtj@{887Z6s}dU{2=mz0FVr= zTu+378=1JVji&qT-Fq0rwCPDjeC_TwJ;Q6b<~iGFHCxncbtY#P@uk7SLWy=q8u#S! z(~PVfVbkV~ShhtfmBh46_C0cddcDc&wJTY-eht?>`x-{ioI^^w`XY2MYtXQ>z`PmXPQ?uOtlY4k@_d%+aDx0r*2E&`SQJHHnvSlla z(XQf_26vccj@d5Vq?dR0|0|+f(>-KH;4>w4e zf{YbWcQq2Wh7gJ;-fs>tUlZJM`zUb?`6LtaNDBu9$^ZL@Nj|tqchqem(Vj+|v3o@A2NoXQn@oMB~eMH;APM zXk=}5@J;|C4$x__qCd}#*Ir2P@DPU%jbTK9T$=(#)%Ps&O%WdKx#1k7>;v}%h)VL-E5Wai94CXPSyxFR8y?IPDRgq_M#o*SbwuYhHmX(OaO55SW#qX+I` z`t+l0ddjnC_q`O>bu&|$q98Qp&K*Gr$?gC4XAG|0#_s?4HaGspdpP;XqwKlm>pXnR zcDjc)P@FtV7z8TmS_%4AZAQ~{PVfK8axxd1#?abryx=$ffWbBEIdJDsIJWyIB+>;g zf5B_%8OkEGt+Z-o=EsgPdf;v}-C)b*&!u~C4Rak6llh6`0Q8P*pxvlEhBDUa5}Foq z6r!6Jt!inR{k0UjZW09U6Tbh%>!R$sl}g;>cjk5~OEOa+3_Nl@L!`}!defm^Ro5j7 zd=R1o;EUn-aj4Z`^=jnM5Mp-r37==^hJ|ieB+@zTRF-VdAo;$PwCXnPy3=tzGcXe- znxPZ=I#$BOP6-;-HUq2rF(aMGRNVEEZjG5rj1&T5iDhb-mWkh9WOd#liorIt4y{ci z7OEA!q+Zr=I}a6YNq_`|uB%-|7@%uHNrwtSp{tAG;Q@X$btf~ec|P9$AUomce}(;|FN5-StdW#A1!LRWH!wkb%P5Qm-u zz*$zuQr1S-4SsL-9qdl-rDb|bWzT>(^zr;iSqWy+BvVN$(Dff;zETZhmY~i z@86F^!_4=S(JZEp?5BHpHJhJ$ErIXix67P<_^#y#Q+Ha!4J7|0zQXs+A9G*(yNtK? zsu4+B@alVC%&zWd^2Rs5m{;HQQtI^C!%Jr5mZ+l5=m zON86bNj&c=^45x;$v$>mSk#Gd_Qe1E@77z+kg zZ((xu6s7)ozCH6J-tYY;Pmw$Lz20{*+c@9il@ekELwV>=2}ZI8n+J0&%oRC4R;M^$ zVndIMp;=5+bqX1cr|#_L?{Ar>(VGWAFIO4tGAKJrnJ{6*O5RutxpbXQ(~0Lu zU*qGGU*t$*A2AUDL1zFcaB=xfe)B)Q=JAusY5#)p^OCu4SjsTUX)2Jgl~lN#P>F=) zdQ^p4nIFfrQ&bnGu##ykJI%wl{tHsZ46VD6^2|9Jm3acUjg?4Yr*Z^dnm8<1o+sZo!sX9J@(;RznH=~c)uZtG9CCu5U6wc8o@4 z0o^cJzw_x7`d4!BuA9$u#bpdqoJY00ttUPAQ4|vX0>DPiFrI*R2c-#%(D)*5lTTRN^$CI>ciCqr}g+7B0ICzW2Q+yssfN9V?l}Fl`F`E7^JN%jq4t zi1JJo(@vt3+JEB*Rx-v-0X0sJFVy8{tPZ@ zav6{7ccoc7oaK-IZ4@U^4rVfn(5(bkDov|WTK14#YE$*+b&7Qb^hst52qAGA_0FP- zh$1D7@X^Fy@ej@?h=_Pk{{2V21ZU5T5r!e%T{$kkbQi2ItnMJj}->j~b({{P#yLWK;mAh!ST`qshMn+bvQNyn+T$J4FH-2?*`LjYw zsMnedukQg1!oQ91oPbhsky5cl9JsXG4ijtF128l;O|8}>4tCZ}OO0qc8Xh<%DJ6UU1gb9H8_3EIH|J=sN07d6HzCb3K+5wv`bdrt%$pPIvq z4E#btU5s*#(UL~f7bJ{`LP{`M)oF)1P5{^KSjC^+@+sEOUCeR)2)`Zu4!4Or{^u9T ze<75*XJ_MMm<+AEkmBSioJJWbC39m()$Ul+(K^W9$y%c|X0)Q1)T!;B@-yz>S zLUHOe^J6CnJcn9whC9FVS4y%piZD8$zD%K?br)St97oKZJIemszq-6LFZ8cu`_o>; z#$DHNJ+zkU!W8EYKlp?;IQ;xV3Lx;>og!d~M*ZZSmZfAaG>zf)7g3x%g>G2% zuGoOvs*}ugapI95D~qxZ(=*TYpF*m810-4!a@akgoofTy)J#*z^=d zNsFUE*+ptv$IDe>+9sy05rxX~PRf`+(JA$NU|C&JV30Q;M7Dj+$G5(qz}Q$0va$7dS%`gi>G`k|2yR1h|nBvZ2#HMkwVt zp=o4$`Z4STPQ8K`fG!nx-)lFq5-EI5>;yL2`SQsOucVHh(v zw?G`l%+D8<#I0#!>Vm0?pw?jP5k-=@*#%myHph>hVrp`Rbps}Yvo9ee-0nOisS20vfwh~q&@<45Xb5=n4*mHEfiHFb{zl*rfIERt0oOj} z=l&i@a9+RtJRa$PBvQwd5JI?LQtxk3o-DC2S7LUyi0_Ar-@I}NfD6h+Hm>hxdalMJ z5AQ=pF~zxA!Z1MSCaso>si~c1cUGg}M7$(;Au*C$joXkRG+d}jjVOl2woXD9I02-s zn2Ux(=Ig4flCc6Ru1UfSC^mK4frc(%ylSvxg(Q;{+;bwP9Y9&DuuiUEV}DFS57|6u zlClNKbPC4}h{KRfcQ1{_Mcj6aO0CV|Q$=Qr4l_-g*;bOwz#2*mC1PD-r!0C$R?&8R z+NBs%lQ;127+&ELTZBA&+8?2aG$ z1=hn73G{z2WM}ubL?NC$@yO%n^-C1C4&Znx3@d?Q+Ia1{dIswzrk%iT)kxI<%5ZtR$%$i*=lI*D`+w^heZW$77SPaFkoz2XLfUC-f%KrMDy+dar7 z&%TN3!W8%3{25Z&E-tw01)MwbAob!jgKM_Yzj_P0VUp_^LQ2W#qxW#`$b$r4TWtzA z?BI$U-^SRH-JIBSJ3Fp@As1iwRC-5pgaHU5PVXD#*zN=DyW`swCr>V)gTlZ{PCjxQ z3*#r$*ZnJL)k-YRjH&|XNt5W4eD5*L10l5KR=eo^&kfA{)QM&5Fr~N@ z`Yv9pfshJd5{1ejLjWRl8EJI0$zRKBH@=UY-Gkd|EL*hdhC#DdBU1KcXhMnAAR(1X z&}z0o3MzGX*)ml#Y|@2Z8jJJT2~%m^8wMLUtz&v>mTIle?Cd-U=WN(w3~G@qQ&WRA=fXwm1d1-7H8W7k5wS#sI_om||t9sRjF z!++ODyfJ_;0%w5d1NQ*`7x*1i0{>IsD?k~jqMorK>b=d*`#%$SA@FTfYv#+qWomsa z6?qDD`Jel$|E&4v5+mcMe>VO|OyN&b$mdI(6+XBgrlIUEqmCu6W*E$^R;|+f;bUYI z88&Yk;l6tw;>eMc#Bof!)y6h8!VYGoKP#DUNJjFKcQjtbA?+xE1XG9ZR7|O*Vd;_} zR&(@|vmu%=7|zEGbqTJzsE47xG^3+492?r zUMNtTo1~C27&~{87!5ZNxPdzMgdwSmBA@DiAMcy^1kZM^(P43TazQ;Ar3xJ}(N z@gsFpw}Y6We9V;>WZ84F&0i_p$%_R4 zaOM^&af`L_dVKMVO0)j&By%MK_IRhfrCnegM^8u&KfOk+WSWbf{!#+p<>&+7@65qf z;%`Gkxj+{7JU`ZGp0T*NEh_i;ux^`U7Jr|EHG&l&2Ai_Dxk&cehg zrcUg|w3Ev_aXXozG(C!)&Y|lDp3_`*Ci_LhN+=sy-)${h&7MEMkKf5_ntonZ8x(EM zZQ^?l(rGGf72j2YVeu~^6S!xO`t#CDi3NzC0^}KkYqygw3<4TfBGGw>NfK#;D3S!O zBnkzZE{UThaF-;N6F5ytadMWrNU%0qPs>9ssE(Jm592x29x>IM=! zY15SwH2jFRD+!|*SvtX*d`M9UT2TVmX{)!?1U)?klF0;)@22>4B{aKzm%3D-cM5(z}zAcBP0!kTN3N z_&m@}0#a!FapirSGbTAKj^Wo@7`jFxnI-gGTJ;*f@1IBR$Ev`P2$~Hw2U8quZFy13 zI3{o!#8E)C;<5MP{bX}lf*`~XLb?h$G)<#fZ<0(V>FzG@(1UwvwHy)&8`IF0ue_#X zCoHsdo~wIzGBi8D2R8i~xqOb}M^E88E~cRZz$;$!5|XJTU;Njb*|=#P z@BXbfk{L)M{^~K=?^7UOB@q=Ue!fiahr8e^NRtGT$c%*lgG$^s3Yq?ws8+oIo`Xu< zD}i4J<~Z-5rUAQANj(WX6*vI=^U`i7WOlkpCYPqGJGZ=s&PPXZLa3kj-2l%GaU7Rw zwT_gM6)XBkrc;me1rVK=>YvhJJG8$NP%YPq0*_`p!mw<5d%I~h8oJ@*zvyFdl zk-O*T5JrOexgx|Nfz!s20gj{0K~iSS%3c$s$JLt>Y?<1|d#yhtVJOhpd_!p~NFk6? z&95V=kupO@dQ9H(ie0Q&w~~8q-_40xI99ajNd^$dgt11s8S~Zq9a^3sjtwFym}h|` zNoH$s&yg034V|O~TL!`PLiX<7Poe8H=r+B(cCwhik;&tSSa4_AeD%`^V-2S=&*=BQ zL`v2eo3&{)oux+yJ!whChT*J7!;xs0KFHDEejnRE@Nr)F$e-}(wXbKanm`vYn3q&q z>N>T2#T{vTvSXGKVd@&2dOa3e0gKIuzK{PU_P4%?d*C=;q>(Ton-DmG$b zc`?U&x$(b{%>Q>n2tm)#I_itF_)j+5{RMV&SEs;I`_7zDxhA&1|{i2KrZQ zV()EVV%3(X@bp)_heRfW+j2N}_$2jGlgh#jaTIZE_pO}Td&lF9P$W{($~w4$)|0f> ze_kwgKEl9T7Lm~n^XC=>hLr#zShMX)>Wec}7bZJGUE1TWQ7r#+Wc-tbSXe-gjlr5V zuyrdOJ-R$nk#U6KG@3NZbqp(^Kxeu^6omx7j&5iq(+L7!;=4YkZ4pNT-vd#XR2QIi zYLP;?g-5S;8EkE5=JXMS5Tr87H+`-l5yC(UWtFK?E%Xm`LwbPn+$643M<;|hW@b^j znyHPFqjpPxVHj-KxR#SAMinC8G?|{Bqa%=nF9Ky&p{Y+0&{23(={<@diaNDZCkvk` zYBZgW8XSVQuc7N|{vUNr7(_?ddns{8ag44>g|J2K;v_0pbcsBddl&PL?)Rg`A*P|L z#OpdBC2=g#G@VpFM-ccp&BpThMc0&*nG_mUGKG~)<2x;+j5|8)Y5|yriR*eeZ5JV6 zVZKN*mBbGM#>Xa^nwlX9l-+8(<*>|a6%j$;qiH$bF#l@itOX9%j?tKG($$qmH!ZRW zi5Du}`p^&0SDF$cslb7{VX^HQH*oU7JNe!xZ)fvW*Hai+LA$a@Yr`7+4XY806}C>y z@|nNB@WSh;l*@eSU+W$bJbQ?Ht^Fz^{RLqfoM~)=%95gPs4E;!2=}YQ298h(NwW!rK%r()b&L z)J@6rKfgo^7Rr53N-#`8v*vK_>;$Kdo#NcNNv5V3NG21kTfd5nFWJ#4+%ysin}NY@ zhK2{wLXcNVn#~qYTg~9ywyNG;rvQXOd%lfRD{^jCKLCBB<4CW;)YurMN}CuB-*usL z9SkkzMVFwG-DN5ZtWYf*GDivg?}aMmeDZqk5sBD=B!vHEYmB%;?eM zoSUk#cPu7l#FX1Qnr1N2WiVCKk!a{b5=pT2h#7qjD^PyoUJRz0S-}b?n{r#V_LFn5ij_K?!R)Fo9% z(x0>O0~_0b+Jkq{eI$?YGqi>32>78SWx`hXA^@(F&&C!1gCgs{WJoD#H!4qX@A~Oj z5(;Bk>Quu{X7Sw?Rw9k(G|^34fw}~Qfk$cT3_{Zw*|?Jxn|9Hzm&tVX(=)spJDEo_ zOd91m`d4kHXJ{=^7!r5<(1$nd#IzD@z4CcVqSUlW{`gL`bdEAGapGZ)KlDSIm4!~L zS{<8dC#jca2z?hTk>-Lco`>(Y*?j4blU526#aZuyAWi$`pNf=;I?YZ zbU(M%_=T7Xzi>SKuuABcUygSCgu)^q6&^vM`oMSEgn@^ZNU2?+>tLtT1b$2$Df(Ck zh>qI=rwL&odC?EH;9D`@zVQ<e}qGObDD-3nb`;$XFsKz$nNFQF&Bi6 zAtDS-B0ICbrIRD1L<&K|wz=Y}r%-FOD3!{jk_jd!XFxYuI{xj^CL}R^aX0gn)egAR zN&;{Lxug`N&4`BALE>wwJc#1+3!*zMaYG$9GCIXVOu~W> z7k`(sUgf^*!_av+X`0efPo~q@c9Ny^ABCaf)(cg5WRp<$OcL1wxxOLFQ|Huapws@< z^bU1TsFu9|!!(G(h*qo3T&ca7Vdq72X`N!R8~cu zCIq@BN!fyit6Idj>}z#QZX|}TacT8691$nbJ8r`%OX7#HwkKl88k4(@MHm{GTEIvi z?tbVT7p%*3;7o&KlOeV)$s{#wJ>pEsV5Y8;!%!}!=16r93Bi<@#l%3@z>N%g*KFjp zc?ri)L@dnYsFwqF4z&odxbNOa>G$uzNvz=1kz-URPjK$UDPp(IiY|$%>A1d&{+Lcz z94phFLRx384hv0*zxZ1E9}h(pRua?^PNVX3 zlY^bgBI6j}Z39Z{LpMyER!z;)BQ-ac5uHSzq0qmA!L{4yU%8odp_j#(vs`+^o5*$# zAY-2sd+uOi;slM#0*If+z`OrZ~()*?t|3kt8)tf~%eDu?ej6-Mhn3ByVd1^$za)E*14 zIsb3TY!`v&5QhQn`XcQ{g}`m0876TUKJI6KC2{}#uzEGL&I<}HsR$ZU#>$kWbD@=^ zj7t>yB(r(qXo(Xp&~#Pkcx|<-)hYqoe~{#s8_)6Zop&&PWbd*KsQ}PKN3K;8DkTeS z9d>QZaQCCLh#-aVo4obeT~rpUe0P70k;veCE<$!3&X5d^408JPS&EBwa$Q|`?IvLu z6ML=YQ~O2pTYSKOFCTP%oA)ICuygv=JakEcOsK!o5hWvzVkNMlfsCS#V1lIOou{-B zOQcY~-ckz6fAZT@gOGtQe1%jq!m=$~*F%e9p4+~bk9YrVr**#M1usdY)8zX{@I8;f zb*Po*l)SB!#Hb>v879c~_EQ*I#oU=AgiCE5O(Do-9HHqZVWhl?0m3j+wzpD{%oSA8 zwFuoS)(}S#&2ka1RVNO-ZZQ^);nlA zA=f_hYFx)>|074(v}NtGcDv^WjGvpqX*sM}J3=y(Wc=I=m2!=Rxp^+Tawnoz=kS4( zlom?Zrl4MLv*VHr(e(dX^}RGF_k)mfPlftBD!7kSxQKrCuQ@>F2NCH^3eR(gq~DRdQxrNncZv>FY{lhbSq zKfw2n{)l6LJC20TNUO=%_$;lKi_>aSdvGu7{^gsLii?z;j<sZu*J$a3%+?n1+LA}d zo76m)zR7RC?C@;_Qml9;}iVf5k=V;YR^p312n=LRidgyVgXu58Y?HVB0J4~%O zMSXFOcD;<9%+hX@Nf&y#_*t(+#vb4N(qQ~ys6=JCIm*1>gs_OtNW&pz%aO)H^feB&r0@ZHYbI3|uFbkjmJ3_{;$ z$!$j0H8fp$lSe^-?|HoXg9$t{By9{s=S}BcNgzVLXn&K)SG!zI(@3VX^bD|JH|Xo{!AjVSpPgoWY?@QYPZ2ey5ndUM z2rstTx@9d1+d!Bp`iFXdaZb8aMV{vdluLD{r)H_wY8*Ruf}LNwfOgv9pT2lAi!Dj5 zRHWUgQJi03Mc!8iA6hq#;}SY`HrWOfXX`YZI#H~;L7ITIJu#Ez24O5|wLPlI1j$ql z{e-$P?>@GV#Yzd+4QM$o2~#jTyMX5@u^~NdQ(hDpA|{F?13AHBQxe9isOm~dhVn7T zW(BcSBOluo?5JObiNP23n>z_nqM>Hy$0yo+_;ZgiQP$LbrzwD3+Kf3l?NW0z7F!xo zY!V~5S=oReZONVOb>7Sz0ZZ zMgW1dsCx!o!Esh31tPQ=$hDX=aunMEuAU^FHHjMywhY9~m3@j$wR_ImlEqLh_r<29 z+!P2Qd1c~lJWo8AfAl}e$F0Ait59LC2JK+k5SVp+0$W#tG7V3o?m$mhnoG715zA9N zbiBqZ=ikVi!`JXh@hPTm$}^RnC;sZMur>NihG8Y>Td{#wtwivjwAYtHH!XUG*JCD9 zwCm;bGuuvr@|-44vr6DOBvM(`=C)J#PLtk|^?=~$gFnEu5+u@j8s&KwCQov>lfc#U zbg7dm7}>ZJr%}aeR*1rY+0nyD8Dk|gcCq=7PzgBAD&_fc;xHhQ&U1R-PguX> z8ZLjqThvIQUS|ItH{&#`bPug%-9=Z>HPB6Up@Qc$u~Ru(wM8^dXY%Ae4&V2kCnQZJ z;!Z2usIpDX(0o)gTH295*20_40Rr z@)7{%&Fe`;X+E3$0$<9031L_mLSpJMS8XeBc(hK%vzL|WG!4q_m|OR?XhjL~Y4Gb1 zxlQG}ZAFB>#pvmCB$EkNts3FX*=bhpxRT23B(2&a@Alrr2mSZ*-P~=wzwnp1PMxHY zS1Lb-iO>X*A3*G5>#>?6#)>K@0XhkGX_zhK5~Qw!dhVRGNJ8V+Uk#Q?`akZ#8k;6e z*fi=*f*|D8^%wDt~%QA`Mu;cU2a+0=FS@HuTN+7~*Q(u_r zwATP3(TJdfJy^m6EI}yEL<-+?ux)!;wMjQjn&l#m#d(ssE=)U#l}syVJU_|CnRR@0 z?FR`wmsYum8P##JLo^#PuIqDR7XI{e_i}7HA{M$Dv&0cgD1V3vB7qQ!)>oaKr7}H9 zs;w!&>@oxhZ*j_y$givp8{#pd+FrB<;|^2qm-g8WMr6$E@fPoGU6x z=5iA@^!c=d1m(7RV7sA?5Rx^$8gUeGx~SuKo@s>?xW2@9Jhqgc!RK!KE|vj)%b~wu zu;_#&w1CwEI{VH=KtR12VD!LmzI23QL-N3*bNE&-1Kmk1+oswUSji-#v$HsDK@h2y zdxSDsi90x%Tmot?5W}tZ4{`lJ;n~46`BwQ`q%7#QCG&NSFovcpsf3b-ry~)ZUXXn2 z?itn%=lFwf?jg`Uw8-Qm{1Jb`N6GzYK;apFhLFhre4O8nMS;is`0*!2tv~)Hf%T;alCHbu!y5T zjTbeogJ@R;h}TxL<%Nk8_->ow^%qi_9>uV1;y9*NTco-$$KKoSMAyv@e#N3Nu!`BU zN4W3izwRXNC&qFDmy-CuFu&GxgJdR;)2tCk;m<7uWE|r*Yf8erBhwp&%Ao6Kg>G0_ ziIf5*c8>4A8@gdJetZw6mBf(oc_kXp_b@D*&~q^CB<)5;S*RK&UfacOx0Fb{+a?Nq zKK7!ASoe1`JYep|7D?V1D#7>zZ;X3tp%t(KV z3)W^?)o=0Hn@5R4opMVeWk7!>rqqxGk)%?pVOl2nt~_T(Cuz4G=0=aP>Y_`z{Qe$3 z=)adg>iQeLn7Em+bs-r>F%C_Vhn zMF?C6p$8;$T`W$WBbD#QZ#N!?pj2phWt2mQPrnS(LJ|c&mKO7@EfEil7V$J?7NeUc zsa%&rXu2(|bRMTs8@V5BW6`p%C@n9%kC0hVRb-`B;npLZQY!vpm7 z_tMkbO}>yLnMz?ACYF^Zl}TdS8lfK(o05D%P%Bs2y1tje9usUEVI}BWy%{tcr`e`i ztz+3XrfvM(F_nxZ?Pi;Wxe{~JvxHugO1aJ1GiP~p?|w@4kiq6414us6{s0j%At6$W z@MTCqNGJk48Q|d)2=%9fM~w!aaA^t$2M8f&xB}7tFDvCm&X>etH34dw+ zExJ(7VrfgEzJmxVZLP!nka&^c?1DO78B4P0nDn}^sw<@KT0}8Qi4nn(DIY_N$R?Gm znb+a97ZQ@1Sz>$nYNF)#unZ819Hn}lAdZ-AN#++-L85DF#xG<X2{FYBqvvpU=36W_B~?cw zX)0H>VgpQFv2s#oL{CZ*IVS$+uScM9i+LM=dGS|xaR0YJLcKiy-+Zk8lF`v@w~`s$ zW_6i5`7?KSj}58hVH@Rn%Clpbi6pIRX?dP1G@brcn^?K!QnKBHbPujku9j|#bB7+_ z?7@2p1D{4^VR=K~G%5(8VORPSL;n;&e;N&B>BV~-+s!^Og zjpsDU>75tYlkdh#rf8Lm)Qd{JX^H13G!0$T$l4N1k100A`8Is#rVj(3OrZ}qY!F2;t>P@{ zu3iS$UqHFtq_Ma_rn?`%S;ev~p1XJjKkU92yau_xVbb|7gl^E)nqblF$FS3QtvdPc z9!j1^7=~nWSvMorHmI!vUZ0GW!R)GMTd%|T&6HuhDtbXUpay$Em+kpnXK8kUI;Q$yVpqL z&-p`k>w9Upnz$VoJjV?PJZLmoHa1$qcjz55#$Z92lNdUz>legP$ms8cpZ>54T9CVhq!y?#7fS&XTr5ED=+8)D&Dw$%QL5#)}d^0yj{Sw7O87av8wi zm|x&;{EzXr;_vV$_FrOZF`58Ni`XbO@X`98a6&sn#jWwS%1xw5(xSy5iI4E-;x8De zZ~B!!Sbv!ih|VrH{I4I25S@gstTcaGE8Mh`^sU&)*pc1DQOKn?ypc1H-p$B{9rO&Z zqd0krb4MOHugTtdjS!l08CwFC0jKxf&6)l8q8kc`T$!JEyok+Dg<&O$X*I~P1ia8&~40)9_H+!`i`OW@h*)L6>AVhK}YlCXI(>;Q^TKOulnDOC{*KdBlJB& z-$m23Wxk!>LFZ{nL)rgD(c_$M;yB{%f3}XrzG1GhKgFA;ZbTq>$lk{*R{uJm9Q=FU zK5-M<#;!(3r*;2v%o`6dTbyU_{xc*@jY4J$p<8_C&Iv-Pkxj(x*pR2z@L8xeh@|oj zN5({a1E3|jucWweDzN5fTAccI~ zda=`4tW1HU(+y%_0?N3iSzf?*nxwn?5V}s_$6VN0MJ~?rx#Xv5RRKGz+C+u{-5Ze8 zlVo}Z&~skPngSMvA(?ykAO!@GAfL~&bJs;| z*}9Rzp?+-JqPMr3zP=u8+eQ+RO4(Spu9yU!hl3y{tWMxH7U^5F29fL{In?P=Xf^x7X`I-SHaK+`QeKcZZ&Fg7|yab|*+6Ol=o%oZ0pH+qgjQe$jp zfj5+2PQ|KHcNzq3rKc|tgt3NY+az;cq^%fdzNDmzJ0dMoN+K!IgRvXFV=9VoV*JP~+4bM6rUf z+lIOfVFd3A-^{p}!p?ZeK;Zab=&C4iLkJ^@5R#+?fuo8Ct#h4(gsd6UlZx0nBya=O zvOh4X)1A}sL#VYw@+lbZPILC$Jku4)Plo@6cb)oO{^^?EQ&jTmg5DR=MFboAm zYkLu4B+{qL(%f;dMblRuhbV?~#TYl}tP252 zGv@LQ1_#G{79E4H8{bEl2A>Z8nD6Sh(i%KTRL^sB?JLw0^IRx*ae1_hG8O)vukjw< zbDoao!sO`#zrsiAFBek&*AmE2z4+%QG~a1*Z1=6p&-BvNX;y5!n7OfIJoNp~KTf4g zXc|@`&5BKzP@FnNz4S!mk0k*0`LBO=0phjm%#R&g{(8wD-b|?R-?Lu#dt7kk^O-qw z1T$eXuzD*;?*EVF4yDjER&KroE1^VdHeGrhRwB*8yKZLu*dE&TvQjkt6^76>4AcHE zTo1MJOJ)l+DhvGlPJsMx6^}v)bX`{?xS!KKFf?6J2^3E{!mtv{J4D}Y6Z$Su6fQf@ zM1hahlx!R=@WnR?uDj!fh*348{9)!!0^jB1;uCyk?cX!BW*hh2^##n?0#0d>?5a)7 z9kV%e-w&xRme{r~&(@VDx9<071sX{c-tel;eB>VvacVYN7VrQ`b#9VOp@)3$0Glh_ zyf1hMAGiJnUxb~VYfOYjre}~uHcujx!)w*BO(lpj(j|ELwZr7Px=Hu+6UDG?v%|}R zfQ9dlQ);PsY(5#&m(!RiDTKWf3Y-^RN3>!P^Yj>r+a5qhai={m`AGA99M?}XXBIIq z2!oJ#$&z(xR=&Km22BHl2&*ux5UDkZM53EEsX`Bd+s5@(Ys%0ywWI1dy>;HA1K<;Q ztvY_Ij%9$;Zh_E<1CMrf5zVlb)^mFfBZl`BZ(`IKBhyny7g-_^k?mbU;54buPZ5U! zt@1qW#aUd(LlPoTiA9;>sGU<7D{g+m)^Pm@9mR9@BZW@ZG(mTFfu~=4B^x)br?Xgr<@28D?n1MWixaoIP|Ojm0^Bc5?dVl9HXw;I`{TZJ%84 z2x~9Ag6hH)6UQH6;>07gYm3Sv6g7*_bPbRx46x(cmys^?;6aOg@J*X)vPe19;D%)|j32yukk86Yw^!E0WPN(rYozrrqf{f)80DFdE zS{SB<@3hcOtF!x53EXp<%Pj(3H&Lyyn7Y>FbzeTpS8v+R$A8CX+v|Umg#!<&-FzUi zlUXud{p^@tLo!Yx_a^Y(awC&>wwbA)WzUH^FWi;n;ZqJrrUmUl&G>%!NR5TsD2pvg z6o<;n6x9l;&Ck%P6nR%TtU+Wy3hzatuG-2>j!k^+6fvB2M{E(1^jZkBUvg) znu_b6N~gKznOD)**Gpetfv)ZX{R4fhUOhxEpT{s27*M_M6BlnB#Y9nzZ6pzBNX;f* zS_`p9abl9<>^!=aL=ysO>twQ7ve_h_8xn>A?Y2v~RHWUilTO>nC?K0KxODpljvgLm z->A>f>Lg)Tg2i&172z;nTKCud`pY)5Zrw`$<1u@7lX7iw+?ZZq}((=@C+lIz%2VEozJXo+J5+dT*(Cs{D@@=dt1X#II z+LaczwAsgg-ojgcbx+p+AB%Lphn|rQB(vR&AA9Hty5CFTxh>8ey1zqLR&0x3bvUgW z0zu!ZEv&ofYHGz2XAj-WsYmWmylt<&Y|54C8esJWmvhC9ZzT!?PCar5$M^h@xpPN< z#VvM$oyy_6t>yQPLZ8p-f5kh)_wqIQYx7 zKreevSE#h+$R$@3d1{`&)T-FnUc;x|KjItu_jzyfL#j$raBvhzOr2nfT&9TCn?8$? zpk4f#TdeR@|l$z@PTN1~Ch_t#|+t zISlJn=4v)pGJ~~p1C9A{@|Mp+sRYEtkrMX+wWCww8#o_5Pu{Axc^AiYimQH*Uw zTzc7d!ayxD&kxCD({%R~NTyRHQU-`8PvpxXG>lYUU4za^)HEGrh}&o~yU^m;sUm&d zX(SqjUIWhysaET_?KV*u;<*lHSjCLNa}5%DNG4@7er|?xt;O7I89$VSfx*S@P6UGZ zk|U&3-Q0cu369Nb(7%$osVQ2G7UlU_;wYvOsy21;j8BXjgPdNpIrSg&NU3J!VXW3o z<1tzW4KL;m_PhA1_xJo{ONQ_5t&!Fxx+b~2e~#C@@CsrnxpYGx2T#qBFx6%ELzt>) z_>o4^kTiX@LkGC$aEtp6N4$UWcbQ{>W;#N&b&^KZ>6WO^*E{WNO{fAPmV)t;8kJ~5 zVjHTRU2O|Kf6FYj_AKpC!wc2O%h13yB!SPej)Ro&s>WL>MBV(Y`DMy20FBUB2WRS# zG*uzd_66B&lAgg~%HKq=N(q9!J4h&`G&CdN0> zXpB)~Ni=q&F;+kXktV&@?QCyPZ_{V)eqX;ou9?|gKv)npZ+;9b=d_nS3t;i&rtS@&wl3@*}q0d);9(W!+2NxDb97ml*sKnSHIYWVd0=jE8W9ugUo&h;>|@>t$tzLA%Fx|@If&?w@pG)JGjjdX1A^6^}=9sFgd2Aw4TGI$jLnjdtk=7)Y?ZT}q3WSuBe+oXrqhcrTP5o_) zZr1WqKV-HnghrCYNE8??N(2cSeqxd<6zI)q+`D0lyP^o10V%^H36vaR!=nWpl4wE+ zs%Wzdq<{1a^xgZ&NuRou)P2}Bm2jc|BK|q^Wdy4FZgbzYmP(y$Q6`dBE4Z!Ot{WC+ zDov)Vm%05r)eK$J$#(Z*=`mZ!$I*1N_4n;7sq+a@5a1>iM9N@m#i!v3y1N8xdSjCA z9>(TlENg*EH6~+goVxurJd)c=gn&pg5p;o*(A_&oabhoaCeL)Kft?>ftJH{s0A16F z<5+15=sI&j9xYKo6^kY!D&Y%(p+m-!oN#nEC$1f)V)e6cd>+#pWnrPjYF%e!Q9tRd zntwmm^ZcUEbe@E94es4c`yhlZjeYLY07F=dm}j_+aD zu4&e9nZs|^F>xuCn;;W1jz*)BP_DSVX7XI7^l5H-V4OSGPf+q5DosgqW;41B2@}0_ zovFF?;vS9Na|u$m(B_eL7_GD?Etzj9U|M_opVK^*Zw8-dueO)V@2e0b0v(B|Ym~|j z{`05zp~-;t`y~e|7D3#mDJl?~0BZ5Uu13L$Y5J0CVDZA}`TWAT5hH1$5#xoRp^)C8 z)H;h{39V~MwkV?-Q4|wI8VE@ubzDU^Rtkx&MQvMLMi+_;4?qGR4F8;O>i@-;tZ!iH z?X#uk{)Lp}*u^GyZV!=2La#x2&w8qrHt~NzZ(mSEE(Lk@r4ivSEv7j<1m1l5SUhqN=sJt zNdF$5d@g=OucNgzE0CRLV$aYr()k_&ugR|Uw-SXuyVu`#STfgigP~=|VmcX$Q+q(h zJo2j_Q<;dsG_a_gwiVv+dIyE}r!QW;w*EEg3{(ky~ zmY|W4$#r2^7H&)aJ8t=ImT{i@3dSCNfUdzsyx{fkWZAKUoc7mQa=yl!fBsxH{Ivx_u=TT& z(eGJY6pnCPZVO{&odm0s0P{nmEr+z2bW){1W1%^{_?}M^Dc|1{l4JO?@tqc+NZs(J zlP2_@k zR}UU@_W^p}_4f>Q2}*I&dTci=?N&;gFE859Oa-b7CDqVJO30*4{2*fE z-X^J;UFhjy6=PNx=u4O2tAjmF+=3m@v23_SYoBK#MLr}h!Lhi zDrMvQAwdvg=+Kq3sMJG*j4*U?TNP-O2-Y5V4DWcuiOf_rc29*YTdcEZ*ItH42I=eT z#mo^E4Wy^=@Ul`|_Jynjc9m`$%gUr=+GAWZ-LMG+VbenjQXn_;e z_CyKnU*IqqU`?n6P0d#oW+X*RXhua&Gx=`t1vZK;yux}5L>i`sy4Hnc_kzLXp0IWO z=?a+Hn!P)g0=;Ez_4-;1Q{qP|Y1&>7{q*t`>pQr9te6_D>(dZm>Is%E@nW64l~DJ= z?<@>j4{%!Jl0eO*V<`}t!NAY}rD6rQ*@UP?J!>soKA^n?8;g&cpCM^=5=847l@cnh z;Ert(h6X}Q$T>QreFpm%67tzBjfRWw`JIsfNT$l5Yl7iILb0x-ZG})3K0tp?;)W78 zfU}Otvh6^NLK_+E`pFqwR{I+oH25*?P|}Da{^u zRy!+wqbnI&b_^3c*JIczruJ;%z}5$_(>ZkAR029E)injq6AZ67j`GYHQYN_d-@aK- zk|flsRZMG^iQQX>;+S%&+(EI2VTk8>q|<4lD5BA59JZJVX&`h}GsAHL~-_6eX;2GRJfZKCgaPTajbU2Iph?)`etWeNMq*PKK9;5ZHDooz_?%BD z8?^htqSeyY#K8x0Tbi`eNQkr)v>q03_uj-WteaF%6D8!4u_PteMArpDOD)c{9PCVv zC=8U0u1pY8VG_K`EC@lqe;6lM02xu98OO9!>IBAdtI}`J<5hCgP_6JNPB`T#i*1uJ z=qYr=MrtPYnfKJw&gREA?_gqj0VkEgvMokN2D$K} zmohjsNDw5LiH>F{pqOZh!L)LGdt%Z#=AE1_+DrplivR;BWwB(m7vF6#Qwj;Bi)BXm zVNA1GA?*l6cNbH|fSFQ)W@Sj57WG(QrY%)%TX}X&Csb-KBgr7wI@c4#g3)wLG0ZVH zUu7sCF0^Z$w8HTG8e%M+N z^kiYKVbTcH-#eDhP$8rl2ue*s5UC{FK2qJOgqo)o78O_Hz2WPrP-Vs(BaRNX_!9)( z89}+JEJdYMp5U@AF_K8aBt{poa!6zMjG|J;Xc(r>=$hks!6lcl?a_VQedT{DXebxJz-n*5p z_xu7t6<@T?W2SKHrQhkq#&umL#}6<&Jqbb(1_u`sNs8B^$58yhC^Y855kA~bZ?I*#zk8!j3#!^6ECI|8FU0wRvk8wM3sZa|^NfJREg3!Qr zO!@`~S$6bFMwboKKiE$!4JwU*VyQ~Q^{LbXN~H=J-Nm*H!E2n#Zrw% zy@@7ZN}J-7{zvhp#m;F-r4}ILknxhhHr4!Cl7LX-n2ar2i$2IZ2}z=kPrKgrB9-{x z61|$Q2cO|u{U)B1IhP5qPAmm^0=*TJ8Y8*otUKqWXf4X2B6BEuTz6WsYA_*}5@ZTJjEs&@ zC}iofBW9)*kmtCiCK+3F7KWn5b|^MA+)yx8im141UkpvMq&s3sw+VAPBH5i$bBGm{hGWWE_*u_hLC2 z49ixsuZE#o4pKREMWK%n8tc~$(abvZOe}EJ_Gv!()!p;Dw_@Cf({}>#Z;x+akqw5BlT$)5zm2A4Jm(ce*2*e}`70pgpAis21ubQJ;Hl?XC zyn2Bs(h1!PNfeN=5+bR$P{QiOX}W=oL(pwxqMYMQJ4GA@{EhoQwx;$F_82&3nk0%^ z?f(?%u0Eo`$BNQKVThH^5l0brrht{o5LTwR08vXr)*x4?c)e6PwaZ=fW z+P|(oLeEn!MS5FoM)8KDK<%sJm~5X(II7>m&yR4-if*((r`nA1=bNmhKwsR=zmNQw zp>BiONkOq1lEjjf715KCAQK`P5k@+m7qV?K!88P>VUR=u5ywct(iM#ep<&r3YuBye zPu~6}f*@qa_T4O5I!dF_q|lXT)#{b3Sh-wL>%0Ir@i9ytEvJBN)ryZ{n#%6aP`qj< zWhmk_tz;g9=PC(eUDrBQT%#E>IWbG4<`D(~bJLUTADcth1fz==p*uFUW{jqp7?z0; zb&@zC2xCgKMUp7M4`O<XLFp{f$mSO@nwW?c)QQMI=W7_-(LmB1) zqLsK?KtmzPIg*O2wT?Ly>oEyFkKT6&o4p!_P~bVm1y_rPoGrOMyq~uh-^?xF`!@pD zLleq4CYF*ohF3l}%Xw!k;fKH2#?FO0J(kAK2^X(XB~H|Qf7et@%~Q#`FDtQ3!BkmQ z=R*a_Oa&4tJM(;@o76ltdH|FVj+XGr;BNr9OWgUJJw^XFo^fQm2LQqRruS|}H%vy4K8ZaW@8#z2e-2t*11pu`g13K^ zHK)CV`N=URc5I+tnx#>hZ@sqa4z^YBewWdYO2sdP%Sk3YEHN03qn&sX~y5^UY zo=dZ^y~MEB&!flO%qRF9rMVhCg#nEGAn8I6Q@gg1?;D~#I|)+aR!byt)Y(zfR`Zaa z;g)B2X`agT0eS}qSkwiDu88rn&Vp-@NYxUOQW6C|VW5O|B#_P*&HGeqp zA}3(d|_ zE6y^tbF*p_*$(q#y9wO(C_v4lG$F7PoBp_$WrfwO=sSkv^pNVlklfe+UFHZwyKHFM zm_ZsVvgi-GnX!uO_xGXin`0<1iQSOF9?7}KWjN{hC0udCcJAM+s8+TGiBwwHan!2Z zgjz%>prA^?$F5t$d;a2`^!9esY`XYpz5*$sU>kz~O+fbSX8AEcV`%S7^g)e2kgorfCO@%IZ(rLPf zmr|eF$(bt>?%b|$Dm|%?T6q@7l*9s(M4*X;I8oK>&N+>{c863wy9G?s*fo>TFZ;M% zyT3EDH#EuO9;ms3VpFtCl3;az!fZ`vp&?pQtO~7PZ()*@_PhF?Mugvt(1ai`(ySPi z%oUrIT)m|(2PZ`*GA1YSn>BT;G>H^y6ckIi{-GLsC$_R{I-(Iu8eUA~2AsA+C+le3 zve~29P$1YaQGzj+sg6-1VY1v>d6UiVJth1mC7)=d*g4F9dRhFxgC~eanzdQ$>zJ* zzkLJBVo6dgE|4TjO5C<>oKyzeaVQt(nVFfv_tnj8XsrrKCd%_X^j(#FLLa|bRWD*% zh(^eXH*aEYw3pEXMXUkkeQnw{Ac!N_{#UU2vyyDTL(+Qm`Hh%-#U|fy*mKI>h7f6`w{DrZu1^vx%h@=NiK3W#y+Ig+ z=(yN44RQn8`%-Wf*^*R%&|@1fn`YIP_?Y5DuSpb$YPs1 zVI--zDtQ|sp(`zrXf%9PDa#}wWhvU4K=J3LgysE^&f8eBNxi08{aq=^WJPdtava~X zzfS-~LAt(A28spa0kyu>skn{Bm4Sfh;z$HQ!7nBVU@k@{#)_g2%+ip3@u^D zLpLL(#I2P{;)um-PI=aO?}tV@lclGBh-R%!y;j9A43Z?lvMh3iUK-T}dV2fOG>uX# znL}#?9>?gq#=2wHuyf~5CMG6mHk$w#$hHn_((*!g34E8(YvQ{NG~H0LeNwV+!x;LO zY4k!bhUI_|>VYdD+YRN51ovHh_=X#n&Wa0<0^sOxFX9X4ciCy}V7=VIeW`o+y7&&; z#Xi=Y|0;Ie`zzApRq`dBz_xJA47WV@T3)^B)x7B8ke@BRm+#De6<^bs+4Cr-og!W6 zX;JMwkP_W6(d{&a!9@gali7XS(d#;1vqAsTm5`{D7SxK2tjVzMIqSG}eHn?X^0{oQ zd6e7&LR+`a(S$DhA;@}U$z{f zY0U23j&7LrcK7qLnUi_{%%xQHGO?e~5E12|NYnC}bml20C1%AW^DI!-%9PSBv-$#4 z(F7&CN!Q3?(zyawxWFQFn$yqT!_aS7eEqn z)t$3!8w)W_n@C0w#{`j1)@rqnr655P#&iTfq=alX%cZZrfCuh>giI#I#h1K z5;_b9*}^4ghQ-bL9lSpH13qJagHl6w+|Al;Ybn({-47+J2O?}!uw_yutXSFyFZKk^ zk6*}_jIZsJc=6#EF+=6U^2cCqZ;KPBZ+NjOjQ+fUelEB{HjGJ0|kv=ZFDK5 zV4$EAMlppnOqA7xKS~66CFU9tc}Mb|S1seNhYnEMmXIUMP29;sU1Aw6|8gPFNI(i! z4r%O}Q|B{n#2hmUo5v(oPqouc4GL+PtqEdb5yx(u^aj9^9>H11X1V^sA_=yVtZe}V zLm@a}ROcs~e+j^U@ZD$S0sH?-BvFVTM@LvWidN!lNe#DrBA)G#Nz#%&ec~8cx`y77 zquBNEEr*#;J(Ccc-qF5SDrtukT-#yVX~MwkfVmGnUWVl`H@=IR{o8Od1$u^-5e2Hk zjU(lcp&RBAZBH)WMYCBaj-scvSTaqEOtwJiHAtmWn5Ic8mBO+tCU$S4SS*pwsIhIW zRyzzsWttZGT#m(y7qfr={=;6^KqyV|C=3YPI&l=@w_Ly4Ug+)lahsE_8y1FTlg{^G zS{8;0b_xzDB0Hg*Q2NGB$^(7;@Wt=vN9%X6YobYFs=>cR;N-d)I(i+OZoZmCDsznh z9iwZ6FRt7}{>%nv&L6{zZ$6Q?OniqQIal+u;k%f2l;?N0r=PJc50NT#6S@r+uReiH zS1&v6y@e!+sh5kGmP37Ej=-(cJvf9dT`GRUm%no-cWo|{NE=;1(gIjmP6|7lMA~vT>Tl!5Wq{ zRaLh8bw6Ok(VMyM-Z}1jcrU43H`zWVQRz49G|EK+w~k>r#G&#;H+5y4V5T!LyNCW2 zE7>tyr&gA%?DgpxY;x~j9p8^=Ha%*7gH*0dX%y=T`-(czh8m4fCzn!kn!3=CQp1hZ z<1~y9ikE=84{TE~*puSIS6z%{n#|73@}{@Ej^2SmD!cb`#+fH^;z`G&=^C|KolGW; zl!98_!_YN!UBgK^q%&!J&trCGo@_pg5TMCG85>9l{3dZqpqnX>qI0jh&4Ah2BKr@F zQ7O%0nSz170&^voa@i-9a%j|QOpT8*HB&{(SXF#dvZz~f?g<5ca%Yt&39#%mB!Vc8 zu+up#E#`*4^_;ioT(bR(3F>7;*g&?Dachl-j3buz2wwlP72I(5{>~Vrg;_)bTfAGb zvH5r7zdCFQLsJQ_r4K}$z!_@{X3HVFW)!#E)RaTov5R2im_ouge915Fo+V>z?5{ZF zQyMidK?+6h>K6qBf}KL?7-#}|G6~}g?ZJSeqnWxSP7;zt(w9}$^QQft0_7!wVna}D zBnSkJK()BTSh9Ck(e-RYCvV3*xN(e$Vu-GpBuIMcR^19+iRq|WraETTW<^)1-41@W$T9ns(Xw~ZsNu;pRKE6+wUH?0(!p}?jxj)_9Qqf_$O zYFU2fGw7$E!6^^VvBGd@l;=3`=mXFE&4p-*OeJbxp5!>Fg+uG-kNLgc;pLQP$M8c% z*DlYFF|cGcrRn{o^F6FM@mx0D{&=7DLqj)A48ufkRn}_rjy$0^>Q%<}Jc@1Gowj=$ z3}+YymSv)~)Zq^9z965^)7#feI-BS6%P(i&zI~L-<<9RIGEpbRt(993)6>@ryG^821bU%q zkVta&gxydg!Ir-a=n9e4J~Hlz&txnt+M5xzs0NPU(8SUf0j+z-F$oM z2i#p)PqVy$&;+KPBGc7J5(VmOtDO)9m6>r;`7Rd5_mQ_l9;n(>>mfm8B7{_i60t=T zDauD2h6thI*DGj3FnzlOs#6lqDy!WDjJpAF%L^ z5Z4H(Yfb#=m?oo|_WH^@X8dW1oO=fxx>SeB-|(Y=`Y`6A={4=_1C zP1A?&zCo(h8c|e3*EAO9i%jg_hc1JTwsCuHscEotyoqIi7a26&c?>O!uIps84n51( zu`N?U?1ontU&7COeomU2qD#dG*Zz&rV62qz&1()YU6v#W7Ih^|Rs=x{OxZ^dueAP% zs$L;w3M@lY-sS<=t?D|Fux~b?-i%44Ng=KD)`M8^$UaFTl#jU|>+G3R4@p1L@Iqx7 zDo|!C$H`-fh_LOLtgTe!=4-OU0C{7439pRKA#9lF(!h`gsn8@24dvI~8Rn>u1{xYV zy42ByhAuQjqS5)^w9@d`&@j;X+u#E{P`H(ahQu)v{HUGKRpo6Ps_h>ng1dG~WTJTG zJEvp%Gs-0AKvA~F0|LubbT{Qh_{0xEh2j_d(cX^$FcX!Yu!wlV7#xIi&js6l>fim} z__d*%CRQrjnO$qXK@|E=-1X}p>4-&ceqCsqj;8BGfp-Ln^Vk1; zX8$&Xrjg2Z6Nf&!X;GdzKot6P4UDodxrbWm$@STjIKq!Ye6M-%drw2aC`l5+Fzj&4 zGnovgY2tYvm5O3s9h#^?<?MR~iNi=T zU40m)O|EYUO*051pZQ{g6)V!@`-aGL_aTJKvFENO*Vo0>zr3E$-~0z$P(O$FRNuni zl?wcqbvfTRucB&t6esu7zw~I(*drb2O_(>cx4Q)gqQV&7ZtD&jp|P2s`gclNw!2-{KWWnb5On8S@8r5yvrh zI@`JdBvvYeS1TiQoqB1Wz-{6b`YBaIT;E}?Dk)@ORliQnm&}$TY7LKiT_a9n(pe=+ z($|`Kf=UW0TVqkTqpEpV((qbs&(^)53BlT9S8@93Ct#$9_{LYhjbYfVUVAj%-Cbm| z84N=)2@GAwFbz^EhjcncDs5qy;;;v9S~m$ijZ8L8I&swX7Q^;!JIG~hmM&j{lTMM+ zTB0J2fXVS`c5K_t*#7;LidCX0q1p5aeGgrO{RgHf&d=ex!C|+ss#66OPv^jHrFf?c z4NK4BMHL*)qFK+-*zyo#2#UOiqpORk%UNE0oWWf?V#R$%fyUYkovE_27fqWH1xGMb zlNeI)ardv$(fLa7Y2q-!>ZD5@P3rA*iH1O{E9WVJ;Ir=(Y(7r#t}nr<55gO*%lMUf z2bw0Sd2KNnwNGt4L)MlY=N?T1moSE!FBt97sCt65nGj3(bmQ+h5FDT(T+kvy5z&ky zLVQA@Jl;bhA}t^wBo;AV65xxFkdT0YNLQa@1~g+IS0?CA#3FYI?+@Qevz7wQW#y1b zr4chzkvOJcv_~*rlAOER;-2k3VXV0EhL+Hk(RjzjNAb;{@1^0l3~D5l8uAGr!F_b` z?dYEgLyaFe-xS5KB$OCNK_V%lj^**s3#CfBWz?E=$!f*nqvQI1)C>Jmo2DVaWc zo@9Her3)@PGqXfWX7_Gm|E57sKL0h$-?x#~k2w4!^9xp6Hh!~?Zkmj)ISSJeSWd!* z8?T^QEpfx@ja(N!%-~M=Q~rQE8dq|^wuNhhhu9{IG|Tf~I@HSt0Htj#WkS`3ny-P- z(KJQLF?5X}Q6>|5szAPPn9A%VNs?e#Hh*2bjD7kzWBLK4CrIaeaJ@2b@?OPHm*2rX zjg81SBG)%a-_oNo`nu^`el&igMv^4h=^XWqvseSGxN56QT)3B)-SswhyyRYHyZe~j zwn2FfCkjqzr!)ACN{8B&Boa;NN?oosCJ{nlm)31O5F#sXVcCLVQ9(A!%elSz}!<@njvcd`G#49|Vu zsl4bV=P)qXM<$a-(+$!o2T4N8amZ#fq%$_U3Gf&vHBDkUIwOmENn#&l#IA|0gw=6Q zJNsOW%m86*P_5LcR%`6rH_m}Qdsvt+GB;ns^CRLYpi-*Qtd*IYub@X2Y%QcA+xCPC z;O9qzl%){XZIrs=fg7ZZ9@BJViDO7^Fn`6MQJ@z21X_TLM<_fz;o)g6E-ry3aRzftP4A`{HV~G}ZI^zG z@|nkxyZjoS!%Mkczl%ajQf{in?&2Q7d|guaMa$L~GFHOM#&RlJnG;7mG+n2VbGUhH z!f>JGdRNx?obfe&VqVR`<;_8SfNdnK8P;gHA!B7FwVSmiC0E(uYC_VRQA&VO0zxJ% z?lY*l36m23EPN}sdslFSb{qBGbzGy)d{U(xRH?gF(q@^)OpQ34CJ~Z+N&*_CM#9D& z^ECYkgo#WJVgep74+1}QzsfR3*(b*N7w;c15Bw8t`QW-ZygF$Y3Qt%qc6Y0ftt9im z@#N8_06*4%B-b-Y&{F0U0=#CelhoUEtIqMSRMf}zV(JOsNVUUl}LCZzKQaTK#*>%*M($S|YFu3^WP4ax@2b=90Rjww%% zqv;WbtuwTccwIFDw}D}W#F1d%hK+c&3aM-tgUi=Yott8N<`Mpn z`7eBC@lUw8c^+?n^n9|LQ~Ye;Htss%0CVh65`@0nqP-}juTqAS^kxM|59{2wGa^a^ zj^&_fnxc+LN#X`P&pU+==l@9^3){hP99EQ;urglGHGGU*-ypTQX-qrC@X_lKnnrbY zl59_(0$*twqsN>?;+A>zflWLZ-oty0*Yc5TF65o3Y{PHXnclU9Y|j8f2m-gE?h~OQ zbdz@X1Sv678TC8O2BvM1&t=#>HAkZq5yn6gvuJdXS6q4l`}U1<_Z{~W#}WetNQx3Q z9j-Jbx|S$u*R-zATPSGy>dLP-JhpDxf!lO>bjuDFFCFE~vrl8`vL&Qa4!L}`L%je= zKCfdt2D$-{OXjT$5Di2ks8)TpK5!S2*W`?I&Ou8LQ*Zc;jg2uoGtZ9gyV<#8H<90@ zR(EMOeMQ+YCCz5Ql3u8mBI=1rq-PlDiAel;N==Id8^h2rObx@*NW2iOl{TU{!Z8HP z`b~CE$C$e0d^(QKyy|IEJ9IZaDxSzVBuHv-z(?T7(-M zoZr`6)y@WpT8ec|UosqzGOx|@l2dv(e(7VDBzn5Y zRoqF=PROM+_AjUhiftqmvNls?<&*9OFw!k(hKerd$AYqZusdODuxnPe$J1uaf2F_2 zOT6>BFnJL+7G`8(wz?8JI-08?ss}FsS(hXv#Kgqc#zaK;GQ<}FK0YoUuJCB$Ql~*( zH2IwQ?+nR7{>!|Af6o3hUZiniriYI;Kfv){E6ZMgX5P~?4ksB1ZUyh7mNEx@<-)cr7WrEaIMQOE=Zn|ND5G|Qija1ga zPJ?L)g!cG1iX-qE;MO8G-+3qQ-g|g$^TXstfh0+2HX6$E^pIG8!!L<^pBFSwqlrr( zJU)KMYx&G`HqpP&VD#f#_~r3iF`l=G#p_OC)fq2jV%tWnR0afuzK7Qv@_lg?U&(%z z34&vl`5PC#!PnP}r=4twpm8*{C4R3iJVGy!?`ySGnG=`xO`7RAN zAdv}PD9IP{WU?7%re>&ll8h~ILuGv_0oV2MJ)bR`w*i9VPCbE>pLZJRv_rm-C!JAk z^C(m|j-Aq5qnF1gb9Ke3|M-5u*#1e3+z6vb_o0~TC?@q-m?pDWfq+4TVA!f1yh5_>p1CjU)WdbIYClQU2MaX;>d%DQTOgI18^JRK< zSZErwLH?SEk`!Xyo=98s=;?339 z@QU0Stn1Ej(Y`;!DRy&V_bb@dtkDPz*6)HBB+sWFB-BKe4b$uKTKg^lQ&Vbvp%nOu zK_bC21ocScZ?!M+k<=H-SurEsf?@*(3xc(a3~t^Mu+UI;uQCBU=%$x$`b8JrvOpo} zqL%^%k)uoGu)_>lnITJtv`o=W7weMM^vZ4w6lk+xN37`AS-#lix(Dyz{qlKF=h=R+ zLVpGcy{%0yG@+Cme-EMQ22Qp>(5xS3YVz9(C8|;fl($8pZxKVwkLAGD`^j|=GPQf- zAr-J%=qQhM(Ge+YRx0Y2Zy)<7h&T#K=X()CJgK8vdpvtY3#!MU+SSd}qGk)N)2UTE znh^RvTGT}NWqNyiN#)OAZhY6Xme56Oq#MUEsZ@$Wp+GvF#xM-RFr-qcJfjwVTLxCt zYMA@?6B-7FrWt6uj?rqV3r$l>I!>k~1*%lZF)YN&YEMqwm`crrkj>RkGK9RY*ff5Sw0c`AKq#HIX|_o@9rONA?V z-mVqAulXl@s`+8=O5aU)VnIDmK^EweIl5$le3CSvw8i%&k9KdO2BlVK=p&R8Hcfn{lEdb{oR#37LcUd-G~ znUrJEl~3XMAyZSc?AtfNrVWp>Y2#L^N8~Cd6 zUkC(Y3{lIaOw%A|L&a5(5?xc&HO!Ecms;$ZgZYNQGQiLhQl`WpLTCmTykHe$yZ7OT zl3O=7SZKnso`~a?cTucY**qo5Ja;uSfY`VdpOg7X^dG!E^9GusT44931CCqjFjtQ0 z3WnI$90y&HvJARPU3i5(Ozx=Dvu7Rmb02HMm6YlcDa+)H@KiEnsGf2UZ~OUI&|lgBYkRtNs`3W z0*&o6Fp!hH{-w((WNkL=-9*XN6i^QEjWT6fX4+DWiDsZ&1j9(t*P=wB`jzR8y5>IX zf0RFrUxP&Q4ePrs={Nb)OIOj`*TtjyB4%}WpK7l9Y=-jc z&UKz`NgU$UE59{f^b?0V7fvS6s#9LXs*}%S*ZSKS+xB3m6)!ZMe9sWog(;AdeD5%) zzv68SEMCPgj7f^{qzN6MUY=!O$r|eAwrkj9J0VBDa<6sXth9S!zp5{6-P z779IMW6S`C&=h5@U4?6{gsvGD$ONHl7^aPtN|VkT2+Nk*!%!iI)mw?NaeZ|P(vp8jXHKZgIX~*sb(vD-@1bD=|AC^IOv1qBz@7u#bp37Y-nEY; zi7`wI*L4Yk0AVQF*6hrD=k>xwAd`dAw{SSxcwn%P@sp3Gq3dKV6H_yY6I!;V+QCju z2UGX>6{nPHagfg%q%;l7OcVV;+4EQx`-=`pY!tM zg}lG^c0QEb)1$o@Tc+n!{U(%BBZ zqju`n%M|)YnLV)mu$MCJ6kfg30{%);xh_tA(d(Joy@9=(?p8y&L_Vv@Ty2{=ho)&_ zSr)$Uv#_x6v{3PnjjpaPmM>pUu~=kiXb4KBRzh!S+ZvXGVOlNln~B!)wN2%^uu~cG zy*53=0z0h|@Z(YKD&hpPT{h{wO87Tle-&pnFC-Qbi6U#G8wR>Ah{85c5c*{wZ;4*Z z>CW@i0T%+pwz+|uK}u|FZphupUtRH1lFKDmuGP8x_yhR~40D(z$ ze!6v`2)3KM_(HskrW6QE(O{%*k#Poy{0JhoG4Wy4Ej9nn^$*iEII5g`QfVr)6Vyv{ z%=8k8ylK@5LVe?2#Acamrcwy7%8td+3PggDVyXee)SQtN6&o2N8)zMJsb38~LXEOD^Yf#^o5p{t~XXu3(B;-oc*% z&@21+AwL4(%~KynPDyH_N+1J%Ab-FC#<+*Oxrcj6MC&0EsekVm9|j2*@e2Nezu@!! z$N9YfF-#QFbx~gzV}_04ySSlG+_qKb@W*b-l=xvnGte1I2APoyBwEYkK$jqu%qv2H z?4+Jy#y2rjHo~v*;^S;~PKWH7%i%R^_({w^M&G93TbN!<(~H@%bq@o*SsvP2Vx3Xs z1JMWg03YZS35O;|sq2tRsfUoJL4SYy0!0oDwdNTbcphS5;YlB!PbXw=FRWU1uyy(C zKF-f09)0xJDxLKVEhCffA&EogCiXz^5!*E7Vx;#Jt`9F@5Vyhf$7fQiHKu;U#CK3ng-4%1E%hCzo% zZdeYwZgj?|zi9{|$Y!%No6V;Ly&XwtnnqVw7lVU?6bc2N``qU;=DOSq7*a}Qoq9-n zT|LDG>3la`YrTjY=C4t!ASv;K z5G$3z$`mM1kMZ8{PxvqWhaBJlhUTdGz0gQPAB4ceS|?C+(CltV2Tj?R(-`a#Y@J*n4t$c%D)2Ek zg{G138^o=Z@ai>U-y@UD(X0z1Arz%dXqf3NrezZa0X-v2(M$ukUSW3cb{4HUk;>d8 z^9Od*yJ#7`qstlF{2+1QBZT0m&NT=GKdpV8Po%!ckDZ@mXL4w|ez4V^M6KhmF*4Xs zE|+1^=rGTJ;qy4@loRkgpV`@Yip7#zu?p1%34H(H16b0M+4eDH-3$imP(e4 zSdBW&5+4R`Hc6_#m}6pFtmh~18~M# z#ize>!#oRNftnlBW&2oKLa`wj?$H^_>YRGw64pNFc(h;K!F(e?*9@XqwT>+ZA7HRQho40Fv82{)a82?P9^xU+<}Boi`+z0<;T>nPddHane6soX+`~N#GmMA@ z7mACJtt5Q2yoJ~EdTtBu=0Er@Cvz%Inq0%xoXuJMid(p!`&iEgJiLRaQ?wrV$2}iR zQ~fiHgP)rwSD7YP89#(Q|H!9qI*0cr@57NPCTm6FoQb9hGP+N|;fb8qHE@xCA)oL* zLY|x&T@dnp{R;l_1vgUuo3~+EI?Y%^n1-5NST<4sx`vTTbIpDCGy28Li5CuFng)6t zVd;|4b6GtU@X)prA(AkJv}3VV-@;kZS)C2A>=eG&IGDUHy%c`@%7v7I`%PpL6!^5n<m|Kj-Y&%+Rc01g~L+pbm>x>%_heme>}^U zEkhKGplKMoVJS3wDhnuCJkxTpoD`;Qk;)k@YMO%m|GLV&9Zs6ggG4tCUj4z#NZl(K zE-q!L`xs_+Z=;1Vr)zjAhMl5boaLg%OL(F6V$7E5i`~*p{&YPS6 z$|qm*EA&)>uu&mN5{eW1&~$^IktI0UJmu-}*8BuCLsu(vDO=cKW!+k=CrtJY5IYr2 z-|JN60?|qCvL)a>KfV`%AYJH2O3A|H0n%MPWV-usDgei9L*Mc^D}Z>I>6M@7jXjtRK8dgy6^a)jXiD=jZkBaI1M2jljq0?n4Nn`0zqU zGjv854X|kO2rE`BW69D{hDHVz68+Jg{Nm>~FgY9_B&&R{Ql22Q@oY zKW_wJXc~(a4|B$IPiFG`a{+j{P`N-Rv@A~ry3z7DZxuc0f*_EDK}Z+`R4a9MY~RK7 z_6Ha+W@s1#1oJw#-Shxk_9{eqK$=W0i)9FGCq)#66f1SKN|R!#hU*558H!%$=mC9> z$9SC3XAiJ%_W|bjH?dO=TV@J013?^kbY)E%ZiL^gqQy;8x&@KXF#|D{2F7-SX3s7% zuHgJL7jeo-E4k-^T};OTzLlb3+eqOd=gY)#%tBovLLbXXp&_X?Li|uk!wS^?&(t+; zc%(^Rw$7!xVAlZ`FR?gvmBX^kQZ~9aUw-!~oSmEH_9cC2vE;IU6NDBtt&rF@@U1g= z(XTZA_`U0qBwQ`8=5$VHKn(C^-rPA~r*T^6^Uv_vC%-YzIY%Xtr;5uj=fgL=hW{)7 zo{eH7S4>^WJ8B=|_QGcT&;$;x6a_1iCA==Wi1$Q)!fo8fhxicdS~) z{^0orPc|uxfadrd<(UcMMv=5FsQQu>y$O?LcwkJ4!3=jvrYa#T2TdmWH}c|%Hv;Ox zEcDhaw>aIN?Le)j=0-_!urdyUgWpS%XP=k8umE@8tv)}rGJecQv3IdLOQ@VUGD%k z+7FMEW3y;I`RHW;T+~_+C5c-2M3F*{>YAk8&8k-Glu8v!#R`o^ zgN3;wQwR1U8zt7AIEbA|vv0?K_D$7Um~WC#K{*PMNyLi91!kK%Q7Xku5;M>nGggn7 znXfRiFotGl8ST+n)D7#F4KX~JW6Q<{r>x2Ii`)0Hb^kak1`Ya#meJeQ$IgB882B7B z9PzqK&thVHhP&_B#dAlmWbKubovCktWAWa!gS0H-cQ}V#&gpAzqUTNTB~COfLt`M>(7*q-cAGr1^2#1fK-Y_>qItB+)252icJTB3T+irvN&U+efdgOETCw-agu7fpe4*%Y7{HjL~*IYyDxaW}R z9>i^wvGd*dev@qP5NE#XGD4ZK>CT@sx9L81PR=SzYbQ;yN;YW zuww^&<}+%sVi@Y*p`RNDSQgxO-(i2&-Q9zx>(2a z*D-X{LN_f8AxPzN!ZH!d*6TC}1dr@|klhbGgeEjJ zT`6Umb_%~)r^gv2Q_WH|6?{KQVi0ZP`c`|mb@2bZ@u&R#**_(4n>=#u4y<#MfCP{lO&RzJN9tpPp@HSdJds! z3=IuXtyF0=U7AgogX(YckYq0C?#>g2%2c4QuZLQ#K`xhJ^_rEOdirx(GjKuvm{n{| z+oYuARMc?@{kWsrr0XVbBkmMJ^K(Ut#S)d05`*!4pCHk()4fz0A$Q$Q*0NzS;`^?WIqDI9CMt+DQpz$f9*?rYVLhJ_r{~Rl@D-2 z>IIaws>$y9XC|2Yr3Xkh=ijCH0G-oZV2Dm`zRm8 z;{$wvPxEP_(8o?^8C`V}yVu|L435z6E>h_%Q4|uk=HfC*kQ~8WRkrX)rcD%h9Rrb6 zwu@%1^gBkt|9(TbF8-sNNDo$t%5xZ*JpF@9@us&h@ccSs+t)Mmqi+$10X4&9<87B? zSPsov5z|h!oZ8fr@NvofNftX|!v<*azMm>A%j!_es?`d`;sQbN#GQ^Oi)=Q_xup{C z{J{@6?&On67Yfuok5oR7ux$b4Huw3%V|_)2bt-=_--y z#uHK0o**OyzNB7~gucf3Nij!N>)79Y6tl}l%7i#dkebAAHmH~8d4c;}HW-@-M2JX4 zt8!Is@g$BBLc=h19GRjo>7lgNq4MYqa|iaa_NV+Ti(t?$buA)nDH*fEWi zqR+%(#N6KP#4WP|T{p-NjNsPFG)fDPQBi84HdUG1DVK#%-1vE|NN>`ujAe>*G)i;C zaZE0gW?-_hh>?>u}ZYfriVt-!YptYdL0D4z1@s1 z9>y>XdV0ID&OC{`UwSsxe3rW`lRMH5uBPD`I(0+MSzIA_tAwk8I8JCbT{0O9-GrvA zZV=xOnVTz8E|rPGfG`M&1D8z7Af<)upRBWSETQ4Ud`+?tr0_;Z4!?%t1l{w|eIMZk z=z)(@s*u<{%m*G_U0F^#^%$H?nm7#TDr6|l%(84aN8jKen|IDLwJ^ujLI^Tuad*N* z2`0-f@89(2q}(pfxlQuP<9{z^0$|qG=Yp_Qf0%ui)+8dr6bxejemwd;%$yy5US~4gNx2ctkhW*rJUdSGEJ%$0HbV#v z&9I35r$<+^(|H27PIZ0?godV@%FqKPahlHe(kRa!Rsq_ntTMlOqD22JROi3%kgbX{ z*FC5l)W)`>X$JRR^KA^%K}t!sdw}Y~RBK+Y+(VxOLTeJv1~;f5wX=y;X%L zNuoqwTF1HBY(Asv9ANqK<(zfWNu0cPEl!d!l1gFZa#)sfr3`|A*&yKVMgt?2$&&4I zFdeWQa54hhX|>i-`}$-cxW|SBYQ=zRF(PnduDj+xIHveQyj+Rm)PCBy>Nt@YmQ5Um zTo}B7D~ziE*+Oxn1a6W<*|)Y{*Tp3iA$lpmbW)h9G_!lR(LJ&h&kK-=GF2H`p%moI zRGLaB~@ayEQ`>{GgS-# zfmg3~S~v)Srt4^iL2Y3MJC$iIgk)!4A*B+EFr5@p;1fsT!39iD7n{#ogqiE2+J6B_ zCQXvdKt6-BdL@spT*juf!_Y#Rldr#(QmM@DUHi#pGZeZD9N0I;)a1-zRk=L$|iP!$0ClDO=>oqCXNEC z#RieTfQVt~P#W26aLYE2fxZH}rhK}39nA4Ltc%|XO_x5$BxmS^O&^(nZs;`X4N{^> zA!Bm%8Ka!GI>YFqJf(7trGq0_xh{-UmhQpDoPN`D(RTHdonFdk`aZ?y{U2foNy*h& z~c=h&Vc>7Iy&FBzMYlo~NBmlhbC52(2bHD7h6 z3JkGj+-I;WVIT`XnfVq52JhnCd_{cauxjmFe2YEo;Z||$k>7;RV*E<{3af>9e}{Z0 zZ{f|nn|Je&c<9JqM8K)?RQAgQd^h+aZ`R%e2pmH_4dO)Lg$aHr_`=mKd1$HOM-o#L z>?s*YDR^LaKoAE+LT6$BHts&<8@%_r?{kz`!5(%qyMNo`P}u+7Ldt|jwfMCE&Tm#* ze-992rLrV(NE8HkjY_Ah`PfALyX4OQ?nBZj&CK4H>4ebZh)QcfR+&gl9&t z<~#4D{DZscjbDX#$r6q$=h^hD>pK@&X?hGK9G9%+8~WEtBITW}X?jPZRnv7qV3^7S zcU}|;_e~RJR5EQ;N`yf`6nNx%2AJLZD5j~TQtfn>Y*#m>*;(3TEJGKB5qK{j$uA#nvbfixC*yGMzDZ6L+{*a=!gW>QR%R zqD$b`ZWBvb! z2;90FOA3MS)^RdOQ` zF8SNbxcnc#+Ch>d1W6QeW_&6(Cif(F6U&yzZHw5fKyfV(+}6&8GGJlH4)%*Zgn@_M z-AAJ|hm?|LrPwl>5lUnr^r)3e>OEWg6h_Jrrt#)W0Z9MH6)nALL6XQ$Lor@HO65au zM;3A<`7BBMV?K+_Wjd-l=|{FQe9=3V-D=>Y34t&jgyv#cN(0}mm0JjV5Ko3d;!NX ziNXZiGSq26@Oc5BlWJiXMG7$3f+x^Am9%FEx-RMIwb6UJ$mSeYA9plb*r4X_BArPi z5$IZzBnsHS_W;WVO_r}2q!i`VLQ-hTMljGYv>GYLCOgna+A-0xI*qzV|B~g@=BrdE zcT<{~q`SYD^vsC_!sDaK-|=}q&sp&q{3`wl6{`G*AM@Az6-80RG);239BWsuW&i&D zlv+X~mSs_^DI=XL#g$yimFoP;G)J+56|7*A2_6s+@KX6QzQ`B(IahO+xRYTy!t2Ew z_=Nm8Ym${M|MP@K09W5LgQdq*J)QDo#7WC_ey07BOOp%ODmU|4|C4-N{}gkXDZbG7 z0-u(jW&<1e55CJ+#WPEu|6SuwaVIO~O74^Qv)Q|qOYOJuh`tE`FVYATi7q64>4>vd z8Qi^FP@2~|okBNs(KQXnC?KS=n0@%1?{ML-{+67~QVpt4`u_jpqD83{LMM(QdWM$K zs4O7)&DzGl%Sh*Y7+SuL;?y3h3raJ@v{S@k@RS^IP1jrOB8hGo#8Gsx8i!x2te47m zF|=$AGyAsUHEKK=^XHjH+fnVA%*>zYwF-p-wOWm_u`!Y)Vd>JPoN&SkjE;_S&N=5` z7zTUy?#1xaaEIAiA!`Tc#!0Mbb)r?3KUR$INjE@)^|##0^xj7)4ZegI?>dDq@7ckF zKmU1Wg(47WhQWK>KjzcMXNiaq610|Loo*Pd>MubEqcwAu3?+l?_xBRo5n^PBT2G#M z&0>V6Bkp-f0qLX?gDFpsVWl!eVbJP$99?r*p5OnkmaS!LX&KA5mRHNRZQCt9X?fYU zKh@Hn?B#lD*?4~U_t$@Qb#-;uxzBl@7uyeSN*#JzB)N@#p2XrhX0w;U4c>I=WwVfq1xw%R0-ik z5(zzAWz}~?lh&?x{^`tA=9_k(70$pT5tX#rM-!-f8LgM+6J1m11LbNC5!GWD4Q~5g z9EtrdyewK6@6h%C=8LSeKaLt` zSwIof8f(pO#%OlTV4?V6?U=8tk}^{!4njYAuGA&@{ka1Oycl&0ck5Iv(=t5?Q4mqS z83N1YT%ntXhr5A2_d{&A=<6+=SbEgyW z&9$tq5cu8~hIOM`TbpVyN&jkKu-VC!qR7UXKEc7kAx;#v?gj%kJ3FKgf zm%F;~v~{;DsMB0^bC;KGX*82gJ?y^k`X3`5K3i1g9;5T;?aIJ>QNOE8-;0_4(p=&0 z)oJ?#T~}`pEa<0q7(c0_+(Z7#{c?eJ4{9g_Gy_&(V0?7E;MM9Sn00LQONrYLNDFDl z3{*7O`jy+bu@6anE#br!F6q0O>px-^B4W0y1LMp&1boB9meok}P)f;Q=cJOEu87!l zhn{Y`fC(s#^WWP3?fe&!2#3Ee7Py*uYs=4v&fcQ$9_wRj&-$R5HL$Vl!<@#wb7$5| z@Dn-fC#hpz6e-Hm05deLQuF!pG>n!t+xW8SH3h~A+8)&R|8*3 z(uE2<;A6vm76?OWj{3-=gAET0AknOPO%Voc(WZ>pjeB2+uuc@&Uq^A!8CSm-%hP-G zM*b%j5$gp{UHLKBp%X$;=HTT;IcV7McTDJV9n(yn4yAJL@W&-Q8;4Qc+zFjIJe_OJ z*SvVyU%|WPbdhjgrYYJ8xhDm=sjI`SdFLW{w|TE_r9ZM&^<$~OF`)~|G#6Jj+)p_5 zyqnGOBa_RnSp+xVsWM_gu3{~*ketU?qBQIGRsNqjNKrPmgbM82|egumx_l-g1>lelCTBdA>?^X zHUie539%3#yo6Uh%2&7%YJ!ek*9lNkNWxAE^8Qz=mQhp z7VY-b(a`Mm%(JC|6BMJ}NB5flm6!4;SVs~mh32p2wMHc5FwdgR z%2bb`eXBQo&?&u41V_l)lLr=r4Ntv)mMzw|Pt=whXb`x_n?P}J^;{b~VSFiZIQpvT zJOKUm^;-@jkkQ^>CPoR>slKtMML3O;nVr+X&1vu-KJVGd#&TUiIcjj8>P>L;7oV`s zMK!075C-+N~`A;vj7;6W6?SpzuZQNwZMJxXE%$VQQ6R(wD|8d6A zw(kvo);c@_QUlm>f;l0xc?Vf;Q-!_dm`;V+dD*dE}q+DsuBPK?lU1(0(OQOK=#{m2}3!Xgcg z>W}gcW!zi+@U!ILA~uF1tI_kWv_0Gxh_upu1d}MM*_#Q&gdoy1 z(BD*B`zuS*Sm&2HI zfDd#RE#TYxM`JXt++KzBtgEJNo7{JyX!v)TS2WPV;}0lP8{3NYDD`CNxr_}KiL z%b!fo_uJJGg+5!hIR zq*6v4D|N0)pHCg@QHunCER=Gwg8OG>8q|-fkeq^H{aRJgLVumMQBT9Vj$KqlBqV{8 z()0$$mxd%WY40SHhR{|b zBR~wD;cj{F-1RI!V*lHRFSl&hDQ>z8jul7YDZMe2&-q2H0D)63)%XSJ+@HNPdNQk7 zzxZTB?>eSPGQ=TVS}a%@_@}}viiPzI8nh{Vyke0v2g~Jp@#H^ zb?rA}zbw~qSJHOSgNL|*zI7c&Wy|o1b%C_5uI!uTi#5Zg<&Mh0)xh6pY&90aSTdPU zOfx^eG}!a=Vi9~M8ERAkEefD|jeIqZGb5+bbhRTbL*)j$mum3A9qSAK-tfq|axFYy z(cM9!R^g{QcqHquD$H5Mt=2`S4x@O#T@xDy8?=?RT}3Nx{oZ=>$J%Bqnlb$@KHlaC z1S2ZovQ7YCen;cWq<8=6XWmax4SQa(XL|0L_ptn&-a~n{%jqkb<$9C%h zlEY%9!qzg#@AipUc0&nfhW@CJuLo9RyzGJZIujt3pi8<0eU!ZD=l8_=k@Wnw92Bip z7hg9>&nos$IZ5Q^0Os`(eDRY@EYzX4F_M9!R%@!D^{uyUDCg8ezmhd{9fmrlK=R>T zevhB`2nDY2>4|nb^L_)+k}ifiCRaq7n3#k_Mk4gx)jAhJ1Zin$za-%frfD<hw2|?&^S@(eFAZ93nVI3h7B&{R2w}$4!A}2I1VLnf9p)ca`wOb>Q@PkJ$=>SJ zE9zQDkxAb$+nAOs?mxslR|O48wG6m`zPjVA)|5ccm_3F^ZtZG*9sl=EqRJq5aqMPy z!%hB`46a6tL2(!cynMomq=wCLWAB2 z0o&#j(l7tCK=(8)(dn;aR0+6wT5%l6oahqGTU6Huz^v9uoZ{wj?FBPb{>MeH<(9GO z1Vwer50M@Ee4=&BTrYaS`{Ne(ZsOTAqpc1C2=jnjoI)C)s|W6HtOT)pL|~q)x9z_6 z+j@*5I`j1?ph&$?*fx4U*i61MA55gx_i+M}fXBRrm7BSs`|g27a~J(i z6wnvsTJD!D*0CT4-M_( zc;SiSs1YUnKkIHbt&!R-?$W3}LFjrY2q?Z3H;s3`zCB~-P6O9_vnCV&aojnCbbpol zf*Kivjq0;JSpaniirm{{zebv{e`I}(HN@LwO!sg-64mUYZW+f9L&Oerl@2-$NZ|QS7Fzs zTGS0VMw!?d?c|A=|8*XeDiC%}+~4l;Gt((V%<-O%3Pkp_z^n3Y=N!;}-=|yEv#9d* z%WJS+7ER%dRql8y5b6-@p%AIRihj56Xu84>bqvmdw$xK8;BKA2b2_6MP55(Bnl5F_ zrGs#Dv0IM4NZQPAn$Tv=4^GQsjI(N>$d9a-R4&ipZpQWaG`~f2Q?JaH43ivU52;VL zBG;-TJ6{WAWi&igtUxH9{h>UbsGaz4fdU|-p^Xh;3G7riR)RQf9+i~O`<2U(TP%!5 z_gT6{yZo~^UnBRs^$Ff);f{Z>ef~=i4dtv|uWZlH&m1bv;qd3Dr)F2Xqd*~YtY4Y`tWc_aR1G*hs`^bR7u@$BYiB0z!UQOhqucpXoUV_15- z@8C^Rxw8dMMknzWHpAJ=mJ@@07)Xzf@ZQASoqXAq!TR0kUJiU~y)#E2)W7`qf;wW( zr3qn4+085eHQ-tty=?A4;+Q@AZYsHsd$|7Q*O^|~%cfe8j>FiZu zz_ULYTM~d`q&jN?Xx73^6w)~O`Q`9s^6SjjD{EIB%!m**H8lFz zW)^1G8t1C4-Nb>jV}XtuxVy|egt8+gCw{dsjsF&(Wmb_iWL()?=`BRLbtk)3_?%6% zRNZT<{VByJ%{g0aKYbAT_tUQRtJ0;O(MO}-InVJclYC{aWR-eR)E+cA=}UipQ?97^ z+9gb$!IYn;%y{EP!iKJYb;p;>7iJpd!9T7I%x!&JS$DivHFG}q_CHu~YR@fK-S=nx z{X1pG%7ql;k8QM8QI=w(eED42VdFGnF~VGf265SZjjctOpRJCPPvYrd`0C+qOCP@E zPHU)>BnQ6`mWH--YRqHTTVRmo)?gMX^gl>ge9rvgw~U&dgB*VD3PR4(ExnexHOeV2 zJ^$a#Y(WP~3f5=F&^c^z_PFEs7O7pn0OnEL${#WexeS?cnw0+9uT~jmJKRS2@)hF6 zk@6%Xu9AY5O+GE+WhA(xC^IU2OG@JW6_r|5w^+Ax;B@*V`f97>-Ij|2`B?-0+-UwA zW9Mh~V??2blk;;+E32pgQ8i#@U$pzE0{+(KKpZJqG|U@(R`W{b^*4C$;Ul37Z0Myg zBr@LDWeUCB5k)~ru>0sIG4VpcL?+YVm7Jx|plv)8I%Wwm!T*A-AK=uL9IoEaKIiHB zeT1nH+tfa3CW@xNpcinYeYC)`cFTSo&vC_#@h@ z`ZGbC-*LbIG}P@0gjVq@Q}jM$#VwXX)KDW{E(kOf2?z)TkA6P{>ePH2JYB2?-XUdW z<((H%|NFBdub9TfItZ&#Pqs$oNFx7M45TX|A>ndP3X4-fAa;H|g-$`bZhUCsSHyd+ z8RVV@F%L(a|=97M3ad5k4YK!#}OuODg1E=2)@29M*>to9^oEHJG zPzJ`tv#O9H*fS|96Z{$NOYG(@72=BR0q&7S6A!cHAH!as13jR|MPCMX9G8cldY#Jv zhlbjgfB8GsUAUb~^ag%yg!2h5zbf)@h#iv_N?yeE8BbLDXlOcXR|}WMPWO=7YSq%C+T?LG@enS*ut^`06>BepU1PHO3{@XS~k zL<);HjEn5+1{UIM`|hLa8<$t(Z9&rN(v@06u4KS=CCIYAwPggHl$BbF>H_HDW{rTy z@PzKgOSqN)iW_P4)mhl{HRC=j0c&&iEw{YWFEF7NB@^S+Ay@q&mJpRMiJp}-&7#}i z)t=W54GqxySk-k@3@LAlQU-KUU_a$5kVftTV(7@h)`x+$_8@SnWOqj)Krdua1_F~ycdG#T$Z&Imn*K8UcP7>_CC zEr%mUw++GeIU7wN4SP4pts~h4jJ?S9$n^@ozuKel03 zhU6brr1({UA{eXAm~ucO#fb3=`P>?}C{4P)iMUd^OeoplGl4u_=z@OKzl)GvezkCP zhcWOpFdka*ZNc-t2%({Y49~$5zi1S9Y90{Ex@M1~n*G_tDLB%sXZa|i0!9u?@vD`n zB$?ZEOxL%kNhR7t%t%EwbT`a@sJ_>ETqUiuaFVuN`&70MHNWWHJMXCKzPKpx^6ND0 zol0|4ZO-p%>po^GEhyO1Z5gu8A3V+-~bHl&gVdAu_tG8h5 zPpvW?;P&tWh47HRNw#t4j;f3J@1*XS`q#u4G_P?ePp=| z1Y8ArU7KtZ7F>LwSlod2>VRWPQtXEfJ;vED1RpF5LOZmKelvH1)Gi*y5>$pqNtNSl z!zIT|mVc>~uv~tSSjOA`gNP;Kk>bE0(fRlKxX4$3GerCp9{0WI3GZFn=lIW#1VwpwX5(tP0nYI4l6Ws|BF#4exKtp=ec$>DFUX*&ax+XwWhKqJ&ZH zK&yjrPtXG3DCQm-&Y##nWqbz4WF2ND*Hz|AawD(4!Hs~Vwc%-(@Zz*ih6UH+dS$c| z_qb%jw4VK;{z^p(3v9FBrP7FTq|WVYbnY@-I;a(T^r;Z~b)kW?)IiRa+U$87c?`{t z7Ara6!MeUmBA>P*QrTpdpR{q|XVw;L=M3BO?yaUQx4NEt9S5{~z-B7VXpazL3t-U34wEgxpfUo%m-5uXr0X~=K#YtC-GdN;M$q8vu-fb1 z8Q6*5e1oEvZzMz?69VfPV}e~Dz{^IhLBJ{k(IGKVF&2_K?l)gNGg)je z@1x&HnuYF(?lGqlx{hGjeC+jcx&f>n#>PTvAbTa&jQ(mJ{Mu}WEqcdaSgc?B$JUD@ zP1eA&yDon33&4{I=3{0k(tB~mZA5o%Iw`BCYy5F)-y3lPS@ooddUd~5#^c57#C)5+ z43;!FHJW&B13Kfb1l?xY!8R?c-p5We#wD&NZDj1hCqS^LIpJF`v6VG*f?C_tQZH;- zxkP8DR=hq8f8ot+kIC(kKp|Q|>MWj&NAOd{Ud^KGpjT|m-dXN z(?sqoROFCxFjOQ!Kj_P7ZvzuO#-Pqo9?_=om! zpDa45DEwO%;e=%8&U?S%`XN1<5+#3R;e+?yD%Q=BKlH~s-x{*klt2@@;oj#@QXp?Z zXG`z^=2|g%SMABG!p&R2(lctmX@4Z72IA{{SshUP@_9owx1fM5)&mGlY51m15+Gm}{wouFm#b6f%Mp54`D6oZuAoH92(yE{gE@;2j*ip*)dC7h6!n zS6(#O(U#JR_K-Rib0S1gxwJIdZ1Sijk4ne_2P@jFt7NHFnDPaTB;$$xSMgjT{{czf zJY{+&{OcCb=d?;XLgTLR8}={JH{N-}na%t_;F-IX_Akuayk~mXp&(XAD6%=DHvJzb zPfm35;jea%*C}++E&PcOOGBKYo6hUg*#dFSFD>hi4(nE4UYU|bA$wmMiIjVdD%Q{c zIPiU3hcTP+t<@=6KQ~+F14Q(lot@vVTUQN!wux|Sr#)W>Jot>%=E$d>6PI!Y-r9;* zREQZB^`f)L&)v+?*L2-|^l)ZWhdzCOs;pky@S7U;=yt@UBr00ECd$c^tDU4sC zlqyjnL}kV$e+nhVQoYK3CKGvwaZY#MGal&|cBj0=H)Z$(-}lmyXhBdNF0yEvO^|qv z?)5TJ0*k7mp04X4T-bRPUbEVmdhAIB_=ZJ2t}D*3a1r}4UNjzkf+>@UJIHJ9fpM zp&2PM6bhg7XTl!)4cyL4p^Lc*m1meeJ-gd1D-!9XWxZWpsK4>#-N`419lwZ5YMx(8 znPoc@Z6CayZy$=qEo&@)KmIfFAo7p%-w|!T*uGM1{pG}2MMvwkRG+_P?)9S!>!fjR zEV7!=K&XBxzx@hP9kdjE6pvH&y08bs-o zlqG>{X+*H;u(`yGzw8=6P2ht>ot?#ZQ|f4RhfQhxxlphKzkrM z^awWmlkap68CNM{m#R2JuDDIuKo*_u={`vjqvYcRg)f-)M{uoj^#Ojz6?eI}bTRsTK!BG{>rBA*xGUNJ4CvVKO4ub67P!lvYQO%z zYso}RBg0W{CWIu<&s^o??ul$(A#R1F*WvY?!36BN)l?e&f!+q(_ue^oUVP0x=^A^W z_@c~U>E^LSZ|Y}(2WNOApNrBJ6yqA34zidn-SUfO!(JLSZV7pZvXol8lq6s`fD|2dH}V>N2J025dXOlgI;fKx>bEvkMFO51ZbUfaBI-t0yNk z6gDb4y7PX`9!D}ov5Z4lS0l%>A=jh~er%f8B!sf1Z&-WSy7}*GV%|M78`UMk^rUd_ z)G|}=)<=k*?-Hi+l*xM85%-(m%HsoyFuRs8P>7-S*dz8tU1w)FhT55@Adu(;k~h8_ z7YUva^EEb+PM`^-G(5GiL)0M$lFxgRB@o zpuzRE97{4CO{>j^kGu$nSJ1Gq1-9I>2*HqTEqlK}3NvYsDK5`4ZIaOT$6*6cxHL^D zxT;7gOZ-=6RT1P-0^19V%0) z*{S=^$;e}|%)oE-i7stvuMndj?O^tqZD(!VJ7$zxeKP#?ERea3pqZO~#_988omwIP zuu8BGZC4!_av$X(6b}@_11k%BVgh2Q)rsFSy1M{Y6M+^ZJ}QvA$(BW%JFUT%MNCFk z+TULY#NLjKz-uTT9v%WdXr;BYt~xO$CwXfRl~PbG+_?5how;UC(C?gayd-NWglpaR zXkR6WBVE6%fTubwi@R{g&CTohUAnT?&!xpibdEJxSQ1AhE)5r+jrZ#v$+PXI&(hkQf>INx2#_l6H=?vT={bW)k1(fjyWMEJfJw@O)D`@HIGNl zec0tsVx;){{`lNFT9#3q%jRCtSmU}f)`h@gPOAKoi{P}T+pF4--@L={#3{h%=l2RM zP%F(gw?wBhnDRA#L2?f$bfn!v6nePmD|LxL$-ahc-@v; zly}m^i+Fh5@%f_Xv+{ApQ&cECP6~v4K+&>tRt?yvcftsbCI(K)PI_kcNq2U|$jrJo zhMWR}ZAO_=`sn`4g?F52;rkF$M|!NsYfa%qsV(#gqprE`C=Cgz^W2i5?8=m+j9BoF z*{eA!RerwNfw%06_Ag<3LwxdpCHW>~Q`Zka` z9{h_j0`bqyukAl{PlbXk@sS-`_8-cz84_@oRNh3WEI$q8-;e0LBHvldA%N z47+0AGe2sAJq)dFY+?X1vkuZxr_@`g9}yS`#FkqM&q{%L0N%(oFMI7lns;NCZokcu zgEQ1vO#6k4q*B-uE$)jU`+fyS)F{XLh)$5gD_rm{lo;A^J^S>~2(>5$4d9E~vWQdt zS7B1l)@V351Djq6iaw8>)1{UcQJUk8^z!~N7(P|Mmo~9{T^|rTmBti^*Z)qU#7rhaAoPD z4WW*cFl7W)#^;8k`wNP8PWkd?pMv-!kHULMP&p1fEIuf zY7W0N=4y}iBCS4)28bh z`~ocV60a*Nt=YEgqtee{vV2ElgIO}Mla3m)|+G6$q(<} zNECKF2Y3f4^PkI9B$V3Oim)&6VZl|EVCGW3j``8vmQjVBu83n`#0^)y_@< z@lGO%4EID9&5ntv#ejoOWyWsQ>S%L9q2x79(RDdrf z49leD@I0Q5_@PpnszPee!nU(zs<4a~Z&HNz@O?b>ReLu2iJ<{iJ-{WlGb6hddnN_-ekb zISF%uls(aMts*94mRxnU+W6sgw$6RXUjNuQY5iQIfLNq<_Q4?rFA%d9T*J-XROr3!??XtFP^uFpzcDbrOWy zN|#i`vsoh0E>8b@`O_8vXcf{>r^%lH!%&AILJA&8oLl*y3Q*PAd~x6lKH?DSVfSFu zoRoUn3OcjG*!J90q{B_tOYuwmr6bwe7mkqB!7y-#a25DD<`X7YUU1dw5m1an=ZEehQiiG#W8hCJ94?gq)!mTxj`GIz9%W?K;-o{^NC@vZj}nK z1ej;^!h3V2^run%coZ|v%ID_?X&Q;@MKdR-B;Zoxdbu;0JxM^$o;%G2=-$|};*ZWX zCM#Mu+5G)YSGjEXOaor=*#qndF8>R2J9){o{9DF&i?3iqk$H$C zudOXWL6-fo#gH6jqh;Ny{B(B;Q4-#UM%v6CmPs>;pn6WF^<;mc{M`D+S>0Ku8n(ho zSM1&5{jpAIfnkvc1I#mF)eLO9K(nBENCn(N)iy16(fEyMxoyEaR!pRfT13;b^)qpn z18B%zjg64Ph%<^yW^rQr;q#~bi%~^Oc`H=3iqM~5I^wjg4W*gC!xzz+WYvmAyB9v_ zD|7p<(Wd&@#>rY{>hyYS%py}~lM6}vTHWf+_xjP8@=UoeC~*UddJbHaUr)c)eyl$I zVOjNgf3iTWaE3BOQ00V@*WY%uUFcY`Gd5p^v2fy{mL9CYP6zwOxbM&2ys$tq9d(k= zrDPa~Qf~2-6u0ha1qqr&E;M^2(*IMu~#YcVg_0i`aVG8E@+ zcx+nr0cs>gwc^A>aKrzix5l`?Aeu5Ln+o|q3$8{>yGkuTt7ALs!rGwVTlEp{uf!~> z7mXRea|*`)ETaL%dKd`z0c3@?vcIo!u1rNQ2aq~^kH(2B8J&Dbic~-*C$JcDD1y9Q zB#_U^X3WC|nrL_(77({YjbZDmI+$7(q(5h3N6lxC&xM!%kyzI%U$uA50}e+g4ER}j zRK`68(PY&tU?2Tz=6F8$L5op^|Gxn91Ofp%mk3srJ6%Y&mD4WH@k7Km@l#xEK=CQ|Xgj!8}c(%{Fj$<63({kWy{bC)83N0bC z>8Y5`U9-}Fu0nYGdA9J1worgdFQ`P~(-Y(J#S<5Zdc|c6 zaw(#4AfI8}f2SP~w4SWzdar6#N6J9)3-wO?{BrgnBq+wI;v>Ts1a!@Oc?7!j(9-h7 zRr9kwj6s%1^=AeiS}E5jJHd0lJ}^D5bE*WkwFgetI&&_926JgIja!LrTso!wjC~bJ zJ2@qjcA6R;9x`lxQX&kx=BFIRX0JDrd*PP8Qyy9`DRm{T8Y|yu2-X1hGC>Ki^Kg6M}=@=HiRV$Fvq1_kT>=?#NKr)5*8 zHhl19RR&3=M_gYYMVD8WpGrjqKYT$T)_y|i)idTMPIM?`J;KfuPxrK-5S{ z)``$UurM$howr2+ z;TEv3B_t=0a^uKP6jYk?)eLy_O10Jw^nf@z0*#TlAF)Ku-w4tXkd6(1 z;i_>5%*OUo@<=s0A_pX??Igc-5`t+neE)>)x0n*u7<8t!+AjlOOK)#4pbkMqM4aPE zH0<``6cbB^bO8pACa-h-KPMi)S62Fiq3QcXzp4(02AI!uc(;CzA`Ife#>$|G6e4MT zDmBza)Lra!jaqWBw6b6a)ul7trcd7Qbn+!$^8jD>>Um5obwgkV%b~y}4`Xe4z+psl zC+|swq&Zc@I%QkLhc6s{^5p}9fIrFtg;&!;v*q6MKZ!XS{K#YRrFZhUZCi+VCuG=f zV8bDg)S7Z$H+$@XaG_%}S^Y8YP+=2R&fz}7!OS~d&aM|xyXJIwAW*p#N3ubu&LZo{ zWu+AaU{Q7JvQkf4KZot?}^uUz~eUzYx{# z;idyAbV_3COQ~2rrpq!qM~UDWixzxG#n*4YKXq9eEX&x0y}ujHtaYVc1VQ9}Pm^n^ zPrC4gz(qaw$#rTKtvX!I_rIcxJ;c|W9#l~$kx`U^|KUESRZbAwwITxb%4Xn0Pm3G0 z*Uix@yoGza+#m3v(*G{!?GWWK$%^MSNK+I$B>|p2e|XQIoKZ@lkoGDUUi-34i+$F0W(o>aL5+oLa~xN629?h{@SS*dx9ESaT4V+m1c2hw z=yo4WWtoE*z+mvVOc~Ka>x0RR1&C+b1YL$=Bo(rm(n4%3%8bZ^LDMQL0NB~JDpoK0 z9m24$w^eQzvY;5U%?YaAhp9G8wr_qb*6$UTVl^r&SLdSZWS;H zL9oz*frWulke1Mzzuf&U1`lODgDMcgs*Ica1W}ATr#7asvfuA?z>00;?i@u2W%3^d z{R}d}F}zZyO_AuZMX&Zik%?QV#ETjKcQ2h^GFsBh2pl9i%DZ1MfoEx4GcEdR0{rr< z#(jCIsW@X}V}L^mpp?dLJlEUQ{2e?Lrz5e|a30wfSJi7Qo+t8O$ux_?Nd%q?q}n%s zZq`tRhxB^C0qs%90a)Cr7E|=>!|q)*t6k~#VmJQq51eNjc-+_I1xx-`je~Su)H<_13jX*B=-Y$t4sg;(L#-Tp{(Tp_CEN2}jwGw*(f=-q>Z*Y~h+UJ= z#Gj;up57DUkNIC2Rg+9s>eCY!zhUtATR8$z5A<$1uxE`j#isJt!rW4O@6LM=rOU9I z6Nb!dd|q=P%aNfAW~~+4@Z7v-qFtG4<0mC9$3~+6_%P03|7f`7MCg}c6gIflU*;4z z0^n7OMw&c>LK)ab(kw@DzYKix(_Rp+@MJ=7@_>1Iip1dcKLiU3#nJAUi~d9ZZ;mVl zgo;eW#KaQIo+OEgeHWT+0Ht+8O*peo!?YY=l&HB>Z=7tY2Y7PlPdqr#Y0GQr(-i3b^a$va}Y*TR z{iyqum0(ZB2^+pezc%|yy;AFo%g(^wKMvr}(ec5{fVFC@?Ba8Wq^KT_W4RmJ-um@I z!zmnfHmQ(&pZ6**g)j565>1BX>%fPixwJ2dnNQ|&r7YO+qBnTadTXvI{m$FEq}q#h zBF(eUJhBm3c044v_xErnrACUO7=p0$@aLRy#;X&B7E$E&*lfk#K9U&b?}dCRUb z;aacEP>!pI*B|cmY!ojQSdGnM!`CV-6SqA%r2UWeWPJ}-$Vb!+s61t)1Zg1yXoHR# zRf>jHe$GVxr@{Oj2j-puVAJ4Eq(odp+SUYq4orwAlx9 z0)LP2M~#t(1jV0lMRJGtT>rj|kcS;VSEU=R-QoQG=Qb^S{WfLuTTL@RKPL4B(5(fC zMmrrRB&s$ztWwoMaOHsxQ2c4DT-9+au%7+Ip+@8GdNTb_lsa@eZd!NX`@a4vpI8^@ zN{YADJMNO@vi<8XdSFLB%+u&7lxO`Zn}V_&Li(RLSEGB{-(7g;$9;Cw% z?r+%enC<->O;xSXYqk5BW#ESLz1=C1rAGdY5p`U>CVTYb`(7+^){R9pT&hg-S^5r2 zl5OWW&Mt1AYW($ri?9<9dVH(3@#H0~_t(Ngtw?F+_#>}*&kw_jOo|2p**ow@O+Ylk z|E_aR{AN6F<^s(kV29}OIAn3wG7CU-=fD?V1lj3i&MCx+)T@#f<=q%`C#!0^$iH)anAuU9jaRG;AAmFi4R;|onTANr#Mz?4!E zPFa6h<;S=_n=Vr1w9E5QoAU~Uf;7=Izg90~yB|qNmKj(=R&zUdpRzRAv^(DA+UL#% zWE1%S_BT?s0#E5bQB7)hfp4v-4x~}hlrKmHr9NEg0@&@Ag>fCpFDLVH zuia2>qbd6iv0x!F53%830gtPw75dAMtZ zi44*Jwk{J9q!%fzM{~N{p5Hf&{yv{B4w0^30z$Cn*b#km16Ukatx`hi>o2TRC}SzF zZAC{@$jsuH{$)H|R*Z@rfC}utxM_Kkg;RZllLvd|8?cSvpRccWd9v6q*Ciq(k&PG4 z+oUKnaH?;Grt~n4(qxqYuwdo+&*yoyIHKV9{z)6@cwWDj zjbBkwG~@fwfTCi$+@%2$@#7U|;04jdhD_j#3xuB5;Iiub%Z z0?i)~H2&B=b{J-kZ|R0_49hWG@zFhS>Dd7PR0NQY1jqcQ}rKbaQUV#_Prenr3jGL`Nl zr@vr)=LS>rS6vVedHop8xI>x{H=+uLRb`%=4vyMFSr5-|BwQ?vO!fSyTvm-{mY!AeZ?lD*%vS)AxV^Xv5QmTU6aBX`#CqS8=t z_T+zCYFs%#b?m>^^UrxEqB#p8&0aPNW2EB!P(qt@e0zHX1e7UL2WFZX@@u>xCfPsr zQKqb>us;;(0k$kBHfR9v*2ef1X9y)wpa*vI9O zw<5PLMGtVHm602_L@^bk+Ff(-fgb{a9I*zwJ5)Xg1GzE{OS6D9H(Ls68?I)HmbTkN zyn!mC#8}0K<9d2fIdGX{E@!Z|Y5y@7yA~imiR;lT^Xuhu`?Sor?@5<(RJr^z4^Y*G zd3h#@XA}8lPQ)^y7XJnuLzS+i!-{jZ>%fZqZ>~uK^GxjbJT2|*9ShT$@^*yrmLEGgpu=%?E5x|f8mD%hV87qCi$^S0(QUwrC+lA5#A?o3-u z+nCti?NyKmSCeDvx_+e{`sW5*$2D?7p2SYCeNY9T^J3;mI#n6mu?P=I14KMliDEh} zHwfl$p+1K+>I7G3g4i;YJ@^ocKqSg!e1tb9=hFgJm#r?T(!>{C0@X7sP{RX?E0JAO zqijC`G0+=kl+)GJzxqo~Q374nNXgLJ@9j;17VFOm&w*QxSNHS>Ea8FMTb@;i%y=Nt zQze&=laq6>FYslh-I=luGM4|}e}RzLC~O*v@1EVKddUqq6-v%%0a!)09h*t|?6k7; zoG7}AvDw)nu_&sZhvN(uvnLu5WwMtlykH6yET$Z5S?YkgC|i&XXl$+3{$oCeM<#k0 zj1<2II@(N23<}(Fn~0!F^y>T@K$xoEVlMw(Z-&m?TVP#~2H`<($0^4kT|K+}Ky(ds z(V@eIR|l6Fj9E}oVk_8JjlbfdRct&;)f`LAGff3|G;)p`s(8p{(s;0(bqC#9zV8X6 z?QhIUbs)Lvi#|CM39~(>W5pQPcE9$J9KPE4_Dwb_7tuJ3Lgy&-M+}uXo?urIClAlS z!EASST`lt!aJ{cx+WGG?N`a zQ|-os8hR+L)scLZ7NaR9)ltl=Q)w@0iRBjgu#%K)oAVKU|>k7+nAhngtK znQWP(tfHDOpG~L9ByK_^_)zm5c3|>tSUE`rz-VJBlKc@V%xsqRlMF7Y47-)6=-r!d zP_viTrNQukNR~N+Sd>e$WWMwpYs$3M+;5vRDj<0}!FdFb=+m8P)Gsp;#Je7(%F~$@ zI4%Gj-udW_FaR~kB~u{8c$c?1x?l7@06>}o9j+3cd71E)@c9X*>%%6%b&DKalmJmU z7XExB%ECGU`SmwgzZ9R}M?~_(n!(8$V=};kq+Gxv=NBIR0C^6ZwIgK;4R*tSk`)#Tbu@(d#Z@v*S8n5}AM` zFamvtsCjq=6*sWP|8GV6-JNy_ePzzrWg{XhG$Fh>l4$L#cHeVttvx{$mar6}51>m4 zB_vS5$^VwjG&PXM=kL=rA1wUuA&5zxJyJjZmr^T$y7<${vS(c8CP`^ZD9mNI+gB{?t1C&2I-Iv3F%JhPHB+t?nb)1 zyF^3lzT zRktp*5+}p&__`Mtp)2s57@>pHbB*_>BO-y=HV1NtRJq0YllsQ;sm78l*jExp!Z?18 znKH@!s95W}_9Tr@Q!5oyP(T5qX(S#eSZ>8?rS}~QwM!9+RbhRk701({qWLzfTr3Jm zSltEL86CqPxPC_gsEZAe)+-ZXqOXnv4qp5km?m}K4O5ktNBR=Ls@C5M&MOsT(BYS!C1=NRd9JRdt|ni#ft za)R!jjOq{m&CJ6yQj@)BwPugpBY{#~-0^eF9_rlQJ9Ojp$t%t@4s-@;4SHa}x&Cx_ z{yA$R_m~^pv+bK@!EBA00y)r`bl8dHw7)r20>AgPo=**D0a_`r^~ZtotkFhyb-j^} zRxL3+9X|J9w1&=~Si}5|k-Ko9-4AhYgG~;lyrHMMjnPCcRNI)_KN6;^E&)>;v%!3 z=U(xV4Bn3Lzvv;~Dp?6)!_*&U&}}?--p}f%*%?j0!U6uMRdg6CSR~7{rstVZjw0|OsKWHZkjj{j_}C0MhXq~L zJh0W9R}HQ;4A3`sn3ISEtz>riobvkv{uoZW2f88E%(Sop2pg zxH33YtZzF~_tD8Q4pW2Hs-?&i{*$Vm6IL{EHVv9RgZc=snSQ=5*f`&Hw&=*MOYtk0 zovLm+0x{Z1i*h6=L9L}iidUaSK)oB4f5;eeMtVlQs%qK|60V?~SS1ChT)@us{dpe0uyCRRBdP{11$@6yD8k!lnzr%oxAP#(9uUbTmA zVHo=8E(jYp1f2=1v4Zt|sSl5O-2*PlMg>VetERwWn96)Cm3`G|L06_L0c=Gh%Ii>5 zg9F#Pgr0}q`v(WEwGXC;-C2L%sPAq!`U3G7jKMnq`hnfiv<63ag8J~nqBXY0gXhZ zSd~eRl`v3FPOi@~^51sIR5WKC@43xJ(Xj} zV(dY_=4Mrsgf1PA9I2e7=9Ibo%m(3H8g;zLd$9GGNo({?`#t*mQRiOq ze@;H~_&g?6NfcO&j`iCoSSDpZ*XZg51XwVK;v{nkOQDveG^3}&c_wvTU-W23p+f3C z;YyM>{pt6Ovx<=_H0R+khk>1&{tFd~`Q=gQmuq=yM{f~DifoLeMx8c+T7^zj0bEdY zgmMLyoLzS4_aqu&=}1eL1_B}+Uq=Feqk|&@wdlCV$*@mlTJ7o8xj;|)D{Mljwgro0 z^EGE!kHj>$h8Mkw_~YsnTjb-aYD6BE@=M#n69|X5Oyq_Y%1$m^vm%Bycfp^(k(SPS z1Vzg0`KX~g4BrD)1p^R(YbQVoko{5;^+)JmkUk!+Z|@gZ~IT8)Zn2u6;II zGUjOAH`9KM9?r;A(MNykGi1iJlA?^4E+bQ=j-Z(VEvHz?uPYpL(vjNF+KcPFNkQ|* zqC_O|Ly8PZ&DY~RMl`04D<+PP3BP{}fe+KIJHbdza#~tAhDE+|wjxz;qJ01qu+xB+ z(t%s`f?op5Pg%Xm4_q(6R0C8F%Fmy{i+v0i1M(eE_<(j02TRdPrdVu%eRFfO$rWY) z6Y;;RLOki7wQdIj5aA3`&q(%aCr*)P+cSsmsF~Bu?C4(C6-sU@j|R*hiDT;UzLKNo zU2BFxjU@Blz^=)QjHzrdP$xEiv)?#)cWltXb?wr2t8#F$c2g*sS8HsEyV3Dr)W&e_ zeD?7!D3ncBC;QK=?y}dj(-T=+uN#^`(nCI%1ubF*WWU&XF4rI2-*_9aU8NoK1&S}9 z>I%jd;sv&VjO#cK$h{p85>nkF(R8L?$E5-0$&`{(-0_t9gHszDBPXNy<<7yNDDOA7 z+CVW(O@XDh^Q&AQ5v_@0rn5n_MskYBP8H{f|9Wx=o8SBp$VgsLADGZwREJWk7BYEe zd7X>g3K7WSsO!Y~Tof)8k(p%hIY+r-+NvQTlgIz)2x8?dPErHAAatkcFjYC*fiHTc z{^{ZAi_gHPF`4_Nlm!PWmypWzx2!r0cD)wXfvYbgn#`)k_VfEw)JOw%77K+%i3e^? zO-ZE%j8Mc$BYkaBD-G3jwCkFGZ*F=GnVNMN^r%RsQ_r73kzY_y0NieuI@NaEtJ?>0 zt26Nse`1Avc~yRd&NT5$mov8s1S*i{mN8VeVBzgqfEb9ni+a(~fWA;l!@6E;wR+8X z$x%`G#+3qofxz?sp5r`O8)etJgVBi&bRUT(`;m1&)?YL!TPV%ail!nLFbrbV7>Bo; zOCXGfh?qH217q;Z<1Ie7V+c^jz^Tm`JFOEv8lY9KW_A1x8%ALKEqSb5Zr7h~9i9`$ zcK_N9409*MLluJn(cpv@brTa41Eg|MJ28^v8m-RsVAO_@jSa(k6D4}6t8C)L0kGu& zGXl6CojO0&mE4=FWy(?-L0E$7yt9)?cOfM?`Kyf$GBpLz6x`b@TF|mpuT$B-fxBzL z60g^o!&=pB3qb=7)WmOCC-lrnJUcl~K+JF{`1hX7;Pe+SpzKxTC(J^ly`OX7O`XG4 z>G^=Y;zKmoEJedA4JS1dSv9E2eG*(J!rOUg5;1zVpSUdJ=JjA%@j8F~&b4cmKt*77 zg&v!@3`q^DibP|Awk_!r>N?n< zz8>EVL#nebHUE&JjyP6wkkA4GlPuH>%aAFnBR7Y#aJ2?_TbWyAxuB zB7D0=65)j~(@C(p#4p4hFm~(&;tWX?vC=He{9>(Zp=hrN>b&rN1|>)V2aA`fcof%t zxv12i#>PI2rVL*^ljn6~ww{kvZL@21?nrCZv&4UJCWAtuey`gae#~|6r}Z(P5x5%0 zm>ygX20Y2UphSLnJ#RE`>=_9>kjuBoeV^*d)3;J2;2RcPFwm?YZ%O=*^79D3r)yXx z!xNKDlz-Py3BOCA85_ivf9;a<|6t0Mf4Q@e7YEEf3h z;9eDCn-ndI;)3jm%n^z;w%4H*WF#Cco2#*S#`a3)33K)mzqTH_zUC|yB0{DsO7Lij zo};>4G^{dSE!=jRB|jyju|5lL^WjTIQ@@wYj=SG}A})S1_IQ#~pXgiUk?d=Fi{LkF zT`QO}?=AmJl`VdkcHm|%9J%PZQMhJfq>0(7|HkKSt~0Q|%F(~F0|sNqO6O~Idh?~o z1_A%w>MA}ShZS-B&{s`0*%7P8l{{r?orS&zYs8+f0BQvuTC0_)gIp!;dL0I%6%KHu z135NsWUtCP4WxuknzJQmWO$8|r$~|?o}Wk4o|&^&dA|Tr!5w@(U#*mxH5c(0n_RIl zA)kAKDor1t8Nue<6O5Ae=npSMn#d=QAp~i|g*%OS&BfkfCc@=>>?;3K%NsEO84fMv z%ix&DD8ln4xVajB?+6EY42zcv4mNpoM~zdPK7GiB4eZJv@uBP-%3^;-d1HK__Re_; zxZ^(W?hD7#uJ^#W^zEcoozBb+IKqQ&+4lFaNg}=w;Z6xM)qs^7ICq|U-HeVYRlACx zR==-)c8Q6@Yl_8UbH1X#{Lz#;7oershWZs_386vT`dN|eq3czIxaYsXwMg3CE)?O& zsemUVH@l`D8Jl1WFy4JgzS-t5~2n??iZaEIhc?Z9tf|ps-GgYFFy?ppuhXf^P8d*coMOu(i14y)>lW8@i=3<|WMh)k*0wtt@}@s5c|3N^0u z+2MnShJ`k9y**5BpBT0ro*^Hcl7b^HApsnvKn4Iti-;%zP1tM$N@cFKDrL>ODn2yg z;kRV2p0Q{|Pe}bOO;3eLdHhxp7L_iWxot6??g3O~_M|_;MIkE{;p=buc=|i~eG6O? zHU}_ne4WQ2`Zv`FRsGM9D*V>UVpQ)eMP-}e`)?D=hyorYk&b~bP3K%k&1o%B#h)#B z5RB4@VUtr*ezT2Xqb>kLnVSn(zH{baY-jE~-GG$df|JdZ?UtS!<9IU0#5PX`^1rry zjykw&PGs_dE9QKe<_`e2AR?kd3zhA7|6MY3IBPxt-lLS1lx(o(vBhQABA6(Zr3(rR zjhG9HEIAQ(5{5&RrNMmxG>AthCZMEaZH$crUY_o1jRugxYCUvr1^NplwaF?@>6|6F z3iP6n#qO-wktDc9pL1XGeSenemb;68mKE2C7(n=`LZE*B-_S=lSqI&SnT3eHcQsJm>9Yqm+@w@|4)_(!AB$ zafD0|ry`F|Xh2gjyp}FrwA-*_O7+kN?p6y!7bX98b}5i8>;nJGdD>vNLQpw)2SJHf zRvHk^Ly8&WD45Ly@0P5hjA^7SIuK#m&^A9nW*>iqQCG~sr8wzh3>gjh;=^l$B}^^j zW(l^%MzaJ)nj#;IMW+a82L`#Y{*5B(jLKPOGZN#--t zhda_pk;Z-<^9{6dx#^}gho}DaK@%w*l zpe&^YN19!0`;5kcv9MGS`__onrMPHfUu%F4) zaTn|>ADDs?yQ;Mpw_X|2d=VP|67$#NFvsoJ>|*w}QFCxp2 zcsLM5j0ivR%2iTsUEA;Sg90^ut<$mES?8O#biOhoY-CZ^t$T)ZD}gp@mK9DH^>?xwKzgJgv+WM0VhJZ~7G>kLCg4J@L)3sTDk~;?ejd~NU{lhF!5wkkC#0}DoW@S_ySCINqcm*x4U{A#Z z#ps)O0KW~`{nJ&phVIXT0rb9kBZ*!#9CRgk?9u|=uGsn(Z|7syXS`9cm~7}dtrw8 zgzDnv>Te9vj&mlLNS@*SwX>#Zrhy`wNFqn_17+LTzGR*o+1DiWW&rhB$=3lQ%FL%j}L@;=({(6Iw2tWl7B8l>VH9`G#M0q7UsWj1D6^FAYd*3vwCXW_=mWx6EHJq0E zz2%=8<8?*~46E72r& zvyC4^pc(!Sc1zg_^l5B|9Drz}L3DNKj@B z-glBst9;>?=#?YLxt|Ean~Mi=`nweC;SaJ0KRmf^- z_8hjp71o7z_3Mh~ZdQ#`ohCLoy3~fr48~OBCTI;O8pMA2*0{oT%H4o*k^joWyy2Q~ z^*t%t^Dg@SfHpw`#K}~P*PlNDOqFgV46Vn(!Qmr(U{gCkD=P+16+!7&rz>e?!t0jr zJ6ODTiFx=Q+3a)yL8jO;b#*;HTM+^~%nM30kr&O%C}9Q^38cx035-pT*@vQ-98fI2 z#Ls-a(dI4kEZTXxjD4i?3eYPTGSBELvX|0#VxANCq1+J#Y+YV((ejpUO>Bcms}Tm2 zV9k>&H@i_Nk46*lR?Jl%xks!<)2vdF7Kj1U!KXP#gBT{2(eW{K=yyOsa^xNZdm7@$ zRt~-&xPFbTjx@T&wwNpV0tiNA0&Y=#eIk%UTm55xbQBRJ z)XFL-)VkkVvdM+N*CU;x*lcp(|B_w;h4CLT17HGO+K+YVv>PIL&f8dRjwGf|oufSn zqdkb^d}OcV2e1n5d<5Q&MkEZ|+3@EX3M_Q{RceErw-_Dv?t}Zx-j#!WQlSQ zOfHv?;;-SoX`17fYr#z%^&a*)w~H1`MvL}${Ul~nQaW|slOYU{9B?V{&e*W?Nh6x= z9Gv*%^CP$grFfXLjGu2p2uf#(f}W)g>b7cdFi8X2&R!eeE#<(&GkW6Y6;EG5U!s;Z zGN_j&`!pcr@d5$G*f(Yive;rP=M%B0=mMUh0Uq&ad!*GDxXLEjPBPY5z7eK)84Pzx zgewK*-^W3r29$@+@_zEj2f;MmXA`7(=XT+B5$86uln&JQ^st^STm6J!n3lUC(aAvV z;dr=Pj6dUlS=+xn0!A<@;W#-MqVWS!&R!ho&^`U5ubX?54%uiVaj2?ninyGupgV|4 zFtlVM6i9j2K}iGuKqxLTkjyw1GjZ^r=Pm@Xk^2(RDtC5vU`fD4)m#laWxBsWv1-F! zIlK6|tnIq6?s7TQDj@YBn1b>)9SrC13rHEDdPVI3zpBWNVevTv$mO@MwaFj`?!!0nj9sH&>fAX9GqE)zU9#9ZxnO z!Nl(aA#fQGHll?v3y@6yUF2{H*mJwuftKLo@Owk)AHx1s5e!>8CNE-tpN&(1Oq9nV zFm!UrKc98Si<^ieezz7}aO|kX9usG3Liy9Ad`xb0*}A2mWHDDvXvXQe&zG_K!en6# zlcN2jf+{@j4b?^c za$=c1M)~WsMEbF{QO?LbX4=XMRPQ|xW}mQ2XAj+n3s_JEH(B|J#^>4Q>Ie5~jB9WL zd@aSA`4jg?9J&8!sQ4+6rjVAWvHhW+kFMOBo+4;-drGs2ZUjg6u6;9h^ZLSq1ZiwY zqM#*=%)eZ1@X&qg*qH99qJ+1T6e2K;w}Wt@#2+=QVvf~M6RPB zp8gv2>bbd71wE$Cem+k8V-Y+frO!!Bg0?4LUeiK1G`Ek-`R^|2HziHEO5CwFY(cpL zoZ(?7@Er|z0?iVu1Hl+X#`+%mCs;s{HHt?hfd&#gSjNB(KR!8$iYD-!eIoMwTI!uu zIxNsv`nFg2u)Et_uSK=+DL_*{^!r>q_Ti+} zjHoAiwJ_bmxNCTf=YlUu1Z6#9t%SO_p7O9E%@XsIYhDeXbkrQv_Y;ne^K3jyTz^3r zb1m{^qWZ#m>^us#NQuby^bs+T*a)m$0Vy%zyUvKSNViI-MujhZx|9{W4A<|Lqx$Ff zaCHZA*~+zsg{hVX>)sQnQ)uCQnaTF9N*Kn_)lGX(-WpLF8|e11t%7cV$0vRPgKM5$ zmpz#PJ1*Q_(RAGrT_MG=nr^bP%!b0x-E+nqikEC|ty@3yJeeZ*!%zXG7-&B%)QKfU z(tN46rAFUUgR-Uc95iEpI=QpsM{{ zLkD&na2*AmYv3W)09bqX zCXMsPV>yM?vFx_v!NujakB(u|K*vSG09yD>6IMqw>k~u3B=!R3;yKYK9f#43iBVM; z!eYNmpG&i{9`OBFWxaR`d2iKm*iK!0lSYW=PAR@Z09bY0{Y;u~@OJ#xDskmIi!PAh zmyYy%TTdDtRdUp28;f`~mYsm@$K|mwKbmZ0?<)JEx)6EFC=^@O8-Q zLN)tX+#HtV5=#B(kqB>M%ko(?`vwMbpAwl>!0z7e^EIod%IyjUz9#;Nk-*xdBVWZK zS=%s2wbRfyXm0()x8Ilz7sMzv@fn*Eb<-*`E13~6IFWvix)Qi?Q0>7@wRb`c>8s<6 zg+3|T>Knqgwv4v_J(ji^pL~L-`=DK>+aBcS=cmC-&4L(4EE@`fvRa7{D;g=&32C{|$(KpMW&r7Gwa%gaC*(19IZJ`*O_a zdsbG1t0@yps!hPeK5HelEp%qyOn}WmAq$^eBbX8@H#a|4L6$Pk?0q3baa3}A!=N9G zHLXx)jN2nSU6ORzfR`NlF(`%jf)Bqia^^HZxk}43CD*xC@D~nuYQ>C#0DWn=ffhn| zRRT1$=NHcm{dsR3$jJaHVj>Strx=lEt%I?)DyL7BFbhYVUt1@$79?@vrfO7&s1*~N zAQK^kOCH)S69%l$h7uV!^>2Cuk@;FGeU?W)_X&o{JLaF5YT$z5AxL$+KP*W{p*Sc|~x?2sp>c0%~4ld7$FA(Jz;iz)I4rvw!2ytduF{8IY-=*QZyUkYh@W%99(G0 zvVI2ipfd;s1%*hUDehAky?Y$@+~kJm<9wQRc^#Vd?}0xXKOuQ`-ay&3zi~`AvuS^5 z06p;Ux=DuB*e;oZ_2n}eY!jX8aNp)8O6-Q-Crw(`1AQAP8vsBCI=974!D0&ibWHT2 z1t8^ssUL*={R5GJ7PPbZ`$x6aiQ7TOK!(e@Teq1dkT%`h$Mci)hI6C&hd~lfpzyl| zr<61m^g=WUrtLb;G&zt}a_Gnn$Tu*s3H%aktu6y}Kg_rTP|2tNYdPJg=KQW8Mn2<~ zZi6@BhDm-S-nTa?Qd?K@iKZ3<0KNL&1fjBMax*DhH>i=*h#+5!%Q?-MQlXSvqQMLn zNE9}6m#Yl1zk=7wXf9+LK1|qs9MYHeoDkteq=5Akgz>gYx`TXjJJE6qSWi4o=5t5g zP|v^7J4HQDv?akZE>_Y_P*flkHh<>m?DN?5aHAfsx!QXT|IP<^#+@gc(8@!qL&$FKT7ZTC)z!t3fo}n&~nQ|HZPu6lW6)PMj#eEU3jWc_jbZ}P^ ze(I+@)^_L?c~mx`M>K3g97&xcyRREt8iL}mev@KNa7x(-Qnupuj{Rae)RUPX%?(=V zQg0_3k*3|d=0D*+75cmS9BS zH%kZGCB^HJzfTX<;p&WQ$Z5OT<|q1Yjg7uV zHw_dTV95ecTzdN(zVm85l<(8n6SFwt)dO#!=(~}sqWATS=2SHb?VJ7x;3N$ubPoZb z6btAP;C<5l{`)<1Bt2xp*?K!qMM19O^gP`Dz6?H4Xu$W_FPS6(M-{m9fdrFr?qfRe zI%Pk{i zt0gBC1wv(U2mThxj!oOBUg!qvoTCoO^2@Ie$@=No!c$YMIb&p7&@?w58`K}~1hLUl z+~jE835O(;lJ+#TeSA0KPjWUgp^}xRRRiTCx-yW*F=jimvCnu9(ZPGWsxWrPZaMo< zbdNn_m}%e@@s0a!ytJ+K0cg<`SYIvQjr|Ni4O%}C{%S6KIU5)d1Gyhy?m|L}0gt27 zog-R`#{DZW!%@!Mt_Cx8`pZIhGaFT1DqYG#())hsDi z#8~ejWRp`&t^B%ztVSxtZ=hJhHpzaGH*$X1IYF?EEFL7Tp{64aXkZ}F#Ky*Iw3mPk zHGr;$y4-+Eqf>C*+pZ@xr+E0%WY+D89dfTYx zW;g!U9a_)l4grG~KcrDz4jG0dqwn8QXV{D;HMukT8?4dQ{J}*FaFN|FcN-IDy*ASa zh0TTwd*&7tN5C-c&rmX(oVvQ%R-OeGDgcNwOB zvH1gK`qbIzb2o+)A-Q6O>g5_kPft(V4#7E?!vxYy76v4rii?YrcPdU|YRTh=G*TO8 zj?x=UpD`i_I&pm5vy#k2O8MZ)Hq^iNJm8@U_nb;=-E!oIN}(U|;^<0nVjz~S%c7Fb z@hy;K9KTP%`LR|(_5-4IuIscxiPcQNvq&|KKhB-J3>l3d8l9SWhaB9{_TN7Fh$`MO z$zn8?maThkIf&vJt!Mc}M5EnxgeC$u$A|S*ckLon{kn3E@w=Z7vX8+lJFdSnEpbe? zRzyP6rAtm9ocgb2&w>hAO9QyllGTeHXyp%{(12kJPhaegs0@2~pN)jG+#wCAZ0dVj z`uCTCIktF_2B*4KO&h)9dXAn~6NEG@>?9;oFDYh+jt1%bElNlf{p8CB(OPGLkdKd~ z!?7iINFtvT<>MyIs>(z|dwS~RYV zj*S_tZ~&}Eejn}rG=j|1D`3IEAOd5_5{CJ0&LgUR6>39l0jaIf+D?%hCA|4GTx13b zafW+6>~^S|0>4L3F?c>!Iabhz&U+BvI>dV2IpzZHbf=BnmHIlTm!>&P)AX`8^qd4v zV~9<7#(W`K;wz))M|#2^^ii-o)pAyQoGs@tUwy8L-DiGPHhxG6u&)WTNUn}s1t(d7 z1(+o$-nvE^D_LbZM-vyymU#}MA(#<=fD=!>@)>@iyfq3?Wi-Y2#~bVS*4}3KF0LD1 zog;W^oqnGD6BJ20-LYg6lTI06{{!S2Fo+u1+oSt}0J(qdll8~>#u^~An3|dG47aP& z&~Fuf5E85k@m{p72gf9+aQo5gXw@solSY`ixq->q5S+E(<$#diY87sFtl-3}&atCF zPB-G-9XPf<8Ha-*w_s;=Sm((r5p%8`Wz?8VuoRr|Zb;VPcbt;+sA$}u6RP|nGRHrk z0CU1UW+|!efW=3=Ri`6*Ch0f*_jDOJ*tfd%*K{ACCZiUm&W6RWI>rcaO=qf+hBA#Omh1nhSxdgwD)&*I7Z8I@Xu)^E*+UI8J| zwB4*~11hqR?@!{HUx{1(D#N#Q1YyClK{`b}`V+QQ{QjedJt~10$TaozPJRKdGC%0x z!L=eBqQ)Y84hl~BCreW`I%cJde)sFH_kPk?yeuVP8i5{yR{?s^;3-(J;hH6kI*CYy zTDD~ObE_#wT9V70*Is~BW2m*NNvG?&jh!Xb%o(rcx?FbM&nky1@b1gXKE`WIN7~gw zx;?0)E##Spq^(TR+`qF$;LM>334{H~PIgJB^B$lcf_11EpvmJ6ukwa?xd(tgaNK?_ zezqL=+^5g`aFh-`NfEI5;qmVNze~!3UPJ+$CvHY0J>SHt#iR6z<$g=ta+nV&gvQ?9 znZTNx$>-5@*^k$}6@<6g?!oyl56xx6ixb?tKIbb_s|BT{WEn(vq=CVI{rwWuiTe+$ zy9f6xnF`hQ9f>k4Nta+BvtQ74QKI??&QwS4f2PkREBi6_g^So|&j8E%VZ8MVn2x8l zbNd-NPG+#wQK3Prg+k4X=K;t+CqR1!dgtVk<6@)2)aAeK&BH;~M54Oh5E!ospva9o zPiJ%GVbBXBE19nRo6XRB>=!-&_F!iGa^41$wxKO@}MNAz8~;VEz%? z)@fsOqS8~KV?}I%ebg9!s;KYt;Z|In)T1$q!!~qBodFJR{R&yTD{8e*3nJw3EALyG z*U!#tfj+aetX&Ge9^UP4YQGyJl6 z2dHUj;m)rpa-wivTaH4Z_ZmUJc0?t$)u+Y{Pj9QR!v@VEZzhH4VKL*{AoJ)|cbKE( zC3B`aln+J561`A#i&8pfp))^Y(=w`3D{%@!l&b~D<{BAKTR4hDKa|L$GVvdLO&QMB zTp+i#Z3~P>_JUq;GI|;q)MF8D5%}p@YNN5$j&9T7C}KA{*Fd$KjXpjkc7h=oG6W$u zfWFmsk#eIJ1I$;vZx0voS;S}Uch&lgKMM1+e;tY6^QsSi{Gi#sM`{|y|4)?CWkdrM z=JZFKMhxfG%-uVzWzwZNBeLaQ89fsH;@3Z+5Jd~+KTcOjJ~DGRZ1Xsu;aJa;xnp*r zuxuDvK0({swuj%Xz1k2GE{_!Sb9>+9q&2N|q&+-5V6XlMCaliRs#>umjO+pZ4e(K+ zK0a0Vy=TJm;YJJfOi_?ElCqUQhXasQG4C$mL9ukof84E_5wfZ=HWEWa+Rb{`t7 zRj581+NFVgHV6r?>Ad4<8=g zSv?cYCZSC1`QoH8@ny@fX1`6N`2vk=l*pzV$U3!Y{XIIUH#|coy+*Bg6`eVg&%zo; z1i3vcuOHw*>+;*C>f4SZPj!eGs@nUYS+~+B(-N&8xwIwZwg1%wZs&+;^{w^)Xp3xQ z?m^_)>l^SqWO_Kt-VCzINy99mMP-QVsO*0aX|tmSv2N6!we}m0Zlt#g-MGxxQ~Jvy z8oQ+22UY6w=VmW_Gqhl5B`gwYUt%V?4A~A;?N1-n(2K*9(HzckPBUww= zT$Bms=)OT~Wh^asnXVX#!?!WxcR}k23gq#byo8ld^Ekn%F=Hif$nW%`KUEK*mxyHy z8UK64M?`-PQtR~(UdvIc3Th!gZ-JR*9sZTCyCdnkJUlS5AV~q-=Oy!%0jli)mKq2& z9Qj$>bTciZ*=YmC==vK$quJgh!YZ1|0+bw0nIqC_kl#Cfh`yz>17{|PH~{+=2(kyo zF6d0=??&;QZMGa&rY(mjr@N+ z*vQ`YAHI@7`jMQK(-OJ13L|U;-I+so`qx&9DcDn$+;iijB&Rr5-dnz+V;BG~7_`*{ zs&xEq#*8gpPYK%hAgnN&p-M9UGQvi~8o}$%2?Co<-Ca>sdOXb44kjI;XcP0lFwRgZ zsHEWhJ}P=hi*vc%F{b(fF;RWwoXWMPc388!-5dpJ`JTUX>ct6ypZDfJ5SrxJ38F)^ zY8G1LJ3}L_Aig3ElkwHalb=wTr}`C8TMU?+LBW@8J~0Swl6YlF?Djk-{Uv}gAxc>n zf>A3oz7>pf>2N3LbiHM9lv~Oa4^Kga^qh#6({|K7y@G1~H4I~L$7vO`q8sfj(mY|2 zim7%$I&X0HxJ4;SN3Qtp&@dY*YLW>l(u(p^!%~lnhA;eA%Q(Nbl4UuS9$22j)QUhn z=;lc`bpf%3Gt@lvKglG*Ytod5+SN2xh(%aEeH%|xBv0jwIWBlv%>T@ zMai_T88+~aR?d6-DI8}N9MjFYMx{^tsx&O+Myh-SyEbPT1^3I8&xel6Ua1^QdFhr@ z@iLdMTE+1l6EnDYoFyA51n$DYXajYXgx5HTD9Qe-Lt~J`- z+5Z8uYb{PEuYnR&^9ZZgsln!Zvq6_468xi@coW;t*AoYA*W){3v=y6RUMUFD_zrvu z;2MHMNN8$ki0G?TAB5_!R@w*B&%h}S(nYdBt|ChcB4e!{TGqgE-$egD6|Gv?SKx^N z*+_u9J=eU{d!@L1k9;mL3g)$7L+yd@7DAmobyjE&1$8j*MHken^NKZC>P2qeH2;3E z>yeE9FraW3o9xIyst%}>f$tF*A$n@cG$?HCWH#=+O6L9yWnC-oWa^yFZmh&{W%kwF zciizMIk$tcSRTsZ^KTXgO;K_trs+1VLMEmO!=tdyt$sE|gg&4T!=eqayA*;o1t;f- zQ_@q!M9!c1!!>e)zWyUJE@0(t7*&3Bvo)QW#N8vPre#rHlv28=(i75|afsqrx7z`KMIA z2(;DHVtYOjWeZdVk0o`)_}!Y>^>jX4BclFsUY0%afnH-XSCbhJ&+Wm z^d^2TwrRe+LSsBu!!GMg)HGo@3?I`#4>=+)RBJlT2hPgGtC|gbDYTkmcHk>H?Km#5 z<;}k4T{~>RLOn{g;m?oKAx%t7b{=hv0N1$&*V%7bbtt8K|MSisf(0?0hL?loTJaX?u~MR;cxwn2LkTrs<@Ytsmg(22hDLVEuDj2+upDJ_bV~+Exv!F zili<*;QS7pzmVR&U^Ltn>_THbto&E%MD*c@L8?>m6S8zc=^qCK>YW>+`mE46*MN&e zbT&Si*`m&$b~%l*P-{$wjxDgNv>Pn%;Z(LQQK6^ml@r@7;B|=dZwV$M01 z3)BxjLLGPO8!@Gan4bM93QFufUEbO*H@EStm|C;rV95|B%7TP*F6~=;yWM;5b9^W~ z1TkU9<+)KF&hJ81pUPCdVj1fxcLDzz{>{R}ntKizxanX#(&f`s0@wuDOGq-a2H>8^ z>9w3dEQWug--J=IKc6niI}U4QA6I|4m&IfpH&ttAEPZVfs+&sU#8Z+)daB2?gkAR} zfSnNOasml-*!CIwSHhajch?1aHd@vagrw20`7E;spR;DK`IUI*{-&}>6DqZ0ne^Wz z3t;JONVa-{{1jqX0DR@vi^F>@Dy5t%Tl1&ao))XOU9xCI~O{FN;F(XBSt#iIYcVu^$ z9HcOS`z11N@IA^g?P#58ljp@11>u>c&D$azA1vfQR;OBHx4zPg{@Z*R5L!SH{x5sF z)#cpu;c5@G!hv6cj<@!{jqI*Boe@D70S#`mXvKGcQ1t-^Yr*rGjm4uJ2HT9V>Ywc<{z$yC=3kci0kmLk5M6)3AuOds73Gh}&D8Bt-R)wAbUNS+|vd@o~!JFtZ&eMcx3PFmQ<_$V4d)f;36{D27rpb4^0zsN;#X#}DX{iQuON$vd55c&8(VSy5=Tg8O#zMtM_65g~4ZNnh7_ z?3~)7;G}@w^^!xqD={HV=^DHRex#`(@esMTq4>&2TH0@~;O|>;R8CJXukwSWcwh3_3 z8O_y6nzgs(%ARe^Ja_Zx%Qbg)A1;xp7M6m7RzuJNj0piO6fLHDSlw#t8Us2JS~6X& zIw@3^fgQQcvGz|OuWpASsoUS>y2Ou}H1EcRH$N0;7pV`o?fyx!?}=P+0HwqILsY`n zti*U9{xub5Ybi;mu4#qq!65Qrp=rJ$ips+NVj$MPtI&LmmX7LJwCSezEOJ{uJum-yiUehlBwm*MduDbVaCcn zQLx7fx=VN8=$mhy>ck8B^f~3;JASj}Z>=u_-y*JJx@5?|3=2RiP=KK=)Jl zLHtX(INfj_-@qqoV^dC67DBpgKRcK(XU>wqB^~zSQ6r%gLp)(Jw_+#`gXg;E#TK7P zS(=SDmNa%q313U5!3-7jEtlyLX{A^)2I}I5+3BT|2UZbTWL*(9^NBNAM`Btqp}l#( zC82w6>}`xz+COxSK-^pHkF<5Tu~$}hpk^~p5^B}q#CU1=_0^v(JRI-6!C~nL7Qnr| z<~E{**88@6_T11;UJ`XU6^s0H_?(Amu4tCn5cIAwcmv1lgZHo4@lUg~MwY3fLHJG^ z2r+&L!l#=_u*!6g3UXZt}udEDQ zjjd>OJkXK*6GP~#v^@w)vl;ZRBw{yValU8MOZ8;t{A^qJB|`*;zoq%(t}(@oM(7Q- zt+3q8oFpZFBCPe1zmb*{NW17`VUi7+w}}jl%1j)>$3%aOB~y6TD2y-5a$49*5g>xI z6HdCt%{-p8m}iPGUS-$0+N@#XX|zrQd<7*XWfSOVH6LVp0P~|MsI~yD0X%nH-1Y%e z#kp*)VdHKfGvS}d0_fvh;DCtQVFE0wAJm7Yqk=Rbn3ricM$v0GfH|G1l=r#YL|1&5 zUfwFNlne}@w*-EeTDewVJx|5^P0o9{C_=vBn-lV}abC_1don=Lga6peRtu20nE;}1 zCpQ|{@sg;2MEyT2nCH!%`X39E`msfS@^arlPkLj>rkHlS@){Z1^|0fnKlvGFUmu4v zYK$w#IdvQV9lL76V>4do6kn0ckg#Dx9GXwHSs0%zzOZfGERbMzmcW6`DIVucgbg{tIC#EV5Gdd!qnk zk2Cl9Rh?uAAtTknd*9CL4&6!?ZF<>tK$ulFuvdjNR3-Rt6&>E=>fxaqFOXWH3L;D$ zpR}0#?Xf%zE!J>&y+`R&W}LkF!8uJdEr9EG4mR=ygKOokow-+y?k^bw2sYgp*aZMr zae&nftmjc6fs1)C3P2+VoQ}^v1QYc}=Jmiv3P9Yo*8n(rAc-hm*asXR!w)O^Gi&C# za`v?e(+u{&$TkL)gqG(*?5g-=*tDm*TCXsB&Oyq}9irbJ(9JMXrcMB8b1tuYsudmQ zuK@bS6bO?6Vidai!b~#?7_U3czmbD@Ujd3nCd%y7*VkM;@dloWrw=5zjvu9(LzbKo zr$PaMy|Ki~J!koA15;&08~Ae*T@b0KXcwSQ6*>C#5dYe?2E}lvKy#6-Wuq-Wo{kC zQk`Hr3QDVBoAP18427q*-3r6^eg{M5IOFv)8ZUpo>u7*K3XM zA87qwPIc=-5m>b?O{rUwukpc_S?x`?cj+wFz^B(P~aos)%Ee@ zgPIe70!T|m_|{)Wntmg}%7wwAybH2LKSvDwj8LW9i9`V^{b;nwvd{841UGMv>W}-6$ca2MZxO)c-&l7M7Oz?C@_ix` z!Fuetw>Siy5(!hQd>3_oH#T=i7362rx#1sTMgEkBrh!{3zY}=wc-y5qZcMW}axI=pQ z@_MSU9H=)4Uo|YvO_*1bD!IV^6IXdJ3O`--@wnBuMC=%jhB2fS2{lx z*1XTAAaC8s64Xv~My_=iwe3w+t)9rF|oq4EdU&!zLe3nGEy1<1sD*%W>72@$IAkmFsOc2CwxB z8pP+b@g1LpIH;U3J^r?2`)SO}^Ik`{{`#iGMB7K{+=e+|6Z_`KT!H$}uo!A(v) zD(ja@OH?Fa%|xQ0SC3zqPU|5ku(}fHIE3^c^pEl%!Qaek55u;RQ6X0uyU@VS+Hunt z^rUKc2DnK7+6I;JsQq?B{jmgv(7l>}Xe!Ddbv$JihMaT#RPlskU(u6*T!K8zXHk4m z;%%EjkZ(E8${)A; zim(+&RIn|U#9qfW6avSoI)o1HwQN(u!YsRT*YA(MSTfRfhPz`NbW*pr__ODZMwWJ9 zTifmnb)CzPX0Fjf&Yj-)S37fy0jy(jq=j+~RdW%9Z$A`5)!K>Z6Lm1MW_ zwmsZ7HG4$A=O8qM_2;B}%I}y4?yv?;+U15E*D7QBvmq_@33fawLDB1d@3!Zx8K)6a z@2B-Gfv+P%(%0aU(9|`P)#kb^BQ;Lh8A``1LyXrq=<_T!{b4RxZl$=k3 z$A!0rn{;->a>$<5y~J&~DOG5e8lvE`BjPO^M}S8ApRiV~&i#7c5U&itdq#m9PFh9= zP-W(JxhX}HYy==lZs>enTrfr)|GO&zCtTE!zRrrNjSbyDj&Pdm({~^!uoQ_wME+lX zjw$+pYt#2}>zwiO&S%moc#oM2B32lxP9&l=w-uJGR=1Xv%HrYCInYtM3vai@Pxo!RZ>4{CL9f3Pr0b_Yw@ zqDi3$RtX0;JcoB<;kLrQDI#&Okiq%bkHy@~?TYZ>@%3vwGa`i>x)8(l%SkDxJ_QV> z=C?*i^DU4Ai#JjtgH`witUrkeu(~U%VFk4cQ>VbdH{}JPg78~6j-_5yt%LBWkoch3 z%dw@8iQZ+PSGGjz+pEQ-95ZjHf~}S?M}XNW+EJ!nQd5V#kxvsMe@foK$g5E4(0U ztt+oqA5k-EXq@t0&PY49hU$u>BeCHr%l83L@zd;$W6o>Tyb3zng7n@i64B!0H5ub> zhF!hanf$G<<+*zH#^+fNU^OEA?3i^?_nPov?djL{K!A$}*s`fg%wt6Y(*wt(E>4NE ze0C3nGZ!SQ4vsc|dt0WJ96VzFm2j?8ErXfYlgc;E>|`|>Pm-bVVH+QAqtM$HltX0r7yjFe>KkaHW!A6`vPV9hl!l^ zF~|Fo8?ebQw_p#E-*U2rdkOS<+YWVyIV)F#>^m+v+B-U|m-B~=P*+?ve;a%OjL`s& zB#BxjjoDbddi|d-;m)I_wYBl(W*hJ-{1>weBwCFa(Pc=r1}bGNh=5uv0Ree5%ErdV z*{!V@lmZI4%$buvD!y-GpXnO6G=AoOGMO3UZe3H|2g8blOAEpXnZaVq?k+Ax(-vb4 zwHNxt6)z;849uR1I+*us+FZgk2~icM2s6C0yc!ru|xatcg{6tqw_lTJEg;{yzMxCZl?yq1nkgDS!c zt|wI3{65&Eyk)wDlJ$Qz0vSKr7@kAT>O;Jw3q`Qx7|H8$u9a=Gxl;qCZOOC}tE~;H zdUEGaQHJ(@9MkdUh~zpWon5w0tB;N6E7NFw_0To@P#TG&XH!~XNp3&pNZ>lIq4ftL zL11Ng+9YLKjo}&dVhYFIZeTh}i-^ExS}0Sp^D6AD9NK(T+ij2F{(IqMhis_|WX{=T z;xRiI@40!sq8L;feLJFzx3?kw&Tylw*N=O^>BuH=2lJq@ec+SvdSq2pA^nL9pOe2d zM}L|=QDj4>4Km6eq6e0Kuy`&T{=&jSoxY<^E@uYc`~D)Hv%>uYpMIZcgeiq*q#eVK zwc&dM9^ADjS=KXsA_{jk3VnsdYCp=b!o=|TQ=*zwF-fu0D?xI}5+g#j0Qik{^~7Gq z5)OzZsc6}1`O057#OIeg)0-E^MDR5Ct-PmB9o#0Yh>Si+UVS!@8PesFm3C%7V-%A` z)yg-tmI|6UoQEjBXOm&6)g)${H^wScztH;c2TnddiM>B!Q?GrM;Km@cJnQmGB$G;r zJTAI>BI|<{$+9q6pXU@mpt2@N9K=a?x=k*`#{FK*Kq^Fe$buv><<#nGD_KQe!`8Ii zAysY#Td7+cQ-iuBO&Sy|f-f3D%mF_#5l4m-M4`Pi2v_TcyYhZYyIhEmeYz@|Uk-QF z+Q_I0(#N6Hw#X~@<+zAKD(Nnd=(}XdlFg~EBxv+{irD>qk~N^X!ePe9ADO3PauX_6 zg|KW8Y#X4_c1UtzHmH;|k8uGjO3D2Ef|VtkGS@x5j(De^5A_raq6urScvM{QGuZdJ zT(f`c?Z*}=<{JOI@fj_JrlpSYT<`(QcwoB8sNtCYLTc|SD6T2W&KH#sD$ZGgA+_G` zHeH=1r7rc?SB{!Z)hK`vK{QtMD^+mi&u`Ty_R|+ngMVt4iHh?vO6Y)!xj7ST+6@~1 za9eko(j?V#NIz`H)SqMc&+ZPAJ}94<-Knl#5Hlyw(agiNleEu4ciuW9rZ0__bei?S zKvGRfUw>wF6c!&J|G)WAy0|}rGDi|HhF7c{0a(4vCewZZ?r=a+ zE1%l9cx6{I{BEo`?lx6H@K-2CMDOd&9iT%K!MfFxc7d$jQC*+A+9DOMnYYKaJ!tLA z-}xj!ze;oVcMdQAu-3hn>5;~o`?@4>2@_e(*LwBv|FnggB*Tf9M-yE-C)Ks7(7F+Z zrM)XZzzLZW(#o#H!K}{UCLFCY^SmLttlEreaAKc#{E0Scm@W`Zt74`7Kv8RzsMVgK zvJkRT{$3)Vkge6lesL$|SlJd+GOsFM&YL0_ftfU*swk#mYDWpuq{Jx_JsVXQFE8;? z6O*@=Ola&Z1BVXzjoErIE662`VyOe?UK6X>k9KTid!c}DiQe91kleaPXNaPBVI`~E z7!F#ZjVOc_jb65FvZ)e(?EN>@jBkf1qN^=c5bji)?>B68hRaAcKgDFewufl9BU^6I zJ3htgzE)?`{-|z*f8e3HyyMGS+=t&dnKjcK*1=8B6JS49y9SvbR8d2<12`#6*=9gc58zRq|CE`#b*Ly=Lj%`CQ^3yp6se$w8~z%`wNvX2B>; zWF0^qBo37wfb#;7#`D|T(*z;Y;P5%H`0z zX_?cBO82cQGCKYwjxeU^6^QNTf>P$eW;P6aQ)O25q8aLb%Db|}cdhtE8pYNr2B%rBWJJ)uRb9K#e?P}kcj%Q4}yG~E&^IPh71rNTj8 zq>d%4(WH<}qgJ*+oh?HeOp;hD@)XHcwJ4pPYK=!a2JL3_)b z_(AFf`?bNuWZS)+Rur4k*8sh(C2n}95T0nzoTEvAxMBDglJvq^o@}aXYNUs~qq9|y z8C@H_8_vk1xaBqHH2=d07yF-bZ1Y1U-uC(BzDQCSb$a=CNpk_#d0-xc5|FTI_}=jvbO8h{KzR zQsF$Kp1=eVdc?#uTIV)}jOZSk@W^Fp8(FQFb+&sxg0f~^H|1+T_fzzLvuH&$NbY$O z0ND3?ZhxBhiY$_3c$k9Dh;YkIAt4xO-CkY&8S@dEF0}2PBjN4M z3w#cNV%=;kcVoH(vs(({WsbHTl8PjF&JR; zPD#hKz~MN~`fYr=rC60}M1-3_Ev>yeOU=ts+mzduO-_nb#0%CK@no5Bpp?@;AnK6u z3H0g@t7?16Fdv}h3PLWzpd967i=SFy{cX&u%wthu`?z(dZjZrvOIdTQ+gJIlbs1)Y zCq|7*rP)Cr~C~&@Es#V-J7hMn;TQ&Kk^65hRgc9zu5Ox%VnCxxS%+5*B|E$pvqlmv0Nr ziY$OXA7k)fqIt2&&^93ztZ$nv%ido)M9FUjO<6%e0;v`_`sw; zyr)z6IZnC7cn9<7C7DjIjEyD7YJ<-vx=x`~j$v+=JJB-o8KrOy=Qk|IOMW?q&?a$;#rKX2T(pKsK4qT3UkAVlswi2V6ZO6SKG6 z+y!Ftbr>2H}+bkk8J1hKgRaOyH}M}wX}@39n#5{OPJlM&U9O&4Lko& z5(Xn`8S9--5G~hCXMDYf58uD|Zlqyo_qZuel$Rl2yV6W4>wDIl!4Q>)c6p;pcnt#F z!@6%f{7tH5YF0%J`kL0oXIh!Fj{Hg1Upb?t96ITQtY)nEmy^$ki%HDuC5t_6-;4yB zo*_E7J<&NwdzQc))Y$mdcs0%);fR5B6NTgGs-nX9GlxZ&d80MEfc-}%%z>H?roN2E z@HSoqwDyhm2{AEbgnVz&A~W^uI?-bAW)%QS;I*IDWKDsC;R-^_7?k8QEPQD?IZr(H>lTku*|*i z{R2MtHZGsh$2LDmp$9;yBG?PJNj&i5W5<@-IP z$e`70u*}?wO@sQj`AXk2_MT&|z@Kn55u0!6g&t%q(s<9oV(tPxV$c6YLdK5kmcq~H zHr8Y7-F|m+YG$vrl3^F^k;P8%o+DHO8XE`4s4o!ee6_BS;+92V%p3olN2$81az}=` z8Yv_R5TtZCgU*g43gB>XS4no~;C$WTKAewxp7C;_c4PMW{Kkg7eQ5QkX}N^)BCIhO zk4!t~JF^&X#R&HM_&=t$dHCEQi>PBR*6xqfpGHDdjv#^zi)xJtHwr8#&gV8Yh^suJ z;))KhF;302rI&FQD4wXwP?AO*Sv~)5+VIFQyM5>-qhTg&bn>=2-1AnsTph_i`>02; z%YxNW9A65t~lgIs4)t&h-wkLXoA`JNPb6G<$+JFI3Zlgt_ztz8GFjL;Y{ z=83a+90!t6tX^cMLMuunjTAOHJix&DPKaav&d6ZcSZX{!!PW%H+G&hy*e1!4Tj)AW zHw@FxeQ-f|oFc=J=l+hw#0)K!U!ML#y-;p#BNY2^owYV~FE}5>T(TSpr5s@Zlmq=X z=hTIqpHh3kdD6(qKf%?qw9E~YHzMhoG-*;3K z4|AmYtYm=fjmIhGmzM&SrbBBDsLM-&jDAKti95jyVhSGFItxnLUqSO7#E+Rs?ho$U zy1@;&PqnP}arj}q5oQ;JB~b05EB2jmP7|(G@V5QF{VH(2>{$1zysZWO&0jF5+?uGIGnrBT*C|FVc<{K6D^Vt|d2?zgWMjP*Ef z>)HKlT9+Zm$c`JCIb!y-!kOQA6O8@<=dxc6XRQZBn@!42Gf?AmN(IE&**G}<+ZY0_ zQ8!OhHAU@&3I}neMiu4QgEXqhvG$n3@NC|1)H6O#XtmN)>TM?vB>^)xnl&fT(?>&3 zPv`W@5lz6N6Sg&2W;6{kzytAmlb|Nq%J3F(^r9SHSke@a)3{tbzsLRJRLX!QPh7L! zfKyXunWQ?SI;6a8>SwWwl@YO@V-gqA4T~pyOf^?J9uJ7#Lyod3M(8K?g6j0VjQ)$W znzM9*a=uO!NTDE(>fW7)z}TkPzENyP+d!vNA9I{=YH9P5zgKL#mWfAhRC%`q^kWzs zZ-rP2t&yX(CMY42s$QtAiZY_9*J+ZTM6YCQ3Ul4bCZ_stQsapVe8+QyQR3}Nbw&2A zlUqDi$^tTuh7}1t>iCa8V72A=pJuP5u-I2yE~D~7FVl@>fSA{Z9BY`N)vQJbC<`#j$;UG(l=d%*QfS3$xEJ`c~- zpuOdGq$QMG<+S)IHZZX?$Kp#cY!TYtvIrKSkgN!rI1h>~c77kvMtlDlylRca-RfxF zd?%I0{;0jh#3Fb8Nx95A$>g4~VTr!bI=0zMQ&$0fKMv4Z+1XKt;08p3&gBk^rWYMC zBoe>59*PA}=#Hd5v2Z)R#bk2p;mr(%(4wf|Iv7j6Mh`{XY>x86d;}>p`vmHzS6;jq z(5JCW+pO(zqmU>3sn)!mTHrd}9ZH(OENM|F?((H!HIp?S2&IpXjs9&gjj?QxYjly( zWU@lFt?q|TnO6Ap8mR5D)UL5x`D;79%ZA4hy@k*V7syeX0AK`QX=2ubc^?qX=k`sV zDs-LSBJuXXTLGEw-)6Zl#m9|dbYER7J99wB)?k~7YpT(chSw?SK?1&Xd?ac~3#*;cA#YRK;=QgD<@8zyhb zJ`5trmD!@LNRkEq45DTKnjWldqi>vG!BPYDFZc&JX13I|Y9Ja;q9sKoq$8dZgIHs; ze6jl-kEl(BH!fS;Ahp&icE-ASqOFBdo-ulMtZcsZg;u}xcM-2>Dd7Y%o7OW5mJqK% z>4?i&loLofJJJO+#^N4hel^`ME-dkr3u13`oX-mk>4MO4lX@qSWX%{|R8$KM4}0sO z^Ny^r<>92C)JlD1j)TqY?pJjXEgeM%-(yp+(YD7oxDrSm9iQp_g<&mX%^l5dZH`&O z(2D;C8T=ssr|qpTqEZ~;C@ra>gsH&dowtlB7O(xp3x)=>CtV}`0f{}lNJZ%Jf$S+i z6OrWg^58>2?AqfHpm{X|p9B6iGySs4g2fvkc)di-X7oLB0H1G7?`GDSt%t;-!y zs+h0ed^&D5zZ1)~jW>flr10c_Cjjj40`Rq4mXqsDsQo_)SBrIaK`9yLzs zODdYcle&_*zHc8+N#0y7etJg+CGd0uNeU%!C^u5!)CJX%g6IPRIU#J zXWiJ4Y%HHpmyJ!c|>8*F} zt>@))m*#W4H0Eq=+o(>nKWZ@Qsrvb=^6}{`?w2Qm9dp*qwj>#B6bP6%zM00e+$Y7F zFo(`)=5<*oy2_k$n${SM7?50za>>gkI?u&Y8O4=Vh)%XP?T84?hSOJC@`60XRd}|< z+JVx&St-v!DGRN?8>cu*J z`T}kj!2SrBg%o%?l*R^UQ;mQRli)U9!#8;+c`=%F* z8mt1*Sf<;{TMwjn>=T*>K+D;afM@)%b`&0MjB&_s$ zVi!g|;#{BO{GqsVWrKk{oG6iY_vmjGtO{PCTzypZ^>*%luZ4*>&n0Drjush`S(hF} zuf(8)C0mS7r~>OGY|k+ZaC74ug%~ulhm&?(1EOPJ?fC|*ah>L5>7Y5+O4h)82u!Pv?#$G!{9C7jrB4>MEj^yw zQ(t3~Tyb|dXqlRRap?#^8<)5*h-|vf4A`9E^gq;lY7`lh!%@|k`Gc5QeP^v2T`sDF(x%~txw zq3(&?{+JJG^$sKkXO+7cP$g;m|5&b%imH>Zq#4|UCV`+q7 z1l^TVrbmKcd(C^zyEY85NeoO|ts@_$LywM_{|J_ga-D8TlDBPRbA3Iwkx4~U=4!K1 z`(C+Lrg)w0$O#{80Zo}58uE%o(l2OElU9@7LBwRT2&~q0*>)7{q*P*3G9EhTEniZ$ zWlzWoR7>eU)SOLWqN^*}r(h^t%IFfrGV)yU)ySK}x2!WI?=J{tNz$jo6kZ&m=wXRD zk2s~Pz4^oQx+!(hVIKRPF}YfXZnxt(c*4>pQ`*vKA&9Q_TPN01uu{5rfEx;xw}*p0 z{MZibc_cF}xAkkkctZ-ctYMZT2?^+k>#r!p4#!TBip%BQjg27!yjWMcv1+tqlQaK} zn)!9fDPQ;4iWCKPx+Xjg*En&sFwi;Rd}gM@DbiT_C<2Se*nzHR7_{2!xgXQGGPV23 zU3-!>@BHlaZGePhtr8X_39&9)+_gM zi0Ozhdoua{DZM-G%i6?%+1JYbFrnT%PX?&9QO8?RuSKQ@BcubvQYZq!ZKmUNlMm5Q z=0B2H(J1qmDG9JE6C}lQ!E3@n+2#lV`UEW(qUW7IRngt02{RGXDyN4kIkS=?XIp4o z+>W`F)>ck+mu@n%%07|~3Y5Kk04LQu3g^WK)4crZ$S!4&a84e$2X;ysh04n(58oy<|ZPFG)lr~stZ=OWEmln z4eTqo)%n{Hs)1koG%?N+L_Pw(9vq}$A!IFr2Z@of0V{26IWhO!LV6ISB$lT;VUGNU zQ_)3FI2-4_I&1$W0{ChipE~PL)UzrWZ(VRQnO+L3e|#Vx{>5oMx|O*ek+6Qfgj1du z&C19c#q0~&9Ma7qlV7jBd#Xh(XtvzY_E_Un=7v1lA1t7Q1fA`fBAk*DmqnMNjV0*l zqOS>){wNMV@RGe?{5?pQpNOR1;PveW*^=yG@ysw&fGzf zQqixA_p;dL+FA8(%GYsgBTtnxxM_iuS!!2!nqq-#XE?m-@^UI6CDt}~vJllhZDE$x z+)QnPHw8gUXyi~Ntm}*K`T#X7K1`K7{^S=TtQ(LTn>EB4G_#cRI&nMUqweokyX2*! zg8udESDT&g_g;m6e#3Le*aG7c&uIGl#LPcXF_!Nf8U3k8xvQzt^RX{?)4#l^(9&_p ztdgaZDe<5;jWKCk^iCaH+s0Fst*)_IKG;;5xu|`ushC%<{1?+F)pn>(xcx6P`E04e zm-no>N3TgWJ55d+k1;iHLv`wdEuwI}M%_BfAo&loR`nsxPx(tSPTu*Iww)#JUa726 zwZAfK9L;m9EHQN-3^abCt}q31OWe~qt*b~-i=2x90(@c6o|A_i$Sg&0z+!MKpj$_f z?H!Uwp5%0A_0)8-UMN#FqLLX3ap?D+2G1+n(_q4dRGDo263>G(4$7R0AH$S1qFq}T z=`2@vYZ}gDpn!ji7*yb}h$e0IEVZ z)IWhs2m|J*r}Q`cT9AG}?S2FIPsT%$eNvBSJUfb+C&k(!95QkWN?2nyKfdlTi7*-> zjx`9Q9SdENyVv29&?o3+`ky1ng@p6sxaP+>GMl)L`dhx6xox@2&nlx_ngYw8N&-ta zdICLf8$cSqp{wUx`p+?q#6i3|8{!QfNWWs?Y4qS9qvYF|Y?(X)n0{$9ygP^7FWj4h zQ=LPd>2gK~cCocO4BCR>5_9vxC;;NJpQ)(4JOTg`QsR++I^MwP8R`vJ?{g3sk>m@y z;co3xiX580%a3eq#~F{D9-xO%(6hyjt(4wb!>ml8sYX5(*WuJ} zDfdt~MpLSt7QuRG=S%O;Qp#)7E^(;13TTT3pOMuW@Y+rx6geqFd^4X1;_OBVR8{1b zh-8iyP3x{Um&GWC-z z0!m3ObMC|}hb;|%Ha=usa%i$}oGY7Ofz8O$VC%eME@t!-(8aShnHFSr(smO-lDyg% zOV2d{;^!-h2uBM)fDB9PEd73m&zHPA0v^l{?Jb~-Q_}1_ZoS>R^8Z z4vmkv>g6I4CkHugQYHna*jt#6MH{DWEezfb-gz#~uIVIpg;?WW8YqH@@WKr20um~i zX6xYQG!Cy%Q9x{Ax0_F@Af~WALuPu7sGeKUxxZtZzd-yAcV+`s#5}rN6$}ncX3#Se z;T{oENvr?^de5=d-N?u>zo0lQ@z@e4F^cGqbYO3B3pI1(H0Zt~cka2E>xwnP_)`(x z4{&?BxVRWZLv18am>y4Mjx<^>taf(=WsN%>1!>&$g?vsyH>L0GDZNPxsTk*Yv5v~* z@F(i;TrSM9TexCcVMY)KNmPNm6tq&bCKcX0ebCe#ym!XNRP78{uW@Vgf(8Pi5dLd` z0-md>OwOys=Ev?(CmqnfML6PPc!&G5J7?lX?U^ooL?PLp02sKO0P^FevGbr|*u{#Y zAbKo*if;)XX>tDq=IG&H2UgGhQ3}IiJUmVj?4*bRu#t!G!ZuBuK1FE$QYC`NH^(}NW%9a$q_+lq7fJBWJ;pLQsHPauIR(N zJSd`S&NQ^&I(Ey@x&Kx*v>vRa{(gHtQQlb|oion`=~p>CwD?W#A1H|Ac^o$5ww)mN z2t@`{H4ihbpRc>jV8<>cXFi8N!G6m?Xie{NZugiz;HmwzGSqufewz6Vo?sBs@gN58 zQ)Nvq26WdHr!=mlpebU!eqxicdiAOkq!R(ZYQGt?HvT2t-v~7aRKfK$K0NS}6yFKk zhV!Qyl_l_T2hF0HBuU#!Z_TFdO=mwXJUbA#X1qWfkG|>GNN0{>A@}e}3X6eUv zkLq}CXv>&r^GQwdp-B7z8*t(Ye61pfjHV7v{R`pc#RvHKQxmA?NWIdi&FA864h#tl z)45ze3D9MNvzn4O>RPip2cnsH+W@!u;(l9DFAja-!34}?CrxVf>oU+MtS&3NVc z*;yf=W#Li$(LvgY;@$UMm7V$G6ROa!0y>=_id1R|FI~}-^%~4t^H0r?TId80V}ahu z=+go>4Nu_X2;rXp{Nmz}zCPc9*Pj{JqAM7{yg`~k z`oxyI_Y*`e0s3kNfshztgPvXGg?GRrQXl2l+fCsN7EhK&^h9<4@5u0j7rl^ClE(=VBa?DyJ!!d0q zvM@yNq%|&p46X?Lbh&VIz>ioCq=L3&%V9A=crann3=NZ*)naK3(MoP6DhdqG;C5o1b9Fdfwy)KmE_xC%HWcTwNI`a?-@a zBl4J$jWH{gDMO&{*iYD2hBd{PM(S*qPStbvRRB zjzLBlhO4RX-c5#0YMg|DXhjOX5$$h27G&yDnq_T2Bhg&4O&>JwRlCkfouX{DgyFQ) z9}B3D$U%x9G=xuRI;aBp0QII5r+@zJ1*6Lwj8|!5Q!6>j>T*n^Edx~)& z0_PlR=$HRc7lnmEp`qd>^4a74PzZn4=Z2I-CgRtLQJJALTa9g7G(cwsInEmF6y`%9_??IlArf^edb#j+g#^={^UD1Z{VW-bDm* zpvoyiPo$Z>tNnlc`l;YKw(@%=PZZl^`h8I8`i_VDUdy(G=DzMrHx(6D_Hlr2gu@u_ za?_kpv;4_@MIIgU{cl6yoN}}|F`@;LJeyL1#rStDc}%|5@>wku%8Zg@icpv^Z0wi| ztX|kaSUe+md7+Bq&Zsflx>*fmBRV?{BcZ`WDQw4xT?gt>LZwokELR42MFz61@6!a^OWc{CNsQ*bZ`K+oOj3mc7jH2jkaD?dnxMY`aJ?c+M+B3{uJ^n% z(^-ks;=dgw{jZ!DIM9euB=-vBWQ&!F5lN%xWOD_w*+bZ?2z5r9K8k&&U$I)sF-8A~ zOTk;Dcf~W4Yz4q^p+{EpMxFsUZ*^^*$BiGG>8zxWdBy@JqzC3eze<7FYfGLH(aP>92{6Wk4b%D;gohLX8RI#yyzVrTe{@4h`ip?&q&V-^=y z%hc5b(HH=Y+$0++yc!UW;KJC^5#PV!1v5b!!iu8|sq@=;6&jRTNFu5V53~~)C;IC2 z)uz`889{<19q>g0h0*eZp^Yyzbc??Wyb*!jTDK$&);*YOfMdooH~J=u9b1R*2YYnp z`Wc6q^GPhEu_LAyH}$&c6g7Il7Dr*Azv3{uFqq2JoAxj^`gMKxJ-IA0xO21l6urn4;_2p|frfR3p=e=z)w;ERE)-Bg<1$)geF5jS6&9gDW(%#;9yVKKV^>+ZZO35|N31${f&Q;Orq;X{C-i=j#J}wD?Xjz z5A-;2v1~ytb1F3aD?b>(uD+>%&S-uy(aOjio1bOL*70Qp9uZ4dyRGJRGscqHRq2_O zun3V{I0$4V5ky?u@Ia?=;w4F?;u_6e?dyT7ALY?^O|_(6-U~%#lqf4|?(B)}Vbpzd zGv4%+Id>E;1#9&$ZX7k8mRA(4iT!E8qe)66B1UdI;2C4GczDf`7p=mEqU(|?YEeJW z;xD-aCABvO#yYG5ew-60~oVf)zraI0CIv;_SjKot$6|01;g3KpR+JCmMw3gK7l%gC%M9tIY% z?DpkeRXENFi8aJ)(f+TSs6G90#QxZNzcN-p?UTb1+B^>3Q{de9 z3n`SBIxpD4S%*a?sixz|JCI4`B*hFNjLHxXIFbETUQ|>Jz3s_77$p#}Z_z2$@3`J+unb!Rmf?ox6}rzU57%stkA zE{GeHZcb^v5yWuA@pxYmNEC`ds=6y(*KLO4AMM{?q!TWXVXz@I(-k8SCCI{V_2)4GS(q3P*(D`m zi%uP@u9B=VY|j_x=jYVbIilgCk|hu|dtI#y^|9jdDjXnR7_2XvfwBcgrFRr}vJ6#n ziR8)LZ31~Xhkqmz{hUSnZM#a$f#$!~_ivRz2SFTtXw^z#eJzKScz&@rWUZ>eZyXWY z%>{*mImUJ&t>X<_`oPq!%J&y}%z({BOWK!W;YCAQZj+-GOU?_IQu-(VmM0>@eV<1( z@2%#RfD@7zn7QI`Ue4YOP)xKcq%=Gplr%O?d@nNP`YAiL!TC&5urPFF!0(HPMv_=% zJmuRmHP3dNefMO-8`JK72s6x22BjvlB`pB8Zee3{IEb!r2s}DsuzlIc0ICGE-%$b5$)S~SR2cAhZmWhme$Pju)JtxOniDs8BWIImo_0Ra%Cs34M)0BtY;&W~95*VDD{u2%^8zjPxVwKnhAfyIWp}5DWThqd&`Y-3T&oUX)(BCha{rmY z!wh}?5K&g3#wqP%tCyT9R9bY-ZV#Oq(Kk!>*d=tU$-OR9KW*C-eB{b0x%pXWGIGO$ zfukL-tb~J4b}ti5>WlR&h2d%Wfp!Xh+|;Kvc78R_cEVdTqjW0YcaJ3)1w-OR$qrfp zwqF`9{>H{y3-F)LWvCgT-oaKf*2FZ4$$|K>_>diUe8c1CTn0kZ(jDKuah|jh%6?U|N#KCRBd2c7kQAY=Uamal zqL%$Tl;uXP9PphHu)5`O34mz#7a`XCOqAnPx20g;;&$GuGhb{tXLuUpJGISx{e=tY z&2`}h;_vV|&cm^9b$PzIF8hqVe*x2y8kGd> zjMJ>DBvFhR*_L~ow`)4+`U9B9@B*W+geo$h5kEh3uFELyef(;B{)tBY;mba#n+`!q zu*nZ#x{jB^_&)%9L4>{$1wQ5R5sD-IM4_Fb8)Iq?WiORdFT(>qQ-SGng# zYot_6pMMBRRHAd;eQaF$H?oCB3XQE#$cda|=5ReX@YU>hxz|~hK7WeDH;`zT;5-lOSidpj#SILnC-Sy?Cxo78t0@SR2=x zcD^=9DX4F(C*RmgzM+MNX|rjVI)_Z539St?XHCU(tuT(O?ASmX!A9N1Of&llInPhG zco8q+PwF~+5m+Ab?CAig&K&@?&0LaJXWC3u+n!@;TR5=ubFj;AIWRoZ6{jwD_G5RQ z(sMYSD@QNoC*_Mcj^i0+lm~bKY1EVc+W*m^lp>eQ;kqu(&CM)Yw20%6Kb~WbIfgin z>F@8ybzQ20!`y!R?QGbvfiMhFO5vthp~+`f2tlb-VrXcHj*bqC z&1GWDw^Imk+zi>eMrIv!G;`GThv?mbzqqvQDQ-*o~v*qNXMgUc%_YC zG{uu9shwV=`@)t z*F!3Y^5}r&oW~*g`WD8AdWoZ`Rw>7+bgVT@u?J{$k}AyEIkrw9KKWSyc(>n$kPhr^ zeG=Aly1u!YbKdoOF8|*#2D&y=XqrOThWk0t3woxR$(`KEPrP69yUZVOj3L3gq6r~v zlEffV8eO%W9vMZ>NoZ6F2hVgld07*GxMP5>5kU|u7SEqYvmB-}K8o)L#45oEWfyiK z$S5lz8zl-QG=n9@lJ*9gyoA-g23N$mGNGv;$hn4raX97BI!1=aNTP^`kFbEa#z!7u zdR@X$S=LbPO__jD=TfO(L87fFPdMDgc*RihBbwW1v;NMz$Q0`7*|>(51!DQ9 zv}9wXXIsa&CHL?ZKE>zF=MPx<>**GUie=o9R$)qlGtbU!#rAFlka6rLEzx!}XY~o} zy%WS@=OS-X6=%$ZLt*uwWqL0s=?{)Ehw)ASbDS;C;^g=g@?L>8$y(0md^Arp&-uNC z=Xo?WH8F4AJo@_j7#bR4{`~oze){Q*kB`&W*T;3&T}K#(6pKZsOqoJ9o29k2mEfU= za85V@zf>Zd%@PCwQ54mHahXg8->>WfHjCq!;hm7zJFg)^O6D&+ndYgpal8y8{atje zUrBMKAJ@1%N1nn)ZyhqlK`14d(c&<-Rk31&k5bZZ(xk=JM2R5hLOIeTX@@WC8l;j; znZ1CqfgZ;CcaY83kwgJ;6j5@@yea!ZJ`=r<&Zv`Lm|xH-x_H1mz%}Bp|A2Sq0OLLH zfe(HVdV2oZNAi>pAtl*-J>}B)9@Ckd$B{PlDR`?*bmo%xE43K_rQQ@?< zV2(H(f&g*XU3l5Nogao3l4v&zl`+I|K*zd=@JkVkk3NO1tM6moitDJ9Mi2O89wU#U zUAJ?dco`cOT+ZJ&S5QLYI?9SoNLz9x#vR=GF72^Uh}Wya)Kk z&+aFPHJcxP5anj5_z^kR;7LtgUeG^o=jTCUTWmSkAkh@OgkuhFBMJi0V{9KtkWx^{ zNIFL(t@(uKpMDt1#N2oH18h2K0RZ)D*D+iMOhTME7zD$u>XJ-hII5 z`{@+ZnNGjB8IhvRTYh&X`MXzA-Z6|eP>G-+XGbU_Ws6uwTitJ{$ud;+l4`BlT8>Zg z7O|dW_9LJznZiZ>w|TpGJ9nEE{10E^=-^m>D1OX$&3B$Uz^4ObrXx7-+ zh}N3EzP=hI4D3wa%17(Hwl|H|Y+Zc^+k~jGegID6RDLLa#8$bT_cwe5FP5M+0z>zp zPydKW9VekNZ^*fVfg;qo5GN@B61xc)D}yd=!BN{R&)yjP@!{I0&&%ZrMTP%yzsDuX z@4)qgDtLZ-3W7=_?+Rdi5Ci2VN zd+jBZMtZ0ei)?-Pt|!cr?+@lrNF?`*yE)cBotw-xC?&0SyAUdCuf9JH{N88fGI^DPfCQc8GWzb;Zl2(&H4t++uw-Hr}Y<=JkDkHr(L>%|LSJTw`BCh$y=U6xujCA;7 z&wul~q04!dc@@7EzkNc^`_mzon8j=oTWgd=JvfHxT7`=3wJCwIvfY%`Wdvh>RApG! zk~mD<3Dv4xiitLTQoBtgi8eS=a6$BSF5p70GQS7lQgaFG*}(hEd!F{myuQ93V+@5t z0VyTDy}ituHH+D^XVc%`&*Q0h793>Kj$sf4l*OfggVmiQLW;dDNe`3hHyzu_i1+NRE6Y;=sMVhv}? z(S$U06ekn|+mg>^EKPBKlV-GHtMn0H;Rw4>FP-U731YSm#uHr}t;y9jVvMFU9O0+t zH!RR|I4eGrEZO}!=gp>>R$AG@mR%hEo{4{KRJ}>65r;m-DA?(O+}&m~i9-52*5emP zs$y%7al8zUYd@l(Lg<&R9INXgghVM9FPA3@1Cms11}ubLDu<@2vuSLbNl+<*fzoI{ zgI${m{gMT{Ro$j0j;!{*wNNyeZ+{!!_dfXi=aFCdpY-?GC85`5@M(2F=|P!%Ml4lJ zKlUBEn`k%fyqFhrDyMO>coye0zK(t|h7iKij!>39W~vA$tHWOO)48Zo%xjMLf2U8U zr8!Ui{1f=$&u?MFwjshW!jT${px_ybfdm8@#}KFPaY8C)G(;qcA&d=I5Uc!@=#aeZWu&wVjKj8H=*aU*1B~>Bn*RuO7s7_mNXEL%xeAB7`vHRg7{JVIml= zxRz3vR)JDjjDRa5%8|s&W?6i~=>%cIX>WKp!#lRI_76X#bInR-wz{nDNH{oJ%4PnK zIgu0DBsT5$xqiAu#$*^~nAy2wKp5(?w#teUD;h&>I!@YtHx#mxp_1kLXB_aO3F?}G zv_)$xaserWLev&#Ami0HwfjcK-b6pA8QqMi0D$ReRp$%i-XI zE%Hw(`}xsdO9^+~g?#Wqq_lu9DWx@Hl9DhCX=rGu&9XhuqrSeLIdkSPJUqP4=IdH}qwg?cyzW%C7RQ0nE$g6(Ov`4nk-?5>F5SFP-bybwg>;){h%j-Sw zJb3xbaq&1wJd1ug#8%ZoY+?`+FPFESn~Q#jcllo+6_2gba_e+~X5C0k%!nAJrK!m2 zM>liF>Jc{dD}>SZeiVkR154t?tTOAVocC(HSH6-)8fY-}WXRy)q#H!TW;U_IbioA| zATGP?F<-|S<_xaq`r7xO7N6nE=1aS549y$g2rqd_`i+^i8#O!s?9xjSfB3^bpU1}v zbJkgK+G(~@s#Z+Z&y&Bt;ReJVcRX>=d+4FCc(Hx#B(WdWuP6U(>((c<+fd!q?=2=* z@NOoDOpD$yu&$m_;9Kd}B(mVQBnneIPz|Kjv4lcnD@h#TI2zZ>QXU%utn})%c}r<( zo5^rr2SeRk@rxr=ilbDMYZC9~W-${>UJZD1+G+Ol-~Kl7vq!C4);3g30OfW$C6m6} zsT;8Gaf*31mvcEcsoPks*72F_ckpG1k_wFFk5_r~DK-v)WS|61nTW(law?$`OMdmY zL2^zXOBegN**cmFLy*--Vdx(hR6;8W>M4yQG$$`stlSdg$C}}iy-^cmTk(l-h>WId zRH1>@olp!V7`u46Qd5c~ovV6~oqr%dUPl@0?&e926oQ;%n3C7bs1M2IT&`cQaD+jS z;KvSiZescIXqs{wM2YRI?;|LUabI&Ym12=cR;?%U9r}tEV7DRjF#pF7`HlZuPB6zm z2J-eF7bc&Fx;k)Oo5-r4AN}?A?fZ3Ow$n~8{TN}arhYPkXa@*hawg$(Pr*1gff}W( z#;c={o&u>zlp^!RBuT=QDO0Gc zt7Gfdtqctf?Os^r4pad2p&3Af}>?i-~;bZ|X)agF>tz6eo9 z@WSA9J{G-)OP$NPb@uc4$+H{SGa+}0{kZ0uy&itMnZa_goH@+l_xyoonmLgZd6#)7 zU*=1@{=w3vaPGN}d0OgMtmQaUq?1n8v+lq1wBC+>N_`c=$FJ_2!UKaymZuT31oSHFt9;6kc0>4l~?;{MLm^F-j-4VF$pY}T&S zYNKmF(mZVrj+bSmXFJNvfYD@fbx6ly#=_;qq0g#Yt|AJ``?k}qRp%4$xG5B1{(SI# zxO-PiziLRwwY+%J%6_jm9D%7S+*OaA)Q}~`Dp$4Tg^-L# zE3d1_+yNS2;DPAcX^m?o$G1LG|^hu%#=Dq5G52tMVLT@;{I*6Jr`?9lvr=~ zNJ|QC3_8Y@g4RNU77o3m0zXy=G|f59u%D$q6EhNIDfK4Qc@?zw(l)Q5B^PnT%$SFJ zU3&a1jY);$7AVF_A=?Hd)9ON6b1{|Jju7%$#im|EsXUBS4g=dZaO7F9qjB0S?!EdF z!r}+r~O^=QS)K8i!PLrw3=pOB1Y9XLTh{zGQ55bw??~Xwc1m^`lc6PQ;Sdhy#o{G=o6ptiowf22F7$p3vCI8Gc^CZEvM6@x zc254hdG~68|Bu)3Df3BY(9UYHmL0N}?V_I^F-lP-930GNm08XC{Dj|{-_R%e>>ply zG2DJT2thrKd{%yjR?|jIf)a}LVgoan!SN5h7cHO9Y(0|>v7PsdceBzwu>a?`8h`#X z^z}`2cplw>seb)LCUby?ABNxme&;SzwbM2EXPuo-?DIN~eO%A8AA5@W`cx0bCr+7T zH5XItAlpbOt+-3t77_^Sr#+<|r5wfvd&uPLnL2w3(s5HEnL6Sy;E_B3ocf&~7^>X3 zE*x|aV)g3B{9P|sNBjK4=va3jI(cl(_Wg--%!_%i{2;H%y$7WPRZ$&*m5p?qD)hd3 zuCP=Vp^1#bQ4&XJD+lWc79X>m?HeAZzq^Mp3duMH>N53q;TDo46mcogF1bU3>FiPA1kWzuL-VYh2 zh&3eUz-Gku-ggPZfPyKooFnk5;8UTCF2=+d&C_O486Ux~lLbm_NQW4Y*@0(b#8>1=o~(JR95|ZbabbY+2px;3NRPO&E`>#M_4XmFgPh4&7^I3 z$IUQ({-HEapKIImLg1Ii=j?@+uWvZM(Nyf8cElC`c%jY=x?3Z!>Eq|lGw+|(O zx4f9{m!C`QWiS~Rna!kMd-fx1jU`&X_G6}h{~}^7z$9dygiu?V);cetrC=B;3CfWo zF$yI$jxaQ2A_DC&9(v@RkVB_d=qpOh7eBxaFMG>lzW%oFTu95ee#-0ypT1Fz9}7IG z3A7?k?8qVK2~@*Ovh{V0Y$qP%jF46ax^3PPgjDox+kg`aPBF(aN6%!6X{KFI=U}~r zRq7$WlKC!WSt92dqS(sZW*v>eZk#ME!JuQ0>9PT%C2x&h%`1YJa+UZ!5h2g!RIcG# zK5jnxv=E zmw&+2?_Xw<$k+(3>!Osj;5>|7rnN>$iRUT`g&clqj7TelP!tLoqQFOz5GI1sN8dvC zhu*o@V-tQr(|3PH>vw*JAfX%%p#ayZM~VnX74VcHOa%2A&8RO^GYCUlK4d&pRAPtL zOqpWrVT5A&^X5@mxQL))XengaxV6k!-yk{&85uR`K$CMl;=X>G`~i$k2xCJKOA21X z)VxnaUePnA*fi*1j6gY#Mdn8#Nvv6r%;lHm|6`F@xL@zZF0Wq*rc9YqtJ;zz*$IjK z&rp%N!d$`a?gRYNyS%nPFn~nVXlFtQCLklGmd3$?oQyFODZchM)iupvjMyom=d{QD z{tbMJPqL9s+|T`th{-(Zr)E?)VpZgNu~^*c{j=4sLli|%%KIp4W3dAdFPj4+h$A1V z96Z=%bG&2m-<|WMpK7TW-09KmF-XdsUb_I}A9o$JXoHsEFRlt%_}b9u_6!)e6_7~45?l)+O_3GEe| zVhWMMFlUNmEu)pi{EP%1&dGn+HR({PO7ZuKDF4gQCBn7470xamoJ;Rn8v ze>z1C8lrqHH0ip0??Cu}Mv_e2@#wVW@YHkPASQe@f^BGV6bF}W2;n`kr94uUE#DgG-eaDaETK^ zUX~g5T@HQ0xy(EKWONj<;t#)J>+1XPBA2zLTga0?pq;l&-Lf8QVf=@MfgXBzLH^Zr z(vw0ds^Cn!stMbBPx<^-$NSL_vNI3EE|5_oc9IBfu9K8}%WlZ&4EOuj6B06mcHSpG z!1o`8QFtbvxOlYjMHNMyBvGw!5kk=1(n@PfGudpG`Sa(~-ri1AQxiLO?BK80-^}Px zKXDZ7vRM&Q(a_pXL#rKSZd-F#N|Z@OydEbj=kbIvf*0~aKFw!omQB39;XhfI^igPP z#mnUx?(W#>`0aSnu4Q0VCJUY>Osv9PE+g;*jpx8Ai#4x!;i25|Ko5UjF~U&AscDW> zWxT%>ew-c27QVpepUhXufsTToPGO9}(J7_Osc)k3(4$D&XA!lwp|e>A$NJIv9K9I_ z+1O03eHQT@x8ZGjggEpG%47S!!`{>H9e@13%~;#p_y4i?7MEQHD^^&PWVviVryu`Y z`VxK|@NMVEb`~eB20AIaU29EU#tKoCLxB=@F)xjeGd4PoGL~u<##S6AP9%x8AUbzP zFRH7@in=I^TL?{crz@={ymCl1D5+UGOYxdBXK}?1Tex?-1KNtgOvy*&9K&$M%Ig}f z@gq$`4)QXlG2_x#&e4>OIc|}|3(s86l7r?kI5^6tHETF{q|9v_VoJJ>OhbXzyr4ML zM@DK!e9uw|QxKD=pGH(1#R!dZ99kN)JnQ8z#Eo;Tx@`qh=Psn770OhY%2fL3 z+yD0@jjFgv7}}n6CX=zc1JUDYSswUJy_m&>B4mf`!4XygPHSVOaD_k!Ll6n;sKxG* zxjl}_$s8;f`O!x@Qq;BItH^+}Gq30E@#{G|Ig>w`tN*Q9ls|EPK!yxSY#0~geA;}5 zBKy~g+n=a!nTCjchKDQ$MC+u6h_8k*hM~a$h6e5LJoL~*`pC!jWj}0sT z#@Jvt=24E1Ce_Xu>fS=7I096=k>(%1c{RfD7yiPH=0Y*sFjRsl zwioav-sN0XxriIZO?2xnT0}FArilUtZV|ULf@M-2;Hx~qzkm9Lqg;+#=ddVgbVmltYVVlEV5cS4u??isiE;+xio55{7-pCP!_( z(IaCG8HBJb0)yo$JB}n%*TmRZksur(=Vp;o;hKQo-`dXuor)+iNTESV2FnUh#yHa8 zsKf&Juufgm>mpimf?^^uD#zUR3`>^GW_+wfEHgB>wi3hx43-2fj50JsEiI+aTBF%o4sKsU61r}Wa}_v_x+Z&+alu72V=NL-Ny@(7w`-A4QRHz zr~=`t5d^!Uk*hPyo!-+_)>CU;+YAUPsEXM?-s|-YaRw{YeKwI#YL#mOr_z4|>j>sy|* z=PQo%Me&t_^gF~}vre6$Dq{Ja+2{YAv zy7jhy>bZG3hBI@~5lo$PF#RG!X=nslu3*N-NJfS*<3-HqFlKxlRSC!%Np{s5D#a0! z$3yw3#$;icyYJpBRqe@+Oun8d@OMJXuaXb(7xNd+_rJ~?@*ia8AxAPk&_n;$brulg zX#ChkId+zgHmT;e70Xz+BSHzocwpP^w(FgwCLID-LSt4l9w`u#*chS+f{{^30v5G8 zbc`unp;_7Ckm$fBlO#bn3XCDr;0aB^jTw(KjD;SF3>ghwqS#QMR~$XtXI+1WL<{Pg zr!Zx~6t4gCE$C86=U4_`OZvtt7!x3n%xj4`Y_`MAk7$Stt_!X-jQMG@F;-i?ZDtFj zJ36@P<`rz~D&r3ipoGD74BZV6vv6e50lzPgRk0+=u45i4CDW!&qpxqGJ8+;FkC&R4 z@&&%YdkP;y#wJbVB5kiv(8^3IG9-klC1h6`Vm&cO-)RvSqQ*ftDRUut)Y_h#r2JJ! z{Q

r(--~77=IEY4g=zF|JF4jC3Q_x*#5{0;wWHn$L4()K|XaV z$AEx3>Qc(2MxvO$@DTD1Ed-Sky_+5;s+35Qgd|BA>FL7F=5f6Y4Xsm&{StM}EeHX* z`bOp+eJVOh81C(+nB*vUO}MH=*Iqg+6@No22S;d(fiRXJG&LU_WdR|U zdm9tQka6uouJy#+$QT1s5+sVz&_PIrD-(`g=<(pTgi2_TLeX8ylb|Ta79E?U8aeh@ z4Uy4kqp284OC3~72{|XG9Or5F${aaQv2;-zL6nfoR5JDkfs`U!+NX0_BDg;JOY`lwdG5W1l!l(%+q+4}(a7juVeKBt|&PdksGhzs?or zxBph{c7SftL$`UVn|O%Y$DF0d<2W9hSKa#0KB%3d3Nn^b?m`QE2k)d)bRnfomvl|{ zhKHGX&@%FktxR8dC>^WsL8r7)M?xI8m8&@d?$!=}dicK8EBBs*DI@YmHui?dIDS#&C{uC zZX+lc@k^tO4(zaP)qOqaNiuc2#8YH5V2mcL6ajmpgb>7`kI|Y~X#U96oXvB&Q?5iQ z2b~zJfo`m(Jt?}~7>Oe_iWr5#*HDQZ?2T?sX>_%Ms|sP5w91TQw)G~Aj3pSUaFrs` zRzc5@>Sbu_scy6(A*m_O#zL}VRM6-J=tK~k3{ED`(u0~f?!?1+Xw^nWHuUhvTYH#3 zYYPS_j*QUIkfV_E7_MY#Zz^%be1|YLR3i9$*9^*)Q5wAv7sFu5^6K5JhfppBFGEXP zE9>vOlOTwQ6N51_-LOd3w*H;o6aLH%xBry|rGu-b{eHhUj|a&vrKD6UQ7je@D48E) zj^R=+rAzekqRi{*cDfOIVxB0l0LPtaY3!146K&sPgGnimo*mEl3ECK}MS=y^Rdw7S z9dAxv%eTdMiTEc_o}P)v3@H_UX_O?6IQ5n9=dM3p_yj-0fnz|bt>$ga*0Y#r=CP4Y{8C)XFZIvL7*o8QWLaY^w z=9SN?=k7;F=@_;}of?BI)fT3Q-tt23Oout*Rq)(>P^*Y9%FoP?<@dAfSWs1u`f zM6=n@RiQEN;8}|dha5DMu7Qw0-mi)Ml647_HW7u1Kq`e-H--8c^HC;Z$Lc#7Eo;J< zv;zUI)J&_3c*V1tdGmF@;*#POe9U~}33-2%Qu`!2GI=9Vtw{DYmYd~#me27lp2a8K zukZ)=IshDL&^4gjg!HdPrceBQa$c_;rLq61{;Wz-tBJ{^AUh={=IPbQn;Z{SZek$| z7!pJK{5qbAe{4wQ;%2feIrdD}-hC}`;6Guy7*ALT!FOg{%=TVxTxc%%m+MwZf zIPkWq=XpChZ0#wkz&P7NH2Wl4B8_At8=1#EzUq9JA7?J6Xnb604O1MM+MAlm^Kh7) zqN@pg=V`g^tEZ4WQnnjXSZ6Jreou2dfKKcNet)`||A@%dHQ{D*95r|_pW(9{E|ybPKC_~B-h15V7;BFB+->h-wOq?r z8otZ08bv8dzIiH1l5pr5FJ-KM2ixwygQPryqZGy@$V?pz7fffxo%f^T2#unpeHKzm z{PAI;C`Km)q<-xPkmNU^bM{f(8ds_Y>AoIN~`kW9dmRVCLc@5mN2+Z+DBkIL;i)kCGqr$>H~N zSNUo_aL@@jIv~+@mL0{gVq=USnzYIiBwDAyErT|OL_-`~M>Qo9@=lD=34#cn&es#2 z^4b&oS!-*YQgfJsN#Z0np(h%m*icCvVqEIY0Oua9IC5cz93?!*@W!*3aLnA8#kmfS znjKLoR~Re$Xn&j~(*JPVAZyW`b^A8^FtOjS7@6ymG*;=#1BHex<>St zn>cK0iQ{Hh$U6~|DoWc@Zw$~o?(ooP35DX1{1Ml@|b&*Q*+F7an@8sjy zm3}6v0ws5rI5CD@5b(ypH^a~K-|v3)pt2R~(U3-@2FEcurTgI^jY^vnOS zWG;>5y}X}4a}9sxTE1ew#>wVnT;n3B%6WsE$+Pstvlt)lxMVA$er;YHck(wHmou(OKA960#)$qZNKaAkg~tpayy4`Jz5riP3rP0C8z3eO;Ll>Kb29ksP*P3yXv|ANu!_X0<$no3jF zfn1?L))UNZ@L4uXvSqB1&7GrU3XS~uYp>?^zuiHxcOyMRArEbj=owCk;+RF#9JUTx zpjIWabFNv9Aq`&0Sez$2>u{Wwx#Y4AEqO!J@Lde_57N~$&W_=PatMPZ3!comR<+J^ z?9F-a*ey(>4S)-{fQz^YKmFejL%YnwtbDGj(b1~*nvcalmr~N$X!)_DqocJpd%J1p z6i#6}(`gaS93l^5ezKSy?BEi0F~3bN2jDht=S;0G*&9dYmo}Zk?0yB>udKndCTrK{@ect^v9>1I$?!17$a0gN;+GoyU#{8vZ za(Q$Va?ZvxICyXYIg{a8(MeqOvH#`nWHv!|3isdmJN*7ZT3VWzb;KzQY+1|D_Vpx4 zWTu|+;Q=eKgr=^(j==Ycqlhr@$!A@HN`-PIKqs1l8?khTpruZd7{S`kfJ7U5#+}q} zMc_$8DYP7SM+xG@P@gp%wIIu_kN7AF-_O4nf3Tj{C9mJFb0&>Mi%H{KmgB0+g)qou01$iH<$Z<#(1H(NkCE~U|aN~41$QAnmxk6#=GsI_ma z)nT(~=HucMoM+DCt1~{y<>lL{L=q`QI{UE+T`K!^wYmf*X5yGM`5Ua8n+1pnX}_MB z7gy;}BHh8->s)kK3^IP#FGeD~+Kv7oM> z(Navuuw?6yLt9%DZlQ&N!C}gy!+6Rdm4iriuiNqg{OKP16B|)b)x>iKS)OzRDgf3+j3L+l_{5nW~nH=65Nsqd$gE{o1jm(_fIbImZOkhR^a z-ku$MeBOQYrVwm4n|W{cv#fCLPXT5YKT>B3END7}!Z5rzdM*o-dCYWXF(qsuYcllG z$AC9Xu{or>&`YK$IdpglznF3*WV-3nkuGbfHzCNEH#OLqRds%1d zc*wb*S@ArEWIvs1J0og{Vp67TDwHS_OP?|oMop2xggm5IvreyPBOCXtIp!FbCYty= zH}iLH;oah0kNIBi%SQdtd3qOfmuC_>H6VhU$r1$>gpl~9vDyvgI1aAs5(L36iRNT; z3RiFiFU_6Ddb!0`ltLh+Bz|nc62b*v7Y;`{~bTMVl56KQVGIX zFycGRXm6%cDp8IUVWmvY6CfSJ$hM286$1JySuzfUiKLKoa6N~CficQ{0z#9K3FT0v z!YbAyK1#$+dgrc$JbAQRq7n%ZiY0m>zbgHJRjlGhaU&O)pHLLV19~rKm>Il*H}F9| z$VZz$%3u6@(V{w_NYEq{bUoYsmHbv*!4>9r^wZBL_yjpo;D5Ytvr?@g<3N;dPE<$MA{CdB!U`}I17qz&4XI?N)x-w-y(0}TQK#|#u@A5`UdH$N0mq9I zd1>~o++O(ur|>K`iA@J|PX67(G&I1PHPG9OIQr@tgKOxM$B$tc>wS)81lz(L6(n&YW-u$@=wSF=H^2P{}vDVN5UHlj+A zk>R}wW$nDc+l`#DqE1qwlZ0%(ffeJoa;_ zzR7}ey$mh&)5#4av?a|fZaSFx(M-Z(g?2uw_pOK+PB(|J)GTIYWeqob_oEyagCHX# zUb0Ma<9BXga9SHbKlUN|`W|3Dc8tUeD|C@c4`QD;LP0@FIN{Kb1e_ zE&45-$9Y^VF0LKT{&d(T1AN^~4mX=eNry^lbhl%jCpDqxO`c;pjyt%0-&<4v;1EJm z-!hHy;oe;+cGb!^o6QmgR+o8qVkU1gZ{lO(6TGPK8Y(hEN@dl_u*ue#36T_0P3TFg z*(?Pn(Zo7Lo0yD~!Qj{`HRY~jtdg9P;74f(pla!wR`)Y!wR7roPU5_`y_(r`rnBm< zJGuA%jXZSEos90-z{qHkjlH0SLt|DGL>i5xH5W0S6o_Sxa&a6Xtl3LqB#BW-VVGTC zrmm3T;ckWFNU}0yq%5fTF^SeV(xTz3Rca+-CkobN@f0Dzm6E2svDU9ao>SwKd42qH zRwXMR(;75uvYgAgyquRagPAmoCYogfLta0v{xlrpvLb&o-|;SDWwdRNowPR7%G<(M zv&hV6ifQ2vc`x7aevB3g29Q)caeJndfnenNi_vpu((sD^#Cd2PU}xu56}g(N>SRsq z6wv5M$a@Lb4*!XTdLg%p+jt-E<16ON%oKCzp_}LP3>a>I!%UwJJ9a=%4`RlQ{r-E` zb%~;g7pgP)K0o5^&F2y2`{*uNyo#SFqC_Huq0URF#12^}!DO1yL760u5JvOH=s);S z<-Pn-T+LPHN^TT4;X46dt_~%kI67Q=PLbZzljo<7n@L$Rq2(nD!TiHcB91~j*WHKX zWtbbx;=jbFIG1zSD7NsU>@T@*ekVwYUmT@vAjgTpk<8H3D3}~$s>Eu!j(g+-42mIU z9(=g<=O_;2D#1K8gL!%mBofcb;)o1w3zl>H$ln=lO%MX6%vr?R+peLheJ%~tX0q{) zzf#{=NAm{w_}B+H(j3luvw;=d&9ga$4QeYt%UsH`<|(xLEu2|An-{D(jGhH~SiBgq zY0n$hoXKH;=WrSq^9$aW`3&C)KF`<1H~EqI0hN6O#W}`dT#Rwu!C&E5?!`Ecq~vS5 z#~doLU9V>~Cd_V%STZZeoO!cpo6^eI*f3kS_R@9V5?a#7Tq{3Mri$8rnXO-O)Lz zh>4I^$2~Ek)_%#)YG=t2hw_e>zL3KXTf)6}-_MV}^&Q4bA*HfU6j|3aB?VeYGD_nJ zo6v(;raS%^$MbN7MoL3QCX`|iV+?s$^O6(mx#7NHdW$Yi*@UssrC6$vBs!f78}cqR z6$aDGm-#^509Lr|0dD8i{8<%!H zopBBfZ3{v@m0m zR5(ebKR31Cv*&+umtl7RIKj}`>(H~?X+HD?sBK+otKB}UHXxP4bsT&@sDXRHkoT-9 zi;{*};e2N5cFv8T$M$3scW^s@=1&~VA*>hc4)98T>c*30z+>jmhfSMc%NE4KeQ^DI z)C{$HPkXrhj^A-C$I@(C_>K2FK9&0lQ6lk_MjLBL;!4A4#dfHSkQ_86q-P9bQ*_hh)^V^}#Ps4cw$*nMiI|uKG7e!FvV3$2f63p>XXRIMrqmNv%Cyd!Puqe+ z*!tjIh`7R+$NrPf%1LlJ7k5E;#g1ShfuD z@WZ>jCA*84@^UUT7jU7th>!D;{ktfDV>p_>dVl0yOPlx_UNcW~y zI~fVVlbq0xGsp2ozQo&kJ6pw;C;aiBtdLTY&*zyxe?Gmvy$lWxk|fDa^9#puYF|fD z#G&R;ZsaCTu6qgNs)S6zT|!8bBt~n4QVK-6fTgo=Z8RnYze%Z5RWU0>Ga>A)Yn_^` zYZ0Q3va{P_x#_1e&nK8YUp;4cn-T|U8qEs0pPAb%AtW~D9mYu}A z76Lz-Xf!EdH!2oyAZf@uxD8WzZRZO(qI?Kv@j?J*F^e$A4sW3cSt$09wq2|`S~PXIX=DvxRwxsTeY8K5pBh+=C` z%N~-s5rVv+|IL~{d^EfLyo#kd3 zzNkvf+Kx?i95?Bial8y(HlJEp&t|B5GsThq+P`OV1;U_=(Hf~7+*t8re!?qxC0p6X zv*fd>$cRXfPrR1qsWi6E;K*surhR*kw($l^j1kV)Y@0bulvj-OY$J+7+U6ccPuEt4 zRzJemM?TLIa|rL7@g=%N5Ba)!5^ZRiF_)pP?OfFPCBEl>lV9myKK6UGVg(#?3>|4FE*R_-?Tzj?5vDM0!_cx#?yaYu(j+_F2#3p)N`1u$5+Z9Ydl82TzC1 z18~qZO=Hf2@%l$9%x%i@pQ|q8+VQ*jb9^0FaYgMh=Q58Dv3(zp-$s?Wm2YUJJT{2d z2}xv8>dGj3>0w-r@aE+0{7w9A;+qSJv=hGN+jz%K!6G7fH%$U)}_PMsL z*mwJV{PI_SB=CLkBjN-UCbeLNS_4>sMyA|ns509f5tDZl{8$ns4)ygpX3UyF94Ayv zLKG`^qxbR6KS9Dd|ba4dMR6xt1gt84Xr*MNfe+*`}vXl zIoG+D(oYXLou_Qdtk13Hn*5*m-{z0;aDRnzV5|U(5%`frNJ&>;i8@bk_>6?@!-i6< z=p0c5@y?gFBO%z0K2jXVwUk{2wE2-qTjmoWH!~@j1DL7*zr8mPwCgU*{XgF|?|GlI z&yf6y?PZve>j1cLByXUfztFEv`L$kf;=70wDz>7_xrx@^FGfY=sKcOLwFaq zlmxwMKp0+7SyL22A+0c5@0|lu;fKQSpXJd8~qkS7=|1?c<=&qohyP= zD*oENGNWTs#!hcPEPt3k>;4%p@So35W?zq{_zWxa%u9u#bilfj!9v|@93R_EP@W=r8ft-WPDRHh*lsm(A@7eqZ?`eoOytysk|cco?ZHN>96E*((!xUBaFX zYqPwPM5m}~Z`^pPo#zUd*T|pXtKw@sqC7?;DkH*}NNHvAAOy|IEOx8L;`9k*6p|en zp|oZr-Btx_DvzQlRHjc5_$~(@`A-lEV;gtzE2Tf;e>%U&$7bKnkBq;ba#X`}94eEC z_>t}plJ#{yx-8f|A^Hse{;|5WBY_t-o^XpW@-85b^-&aEWmHye5LCKLq&r`_ySr05 zC6(?j>5`W2mKG3@Zjc6Fl@96d&hPnt=ns!_Jm=oKJ3BKwi$hx^-(Yv%T`&7L`Y)^N z#QG8L1X?LaifqkDVNxXjVpK-Wlq zaov-2IgKc)4U6na%pwR;+`002BM#+B!%DA{kkgjXAN;esj|>HfT}so=d)%YH@h3Sr z>vP=$vD#ZTo%bu@FX==44-Ee;3EVDr%edzm3wBm$#eg84;u&BZ=gdSav-xGuYr~rj zCz1GVC4Dt9P`fMBEAnLPAXn{_@aXlk{tG|mS4_HqME)^EtRMACN^BN}=4=rfVP%yW zX$otIaKUOc(naz*2aI2Sy*AMuRK_QSpu0FzHK$&Yi^w-=A`<>Ox_(U6!0Jq`rZP{; z|6%@ZAn`Y@0?k`@+P-V;5J)X6Xld_>5Yia<1AJp-JELRNy3~7q!!Onm%1z-4xSk>z z7!F>WKiwSsMUJ1mb@v+(pH0B0&%!~KN9sY9p=wzFf%8vb6N>$Ea;)3v;rxbgMQ@$$ z_z5SEZN7(-8Th`e^$e7R^JCR>1rP1L9AV*quACg3Pm~ueO33 zyBiA*tg>l1F%f9G8x#tCRuA7y15+i>MOPXvEvacTAJv&D7Y=3+P59`vk%Jc;*@Lbj zwaa~qJL=l0zCN!lg*nX2+>{SH!UOW3@I~*FhWQ~UPpB~zhzZc(v*tbU(_mg;Jm=Vz)tX^ie9j~OM|tgPlus#^E&+!ywG;PM z(<)J-t#TrI7p{9s==Rf#m;7t=eWiEwYMOtJFA8+J3U5^t4_~xTBbUYgRr|yvcGMLz zFeZPc=jw!;vf&CioXLB-RutZNZEVeX%G8b1*zvOMl(&~|`ZmCWLk0ScITkGNTwZcZ zB7tnnJ`kM)~@CKDL8n7YeO~$-=fMO$)X6Bu_8UOuKMIoDw(!r z14c{Dfe>*uDzi_|!ilwEvtLMyzi;T(Bg2CS*6URr?w_Q`s(ZUHNPD#9Q zWlWF~>e_7f+x5a9Qv{=>u3|XuJQ&r}W8;3qG+kI5Pc_I26oU?LTgwU$`caP$jt_J=%6oBvOeNhOEUEOqa!4Dc(%rppBcyKVHs?`)nM3VV=GwSE9 zf6MvTeYT*8gE`VC@&>~?K9Bkhu6N2~zVa>ct}4{$uRZ zyvM6gZ&?$Wg2-#%OAKRm)=%9I=ibLvp?71zpL@;dY`?d^i#bJnuM>WTe>@ed8@iFpJ00}atk3Jj9cQ@F#Kn8zWFdbxB$K1ghFT8Lx`nAUY`bj0fph zgSwwY-Qp2lZ)bic8$Iw&)}s|LGIpehZR9=@vL&;v>pq%pIjlH28{}*;?VFH|1cuL# zBX`&$%j^pm9n)h`{?z*o&tO6Mc7|Hua(lrlK@Yzuamw%?V;`;g2rDAlpEWj>Gs8`|8jV0BY{R==(F9^~a%-~i{v(VEHbGVo zYT+*&fA_kna?D5iKdL0B)D@f=N#6xY_ss_GDN`wM`GZG4GW4JA3A(AIl0VEGI2)*} z+!PLdHsFH! zB-r>(Q{LJqtE+m(d4-C&bXJoPRZgFNxHbRbuH+m!M4NTR$)nmi(YH;KT=&OjplDXn zh}gxHQa9G=!+Fq!Ztue#=Gp8R=a16vlMRmRv$@e#F`0qBca%!#MOzPwwMa{5Yr~TI zW8d0rbX>33*~UoT@?c=rD@0B7zC7}6D-wUK&D?P)Ul}N#FWwAcK3O+T$0xrZ-bVSb ztA;3XdP!GrLf4g@Fp@woMvfv$ z{66sbRDu>XvP}UaI{QE`6Jxif+C}|{5m<6XZM3>P$>4;-!y!w^p+h`H6yZo zhflS^R*)Q%sN}`Tax$CuHXOaD8~OY_(S(t1R?)-|IBZ;~v$@9Uv<>~UzamMG2M-kz zd>h?2?vEa{q%C4wOungcsO6s?Ot%`yQ<5JZ-?WO=pzV)gUn!owB)p)A_Q|c=!1~w_ zO|B}+&n=7~KXbo{4E%e8Mu*BWv)+9%s-)1vieANR8&>qq^B|5{l~hVYD@Sz$XW#?t zfD9@7RA`ayX5^5Dc3iZb)5a}zekrG0as{>D{BZX<`F-SV(>2>g@gr65mf-6^SWfp+ z`n`Y(!M$`C6+RHnNQo<27!cEv_RQDnm`B($9tnMkNF^O=GPFdIItyI#vE!_8UQe1b zEx4ppH+S8%T0wjkf20(nH62^-_;~fHOPE?$JJq~CYR5;x+0Vc`4enBlG5qAgrLL8J zjgy^SoH3OuRZ*jEcF$d~{#=uHY;BEV!ukRk_I{9&Fy7fatnLEIbmwShQN3f%T^y+w zadY)l=$P%yu0l*2+d$cI&o`rNWbHln)J=u<{%u!6Sl+3WQ3J2z67naPL++T$^;>N0 z`U(mA*^1(?M728`exg}rL%zKdpKyKI9!`?}hT){Izl~e!Vb{Rr;1g0~O{X;dIip;D z8j^TW*ByN%)WRhys#xxjGG>*T8>eCrAsbQgXaBbyI=3->O0)V~zO?$(PkM-}m^6XYZ(Q~!yvxzq(Q{>m)@R<3ZrdsKi7bnoRpQk89~+swtGA#(c0rnkb6QNnvyqpYIEcRh?ZSTn@IC;